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

Font Size Picker: Allow non-integers as simple CSS values and in hints #36636

Merged
merged 3 commits into from
Nov 30, 2021

Conversation

aaronrobertshaw
Copy link
Contributor

@aaronrobertshaw aaronrobertshaw commented Nov 19, 2021

Related:

Description

This PR:

  • Allows for non-integer font-size values such as 1.5rem to be accepted as simple CSS values
  • Allows for non-integer values that are < 1. e.g. 0.75em
  • Adds a new FontSizePicker story that includes complex CSS and non-integer values
  • Adds unit tests for isSimpleCssValue and splitValueAndUnitFromSize util functions

Note: This PR builds upon the approach taken and discussion in #36420. Credit goes to @ndiego

Earlier iterations of this PR removed the hints from the select control however upon further discussion they have been reinstated.

How has this been tested?

Unit Tests:

  1. Run npm run test-unit:watch packages/components/src/font-size-picker/test
  2. Ensure all the original component tests pass as well as the new utils.js tests

Storybook:

  1. Fire up the Storybook: npm run storybook:dev
  2. Visit: http://localhost:50240/?path=/story/components-fontsizepicker--with-complex-css-values
  3. Ensure the control behaves as you'd expect
  4. Adjust the font-size config via the "Knobs" tab and try different font-size values

Block Editor:

  1. Set your active theme to TwentyTwentyTwo
  2. Create a new post in the block editor and a paragraph with text
  3. In the inspector controls manipulate the paragraph's font-size
  4. Ensure that various font-size selections are reflected correctly in the control's label and each option's hint appears correctly.

Screenshots

Storybook Editor
FontSizePickers-HintsReinstatedStory FontSizePickers-HintsReinstatedEditor

Types of changes

Enhancement.

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • I've tested my changes with keyboard and screen readers.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • I've updated all React Native files affected by any refactorings/renamings in this PR (please manually search all *.native.js files for terms that need renaming or removal).

@aaronrobertshaw aaronrobertshaw added [Feature] UI Components Impacts or related to the UI component system [Feature] Design Tools Tools that impact the appearance of blocks both to expand the number of tools and improve the experi labels Nov 19, 2021
@aaronrobertshaw aaronrobertshaw self-assigned this Nov 19, 2021
@github-actions
Copy link

github-actions bot commented Nov 19, 2021

Size Change: +2.61 kB (0%)

Total Size: 1.1 MB

Filename Size Change
build/block-editor/index.min.js 139 kB +110 B (0%)
build/block-editor/style-rtl.css 14.4 kB +25 B (0%)
build/block-editor/style.css 14.4 kB +21 B (0%)
build/block-library/blocks/cover/style-rtl.css 1.22 kB +29 B (+2%)
build/block-library/blocks/cover/style.css 1.22 kB +29 B (+2%)
build/block-library/blocks/gallery/editor-rtl.css 976 B -1 B (0%)
build/block-library/blocks/gallery/editor.css 980 B -2 B (0%)
build/block-library/blocks/home-link/style-rtl.css 0 B -247 B (removed) 🏆
build/block-library/blocks/home-link/style.css 0 B -247 B (removed) 🏆
build/block-library/blocks/navigation-submenu/style-rtl.css 0 B -213 B (removed) 🏆
build/block-library/blocks/navigation-submenu/style.css 0 B -213 B (removed) 🏆
build/block-library/blocks/navigation/style-rtl.css 1.66 kB +79 B (+5%) 🔍
build/block-library/blocks/navigation/style.css 1.65 kB +79 B (+5%) 🔍
build/block-library/blocks/post-featured-image/editor-rtl.css 721 B -50 B (-6%)
build/block-library/blocks/post-featured-image/editor.css 721 B -50 B (-6%)
build/block-library/blocks/site-logo/editor-rtl.css 772 B +2 B (0%)
build/block-library/blocks/site-logo/editor.css 772 B +2 B (0%)
build/block-library/blocks/social-links/editor-rtl.css 670 B -154 B (-19%) 👏
build/block-library/blocks/social-links/editor.css 669 B -154 B (-19%) 👏
build/block-library/editor-rtl.css 9.81 kB -159 B (-2%)
build/block-library/editor.css 9.81 kB -160 B (-2%)
build/block-library/index.min.js 162 kB +13 B (0%)
build/block-library/style-rtl.css 10.5 kB -39 B (0%)
build/block-library/style.css 10.5 kB -39 B (0%)
build/components/index.min.js 214 kB +434 B (0%)
build/components/style-rtl.css 15.3 kB +24 B (0%)
build/components/style.css 15.3 kB +24 B (0%)
build/data/index.min.js 7.47 kB +42 B (+1%)
build/edit-navigation/index.min.js 16 kB +1 B (0%)
build/edit-post/index.min.js 29.6 kB +10 B (0%)
build/edit-site/index.min.js 33.2 kB +2.92 kB (+10%) ⚠️
build/edit-site/style-rtl.css 6.51 kB +244 B (+4%)
build/edit-site/style.css 6.5 kB +245 B (+4%)
build/edit-widgets/index.min.js 16.5 kB +1 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 960 B
build/admin-manifest/index.min.js 1.1 kB
build/annotations/index.min.js 2.75 kB
build/api-fetch/index.min.js 2.21 kB
build/autop/index.min.js 2.12 kB
build/blob/index.min.js 459 B
build/block-directory/index.min.js 6.28 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
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 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 58 B
build/block-library/blocks/audio/editor.css 58 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 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 470 B
build/block-library/blocks/button/editor.css 470 B
build/block-library/blocks/button/style-rtl.css 560 B
build/block-library/blocks/button/style.css 560 B
build/block-library/blocks/buttons/editor-rtl.css 291 B
build/block-library/blocks/buttons/editor.css 291 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 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 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 90 B
build/block-library/blocks/code/style.css 90 B
build/block-library/blocks/code/theme-rtl.css 134 B
build/block-library/blocks/code/theme.css 134 B
build/block-library/blocks/columns/editor-rtl.css 206 B
build/block-library/blocks/columns/editor.css 205 B
build/block-library/blocks/columns/style-rtl.css 503 B
build/block-library/blocks/columns/style.css 502 B
build/block-library/blocks/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/embed/editor-rtl.css 488 B
build/block-library/blocks/embed/editor.css 488 B
build/block-library/blocks/embed/style-rtl.css 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 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 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 322 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/style-rtl.css 1.62 kB
build/block-library/blocks/gallery/style.css 1.62 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 159 B
build/block-library/blocks/group/editor.css 159 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 114 B
build/block-library/blocks/heading/style.css 114 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 731 B
build/block-library/blocks/image/editor.css 730 B
build/block-library/blocks/image/style-rtl.css 507 B
build/block-library/blocks/image/style.css 511 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 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 137 B
build/block-library/blocks/latest-posts/editor.css 137 B
build/block-library/blocks/latest-posts/style-rtl.css 528 B
build/block-library/blocks/latest-posts/style.css 527 B
build/block-library/blocks/list/style-rtl.css 94 B
build/block-library/blocks/list/style.css 94 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 493 B
build/block-library/blocks/media-text/style.css 490 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 649 B
build/block-library/blocks/navigation-link/editor.css 650 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B
build/block-library/blocks/navigation-link/style.css 94 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/view.min.js 343 B
build/block-library/blocks/navigation/editor-rtl.css 1.89 kB
build/block-library/blocks/navigation/editor.css 1.89 kB
build/block-library/blocks/navigation/view.min.js 2.74 kB
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 377 B
build/block-library/blocks/page-list/editor.css 377 B
build/block-library/blocks/page-list/style-rtl.css 172 B
build/block-library/blocks/page-list/style.css 172 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 273 B
build/block-library/blocks/paragraph/style.css 273 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/style-rtl.css 444 B
build/block-library/blocks/post-comments-form/style.css 444 B
build/block-library/blocks/post-comments/style-rtl.css 492 B
build/block-library/blocks/post-comments/style.css 493 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/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/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 391 B
build/block-library/blocks/post-template/style.css 392 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 80 B
build/block-library/blocks/post-title/style.css 80 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 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 378 B
build/block-library/blocks/pullquote/style.css 378 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 262 B
build/block-library/blocks/query-pagination/editor.css 255 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 131 B
build/block-library/blocks/query/editor.css 132 B
build/block-library/blocks/quote/style-rtl.css 187 B
build/block-library/blocks/quote/style.css 187 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 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 397 B
build/block-library/blocks/search/style.css 398 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 99 B
build/block-library/blocks/separator/editor.css 99 B
build/block-library/blocks/separator/style-rtl.css 245 B
build/block-library/blocks/separator/style.css 245 B
build/block-library/blocks/separator/theme-rtl.css 172 B
build/block-library/blocks/separator/theme.css 172 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/style-rtl.css 165 B
build/block-library/blocks/site-logo/style.css 165 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 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 177 B
build/block-library/blocks/social-link/editor.css 177 B
build/block-library/blocks/social-links/style-rtl.css 1.32 kB
build/block-library/blocks/social-links/style.css 1.32 kB
build/block-library/blocks/spacer/editor-rtl.css 307 B
build/block-library/blocks/spacer/editor.css 307 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 471 B
build/block-library/blocks/table/editor.css 472 B
build/block-library/blocks/table/style-rtl.css 481 B
build/block-library/blocks/table/style.css 481 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 146 B
build/block-library/blocks/tag-cloud/style.css 146 B
build/block-library/blocks/template-part/editor-rtl.css 560 B
build/block-library/blocks/template-part/editor.css 559 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 569 B
build/block-library/blocks/video/editor.css 570 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 815 B
build/block-library/common.css 812 B
build/block-library/reset-rtl.css 474 B
build/block-library/reset.css 474 B
build/block-library/theme-rtl.css 672 B
build/block-library/theme.css 677 B
build/block-serialization-default-parser/index.min.js 1.09 kB
build/block-serialization-spec-parser/index.min.js 2.79 kB
build/blocks/index.min.js 46.3 kB
build/compose/index.min.js 10.9 kB
build/core-data/index.min.js 13.2 kB
build/customize-widgets/index.min.js 11.4 kB
build/customize-widgets/style-rtl.css 1.5 kB
build/customize-widgets/style.css 1.49 kB
build/data-controls/index.min.js 631 B
build/date/index.min.js 31.5 kB
build/deprecated/index.min.js 485 B
build/dom-ready/index.min.js 304 B
build/dom/index.min.js 4.5 kB
build/edit-navigation/style-rtl.css 3.76 kB
build/edit-navigation/style.css 3.76 kB
build/edit-post/classic-rtl.css 492 B
build/edit-post/classic.css 494 B
build/edit-post/style-rtl.css 7.1 kB
build/edit-post/style.css 7.09 kB
build/edit-widgets/style-rtl.css 4.18 kB
build/edit-widgets/style.css 4.18 kB
build/editor/index.min.js 37.8 kB
build/editor/style-rtl.css 3.78 kB
build/editor/style.css 3.77 kB
build/element/index.min.js 3.29 kB
build/escape-html/index.min.js 517 B
build/format-library/index.min.js 6.57 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.63 kB
build/html-entities/index.min.js 424 B
build/i18n/index.min.js 3.71 kB
build/is-shallow-equal/index.min.js 501 B
build/keyboard-shortcuts/index.min.js 1.8 kB
build/keycodes/index.min.js 1.39 kB
build/list-reusable-blocks/index.min.js 1.86 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.92 kB
build/notices/index.min.js 925 B
build/nux/index.min.js 2.08 kB
build/nux/style-rtl.css 747 B
build/nux/style.css 743 B
build/plugins/index.min.js 1.84 kB
build/primitives/index.min.js 924 B
build/priority-queue/index.min.js 582 B
build/react-i18n/index.min.js 671 B
build/redux-routine/index.min.js 2.65 kB
build/reusable-blocks/index.min.js 2.22 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11 kB
build/server-side-render/index.min.js 1.57 kB
build/shortcode/index.min.js 1.49 kB
build/token-list/index.min.js 639 B
build/url/index.min.js 1.9 kB
build/viewport/index.min.js 1.05 kB
build/warning/index.min.js 248 B
build/widgets/index.min.js 7.15 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.04 kB

compressed-size-action

@aaronrobertshaw aaronrobertshaw mentioned this pull request Nov 19, 2021
5 tasks
@ciampo ciampo added the [Package] Components /packages/components label Nov 19, 2021
@ciampo ciampo added the [Type] Enhancement A suggestion for improvement. label Nov 19, 2021
Copy link
Contributor

@ciampo ciampo left a comment

Choose a reason for hiding this comment

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

Thank you @aaronrobertshaw for iterating on the approach taken in #36420 ! Having unit tests for isSimpleCssValue and splitValueAndUnitFromSize gives us confidence and also doubles as live documentation of how we expect these functions to work.

Changes LGTM, and they test well as per the instructions in both Storybook and the Block Editor.

Could you also add a CHANGELOG entry in the components package before merging?

*/
const [ , numericValue, unit ] = size.split( /(\d+)/ );
return [ numericValue, unit ];
const [ numericValue, unit ] = `${ size }`.match( /[\d\.]+|\D+/g );
Copy link
Contributor

Choose a reason for hiding this comment

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

Looking at the changes made in #36420, I believe that we should also apply the change on the JSDoc for the size param (i.e. changing its type to be only string)

Copy link
Contributor Author

Choose a reason for hiding this comment

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

The changes here were slightly different to #36420. It honours what was documented in terms of the param accepting string|number. The tests also cover both strings and numbers.

The FontSizePicker docs themselves also include numerical size values. Should we not maintain compatibility with that?

In light of that, do you still believe I should restrict this?

Copy link
Contributor

Choose a reason for hiding this comment

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

You actually made a few good points — let's leave it as-is (and thank you for looking into it)

Copy link
Contributor

Choose a reason for hiding this comment

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

I was wondering why you changed from split to match. I was expecting a change in the regex.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Honestly, this wasn't a conscious choice. It came from when I copied the original change.

On a closer look though, match appears a little cleaner in terms of its results. I don't feel strongly about it, so if there is a good reason to change it back to split I can.

@ndiego
Copy link
Member

ndiego commented Nov 19, 2021

This looks great, thanks for the iteration @aaronrobertshaw 🙌

@ndiego
Copy link
Member

ndiego commented Nov 19, 2021

Also, if not already planned, I feel this should be backported to 5.9, especially since Beta 1 has been delayed.

@jasmussen
Copy link
Contributor

Before landing this PR, let's just re-read #34345 a bit, and perhaps get a sanity check from @pablohoneyhoney. It looks like the hints might be intentional, but with some unit specific design to follow.

@ntsekouras
Copy link
Contributor

Like @jasmussen I'd also wanted to advise for sanity check about this. I also commented in the other PR from @ndiego

My first thoughts though are that while handling the decimals case should be added, I'm not sure about removing the hints entirely. This is because units are something that themes control (setting these values) and with the current update of FontsizePicker this seems just like a bandaid because if the theme has less than 6 values, the hint in the SelectControl is the actual label of the SegmentedControl. If we are not sure about the shown hint/labels when other units are used, we should probably rethink the whole control. What do you think?

@aaronrobertshaw
Copy link
Contributor Author

Like @jasmussen I'd also wanted to advise for sanity check about this

I think I'm lacking context and history on this as I'm not following what the issue is.

My first thoughts though are that while handling the decimals case should be added, I'm not sure about removing the hints entirely.

The only hints that were removed were those from the SelectControl which were broken for decimals and omitted for non-simple CSS values. Given they were also parsed as integers they weren't very helpful if the different sizes had different units.

this seems just like a bandaid because if the theme has less than 6 values, the hint in the SelectControl is the actual label of the SegmentedControl

There is a separate PR adding tooltips to the the ToggleGroupControl which should provide additional context when the segmented control is used here. Currently on trunk I believe any decimal is treated as a non-simple CSS value and forces the SelectControl display. In that instance, no hints are showing and neither does the selected size in the picker's header hint.

Example font sizes array used in demos below
[
  {
    "name": "Small",
    "slug": "small",
    "size": "0.75rem"
  },
  {
    "name": "Normal",
    "slug": "normal",
    "size": "1rem"
  },
  {
    "name": "Large",
    "slug": "large",
    "size": "2.5em"
  },
  {
    "name": "Extra Large",
    "slug": "extra-large",
    "size": "3.5rem"
  }
]
Trunk This PR
FontSizePicker-Reply FontSizePicker-Reply-2

If we are not sure about the shown hint/labels when other units are used, we should probably rethink the whole control. What do you think?

If we are to rethink the whole control. I'd propose we still pursue these refinements as an interim step forward.

Before landing this PR, let's just re-read #34345 a bit, and perhaps get a sanity check from @pablohoneyhoney. It looks like the hints might be intentional, but with some unit specific design to follow.

The mockup included in #34345 doesn't appear to match what is currently on trunk either and looks pretty pixel-centric. The component as is on trunk only spits out the font size option's size value as the header hint if it's a simple CSS value. This means it's the entire value, not the unit as per the mockup. Displaying the unit only would make more sense if hints within the SelectControl could be used and you could assume that all the sizes used the same unit and were all simple values. I don't believe we can do that.

Screen Shot 2021-11-25 at 5 19 42 pm

The checklist of tasks also has the following item:

Assess current look vs design (the needed design may not currently be possible, since the contents of each select option can currently only be specified as a string of text)

Given the wrinkles found to date, I'm not sure we can consider the design final either. I think the changes in this PR help provide some more solid middle ground while we refine what this component should ultimately be.

@jasmussen
Copy link
Contributor

Thanks for the comment, Aaron, and thanks for all the explorations. In trying out the various approaches, and revisiting the mockups, even though the hints are pixel centric, they do come up again and again and in doing so feel more important to the design than I gave credit in my past comment. In light of those comments it seems like we might want to allow the non-integers but still keep the hints after all. If it turns problematic, we can remove them in the future. I realize that circles us a bit back to @ndiego's original PR! Sorry about that everyone.

What do you think?

@aaronrobertshaw
Copy link
Contributor Author

aaronrobertshaw commented Nov 26, 2021

In trying out the various approaches, and revisiting the mockups, even though the hints are pixel centric, they do come up again and again and in doing so feel more important to the design than I gave credit in my past comment.

I could only see the two mockups on the Typography Tools: Tracking issue, do you have others?

To play devil's advocate here, does just because the hints are in the mockups mean they have to be or should be? The mockups don't cover the case of mixed units so appear incomplete to me or needing more thought.

In light of those comments it seems like we might want to allow the non-integers but still keep the hints after all. If it turns problematic, we can remove them in the future.

We've already seen issues with simple vs complex CSS values, integers vs non-integers etc. It feels like we are sticking our head in the sand a little here. I'll go with whatever the majority view is though.

Adding back the labels we can get the following example where the hints don't appear to make sense and could add confusion rather than alleviate it. In the example below a user might think "Why on earth is Small '16' when Extra Large is '3.5'?"

I appreciate a theme author is unlikely to mix px and more dynamic units. I can see them mixing those dynamic units though.

FontSizePickers-HintsReinstated

Example font size config used in demo above
[
  {
    "name": "Tiny",
    "slug": "tiny",
    "size": "0.75rem"
  },
  {
    "name": "Small",
    "slug": "small",
    "size": "16px"
  },
  {
    "name": "Normal",
    "slug": "normal",
    "size": "1rem"
  },
  {
    "name": "Large",
    "slug": "large",
    "size": "2.5em"
  },
  {
    "name": "Extra Large",
    "slug": "extra-large",
    "size": "3.5rem"
  },
  {
    "name": "Huge",
    "slug": "huge",
    "size": "clamp(2.5rem, 4vw, 3rem)"
  }
]

I realize that circles us a bit back to @ndiego's original PR!

I believe we should persist with this PR as it adds unit tests, improved header hint for complex/dynamic CSS values etc.

@jasmussen
Copy link
Contributor

I could only see the two mockups on the Typography Tools: Tracking issue, do you have others?

The ones I looked at are these, which come from the Global Styles figma.

To play devil's advocate here, does just because the hints are in the mockups mean they have to be or should be? The mockups don't cover the case of mixed units so appear incomplete to me or needing more thought.

Oh mockups are never perfect, hence a bit of my reluctance in the first place. They're always a kind of glimpse into a potential future, and these implementation bouts that make it real surface key information as to which way to go.

At the end of the day, this one is on me: my first instinct was to remove the hints entirely since they couldn't work for all cases. But in marinating on the mockups a bit more, trying to understand the thought behind them, it's just feeling clear to me that the hints are there as a numeric addition to the phrases, Tiny, Small, etc. Even if 1, 1.5, 2 (referring to rem units) might not be as obvious of a type scale as 12, 14, 18, 24 etc — it does still show a progression and delta. Sorry about the back and forth!

Adding back the labels we can get the following example where the hints don't appear to make sense and could add confusion rather than alleviate it. In the example below a user might think "Why on earth is Small '16' when Extra Large is '3.5'?"

Yep, that could be an argument for adding the units in the future. I want to think this is an edgecase, and that most themes will stick to a single unit. But this is definitely something we can come back to.

Thanks again for this one.

@ntsekouras
Copy link
Contributor

Adding back the labels we can get the following example where the hints don't appear to make sense and could add confusion rather than alleviate it. In the example below a user might think "Why on earth is Small '16' when Extra Large is '3.5'?"

Yep, that could be an argument for adding the units in the future. I want to think this is an edgecase, and that most themes will stick to a single unit. But this is definitely something we can come back to.

I would also agree here that this would be an edgecase. Also I'm not sure if showing dynamic provides some real value. I feel like a not advanced user could become more confused with this than not seeing anything. This is subjective of course 😄

@pablohoneyhoney
Copy link

I appreciate a theme author is unlikely to mix px and more dynamic units. I can see them mixing those dynamic units though.

It's fair to design for the most common case, and not optimize for an edgecase of bad practice.

Because the numeric values do provide more precision to concepts that might be understood subjectively by different people. Semantics like Small can be interpreted differently by different users with diverse knowledge, design approaches, biases, and backgrounds.

@aaronrobertshaw aaronrobertshaw changed the title Font Size Picker: Remove hints and allow non-integers Font Size Picker: Allow non-integers as simple CSS values and in hints Nov 29, 2021
@aaronrobertshaw
Copy link
Contributor Author

Also I'm not sure if showing dynamic provides some real value. I feel like a not advanced user could become more confused with this than not seeing anything. This is subjective of course 😄

Fair point. I've removed the Dynamic header hint for complex CSS values in favour of displaying nothing. Any improvements here can be included in future iterations on the FontSizePicker component.

The PR description and title have been updated for the current state of this PR.

Copy link
Contributor

@ntsekouras ntsekouras left a comment

Choose a reason for hiding this comment

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

Thanks for iteration and the tests @aaronrobertshaw ! 💯

Let's ship to handle the decimals for now.

@aaronrobertshaw aaronrobertshaw merged commit 79fe31b into trunk Nov 30, 2021
@aaronrobertshaw aaronrobertshaw deleted the update/font-size-picker-remove-hints branch November 30, 2021 02:02
@github-actions github-actions bot added this to the Gutenberg 12.1 milestone Nov 30, 2021
@ndiego
Copy link
Member

ndiego commented Nov 30, 2021

Was out for the past couple days. This looks great! 🙌

@aaronrobertshaw
Copy link
Contributor Author

Was out for the past couple days. This looks great! 🙌

It was based off your work, so thank you 🙇

After merging though there are a couple of unrelated e2e and unit test failures.

The e2e failure is being addressed here: #36982. The unit test failure appears related to #36896.

noisysocks pushed a commit that referenced this pull request Jan 4, 2022
#36636)

* Remove hints and allow non-integers
* Reinstate hints
* Remove Dynamic label from header hints
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Design Tools Tools that impact the appearance of blocks both to expand the number of tools and improve the experi [Feature] UI Components Impacts or related to the UI component system [Package] Components /packages/components [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants