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

Allow setting Letter case and Decoration to 'None' and add Letter case to Global Styles #44067

Merged

Conversation

noisysocks
Copy link
Member

What?

Alternative to #43356. Partially reverts #36735. Closes #36735 and addresses one of the items in #34345 (comment).

This PR does three things:

  • Go back to using buttons in TextTransformControl and TextDecorationControl instead of a ToggleGroupControl
  • Add None option to TextTransformControl and TextDecorationControl which allows user to set text-transform: none and text-decoration: none
  • Add TextTransformControl to Global Styles

Why?

We want to add TextTransformControl to Global Styles. See #34345 (comment).

We also want to allow the user to set text-transform: none or text-decoration: none explicitly. This allows users to override theme styles at a block level. See #42766 and #43356 (comment).

So, using TextTransformControl as an example, the control should support these options:

  • Default (no style)
  • None (text-transform: none)
  • Upper case (text-transform: uppercase)
  • Lower case (text-transform: lowercase)
  • Capitalize (text-transform: capitalize)

Displaying all five options is overwhelming. It is much more intuitive for users if we can display only four buttons (None, Upper case, Lower case and Capitalize) and implement Default using a click-to-unselect mechanism or the ellipsis menu in the Tools Panel. Unfortunately though, ToggleGroupControl does not support click-to-unselect as it uses radio, and Global Styles does not use Tools Panel.

We switched from a group of buttons to a ToggleGroupControl in #36735 for two reasons:

  1. So that TextTransformControl and TextDecorationControl would have updated 40px styling.
  2. To communicate semantically using role=radio that these options are mutually exclusive.

(1) can be implemented by styling the group of buttons.

I've been reading about (2) and I don't believe it's actually a big concern. There is little practical difference in terms of what is announced by a screen reader between a group of buttons with aria-pressed and a group of radios. Moreover, we should use the markup and semantic roles that most closely resembles the UI. In this case, I believe that TextTransformControl and TextDecorationControl is a group of buttons, because:

  • They look more like buttons than radios. (They're squares containing an icon, not unfilled circles with an adjacent label)
  • They support button-like behaviour such as deselection
  • They aren't grouped together and therefore I wouldn't expect them to be in the same tab stop (i.e. Tab should move focus between the buttons)
  • TextDecorationControl could in theory support multiple values e.g. text-decoration: underline strike-through

https://lea.verou.me/2022/07/button-group/ is a good article that I found on this subject.

Testing Instructions

  1. Go to Editor → Global Styles → Typography.
  2. Check that Letter case appears in the Heading section but no other sections, and that modifying it works.
  3. Go to Global Styles → Blocks.
  4. Check that Letter case appears in the Typography panel for blocks that support these controls, and that modifying them works.
  5. npm run storybook:dev and see the stories for TextTransformControl/TextDecorationControl.

Screenshots or screencast

Kapture.2022-09-12.at.17.45.56.mp4

@noisysocks noisysocks added [Type] Enhancement A suggestion for improvement. Global Styles Anything related to the broader Global Styles efforts, including Styles Engine and theme.json labels Sep 12, 2022
@github-actions
Copy link

github-actions bot commented Sep 12, 2022

Size Change: +255 B (0%)

Total Size: 1.26 MB

Filename Size Change
build/block-editor/index.min.js 163 kB +64 B (0%)
build/block-editor/style-rtl.css 15.3 kB +63 B (0%)
build/block-editor/style.css 15.3 kB +67 B (0%)
build/edit-site/index.min.js 58 kB +61 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.05 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-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 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 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 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 103 B
build/block-library/blocks/code/style.css 103 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 187 B
build/block-library/blocks/comment-template/style.css 185 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 834 B
build/block-library/blocks/comments/editor.css 832 B
build/block-library/blocks/comments/style-rtl.css 632 B
build/block-library/blocks/comments/style.css 630 B
build/block-library/blocks/cover/editor-rtl.css 605 B
build/block-library/blocks/cover/editor.css 607 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 337 B
build/block-library/blocks/group/editor.css 337 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 876 B
build/block-library/blocks/image/editor.css 873 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-submenu/view.min.js 423 B
build/block-library/blocks/navigation/editor-rtl.css 1.99 kB
build/block-library/blocks/navigation/editor.css 2 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 260 B
build/block-library/blocks/paragraph/style.css 260 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 547 B
build/block-library/blocks/post-featured-image/editor.css 545 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 73 B
build/block-library/blocks/post-terms/style.css 73 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 488 B
build/block-library/blocks/site-logo/editor.css 488 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 84 B
build/block-library/blocks/site-title/editor.css 84 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 239 B
build/block-library/blocks/tag-cloud/style.css 239 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 561 B
build/block-library/blocks/video/editor.css 563 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/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 kB
build/block-library/editor.css 11 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 190 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 12.2 kB
build/block-library/style.css 12.2 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.1 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 49.6 kB
build/components/index.min.js 198 kB
build/components/style-rtl.css 11.5 kB
build/components/style.css 11.5 kB
build/compose/index.min.js 12.5 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.06 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 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 30.7 kB
build/edit-post/style-rtl.css 6.94 kB
build/edit-post/style.css 6.94 kB
build/edit-site/style-rtl.css 8.36 kB
build/edit-site/style.css 8.34 kB
build/edit-widgets/index.min.js 16.5 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.66 kB
build/editor/style.css 3.65 kB
build/element/index.min.js 4.68 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 6.76 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.81 kB
build/list-reusable-blocks/index.min.js 1.74 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 953 B
build/nux/index.min.js 2.05 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.3 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.61 kB
build/shortcode/index.min.js 1.53 kB
build/style-engine/index.min.js 1.45 kB
build/token-list/index.min.js 644 B
build/url/index.min.js 3.61 kB
build/vendors/react-dom.min.js 38.5 kB
build/vendors/react.min.js 4.34 kB
build/viewport/index.min.js 1.09 kB
build/warning/index.min.js 268 B
build/widgets/index.min.js 7.18 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

@jasmussen
Copy link
Contributor

Thank you for your patience on this one. The behavior in this PR feels correct: there's an explicit "none" added to the controls, you can toggle and untoggle (so you can go back to unset unlike the radio behavior).

We have a visual challenge, though. Each dark toggle button should be exactly 32x32px, but they are 36px tall and flexing in their width:

Screenshot 2022-09-12 at 10 49 32

If I do a little inspector hacking I can get them to the right sizes, which introduces a different problem, that there isn't room for 3 + 4 buttons:

Screenshot 2022-09-12 at 10 52 07

A few solutions to this one:

  • Smaller than 32px icons. Perhaps 24x24? Ideally we can avoid this one as it would mess with the general grid spacing.
  • Allow the text decoration control to fill a full row. This might be the interim solution.

Another option is to allow the two columns to be flexible. Mockup:

Screenshot 2022-09-12 at 10 52 07

CC: @javierarce @jameskoster in case you have thoughts, and @ciampo @mirka for thoughts from the component side.

The near term solution, probably, is to allow the text decoration to fill a full row, and to get the buttons to be the correct 32x32px sizes. Does that sound okay?

@jasmussen
Copy link
Contributor

Just connecting some dots here, this PR seems to overlap: #43993 CC: @draganescu @scruffian

@draganescu
Copy link
Contributor

I'll absolutely close #43993 for this one here which is a complete implementation since being able to un-select is essential to preserve theme styles as they are w/ no user intervention.

@jameskoster
Copy link
Contributor

Personally I find 24x24 buttons awkward to click, especially on mobile. And the difference in height between buttons / inputs creates unnecessary tension in the overall appearance. Since we're committed to making all inputs 40px tall, I would be inclined to do the same with icon buttons.

If that means some controls (like this one) occupy a single row, then I think it's worth it. In the future we could consider making the Inspector wider to better accommodate multi-column layouts.

@jasmussen
Copy link
Contributor

Since we're committed to making all inputs 40px tall, I would be inclined to do the same with icon buttons.

Just to clarify here, I don't think that means the 32x32px buttons must become 40x40 — or that the toggle control has to be 40px tall suddenly. The buttons can remain 32x32, but inside a 40px wrapper, so the spacing remains right.

@jameskoster
Copy link
Contributor

jameskoster commented Sep 12, 2022

That's the reason I think it's worth considering making the icons 40x40. It gives us this:

Screenshot 2022-09-12 at 14 48 13

Which feels more balanced than:

Screenshot 2022-09-12 at 14 50 14

@mirka
Copy link
Member

mirka commented Sep 12, 2022

https://lea.verou.me/2022/07/button-group/ is a good article that I found on this subject.

This is a great pull, thanks! It clears up the HTML concerns, which feels like a big step forward.

However I feel like this solution doesn't fully address one of the main takeaways of the article (and Léonie's follow-up), which is that we have to be careful about not mismatching user expectations. Having UI components that pretty much look the same (i.e. a row of square icon buttons with no enclosing border) that are sometimes mutually exclusive and sometimes not, sometimes de-selectable and sometimes not, seems like it would result in a lot of mismatched expectations within the app.

So from a design standpoint, I would advocate for a bit more clarity around these affordances before we go further.

We have three possible combinations, so for example a consistent system could look like:

  1. mutually exclusive, de-selectable → has transition animation, no border
  2. mutually exclusive, not de-selectable → has transition animation, has border
  3. not mutually exclusive (de-selectable by nature) → no transition animation, no border

It's probably not super important to visually afford mutual exclusivity because it's obvious after the first interaction, but having a visual differentiator for de-selectability seems important to me. Thoughts?


From the components maintenance standpoint, we will extract whatever design pattern that's decided on into the components package so it can be reused elsewhere in a consistent way. Ideally that componentization happens before this PR merges, but if it's urgent we can clean it up later 🙂

@noisysocks
Copy link
Member Author

noisysocks commented Sep 13, 2022

I'll absolutely close #43993 for this one here which is a complete implementation since being able to un-select is essential to preserve theme styles as they are w/ no user intervention.

Forgot about your PR sorry! Props @draganescu ❤️

If that means some controls (like this one) occupy a single row, then I think it's worth it. In the future we could consider making the Inspector wider to better accommodate multi-column layouts.

A single row sounds good to me. I think right now the buttons are 36px with a 2px margin but I can make them 40px to align fully with the inputs.

So from a design standpoint, I would advocate for a bit more clarity around these affordances before we go further.

We have three possible combinations, so for example a consistent system could look like:

  1. mutually exclusive, de-selectable → has transition animation, no border
  2. mutually exclusive, not de-selectable → has transition animation, has border
  3. not mutually exclusive (de-selectable by nature) → no transition animation, no border

I love this and completely agree! 💯

I'd add that only when there is a border (2) should the group be in a single tab stop.

From the components maintenance standpoint, we will extract whatever design pattern that's decided on into the components package so it can be reused elsewhere in a consistent way. Ideally that componentization happens before this PR merges, but if it's urgent we can clean it up later 🙂

Happy to look at doing this in a components-first way. Were you thinking that there would be separate components for the three patterns above, or could all three patterns be handled by ToggleGroupControl using e.g. optional and multiple props?

@jasmussen
Copy link
Contributor

Lots of good thoughts here. Happy to try the suggested outline.

Outside of the components work, let's allow the 4-button group a whole row for now. I don't think we should touch any dimensions at this point, meaning 32x32 remains the toggle size so it matches up with these buttons:

Screenshot 2022-09-13 at 08 52 58

@mirka
Copy link
Member

mirka commented Sep 13, 2022

Were you thinking that there would be separate components for the three patterns above, or could all three patterns be handled by ToggleGroupControl using e.g. optional and multiple props?

It's a tough call but I'm leaning toward handling everything in ToggleGroupControl with two extra props. I imagine it would be confusing for a dev to pick out the correct component to use if we split them 🤔

I'll start working on this during the coming days and see how it goes. Might have to split somehow if the internal logic feels untenable.

@noisysocks
Copy link
Member Author

noisysocks commented Sep 14, 2022

Outside of the components work, let's allow the 4-button group a whole row for now. I don't think we should touch any dimensions at this point, meaning 32x32 remains the toggle size so it matches up with these buttons:

Cool yep. I've changed the button size to be 32px with 4px of top/bottom margin so that it's centred with the 40px inputs. I've also changed Letter case to take up a full row.

Here's how it looks now:

Block settings Global styles
Screen Shot 2022-09-14 at 12 36 37 Screen Shot 2022-09-14 at 12 36 51

I'll start working on this during the coming days and see how it goes. Might have to split somehow if the internal logic feels untenable.

Legend, thanks! 🙌 I'm happy to help—ping me.

I think in that case then let's proceed with this PR as a smallish win (it's nice to have consistency between block settings and global styles) and then work on trying to consolidate everything around using ToggleGroupControl. We have quite a few places where ToggleGroupControl could be used if it were configurable enough, e.g. take a look at the block inspector for the Navigation block.

Copy link
Contributor

@jasmussen jasmussen 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, looks good!

Screenshot 2022-09-14 at 08 36 49

Screenshot 2022-09-14 at 08 37 07

The explicit none appears to work as intended. It's still unclear if the minus is the best longer term icon, but that should't block this from landing, as it's an important tool. Thank you for your patience on this one.

I'd love a code review, but for the behavior, let's try this.

Copy link
Contributor

@aaronrobertshaw aaronrobertshaw left a comment

Choose a reason for hiding this comment

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

It's great to see the ability to "toggle off" items in these controls return. 👌

✅ Letter case appears in the Heading section, but no other "root" level sections
✅ Letter case appears in the Typography panel for blocks that support these controls
✅ Modifying Letter case works
✅ Controls reflect none selection when set via theme.json
✅ Storybook examples for text transform/decoration controls look & function correctly

❓ Letter case buttons are squashed (not square). Occurs in both block editor and Global Styles panels.

Overall this PR works pretty well for me. There was just a small styling issue that I think we need to tweak first before landing this.

Block Inspector Controls Global Style - Block Global Styles - Heading
Screen Shot 2022-09-15 at 1 24 45 pm Screen Shot 2022-09-15 at 1 25 18 pm Screen Shot 2022-09-15 at 1 25 03 pm

When I view the TextTransformControl in both the site or block editor, the buttons are not square. They are in the Storybook examples. I believe this is due to the Letter case control not being set to span both columns and thus has its width constrained.

To change that I believe we'd need to remove the single-column class from the typography support hook's use of the control. Also, the controls in the Global Styles panels appear to use the .edit-site-typography-panel__full-width-control class. I've left an inline comment on that below.

@jasmussen
Copy link
Contributor

Just to echo Aaron's comments, this is looking good except for the squashed buttons:

Screenshot 2022-09-15 at 10 40 06

Screenshot 2022-09-15 at 10 40 17

Ideally the toggled state is 32x32 and if letter case can't fit in a single column, it's okay if it has to span two columns.

@noisysocks
Copy link
Member Author

noisysocks commented Sep 16, 2022

🤦‍♂️🤦‍♂️🤦‍♂️ I forgot to git push the changes described in #44067 (comment).

@noisysocks noisysocks force-pushed the try/go-back-to-buttons-for-text-decoration-and-transform branch from 2f90a67 to 3e98495 Compare September 16, 2022 02:26
@noisysocks
Copy link
Member Author

OK try this now. I rebased it to include #44142, implemented @aaronrobertshaw's suggestion about adding a className prop, AND REMEMBERED TO GIT PUSH MY CHANGES.

@noisysocks
Copy link
Member Author

noisysocks commented Sep 16, 2022

@ockham reckon we could include this in 6.1? It isn't technically a "bug" (more "missing functionality") but it (along with #44142) does make global styles feel less broken. Entirely up to you!

@noisysocks noisysocks added the Backport to WP 6.7 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Sep 16, 2022
Copy link
Contributor

@aaronrobertshaw aaronrobertshaw 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 testing well now 🚢

@noisysocks noisysocks merged commit f20301e into trunk Sep 16, 2022
@noisysocks noisysocks deleted the try/go-back-to-buttons-for-text-decoration-and-transform branch September 16, 2022 04:12
@github-actions github-actions bot added this to the Gutenberg 14.2 milestone Sep 16, 2022
ockham pushed a commit that referenced this pull request Sep 19, 2022
…e to Global Styles (#44067)

* Make TextDecorationControl and TextTransformControl use buttons with aria-pressed again

* Add option for 'none' text-transform and text-decoration

* Add Letter Case to Global Styles

* Make buttons 32px

* Make TextTransformControl take up full row

* Add back className
@ockham
Copy link
Contributor

ockham commented Sep 19, 2022

I just cherry-picked this PR to the wp/6.1 branch to get it included in the next release: 853051b

@ockham ockham removed the Backport to WP 6.7 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Sep 19, 2022
@bph bph added the Needs User Documentation Needs new user documentation label Sep 21, 2022
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 [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

TextTransformControl/TextDecorationControl: Balancing usability and accessibility
8 participants