Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fluid typography: add min and max viewport width configurable options #53081

Merged
merged 5 commits into from
Aug 4, 2023

Conversation

ramonjd
Copy link
Member

@ramonjd ramonjd commented Jul 28, 2023

What?

Welcome to this PR!

Please test its exciting features. Wow!

We're adding configurable min and max viewport width values to the typography.fluid theme.json schema, to allow theme developers to configure their own default min and max viewport widths for calculating fluid font sizes.

"What do the min and max viewport widths do?" you ask? Good question.

They define the boundaries, in terms of viewport widths, at which font size clamp values will stop being "fluid". For example, consider the following theme.json settings:

		"typography": {
			"fluid": {
				"maxViewportWidth": "800px",
				"minViewportWidth": "600px"
			},
                  }

Between the browser widths of 600px and 800px a font size will be fluid. If the browser width is narrower or wider, the font size will no longer shrink or grow.

See this fascinating screencast that demonstrates the above claim now! Witness how the computed font-size changes as the browser moves between 800px and 600px, but remains static higher or lower than those values. Unbelievable!

2023-08-04.11.15.13.mp4

Why?

  1. To provide extra configuration to theme authors so they can control how fluid typography works.
  2. To also decouple max viewport width from the layout wideSize value (introduced in Fluid typography: use layout.wideSize as max viewport width #49815). Here is the background behind this motivation:

TODO

How?

By accepting maxViewportWidth and minViewportWidth values from theme.json settings in the editor and frontend.

Testing Instructions

  1. Fire up a block theme and enable fluid typography (see example theme.json below). Define a maxViewportWidth and minViewportWidth
  2. Add some text content to a post/page or template and apply a custom font size to them. (see example HTML below).
  3. Make sure your text has clamp values applied to them, and also verify that the font sizes are only fluid within the limits of the min and max viewport widths defined in theme.json. To do this you can open up Chrome dev tools and check the computed font-size values of the elements as you vary the width of the viewport.
  4. Ensure that maxViewportWidth takes precedence over any settings.layout.wideSize value
Example theme.json
{
	"version": 2,
	"settings": {
		"appearanceTools": true,
		"layout": {
			"contentSize": "1000px",
			"wideSize": "1100px"
		},
		"typography": {
			"fluid": {
				"maxViewportWidth": "800px",
				"minViewportWidth": "600px"
			}
		}
	}
}
Example block HTML
<!-- wp:paragraph {"style":{"typography":{"fontSize":"30px"}}} -->
<p style="font-size:30px">A paragraph 30px</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"style":{"typography":{"fontSize":"6rem"}}} -->
<h2 class="wp-block-heading" style="font-size:6rem">A heading 6rem</h2>
<!-- /wp:heading -->

<!-- wp:cover {"customOverlayColor":"#a3e9a6","isDark":false,"layout":{"type":"constrained"}} -->
<div class="wp-block-cover is-light"><span aria-hidden="true" class="wp-block-cover__background has-background-dim-100 has-background-dim" style="background-color:#a3e9a6"></span><div class="wp-block-cover__inner-container"><!-- wp:paragraph {"align":"center","placeholder":"Write title…","style":{"typography":{"fontSize":"5em"}}} -->
<p class="has-text-align-center" style="font-size:5em">Cover block text 5em</p>
<!-- /wp:paragraph --></div></div>
<!-- /wp:cover -->

@ramonjd ramonjd added [Type] Enhancement A suggestion for improvement. [Status] In Progress Tracking issues with work in progress [Feature] Typography Font and typography-related issues and PRs labels Jul 28, 2023
@ramonjd ramonjd self-assigned this Jul 28, 2023
@github-actions
Copy link

github-actions bot commented Jul 28, 2023

This pull request has changed or added PHP files. Please confirm whether these changes need to be synced to WordPress Core, and therefore featured in the next release of WordPress.

If so, it is recommended to create a new Trac ticket and submit a pull request to the WordPress Core Github repository soon after this pull request is merged.

If you're unsure, you can always ask for help in the #core-editor channel in WordPress Slack.

Thank you! ❤️

View changed files
❔ lib/block-supports/typography.php
❔ phpunit/block-supports/typography-test.php
❔ phpunit/data/themedir1/block-theme-child-with-fluid-typography-config/theme.json

@github-actions
Copy link

github-actions bot commented Jul 28, 2023

Size Change: +49 B (0%)

Total Size: 1.44 MB

Filename Size Change
build/block-editor/index.min.js 210 kB +6 B (0%)
build/block-library/blocks/file/style-rtl.css 280 B +11 B (+4%)
build/block-library/blocks/file/style.css 281 B +11 B (+4%)
build/block-library/index.min.js 202 kB +7 B (0%)
build/block-library/style-rtl.css 13.8 kB +6 B (0%)
build/block-library/style.css 13.8 kB +8 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 955 B
build/annotations/index.min.js 2.69 kB
build/api-fetch/index.min.js 2.28 kB
build/autop/index.min.js 2.1 kB
build/blob/index.min.js 451 B
build/block-directory/index.min.js 6.99 kB
build/block-directory/style-rtl.css 1.02 kB
build/block-directory/style.css 1.02 kB
build/block-editor/content-rtl.css 4.26 kB
build/block-editor/content.css 4.25 kB
build/block-editor/default-editor-styles-rtl.css 381 B
build/block-editor/default-editor-styles.css 381 B
build/block-editor/style-rtl.css 14.8 kB
build/block-editor/style.css 14.8 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 126 B
build/block-library/blocks/audio/theme.css 126 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 584 B
build/block-library/blocks/button/editor.css 582 B
build/block-library/blocks/button/style-rtl.css 624 B
build/block-library/blocks/button/style.css 623 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 409 B
build/block-library/blocks/columns/style.css 409 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 647 B
build/block-library/blocks/cover/editor.css 650 B
build/block-library/blocks/cover/style-rtl.css 1.61 kB
build/block-library/blocks/cover/style.css 1.6 kB
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 B
build/block-library/blocks/details/style-rtl.css 178 B
build/block-library/blocks/details/style.css 178 B
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 126 B
build/block-library/blocks/embed/theme.css 126 B
build/block-library/blocks/file/editor-rtl.css 316 B
build/block-library/blocks/file/editor.css 316 B
build/block-library/blocks/file/view-interactivity.min.js 317 B
build/block-library/blocks/file/view.min.js 375 B
build/block-library/blocks/footnotes/style-rtl.css 201 B
build/block-library/blocks/footnotes/style.css 199 B
build/block-library/blocks/freeform/editor-rtl.css 2.58 kB
build/block-library/blocks/freeform/editor.css 2.58 kB
build/block-library/blocks/gallery/editor-rtl.css 947 B
build/block-library/blocks/gallery/editor.css 952 B
build/block-library/blocks/gallery/style-rtl.css 1.53 kB
build/block-library/blocks/gallery/style.css 1.53 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/editor-rtl.css 654 B
build/block-library/blocks/group/editor.css 654 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 336 B
build/block-library/blocks/html/editor.css 337 B
build/block-library/blocks/image/editor-rtl.css 834 B
build/block-library/blocks/image/editor.css 833 B
build/block-library/blocks/image/style-rtl.css 1.42 kB
build/block-library/blocks/image/style.css 1.42 kB
build/block-library/blocks/image/theme-rtl.css 126 B
build/block-library/blocks/image/theme.css 126 B
build/block-library/blocks/image/view-interactivity.min.js 1.46 kB
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 507 B
build/block-library/blocks/media-text/style.css 505 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 712 B
build/block-library/blocks/navigation-link/editor.css 711 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 B
build/block-library/blocks/navigation/editor-rtl.css 2.26 kB
build/block-library/blocks/navigation/editor.css 2.26 kB
build/block-library/blocks/navigation/style-rtl.css 2.23 kB
build/block-library/blocks/navigation/style.css 2.22 kB
build/block-library/blocks/navigation/view-interactivity.min.js 988 B
build/block-library/blocks/navigation/view-modal.min.js 2.85 kB
build/block-library/blocks/navigation/view.min.js 469 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 401 B
build/block-library/blocks/page-list/editor.css 401 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 508 B
build/block-library/blocks/post-comments-form/style.css 508 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 588 B
build/block-library/blocks/post-featured-image/editor.css 586 B
build/block-library/blocks/post-featured-image/style-rtl.css 319 B
build/block-library/blocks/post-featured-image/style.css 319 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 314 B
build/block-library/blocks/post-template/style.css 314 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 69 B
build/block-library/blocks/post-time-to-read/style.css 69 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 125 B
build/block-library/blocks/preformatted/style.css 125 B
build/block-library/blocks/pullquote/editor-rtl.css 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 335 B
build/block-library/blocks/pullquote/style.css 335 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 302 B
build/block-library/blocks/query-pagination/style.css 299 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 450 B
build/block-library/blocks/query/editor.css 449 B
build/block-library/blocks/quote/style-rtl.css 222 B
build/block-library/blocks/quote/style.css 222 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 149 B
build/block-library/blocks/rss/editor.css 149 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 178 B
build/block-library/blocks/search/editor.css 178 B
build/block-library/blocks/search/style-rtl.css 587 B
build/block-library/blocks/search/style.css 584 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/search/view.min.js 631 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 323 B
build/block-library/blocks/shortcode/editor.css 323 B
build/block-library/blocks/site-logo/editor-rtl.css 754 B
build/block-library/blocks/site-logo/editor.css 754 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.44 kB
build/block-library/blocks/social-links/style.css 1.43 kB
build/block-library/blocks/spacer/editor-rtl.css 348 B
build/block-library/blocks/spacer/editor.css 348 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 645 B
build/block-library/blocks/table/style.css 644 B
build/block-library/blocks/table/theme-rtl.css 146 B
build/block-library/blocks/table/theme.css 146 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 403 B
build/block-library/blocks/template-part/editor.css 403 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/term-description/style-rtl.css 111 B
build/block-library/blocks/term-description/style.css 111 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 185 B
build/block-library/blocks/video/style.css 185 B
build/block-library/blocks/video/theme-rtl.css 126 B
build/block-library/blocks/video/theme.css 126 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.1 kB
build/block-library/common.css 1.1 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 12.1 kB
build/block-library/editor.css 12.1 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/theme-rtl.css 686 B
build/block-library/theme.css 691 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/blocks/index.min.js 51 kB
build/commands/index.min.js 15.3 kB
build/commands/style-rtl.css 849 B
build/commands/style.css 843 B
build/components/index.min.js 243 kB
build/components/style-rtl.css 11.8 kB
build/components/style.css 11.8 kB
build/compose/index.min.js 12.1 kB
build/core-commands/index.min.js 2.44 kB
build/core-data/index.min.js 16.4 kB
build/customize-widgets/index.min.js 12 kB
build/customize-widgets/style-rtl.css 1.46 kB
build/customize-widgets/style.css 1.45 kB
build/data-controls/index.min.js 640 B
build/data/index.min.js 8.28 kB
build/date/index.min.js 17.8 kB
build/deprecated/index.min.js 451 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.63 kB
build/edit-post/classic-rtl.css 544 B
build/edit-post/classic.css 545 B
build/edit-post/index.min.js 35.6 kB
build/edit-post/style-rtl.css 7.58 kB
build/edit-post/style.css 7.58 kB
build/edit-site/index.min.js 90.4 kB
build/edit-site/style-rtl.css 13.2 kB
build/edit-site/style.css 13.2 kB
build/edit-widgets/index.min.js 16.9 kB
build/edit-widgets/style-rtl.css 4.52 kB
build/edit-widgets/style.css 4.52 kB
build/editor/index.min.js 45.3 kB
build/editor/style-rtl.css 3.55 kB
build/editor/style.css 3.55 kB
build/element/index.min.js 4.8 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 7.59 kB
build/format-library/style-rtl.css 554 B
build/format-library/style.css 553 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.58 kB
build/interactivity/index.min.js 10.4 kB
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.64 kB
build/keycodes/index.min.js 1.84 kB
build/list-reusable-blocks/index.min.js 2.18 kB
build/list-reusable-blocks/style-rtl.css 836 B
build/list-reusable-blocks/style.css 836 B
build/media-utils/index.min.js 2.9 kB
build/notices/index.min.js 948 B
build/nux/index.min.js 1.99 kB
build/nux/style-rtl.css 735 B
build/nux/style.css 732 B
build/plugins/index.min.js 1.79 kB
build/preferences-persistence/index.min.js 1.84 kB
build/preferences/index.min.js 1.24 kB
build/primitives/index.min.js 943 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 951 B
build/react-i18n/index.min.js 615 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.7 kB
build/reusable-blocks/index.min.js 2.71 kB
build/reusable-blocks/style-rtl.css 243 B
build/reusable-blocks/style.css 243 B
build/rich-text/index.min.js 11 kB
build/router/index.min.js 1.77 kB
build/server-side-render/index.min.js 1.94 kB
build/shortcode/index.min.js 1.39 kB
build/style-engine/index.min.js 1.83 kB
build/token-list/index.min.js 582 B
build/url/index.min.js 3.57 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 958 B
build/warning/index.min.js 268 B
build/widgets/index.min.js 7.16 kB
build/widgets/style-rtl.css 1.15 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.02 kB

compressed-size-action

- add min and max viewport width to the theme.json schema
- supporting min and max viewport widths in PHP typography block supports
@ramonjd ramonjd force-pushed the add/fluid-typography-min-max-viewport-width branch from 0592224 to 314ea97 Compare August 4, 2023 00:39
@ramonjd ramonjd added the Needs PHP backport Needs PHP backport to Core label Aug 4, 2023
Max and min viewport values should be taken from $fluid_settings ;-P
@ramonjd ramonjd marked this pull request as ready for review August 4, 2023 02:06
@eric-michel
Copy link

Wow, that was super quick! Thanks @ramonjd! I hope this makes it in the next release since I believe that's when the max viewport width change is hitting 🤞

I (and our clients) really appreciate your work!

Copy link
Contributor

@tellthemachines tellthemachines left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is generally working well for me! I found something interesting though: if we set a smaller max value than min, the resizing goes the other way:

fontsbigger.mov

Is this something to be concerned about? I can't decide if it's a bug or an easter egg tbh 😄

$default_minimum_viewport_width = '320px';
$default_maximum_viewport_width = isset( $layout_settings['wideSize'] ) ? $layout_settings['wideSize'] : '1600px';
if ( isset( $fluid_settings['maxViewportWidth'] ) ) {
$default_maximum_viewport_width = $fluid_settings['maxViewportWidth'];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: does it still make sense to call this variable default_maximum_viewport_width now that its value is customisable?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point!

@andrewserong
Copy link
Contributor

Is this something to be concerned about? I can't decide if it's a bug or an easter egg tbh 😄

I just noticed that, too! It seemed quite delightful to me 😀

@ramonjd
Copy link
Member Author

ramonjd commented Aug 4, 2023

I found something interesting though: if we set a smaller max value than min, the resizing goes the other way:

Thanks for raising that. I was actually agonizing over this for the min/max font size values in the fluid presets as well and decided to not guard against user input in theme.json. My reasoning was that there are a bazillion ways to break a site using weird theme.json values, and getting min and max definitions mixed up was the least of our worries.

Having said this, I don't expect it to be very hard to return early if we detect a min value that is greater than max (and vice versa) if you think it's worth it. Very happy to update this PR to that effect.

@andrewserong
Copy link
Contributor

Having said this, I don't expect it to be very hard to return early if we detect a min value that is greater than max (and vice versa) if you think it's worth it. Very happy to update this PR to that effect.

I'd gently vote for leaving the behaviour as-is without guarding against whether one value is bigger/smaller than the other. I don't feel strongly about it, though 🙂

@ramonjd
Copy link
Member Author

ramonjd commented Aug 10, 2023

Is this possible? e.g. simply by setting minViewportWidth to the JSON value var(--wp--style--global--content-size) ?

Thanks for the thoughts @porg

At the moment the fluid calculations require numbers to generate the scale factors, but another thing that we could consider is porting over the "ref" functionality that theme.json styles use:

See: https://github.com/WordPress/gutenberg/blob/trunk/schemas/json/theme.json#L33

The gist of it is that we could specify a path in the theme json to arrive another value in the JSON tree. Example:

	"settings": {
		"appearanceTools": true,
		"layout": {
			"contentSize": "840px",
			"wideSize": "1100px"
		},
		"typography": {
			"fluid": {
				"maxViewportWidth": {
					"ref": "settings.layout.contentSize"
				},
				"minViewportWidth": "600px"
			}
		}
	},

Edit: I've added this idea to the tracking issue

@porg
Copy link

porg commented Aug 10, 2023

  1. Hi, yes that „ref“ function which can point to any JSON path would fulfill the requirement.

  2. „Sprint planning“

  • I saw that you added this very issue to the tracking issue under section „Wishlist“ twice.
    • The first mention being the issue title in its core function
    • the second being the extension to include the ref function.
  • I hope that this will get completed and not forgotten then.
    • So are you personally continuing on this issue to add what‘s needed, then a re-opening (second commit and merging) of this very ticket probably reflects the state better, would it?
    • If the ref function integration happens later then please better create a stand-alone followup issue.

@ramonjd
Copy link
Member Author

ramonjd commented Aug 10, 2023

I saw that you added this very issue to the tracking issue under section „Wishlist“ twice.
The first mention being the issue title in its core function
the second being the extension to include the ref function.

That's a fair summary.

I hope that this will get completed and not forgotten then.
So are you personally continuing on this issue to add what‘s needed, then a re-opening (second commit and merging) of this very ticket probably reflects the state better, would it?
If the ref function integration happens later then please better create a stand-alone followup issue.

I'm the only one actively working on fluid typography, which is good and bad. Good that I can understand issues (maybe) more quickly, but bad in that it's a competing demand on my time. If it's on the tracking issue, it won't be forgotten. Once I get time to address it then a standalone issue/PR will be pushed to cover it.

@porg
Copy link

porg commented Aug 10, 2023

Created standalone issue (for tracking!)

Which please should be added to section "Wishlist" at:

Thanks!

Copy link
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Edited: whoops, added a comment to the wrong PR! 😅 (I meant to add a review to #53551)

@eric-michel
Copy link

Hey Everyone! I'm not sure if this is the right place to ask this question. I see that this PR has been merged into trunk (thank you again @ramonjd!), but did not make it into the WP 6.3 release. Is there any chance that this change could be included in a minor release in the next couple weeks? We have several sites developed under the previous paradigm (1600px maxViewportWidth and 768px minViewPortWidth) including a 400+ page website.

If this PR cannot be deployed in a minor release, we're faced with the prospect of upgrading to 6.3 and having to check many hundreds of pages at every viewport width to confirm if text sizes need to be changed, or waiting several months for another major release before updating WP. Both are daunting propositions.

I'm not really sure who makes the decisions about what gets included in minor releases, but if you can point me in their direction I will throw myself on their mercy in hopes of getting this update included 😬

@ramonjd
Copy link
Member Author

ramonjd commented Aug 16, 2023

Thanks @eric-michel At this stage, because it's a new feature and not a major bug fix, I'm not sure that this PR's changes will arrive in the next minor release. 6.4 is a couple of months away I believe.

Could you install the Gutenberg plugin perhaps to get the functionality you need?

@eric-michel
Copy link

@ramonjd I was afraid of that, sadly. Is there anyone I can make my case to who makes the decisions about what gets folded into minor releases? This is more of a backwards compatibility issue for us than a new feature.

If not, we'll just let our clients know that we'll need to wait for 6.4 before updating. Not ideal, but not the end of the world. I'm tempted to try the Gutenberg plugin as you suggested, but I'm wary of adding a bunch of other features that may have unintended effects. I appreciate the suggestion though!

@ramonjd
Copy link
Member Author

ramonjd commented Aug 17, 2023

Is there anyone I can make my case to who makes the decisions about what gets folded into minor releases? This is more of a backwards compatibility issue for us than a new feature.

I'd defer to @tellthemachines or @ndiego but given the tight timeline I'm not sure sure it'll make 6.3.1.

In upcoming work, there's a case for a filter to short-circuit typography values. This might provide options for developers in the future between the staggered introduction of new features.

I'm tempted to try the Gutenberg plugin as you suggested, but I'm wary of adding a bunch of other features that may have unintended effects. I appreciate the suggestion though!

I'm happy to help as much as I can if you run into issues. There have been quite a few new features introduced and it might not be as stable as core, depending on your setup.

@ndiego
Copy link
Member

ndiego commented Aug 17, 2023

I'd defer to @tellthemachines or @ndiego but given the tight timeline I'm not sure sure it'll make 6.3.1.

I'm just catching up here. This is a new feature, right?

@ramonjd
Copy link
Member Author

ramonjd commented Aug 17, 2023

This is a new feature, right?

Technically, yes so I think we could aim for 6.4? There's a core backport patch ready

@ndiego
Copy link
Member

ndiego commented Aug 17, 2023

Yeah, my gut is saying 6.4. Unless there are extenuating circumstances, and all leads would need to agree, there really shouldn't be any new features in minor releases. Just major bugs as you mentioned.

@eric-michel
Copy link

@ramonjd Thanks for checking on this and all the work you've done! It's sincerely appreciated by all of our team (and clients, whether they realize it or not 😉).

@ndiego Thanks for taking a look - we'll just wait for 6.4 before updating.

@ramonjd
Copy link
Member Author

ramonjd commented Oct 12, 2023

✍🏻 Dev note

Fluid typography: configurable minimum and maximum viewport values

WordPress 6.4 introduces configurable minimum and maximum viewport width values to fluid typography settings in theme.json.

Theme developers can now define their own default viewport "boundaries" for calculating fluid font sizes. These boundaries determine the browser viewport widths at which any font size clamp values will stop being "fluid".

For example, given the following theme.json settings:

"settings": {
	"typography": {
		"fluid": {
			"maxViewportWidth": "800px",
			"minViewportWidth": "600px"
		},
	  }
}

Between the browser widths of 600px and 800px, a font size will be fluid, and therefore scale up or down according to the current viewport size. If the browser width is narrower than 600px or wider than 800px, the font size will no longer shrink or grow.

Due to the way the Block Editor calculates fluid font size values, maxViewportWidth and minViewportWidth only accept px, rem and em units.

In the case of unsupported values, including CSS variables, fallback maxViewportWidth and minViewportWidth are used -1600px and '320px' respectively.

@mhennessie
Copy link

mhennessie commented Nov 21, 2023

I was hoping this might take place of using a fluid type mixin in my sass so I only have to set the theme font sizes in one location but I cannot figure out how is this calculation done using minViewportWidth and maxViewportWidth. The values I use do not seem to correlate when it starts/stops scaling. For example values of 768px and 1440px, it is fluid between 347px and 1021px.

The example values of 600px and 800px, scaling happens between 475px and 675px. It doesn't make any sense.

I am running WP 6.4.1

@ramonjd
Copy link
Member Author

ramonjd commented Nov 21, 2023

Hi @mhennessie

Thanks for the feedback. I'm interested to learn about your setup, and how you're testing it, including theme.json settings and the blocks HTML.

I've been testing with a basic theme and no plugins. Here's the theme.json I'm using

	"settings": {
		"appearanceTools": true,
		"layout": {
			"contentSize": "840px",
			"wideSize": "1100px"
		},
		"typography": {
			"fluid": {
				"maxViewportWidth": "768px",
				"minViewportWidth": "1440px"
			}
		}
	},
And the block HTML
<!-- wp:group {"style":{"spacing":{"blockGap":"var:preset|spacing|60","padding":{"left":"var:preset|spacing|50","right":"var:preset|spacing|60","top":"var:preset|spacing|70","bottom":"var:preset|spacing|80"},"margin":{"top":"186px","bottom":"199px"}},"border":{"width":"40px"}},"layout":{"type":"constrained"}} -->
<div class="wp-block-group" style="border-width:40px;margin-top:186px;margin-bottom:199px;padding-top:var(--wp--preset--spacing--70);padding-right:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--80);padding-left:var(--wp--preset--spacing--50)"><!-- wp:paragraph {"style":{"typography":{"fontSize":"104px"},"color":{"background":"#f8700e"}}} -->
<p class="has-background" style="background-color:#f8700e;font-size:104px">test</p>
<!-- /wp:paragraph --></div>
<!-- /wp:group -->

Checkout the computed font-size down at the bottom right.

2023-11-22.10.03.01.mp4

The boundaries appear to work as intended. The "test" paragraph has a max font-size of 104px, which is reached once the window size reaches 768pxor lower.

@mhennessie
Copy link

Here is what I have... the H1 should be 40px when the viewport is less than 576px and 48px when the viewport is more than 1200px. This is a custom theme but only ACF is installed and I have disabled the fluid type mixin for the H1. The block I am testing is just the core/heading block.

The block html is a simple H1 heading block:

<h1 class="wp-block-heading">This is an H1 heading</h1>

Generated css var

--wp--preset--font-size--h-1: clamp(40px, 2.5rem + ((1vw - 5.76px) * 1.282), 48px);

The theme.json looks like this (truncated):

"settings": {
    "layout": {
        "contentSize": "100%",
        "wideSize": "1440px"
    },
    "typography": {
	"fluid": {
	    "minViewportWidth": "576px",
	    "maxViewportWidth": "1200px"
	},
        "fontSizes": [
            {
	       	"size": "48px",
		"fluid": {
		    "min": "40px",
		    "max": "48px"
		},
		"slug": "h1",
                "name": "H1"
            }
        ]
    }
},
"styles": {
    "elements": {
        "h1": {
            "spacing": {},
	    "typography": {
	        "fontFamily": "p22-mackinac-pro",
		"fontSize": "var(--wp--preset--font-size--h-1)",
		"lineHeight": "1.2"
	    }
        }
    }
}
wp-fluid-type.mov

@ramonjd
Copy link
Member Author

ramonjd commented Nov 23, 2023

Thanks for providing extra details.

the H1 should be 40px when the viewport is less than 576px and 48px when the viewport is more than 1200px

On your screencast I'm seeing that the H1 goes down to around 42ish px at the minimum width, but it respects the 48px maximum.

I tried again using your theme.json settings. WordPress 6.4.1, no plugins and very bare-bones block theme, and I can't reproduce:

2023-11-23.11.57.16.mp4

Same with Gutenberg activated.

Are there any surrounding HTML elements whose styles might be affecting things here?

fluid type mixin

Is that a sass mixin?

@mhennessie
Copy link

Ok, I figured it out. My root font-size was 18px in my css which completely throws it off. Changing it to 16px, it works perfectly. Thank you for helping me troubleshoot this!

@ramonjd
Copy link
Member Author

ramonjd commented Nov 23, 2023

Ok, I figured it out. My root font-size was 18px in my css which completely throws it off. Changing it to 16px, it works perfectly. Thank you for helping me troubleshoot this!

Good stuff. Happy to help.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Typography Font and typography-related issues and PRs [Type] Enhancement A suggestion for improvement.
Projects
No open projects
Status: Done
Development

Successfully merging this pull request may close these issues.

8 participants