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

Spacing presets: add editor UI support #42173

Merged
merged 89 commits into from
Aug 14, 2022
Merged

Conversation

glendaviesnz
Copy link
Contributor

@glendaviesnz glendaviesnz commented Jul 6, 2022

What?

Add UI into the padding toolspanel control to allow for either a custom value to be entered or a preset spacing value to be selected

Why?

There needs to be an option for users and theme authors to specify a preset spacing size instead of having to enter a custom value every time

How?

Adds a new spacing sizes control to the editor components that can be shared between padding, margins, blockgap.

Currently this control is only applied to the padding settings.

Testing Instructions

  • Add a group block and in the block settings panel try setting a range of combinations of values, eg. single-side custom and preset, multi-side custom and prest and switching between them
  • Check that any changes are reflected in the editor canvas and frontend
  • In core or theme theme.json increase settings.spacing.spacingScale.steps to a value > 7 and check that segmented range is replaced with a select list
  • Note that switching from a preset to custom should copy the preset value into the custom box, but going from custom to preset makes no attempt to transfer the value as the chances of a match with a preset are minimal
  • Also check the padding settings in the Site Editor global styles Layout and Block styles

Screenshots or screencast

presets.mp4
@glendaviesnz glendaviesnz added the [Status] In Progress Tracking issues with work in progress label Jul 6, 2022
@glendaviesnz glendaviesnz self-assigned this Jul 6, 2022
@github-actions
Copy link

github-actions bot commented Jul 6, 2022

Size Change: +9.14 kB (+1%)

Total Size: 1.28 MB

Filename Size Change
build/block-editor/index.min.js 158 kB +4.52 kB (+3%)
build/block-editor/style-rtl.css 15.1 kB +389 B (+3%)
build/block-editor/style.css 15.1 kB +391 B (+3%)
build/block-library/blocks/button/style-rtl.css 539 B -3 B (-1%)
build/block-library/blocks/button/style.css 539 B -3 B (-1%)
build/block-library/blocks/latest-posts/editor-rtl.css 213 B +14 B (+7%) 🔍
build/block-library/blocks/latest-posts/editor.css 212 B +14 B (+7%) 🔍
build/block-library/blocks/navigation/style-rtl.css 1.98 kB +16 B (+1%)
build/block-library/blocks/navigation/style.css 1.97 kB +18 B (+1%)
build/block-library/blocks/query/editor-rtl.css 439 B +74 B (+20%) 🚨
build/block-library/blocks/query/editor.css 439 B +75 B (+21%) 🚨
build/block-library/blocks/search/style-rtl.css 396 B +11 B (+3%)
build/block-library/blocks/search/style.css 393 B +7 B (+2%)
build/block-library/blocks/tag-cloud/style-rtl.css 239 B +13 B (+6%) 🔍
build/block-library/blocks/tag-cloud/style.css 239 B +12 B (+5%) 🔍
build/block-library/editor-rtl.css 10.9 kB +66 B (+1%)
build/block-library/editor.css 10.9 kB +65 B (+1%)
build/block-library/index.min.js 185 kB +509 B (0%)
build/block-library/style-rtl.css 11.9 kB +11 B (0%)
build/block-library/style.css 11.9 kB +12 B (0%)
build/blocks/index.min.js 47.3 kB +36 B (0%)
build/components/index.min.js 231 kB +527 B (0%)
build/components/style-rtl.css 14 kB -113 B (-1%)
build/components/style.css 14 kB -112 B (-1%)
build/compose/index.min.js 12 kB +350 B (+3%)
build/core-data/index.min.js 15.2 kB +525 B (+4%)
build/customize-widgets/index.min.js 11.3 kB +12 B (0%)
build/dom/index.min.js 4.69 kB +1 B (0%)
build/edit-navigation/index.min.js 16 kB -3 B (0%)
build/edit-post/index.min.js 30.5 kB -9 B (0%)
build/edit-site/index.min.js 56.9 kB +1.22 kB (+2%)
build/edit-site/style-rtl.css 8.23 kB +13 B (0%)
build/edit-site/style.css 8.22 kB +14 B (0%)
build/editor/index.min.js 41.4 kB +77 B (0%)
build/keycodes/index.min.js 1.79 kB +403 B (+29%) 🚨
build/reusable-blocks/index.min.js 2.21 kB -4 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 6.58 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 103 B
build/block-library/blocks/audio/style.css 103 B
build/block-library/blocks/audio/theme-rtl.css 110 B
build/block-library/blocks/audio/theme.css 110 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 59 B
build/block-library/blocks/avatar/style.css 59 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 441 B
build/block-library/blocks/button/editor.css 441 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 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 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 615 B
build/block-library/blocks/cover/editor.css 616 B
build/block-library/blocks/cover/style-rtl.css 1.55 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 110 B
build/block-library/blocks/embed/theme.css 110 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 333 B
build/block-library/blocks/group/editor.css 333 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 736 B
build/block-library/blocks/image/editor.css 737 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 110 B
build/block-library/blocks/image/theme.css 110 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/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 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 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 2.03 kB
build/block-library/blocks/navigation/editor.css 2.04 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 157 B
build/block-library/blocks/paragraph/editor.css 157 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-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 605 B
build/block-library/blocks/post-featured-image/editor.css 605 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 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 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 370 B
build/block-library/blocks/pullquote/style.css 370 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/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/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 233 B
build/block-library/blocks/separator/style.css 233 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 708 B
build/block-library/blocks/site-logo/editor.css 708 B
build/block-library/blocks/site-logo/style-rtl.css 192 B
build/block-library/blocks/site-logo/style.css 192 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.39 kB
build/block-library/blocks/social-links/style.css 1.38 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 175 B
build/block-library/blocks/table/theme.css 175 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 159 B
build/block-library/blocks/video/style.css 159 B
build/block-library/blocks/video/theme-rtl.css 110 B
build/block-library/blocks/video/theme.css 110 B
build/block-library/common-rtl.css 1.01 kB
build/block-library/common.css 1 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/theme-rtl.css 695 B
build/block-library/theme.css 700 B
build/block-serialization-default-parser/index.min.js 1.11 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/customize-widgets/style-rtl.css 1.4 kB
build/customize-widgets/style.css 1.4 kB
build/data-controls/index.min.js 653 B
build/data/index.min.js 8.03 kB
build/date/index.min.js 32 kB
build/deprecated/index.min.js 507 B
build/dom-ready/index.min.js 324 B
build/edit-navigation/style-rtl.css 4.02 kB
build/edit-navigation/style.css 4.03 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/style-rtl.css 6.94 kB
build/edit-post/style.css 6.94 kB
build/edit-widgets/index.min.js 16.5 kB
build/edit-widgets/style-rtl.css 4.35 kB
build/edit-widgets/style.css 4.35 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.75 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/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 612 B
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/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11.1 kB
build/server-side-render/index.min.js 1.61 kB
build/shortcode/index.min.js 1.53 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.08 kB
build/warning/index.min.js 268 B
build/widgets/index.min.js 7.19 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@glendaviesnz glendaviesnz changed the title [WIP] Spacing presets: add editor UI support Jul 22, 2022
@glendaviesnz glendaviesnz marked this pull request as ready for review July 25, 2022 04:22
@glendaviesnz glendaviesnz added [Feature] Themes Questions or issues with incorporating or styling blocks in a theme. Global Styles Anything related to the broader Global Styles efforts, including Styles Engine and theme.json and removed [Status] In Progress Tracking issues with work in progress labels Jul 25, 2022
@@ -71,6 +71,7 @@ export default function CustomSelectControl( {
/** @type {import('../select-control/types').SelectControlProps.size} */
size = 'default',
value: _selectedItem,
Copy link
Contributor Author

Choose a reason for hiding this comment

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

These changes were a temporary proof of concept for testing reflecting changes in canvas when hovering a select list. Using this will need to wait of a rewrite of this component which is underway, so these changes will be removed before this PR is merged.

@glendaviesnz
Copy link
Contributor Author

glendaviesnz commented Jul 26, 2022

@jameskoster the designs for the UI link the concept of a Default setting with one of the values in the array of available preset options. However, currently, the spacing presets are following the approach of the font sizing in the theme.json which as far as I am aware doesn't have an option to specify a Default value.

In terms of font sizes, there is a Default option in the select list of font sizes (if the theme specifies more font sizes than can fit in the toggle buttons selector), and this shows as selected when no font size has been specified, which is indicated by the fact that the block has not font-size attribute set, eg:

Screen Shot 2022-07-26 at 1 31 20 PM

In this instance, the block will default to the font size that it naturally inherits via the CSS cascade, eg. what is set in theme and global styles.

If the user selects a specific font size then attributes are attached to the block and the styles linked to that font size preset will be applied to the block to override the inherited default.

Screen Shot 2022-07-26 at 1 32 41 PM

If they then switch back to Default it wipes the font-size attribute.

If a default font size for a block is specified in global styles, the selected size is reflected in how big the font shows in the editor and front end, but the size selected in global styles is not indicated in any way in the font size selector for an individual block - it still shows default as indicating 'not set'.

There isn't an easy way to dictate what the 'default' space size setting might be across all blocks in all contexts, eg. a Group block has a default padding of 0px unless it has background color applied in which case the default is 1.25em 2.375em;. It seems to therefore make sense to follow the pattern already set by the font preset sizing and take Default as meaning that no value has been applied to this block, it is currently inheriting the Default setting dictated by theme and global styles.

I might have missed another discussion somewhere though about a global default space size setting that makes sense to be able to easily select across different contexts?

return (
<fieldset role="region" className="component-spacing-sizes-control">
<HStack className="component-spacing-sizes-control__header">
<Text as="legend">{ label }</Text>
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Need to fix this up as legend needs to be first child of fieldset ... but that makes some of the layout needed here difficult ... working on it

Copy link
Contributor

Choose a reason for hiding this comment

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

We could leverage CSS grid here despite the Chrome bug where a fieldset with display: grid won't work properly.

If we apply display: grid; to the wrapping ToolsPanelItem we can set display: contents; on the fieldset itself. This allows us to make the legend an immediate descendant of the fieldset. Such an approach will require a few other style tweaks but quickly hacking around in dev tools showed it should have some legs.

Also, legends get some default padding via browser user agent styles, so we should probably strip that as well to line things up.

Click for CSS snippets and demo video of results
Screen.Recording.2022-07-26.at.4.46.40.pm.mp4

ToolsPanelItem

    display: grid;
    grid-template-columns: repeat(2, 1fr);

fieldset

    display: contents;

legend

    /* Quick vertical alignment and spacing tweaks. There's likely a better approach */
    display: flex;
    align-items: center;
    padding-left: 0;
    margin-bottom: 12px;
}

span

	/* aligns the button to the right and tweaks spacing, cleaner approaches likely as well. */
	text-align: right;

.component-spacing-sizes-control :nth-child(1n+3)

	grid-column: span 2;
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Great, thanks, will have a play around with 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.

This is looking really good so far @glendaviesnz, massive effort! 🙇

✅ Unit tests are passing
✅ Adjusting values via presets or custom values, all sides or single, are reflected in editor and frontend
❓ When switching to custom value input for the linked control, the custom value appeared to be an index not real value
❓ Moving the presets slider all the way to the right results in horizontal scrollbar for sidebar
❓The control's layout is a bit funky when custom select control is used due to spacing scale with more than 7 steps.

Custom value issue for all sides control
Screen.Recording.2022-07-26.at.5.47.06.pm.mp4
Rogue scrollbar Screen Shot 2022-07-26 at 5 40 38 pm
Component layout with custom select control
Screen.Recording.2022-07-26.at.5.55.33.pm.mp4

I've left a number of inline comments, mostly small stuff like typos or copy/paste issues.

Hope this helps. Happy to test/review again whenever you need it. 🙂


Also, as we discussed internally, we'll need to update the Global Styles dimensions panel so it matches the block editor's.

return (
<fieldset role="region" className="component-spacing-sizes-control">
<HStack className="component-spacing-sizes-control__header">
<Text as="legend">{ label }</Text>
Copy link
Contributor

Choose a reason for hiding this comment

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

We could leverage CSS grid here despite the Chrome bug where a fieldset with display: grid won't work properly.

If we apply display: grid; to the wrapping ToolsPanelItem we can set display: contents; on the fieldset itself. This allows us to make the legend an immediate descendant of the fieldset. Such an approach will require a few other style tweaks but quickly hacking around in dev tools showed it should have some legs.

Also, legends get some default padding via browser user agent styles, so we should probably strip that as well to line things up.

Click for CSS snippets and demo video of results
Screen.Recording.2022-07-26.at.4.46.40.pm.mp4

ToolsPanelItem

    display: grid;
    grid-template-columns: repeat(2, 1fr);

fieldset

    display: contents;

legend

    /* Quick vertical alignment and spacing tweaks. There's likely a better approach */
    display: flex;
    align-items: center;
    padding-left: 0;
    margin-bottom: 12px;
}

span

	/* aligns the button to the right and tweaks spacing, cleaner approaches likely as well. */
	text-align: right;

.component-spacing-sizes-control :nth-child(1n+3)

	grid-column: span 2;
@@ -15,6 +15,7 @@ import './duotone';
import './font-size';
import './border';
import './layout';
//import './spacing-size';
Copy link
Contributor

Choose a reason for hiding this comment

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

🧹 I take it this isn't needed and can be cleaned up?

@jameskoster
Copy link
Contributor

@glendaviesnz

If a default font size for a block is specified in global styles, the selected size is reflected in how big the font shows in the editor and front end, but the size selected in global styles is not indicated in any way in the font size selector for an individual block - it still shows default as indicating 'not set'.

Ah yes, I've ran into this issue a couple of times now. Something to address for sure (imo), but not here.

One other small issue I noticed is that if you scroll up / down the range quickly, the on-canvas rendering doesn't work perfectly. Notice how the content starts to bleed into the padded area:

padding.mp4
@glendaviesnz
Copy link
Contributor Author

One other small issue I noticed is that if you scroll up / down the range quickly, the on-canvas rendering doesn't work perfectly.

Thanks @jameskoster, that visualiser is a bit flakey in a number of situations, we will take a look at it, but it may be as a separate PR.

With the z-index on the slider thumb another dev has checked the branch out and run locally and the new z-index is applied for them. Do you use wp-env to run it locally? If so and you don't have any critical data in your local env try running wp-env destroy in your Gutenberg repo dir and then wp-env start again and see if that fixes it.

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.

Thanks, for the quick iterations on this @glendaviesnz. 🚀

I appreciate your still working on things like moving the legend and updating the Global Styles panel but I've given it another quick once-over. It's taking shape nicely!

✅ Unit tests still pass
✅ Applies the spacing correctly in both editor and frontend
✅ Custom value bug for all inputs slider control has been resolved
✅ Layout for the custom select control looks neater

While testing this again, I noticed some other issues we might wish to address.

Position of LinkedButton

When the control is used within the sidebar alongside others, such as the BoxControl or BorderRadiusControl, the position of the linked button looks out of whack. I'm assuming this was due to restricting the control's width to avoid the horizontal sidebar? Is there a different approach we can take to avoid it?

Screenshot Screen Shot 2022-07-27 at 8 29 32 pm

Disjoint between mode value and slider position

After expanding the control and adjusting the different side values, the correct mode value is displayed as help text underneath the main label. Can we update the slider's value/progress to reflect that? It's a little odd to set mostly x-small values for the sides, collapse the control, and still see the slider halfway.

Screen Shot 2022-07-27 at 8 33 05 pm

Custom select control view

When using a custom select control due to the spacing scale's steps being greater than 7, after selecting an option, if you switch to the custom value input, the value isn't shown. Also, After selecting a value in the primary select control, if you switch to the unlinked sides, they don't have that value set.

Demo video
Screen.Recording.2022-07-27.at.9.04.06.pm.mp4

Other minor nits

There's a little extra clean-up we can do in terms of typos etc. I've created a diff below that you can apply if you feel so inclined.

Suggested changes
diff --git a/packages/block-editor/src/components/spacing-sizes-control/index.js b/packages/block-editor/src/components/spacing-sizes-control/index.js
index a005df8b63..6e8bdcad32 100644
--- a/packages/block-editor/src/components/spacing-sizes-control/index.js
+++ b/packages/block-editor/src/components/spacing-sizes-control/index.js
@@ -19,7 +19,6 @@ import { settings } from '@wordpress/icons';
 /**
  * Internal dependencies
  */
-
 import AllInputControl from './all-input-control';
 import InputControls from './input-controls';
 import AxialInputControls from './axial-input-controls';
@@ -54,7 +53,6 @@ export default function SpacingSizesControl( {
 		...useSetting( 'spacing.spacingSizes' ),
 	];
 
-	const type = label;
 	const inputValues = values || DEFAULT_VALUES;
 	const hasInitialValue = isValuesDefined( values );
 	const hasOneSide = sides?.length === 1;
@@ -89,7 +87,7 @@ export default function SpacingSizesControl( {
 		values: inputValues,
 		spacingSizes,
 		useSelect,
-		type,
+		type: label,
 	};
 
 	return (
diff --git a/packages/block-editor/src/components/spacing-sizes-control/linked-button.js b/packages/block-editor/src/components/spacing-sizes-control/linked-button.js
index 1cf0f2f361..fd4781a205 100644
--- a/packages/block-editor/src/components/spacing-sizes-control/linked-button.js
+++ b/packages/block-editor/src/components/spacing-sizes-control/linked-button.js
@@ -5,10 +5,6 @@ import { link, linkOff } from '@wordpress/icons';
 import { __ } from '@wordpress/i18n';
 import { Button, Tooltip } from '@wordpress/components';
 
-/**
- * Internal dependencies
- */
-
 export default function LinkedButton( { isLinked, onClick } ) {
 	const label = isLinked ? __( 'Unlink Sides' ) : __( 'Link Sides' );
 
diff --git a/packages/block-editor/src/components/spacing-sizes-control/style.scss b/packages/block-editor/src/components/spacing-sizes-control/style.scss
index 9075a30446..a4ea9d4155 100644
--- a/packages/block-editor/src/components/spacing-sizes-control/style.scss
+++ b/packages/block-editor/src/components/spacing-sizes-control/style.scss
@@ -1,5 +1,5 @@
 // The following is needed to prevent horizontal scrollbar when range
-// control is slid to far right. Component styles overrride with 100%
+// control is slid too far right. Component styles override with 100%
 // max width if extra specificity not added.
 .components-tools-panel-item > fieldset.component-spacing-sizes-control {
 	max-width: 235px;

Nice work so far, I'm looking forward to seeing the finished product 👍

@jameskoster

This comment was marked as outdated.

@glendaviesnz

This comment was marked as outdated.

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.

The UI is working well for me. Aria labels/tooltips make sense and I can use the keyboard exclusively.

Frontend CSS matches my settings as well.

I'm not fully over this PR so will let more experienced folks give a final assessment, but it's looking great to me.

@glendaviesnz

This comment was marked as outdated.

@jasmussen
Copy link
Contributor

Perhaps something to fix separately, but I'd love to see the advanced and link/unlink toggles have the same visual style, and be square like the font size control:
Screenshot 2022-08-11 at 09 37 07

Something closer to this:

Screenshot 2022-08-11 at 09 38 27

@glendaviesnz
Copy link
Contributor Author

Perhaps something to fix separately, but I'd love to see the advanced and link/unlink toggles have the same visual style, and be square like the font size control

@jasmussen if we make the link/unlink button 24px it would then be different to the border control ones, and it we just do the custom toggle, it is different to the link/unlink:

Screen Shot 2022-08-12 at 10 40 25 AM

should we just make the custom toggle 24px for now and circle back and fix all the link/unlink buttons in the toolspanel in one go, or just leave the custom toggle the same width as the link/unlink button until we do that?

Comment on lines 29 to 30
{ name: 0, slug: '0', size: 0 },
...useSetting( 'spacing.spacingSizes' ),
Copy link
Contributor

@andrewserong andrewserong Aug 12, 2022

Choose a reason for hiding this comment

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

This appears to throw a fatal in the site editor or a block error in the post editor if spacing sizes are disabled or not available. What should happen for this component if there are no presets? I was wondering if we'd default to just the custom sizes view?

Block editor Site editor
image image

(I noticed this because I forgot to update my theme.json file after testing out #43105 🙂)

Copy link
Contributor Author

Choose a reason for hiding this comment

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

nice catch, let me think about that

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.

Thanks for all the follow-up @glendaviesnz! This is testing really well for me now, with a couple of non-blocking caveats.

✅ Using preset and custom values in the block editor is working well
✅ Using preset and custom values with constrained sides is working well
✅ Using preset and custom values in global styles is working well and the CSS variables are rendering correctly in the site editor
✅ With the dropdown list variant, the Default option is now working correctly in global styles, and displays the value set in theme.json as a custom value when it's the default
✅ Setting steps to 0 no longer crashes the editor or global styles
❓Caveats for the above — there's a slight styling issue with the BoxControl component in the post editor, and it looks like Global Styles needs the same conditional so that it'll display the BoxControl instead when no presets are available.

From my perspective, I think this PR is in a good place to merge. Tweaking the case of 0 presets being available could be tackled in a follow-up as the PR to allow steps of 0 only just merged (#43105) and there are no longer any fatals being thrown. And I think many of these tweaks will likely be easier in smaller PRs once this one lands. But feel free to fix them up here first if you'd prefer, of course!

Great work wrangling all the complexity here! 🎉

@@ -77,6 +77,7 @@ export function DimensionsPanel( props ) {
<InspectorControls __experimentalGroup="dimensions">
{ ! isPaddingDisabled && (
<ToolsPanelItem
className="tools-panel-item-spacing"
Copy link
Contributor

Choose a reason for hiding this comment

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

Styling nit: I think the styling changes here affect the position of the Unlink button in the BoxControl layout when the spacing presets are set to 0 steps:

Trunk This PR
image image

Since by default the spacing presets will be available, this feels like an edge case / bit of tweaking we could look into in a follow up to me.

>
<BoxControl
<SpacingSizesControl
Copy link
Contributor

@andrewserong andrewserong Aug 12, 2022

Choose a reason for hiding this comment

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

It looks like this component needs the same logic as for the hooks/padding.js change where if there are no spacing presets we render the BoxControl instead. Otherwise it renders the RangeControl with only a single value:

image

Still, it's a good proof that the previous commit fixed up the fatal error that was happening, and it's technically usable as the user can switch to the custom input! 😄

@jasmussen
Copy link
Contributor

should we just make the custom toggle 24px for now and circle back and fix all the link/unlink buttons in the toolspanel in one go, or just leave the custom toggle the same width as the link/unlink button until we do that?

The default for the toggle in the inspector should be 24x24. The fact that the link/unlink button isn't, is the errant behavior. Which is fine for one of us to look at separately — just wanted to clarify what the intended default is, so we don't optimize towards the legacy controls, which weren't as intentionally designed.

@richtabor
Copy link
Member

The default for the toggle in the inspector should be 24x24. The fact that the link/unlink button isn't, is the errant behavior. Which is fine for one of us to look at separately — just wanted to clarify what the intended default is, so we don't optimize towards the legacy controls, which weren't as intentionally designed.

Agreed.

Took this for another run-through — its certainly coming together well!

One bit I noticed is a delay in the applied padding visual (Chrome and Safari). If you take one step at a time, it's fine — but if you go through more than one before it applies the visual, the padding visual is off.

CleanShot.2022-08-12.at.20.57.34.mp4
@glendaviesnz
Copy link
Contributor Author

One bit I noticed is a delay in the applied padding visual

Thanks, @richtabor - the spacing visualiser has a number of issues on trunk currently, and the spacing presets just highlights these, I have added a note on the overview issue to follow up on this and try and get it working a bit more reliably.

@glendaviesnz
Copy link
Contributor Author

The default for the toggle in the inspector should be 24x24.

Thanks for confirming @jasmussen, will get that sorted in a follow-up PR before this makes it into a release.

};

return (
<fieldset role="region" className="component-spacing-sizes-control">
Copy link
Contributor

Choose a reason for hiding this comment

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

Any specific reason for this role="region"? It appears this conflicts with useNavigateRegions, especially in the Site Editor Will create a new issue.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Can't remember the reasoning, so do add a new issue thanks.

Copy link
Contributor

Choose a reason for hiding this comment

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

Thanks. Reported in #46509 together with other issues.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Themes Questions or issues with incorporating or styling blocks in a theme. Global Styles Anything related to the broader Global Styles efforts, including Styles Engine and theme.json Needs User Documentation Needs new user documentation