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

Update design of FontSizePicker when withSlider is set #44598

Merged
merged 10 commits into from
Oct 24, 2022

Conversation

noisysocks
Copy link
Member

@noisysocks noisysocks commented Sep 30, 2022

What?

Updates the design and behaviour of FontSizePicker when withSlider is set to match the design.

  • The slider will now only appear when setting a custom font size value.
  • The slider will appear inline with the custom font size field.
  • Users can now edit em and rem values using the slider.

Why?

Part of an effort to make the Typography panel match the design. See #34345 (comment).

How?

Testing Instructions

  1. Open the site editor.
  2. Go to Global Styles → Typography → Text.
  3. Select Set custom size.
  4. Play with setting different custom font sizes using the text field and slider.

Screenshots or screencast

Global styles:

Before After
Screen Shot 2022-09-30 at 15 34 57 Screen Shot 2022-09-30 at 15 35 25

Storybook:

Before After
Screen Shot 2022-09-30 at 15 41 24 Screen Shot 2022-09-30 at 15 40 52

Storybook with Reset button:

This isn't used anywhere in Gutenberg (we could probably deprecate withReset) but I ensured it looks reasonable as this is the default.

Before After
Screen Shot 2022-09-30 at 15 41 24 Screen Shot 2022-09-30 at 15 43 28

Video:

Kapture.2022-09-30.at.15.46.05.mp4

@noisysocks noisysocks added [Type] Enhancement A suggestion for improvement. [Package] Components /packages/components Global Styles Anything related to the broader Global Styles efforts, including Styles Engine and theme.json labels Sep 30, 2022
@noisysocks noisysocks self-assigned this Sep 30, 2022
@github-actions
Copy link

github-actions bot commented Sep 30, 2022

Size Change: -67 B (0%)

Total Size: 1.28 MB

Filename Size Change
build/block-editor/index.min.js 169 kB +10 B (0%)
build/components/index.min.js 202 kB -87 B (0%)
build/edit-site/index.min.js 57.9 kB +7 B (0%)
build/edit-site/style-rtl.css 8.37 kB +1 B (0%)
build/edit-site/style.css 8.35 kB +2 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 982 B
build/annotations/index.min.js 2.76 kB
build/api-fetch/index.min.js 2.26 kB
build/autop/index.min.js 2.14 kB
build/blob/index.min.js 475 B
build/block-directory/index.min.js 7.09 kB
build/block-directory/style-rtl.css 990 B
build/block-directory/style.css 991 B
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-editor/style-rtl.css 15.8 kB
build/block-editor/style.css 15.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 84 B
build/block-library/blocks/avatar/style.css 84 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 482 B
build/block-library/blocks/button/editor.css 482 B
build/block-library/blocks/button/style-rtl.css 523 B
build/block-library/blocks/button/style.css 523 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 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 100 B
build/block-library/blocks/categories/style.css 100 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 406 B
build/block-library/blocks/columns/style.css 406 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 612 B
build/block-library/blocks/cover/editor.css 613 B
build/block-library/blocks/cover/style-rtl.css 1.57 kB
build/block-library/blocks/cover/style.css 1.55 kB
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 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 253 B
build/block-library/blocks/file/style.css 254 B
build/block-library/blocks/file/view.min.js 346 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 948 B
build/block-library/blocks/gallery/editor.css 950 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 394 B
build/block-library/blocks/group/editor.css 394 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 327 B
build/block-library/blocks/html/editor.css 329 B
build/block-library/blocks/image/editor-rtl.css 880 B
build/block-library/blocks/image/editor.css 880 B
build/block-library/blocks/image/style-rtl.css 627 B
build/block-library/blocks/image/style.css 630 B
build/block-library/blocks/image/theme-rtl.css 126 B
build/block-library/blocks/image/theme.css 126 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 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 463 B
build/block-library/blocks/latest-posts/style.css 462 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 705 B
build/block-library/blocks/navigation-link/editor.css 703 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.02 kB
build/block-library/blocks/navigation/editor.css 2.03 kB
build/block-library/blocks/navigation/style-rtl.css 2.17 kB
build/block-library/blocks/navigation/style.css 2.16 kB
build/block-library/blocks/navigation/view-modal.min.js 2.78 kB
build/block-library/blocks/navigation/view.min.js 443 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 363 B
build/block-library/blocks/page-list/editor.css 363 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 493 B
build/block-library/blocks/post-comments-form/style.css 493 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 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 586 B
build/block-library/blocks/post-featured-image/editor.css 584 B
build/block-library/blocks/post-featured-image/style-rtl.css 315 B
build/block-library/blocks/post-featured-image/style.css 315 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 282 B
build/block-library/blocks/post-template/style.css 282 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-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 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 326 B
build/block-library/blocks/pullquote/style.css 325 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 282 B
build/block-library/blocks/query-pagination/style.css 278 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 439 B
build/block-library/blocks/query/editor.css 439 B
build/block-library/blocks/quote/style-rtl.css 213 B
build/block-library/blocks/quote/style.css 213 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 202 B
build/block-library/blocks/rss/editor.css 204 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 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 409 B
build/block-library/blocks/search/style.css 406 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 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 464 B
build/block-library/blocks/shortcode/editor.css 464 B
build/block-library/blocks/site-logo/editor-rtl.css 490 B
build/block-library/blocks/site-logo/editor.css 490 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.4 kB
build/block-library/blocks/social-links/style.css 1.39 kB
build/block-library/blocks/spacer/editor-rtl.css 322 B
build/block-library/blocks/spacer/editor.css 322 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 494 B
build/block-library/blocks/table/editor.css 494 B
build/block-library/blocks/table/style-rtl.css 611 B
build/block-library/blocks/table/style.css 609 B
build/block-library/blocks/table/theme-rtl.css 190 B
build/block-library/blocks/table/theme.css 190 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 235 B
build/block-library/blocks/template-part/editor.css 235 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/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 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 691 B
build/block-library/blocks/video/editor.css 694 B
build/block-library/blocks/video/style-rtl.css 174 B
build/block-library/blocks/video/style.css 174 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 162 B
build/block-library/classic.css 162 B
build/block-library/common-rtl.css 1.02 kB
build/block-library/common.css 1.02 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 11.2 kB
build/block-library/editor.css 11.2 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 192 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 12.3 kB
build/block-library/style.css 12.3 kB
build/block-library/theme-rtl.css 719 B
build/block-library/theme.css 722 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 49.9 kB
build/components/style-rtl.css 11.3 kB
build/components/style.css 11.3 kB
build/compose/index.min.js 12.2 kB
build/core-data/index.min.js 15.5 kB
build/customize-widgets/index.min.js 11.3 kB
build/customize-widgets/style-rtl.css 1.38 kB
build/customize-widgets/style.css 1.38 kB
build/data-controls/index.min.js 653 B
build/data/index.min.js 8.08 kB
build/date/index.min.js 32.1 kB
build/deprecated/index.min.js 507 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.7 kB
build/edit-navigation/index.min.js 16.1 kB
build/edit-navigation/style-rtl.css 3.99 kB
build/edit-navigation/style.css 4 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/index.min.js 31.8 kB
build/edit-post/style-rtl.css 7.13 kB
build/edit-post/style.css 7.13 kB
build/edit-widgets/index.min.js 16.7 kB
build/edit-widgets/style-rtl.css 4.34 kB
build/edit-widgets/style.css 4.34 kB
build/editor/index.min.js 41.7 kB
build/editor/style-rtl.css 3.62 kB
build/editor/style.css 3.61 kB
build/element/index.min.js 4.68 kB
build/escape-html/index.min.js 537 B
build/experiments/index.min.js 868 B
build/format-library/index.min.js 6.95 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.64 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.77 kB
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.78 kB
build/keycodes/index.min.js 1.83 kB
build/list-reusable-blocks/index.min.js 2.13 kB
build/list-reusable-blocks/style-rtl.css 835 B
build/list-reusable-blocks/style.css 835 B
build/media-utils/index.min.js 2.93 kB
build/notices/index.min.js 963 B
build/nux/index.min.js 2.06 kB
build/nux/style-rtl.css 732 B
build/nux/style.css 728 B
build/plugins/index.min.js 1.94 kB
build/preferences-persistence/index.min.js 2.22 kB
build/preferences/index.min.js 1.33 kB
build/primitives/index.min.js 933 B
build/priority-queue/index.min.js 1.58 kB
build/react-i18n/index.min.js 696 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.74 kB
build/reusable-blocks/index.min.js 2.21 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.6 kB
build/server-side-render/index.min.js 1.77 kB
build/shortcode/index.min.js 1.53 kB
build/style-engine/index.min.js 1.46 kB
build/token-list/index.min.js 644 B
build/url/index.min.js 3.61 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 38.5 kB
build/vendors/react.min.js 4.34 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 268 B
build/widgets/index.min.js 7.21 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.19 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@@ -19,6 +19,7 @@
margin-bottom: $grid-unit-20;
background: $gray-100;
border-radius: $radius-block-ui;
overflow: hidden;
Copy link
Member Author

Choose a reason for hiding this comment

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

This stops the Aa text breaking out of the font preview container when the font size is really large.

isFinite( Number( numericValue ) )
) {
return [ numericValue, unit ];
export function parseNumberAndUnitFromSize(
Copy link
Member Author

Choose a reason for hiding this comment

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

Not really necessary for this PR but I thought I'd update this function to:

  • accept undefined, since that's a valid input to FontSizePicker;
  • be more strict about what is returned, i.e.
    • specify a return type;
    • return a number instead of a string containing a number;
  • use a regular regex with capturing groups instead of relying on /g behaviour;
  • not use "value" in the name since that can be confused with the value prop in FontSizePicker.

Copy link
Contributor

@ciampo ciampo Oct 14, 2022

Choose a reason for hiding this comment

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

UnitControl has got a bunch of utils function that potentially achieve a very similar (if not the same) result: https://github.com/WordPress/gutenberg/blob/1326a46cf10ad54e897d1f3c9aaa0e385aba896a/packages/components/src/unit-control/utils.ts

Maybe we could use those function directly? It would remove redundant code AND make sure that we're more consistent on the way we parse unit and values.

Also happy if we want to leave this task separate and work on it in the future.

Copy link
Member Author

Choose a reason for hiding this comment

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

Oh fantastic! That lets us delete this altogether 😀

const [ , firstFontSizeUnit ] = parseNumberAndUnitFromSize(
fontSizes[ 0 ]?.size
);
const hasUnits = !! valueUnit || !! firstFontSizeUnit;
Copy link
Member Author

@noisysocks noisysocks Oct 4, 2022

Choose a reason for hiding this comment

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

Also not really necessary for this PR but was irking me. Previously hasUnits was calculated by checking the type of value and the first option's size. If either was a string then we'd allow units. This isn't 100% correct though since technically a font size can be a string containing a number with no unit, i.e. "30". This new logic uses parseNumberAndUnitFromSize which is a little more tedious but correct.

Copy link
Member Author

Choose a reason for hiding this comment

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

I was wrong about this. See #44598 (comment).

}: {
selectedItem: FontSizeSelectOption;
} ) => {
if ( selectedItem.size === undefined ) {
Copy link
Member Author

@noisysocks noisysocks Oct 4, 2022

Choose a reason for hiding this comment

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

I changed all of the onChange callbacks to explicitly handle the undefined case because:

  • I think it's easier to understand, and;
  • if hasUnits is false then you could get into a situation where onChange is called with NaN because Number( undefined ) === NaN.

Comment on lines 310 to 312
min={ isValueUnitRelative ? 0.75 : 12 }
max={ isValueUnitRelative ? 6.25 : 100 }
step={ isValueUnitRelative ? 0.05 : 1 }
Copy link
Member Author

@noisysocks noisysocks Oct 4, 2022

Choose a reason for hiding this comment

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

I chose these new em/rem values to be roughly equivalent to the previous px values assuming a 16px base font size.

Copy link
Contributor

Choose a reason for hiding this comment

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

These values feel nice to play with in the UI! 👍

Copy link
Contributor

Choose a reason for hiding this comment

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

@glendaviesnz also made similar changes in #44959 for spacing. Font size is a bit different to spacing, so not sure if it makes sense to align these values.

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.

Nice work @noisysocks, this is looking really good! Just left a couple of questions, but no real issues from the code side of things to me 👍

From the UI perspective, these are all mostly nits / fine-tuning notes. It looks like a gutter might need to be added to the left (and possibly right) of the slider bar so that there's a little breathing room, and for consistency with the spacing controls (#44858). For example, in Storybook, the thumb lines up/overlaps the reset button slightly in the right-most position:

image

For the gutter between the UnitControl and the slider, there's a bit of discussion on @aaronrobertshaw's PR #44858 (comment) where @jasmussen mentioned 16px.

Similar to that PR, I noticed that in the 100% position, the tooltip results in a scrollbar being introduced in browsers that have visible scrollbars switched on — not sure if that's also something to be addressed via gutters 🤔 (I suspect it's because the thumb hangs over the edge of the space for the component?):

Last one: (not sure if this is something to be looked into separately), the click and drag behaviour on the UnitControl currently allows negative values to be used, so if you're scrolling down below 0, negative values are displayed and the slider pops into the middle position. Would it be worth adding a min value to the <FontSizePicker>?

Other than that, this looks very close to me!

packages/components/src/font-size-picker/index.tsx Outdated Show resolved Hide resolved
packages/components/src/font-size-picker/index.tsx Outdated Show resolved Hide resolved
Comment on lines 310 to 312
min={ isValueUnitRelative ? 0.75 : 12 }
max={ isValueUnitRelative ? 6.25 : 100 }
step={ isValueUnitRelative ? 0.05 : 1 }
Copy link
Contributor

Choose a reason for hiding this comment

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

These values feel nice to play with in the UI! 👍

@ramonjd
Copy link
Member

ramonjd commented Oct 12, 2022

I just rebased this onto trunk to get the latest fluid type commits and tested in TT3.

I noticed that, for some custom fields, I can't change the unit:

Maybe it's something to do with the style value defined in theme.json.

Here's the h2, which is a clamp value. And h4: a CSS var.

And h1, which is a simple value + unit.

I can change the units for h1 but not h4 and h2.

@noisysocks noisysocks requested a review from ciampo October 12, 2022 23:30
@noisysocks
Copy link
Member Author

Thanks for the reviews! 🙇

It looks like a gutter might need to be added to the left (and possibly right) of the slider bar so that there's a little breathing room, and for consistency with the spacing controls (#44858).

Good flag! I added a 8px margin to the left and right of the slider. When combined with the existing 8px flex gap that makes for a 16px space between the unit control and slider. (We can't set the flex gap to 16px because then the unit control won't align with other single column controls in Global Styles.)

Screen Shot 2022-10-13 at 14 13 46

Screen Shot 2022-10-13 at 14 15 12

Last one: (not sure if this is something to be looked into separately), the click and drag behaviour on the UnitControl currently allows negative values to be used, so if you're scrolling down below 0, negative values are displayed and the slider pops into the middle position. Would it be worth adding a min value to the ?

A min of 0 makes total sense since negative font sizes aren't a thing. Added.

I noticed that, for some custom fields, I can't change the unit:

@ramonjd I can't reproduce what you see there when I test in Twenty Twenty-three. Want to double check? What am I missing? 😅

@ramonjd
Copy link
Member

ramonjd commented Oct 13, 2022

I can't reproduce what you see there when I test in Twenty Twenty-three. Want to double check? What am I missing? 😅

Did you rebase onto trunk? I just nuked my environment, then checked out this branch and rebased and can still reproduce.

Running WordPress 6.1-RC1-54506

I'm very willing to accept that it's just me by the way 😄

@noisysocks noisysocks force-pushed the update/font-size-picker-slider branch from 001e0de to ab52205 Compare October 13, 2022 04:03
@noisysocks
Copy link
Member Author

Thanks @ramonjd, I did indeed forget to rebase trunk 😀

That bug should be fixed now. Turns out I was wrong about #44598 (comment). If we stop doing the naive check for typeof value === 'string' then hasUnits won't be true when the value is a clamp() value which means that the user can't select a unit. I restored the logic back to how it is in trunk.

Thinking about this, probably what makes more sense is to have the caller of FontSizePicker use an argument to say what units are supported rather than FontSizePicker inferring it from value and fontSizes. That's a PR for another day, though.

@noisysocks
Copy link
Member Author

Keen to get @ciampo to double check the code here but in particular my assumption that it's an "enhancement" and not a "breaking change" to change how the component looks when withSlider is set.

@ramonjd
Copy link
Member

ramonjd commented Oct 14, 2022

That bug should be fixed now.

I can confirm that it's fixed, thanks!

2022-10-14.14.39.05.mp4

Thinking about this, probably what makes more sense is to have the caller of FontSizePicker use an argument to say what units are supported rather than FontSizePicker inferring it from value and fontSizes. That's a PR for another day, though.

And have the incoming units populate the drop down? That makes sense! Agree it's a PR for "later Rob" 😄

I'm not sure if this a UX problem or not. If I want a font size of > 100 anything, the slider becomes a little redundant in that I can adjust around my selected value, only between 0-100. And if I touch the slider my custom font size is reset to 100.

2022-10-14.14.49.44.mp4

My brain expected the slider to adjust the value in the UI control.

I get that it might not be practical to have the slider adjust the range according to the custom value however, I'm not sure what's right here.

@noisysocks
Copy link
Member Author

Hm not sure what we could do about that. Dynamically set the max of the slider? It could get confusing then that different positions on the slider correspond to different values depending on what you previously entered. For what it's worth this is how the UnitControl + RangeSlider pattern works in other parts of the block editor that uses it. (Margins and padding, specifically.)

@ciampo
Copy link
Contributor

ciampo commented Oct 14, 2022

Catching up with my review queue, I'll try to give this PR a thorough look next week — but in the meantime:

  • I also think this can be classified as an enhancement, given how high-level this component is (i.e. we're not making a substantial change to a primitive component)
  • Re the max value of input and slider, my gut feeling is that those two components should be kept in sync when they're shown together, and should therefore have the same min and max boundaries

@ramonjd
Copy link
Member

ramonjd commented Oct 16, 2022

For what it's worth this is how the UnitControl + RangeSlider pattern works in other parts of the block editor that uses it.

Ah that's interesting thanks. Maybe we could decide on a universal behaviour here and perform a sidebar-wide revisit in another PR?

@ramonjd
Copy link
Member

ramonjd commented Oct 24, 2022

What would the max be for a font size though? Any positive number is technically valid 😅 Should we pick an arbitrary largish number e.g. 1000?

I'm not sure about this, but about updating the step and max attributes of the range dynamically? I mean everything over a threshold, e.g., 100, would be the new max and step === rangeInput.value / STEP_DEMONINATOR

So, starting with a default max of 100 and base denominator of 10 for the step:

2022-10-24 13 55 54

@noisysocks
Copy link
Member Author

I do like that. But how about we implement that logic in SliderUnitControl and stick to the status quo for now? That way the behaviour will be consistent across components.

@noisysocks noisysocks force-pushed the update/font-size-picker-slider branch from 6495837 to df15dc5 Compare October 24, 2022 03:34
@noisysocks
Copy link
Member Author

I rebased this, removed parseNumberAndUnit in favour of the existing parseQuantityAndUnitFromRawValue, and have made the min, max and step values consistent with SpacingSizesControl. How are we feeling? 🙂

@aaronrobertshaw
Copy link
Contributor

I do like that. But how about we implement that logic in SliderUnitControl and stick to the status quo for now? That way the behaviour will be consistent across components.

I've added this to the tracking issue and will look to work the dynamic max/step into the SliderUnitControl.

Copy link
Member

@ramonjd ramonjd left a comment

Choose a reason for hiding this comment

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

LGTM.

This is working as described. I tested using different units and for elements, blocks in Global styles, as well as at the block-level.

Does this need a CHANGELOG entry?

Another possible follow up might be to see if adding touch-action: none; to the custom input numeric field improves interactivity on touch devices:

Without
2022-10-24 15 14 29

With
2022-10-24 15 14 14

@aaronrobertshaw
Copy link
Contributor

Another possible follow up might be to see if adding touch-action: none; to the custom input numeric field improves interactivity on touch devices:

This was something I'd added to the new SliderNumberControl etc. Didn't see any issues in initial testing but had flagged it for a call out when it comes time for reviews.

@noisysocks
Copy link
Member Author

Another possible follow up might be to see if adding touch-action: none; to the custom input numeric field improves interactivity on touch devices:

Looks like there's an issue for this: #38865

Does this need a CHANGELOG entry?

Thanks, added!

@noisysocks noisysocks merged commit 98803a3 into trunk Oct 24, 2022
@noisysocks noisysocks deleted the update/font-size-picker-slider branch October 24, 2022 05:20
@github-actions github-actions bot added this to the Gutenberg 14.5 milestone Oct 24, 2022
Comment on lines -44 to -83
const splitValuesCases: [
number | string,
string | undefined,
string | undefined
][] = [
// Test integers and non-integers.
[ 1, '1', undefined ],
[ 1.25, '1.25', undefined ],
[ '123', '123', undefined ],
[ '1.5', '1.5', undefined ],
[ '0.75', '0.75', undefined ],
// Valid simple CSS values.
[ '20px', '20', 'px' ],
[ '0.8em', '0.8', 'em' ],
[ '2rem', '2', 'rem' ],
[ '1.4vw', '1.4', 'vw' ],
[ '0.4vh', '0.4', 'vh' ],
// Invalid negative values,
[ '-5px', undefined, undefined ],
// Complex CSS values that shouldn't parse.
[ 'abs(-15px)', undefined, undefined ],
[ 'calc(10px + 1)', undefined, undefined ],
[ 'clamp(2.5rem, 4vw, 3rem)', undefined, undefined ],
[ 'max(4.5em, 3vh)', undefined, undefined ],
[ 'min(10px, 1rem)', undefined, undefined ],
[ 'minmax(30px, auto)', undefined, undefined ],
[ 'var(--wp--font-size)', undefined, undefined ],
];

describe( 'splitValueAndUnitFromSize', () => {
test.each( splitValuesCases )(
'given %p as argument, returns value = %p and unit = %p',
( cssValue, expectedValue, expectedUnit ) => {
const [ value, unit ] = splitValueAndUnitFromSize( cssValue );
expect( value ).toBe( expectedValue );
expect( unit ).toBe( expectedUnit );
}
);
} );

Copy link
Contributor

Choose a reason for hiding this comment

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

Would it be useful to add these tests to the UnitControl utils that FontSizePicker is now reusing?

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 plan. I'll spin up a PR.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Global Styles Anything related to the broader Global Styles efforts, including Styles Engine and theme.json Needs User Documentation Needs new user documentation [Package] Components /packages/components [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants