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

Adapt flex child controls for Spacer. #49362

Merged
merged 9 commits into from
Apr 19, 2023
Merged

Conversation

tellthemachines
Copy link
Contributor

What?

Fixes #38022.

  • Removes custom size controls when Spacer is a child of a flex layout block (Row, Stack, Navigation).
  • Adapts the block resizing handles so they change flex-basis value instead of width and height.

Note: I've made the "Fit" control reset the block width/height to 0 instead of removing it altogether, as removing "Fit" presents a technical challenge, due to those controls not knowing about the blocks they're applied to. I'm not sure if it makes sense to try and hack around this because Spacer is probably the only block that has no intrinsic size.

Testing Instructions

  1. In a post or template, add a Row block with a few blocks inside, including a Spacer;
  2. Check that custom sizing controls no longer show in the Spacer sidebar;
  3. Resize Spacer using its resizing handles and check that all works correctly;
  4. Try setting Spacer to "Fill" with the child flex controls in the sidebar.

Testing Instructions for Keyboard

Screenshots or screencast

Screenshot 2023-03-27 at 5 08 44 pm

Screenshot 2023-03-27 at 5 08 59 pm

@tellthemachines tellthemachines self-assigned this Mar 27, 2023
@tellthemachines tellthemachines added [Block] Spacer Affects the Spacer Block [Feature] Layout Layout block support, its UI controls, and style output. labels Mar 27, 2023
@github-actions
Copy link

github-actions bot commented Mar 27, 2023

Size Change: +221 B (0%)

Total Size: 1.37 MB

Filename Size Change
build/block-editor/content-rtl.css 4.17 kB +66 B (+2%)
build/block-editor/content.css 4.17 kB +66 B (+2%)
build/block-editor/index.min.js 203 kB +108 B (0%)
build/block-editor/style-rtl.css 14.6 kB +28 B (0%)
build/block-editor/style.css 14.6 kB +28 B (0%)
build/block-library/blocks/html/editor-rtl.css 340 B +8 B (+2%)
build/block-library/blocks/html/editor.css 341 B +8 B (+2%)
build/block-library/blocks/shortcode/editor-rtl.css 329 B -145 B (-31%) 🎉
build/block-library/blocks/shortcode/editor.css 329 B -145 B (-31%) 🎉
build/block-library/editor-rtl.css 11.6 kB -83 B (-1%)
build/block-library/editor.css 11.6 kB -85 B (-1%)
build/block-library/index.min.js 204 kB +193 B (0%)
build/commands/index.min.js 14.8 kB +77 B (+1%)
build/components/index.min.js 208 kB +26 B (0%)
build/core-data/index.min.js 16.3 kB +3 B (0%)
build/data-controls/index.min.js 718 B +55 B (+8%) 🔍
build/dom/index.min.js 4.76 kB +41 B (+1%)
build/edit-site/index.min.js 64.3 kB +36 B (0%)
build/edit-site/style-rtl.css 10.1 kB -33 B (0%)
build/edit-site/style.css 10.1 kB -34 B (0%)
build/editor/index.min.js 45.9 kB +3 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.78 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 483 B
build/block-directory/index.min.js 7.2 kB
build/block-directory/style-rtl.css 1.04 kB
build/block-directory/style.css 1.04 kB
build/block-editor/default-editor-styles-rtl.css 403 B
build/block-editor/default-editor-styles.css 403 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 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 138 B
build/block-library/blocks/audio/theme.css 138 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 91 B
build/block-library/blocks/avatar/style.css 91 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 587 B
build/block-library/blocks/button/editor.css 587 B
build/block-library/blocks/button/style-rtl.css 628 B
build/block-library/blocks/button/style.css 627 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 409 B
build/block-library/blocks/columns/style.css 409 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 649 B
build/block-library/blocks/cover/editor.css 651 B
build/block-library/blocks/cover/style-rtl.css 1.61 kB
build/block-library/blocks/cover/style.css 1.6 kB
build/block-library/blocks/details-summary/editor-rtl.css 65 B
build/block-library/blocks/details-summary/editor.css 65 B
build/block-library/blocks/details-summary/style-rtl.css 61 B
build/block-library/blocks/details-summary/style.css 61 B
build/block-library/blocks/details/style-rtl.css 54 B
build/block-library/blocks/details/style.css 54 B
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 138 B
build/block-library/blocks/embed/theme.css 138 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 269 B
build/block-library/blocks/file/style.css 270 B
build/block-library/blocks/file/view.min.js 353 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 984 B
build/block-library/blocks/gallery/editor.css 988 B
build/block-library/blocks/gallery/style-rtl.css 1.55 kB
build/block-library/blocks/gallery/style.css 1.55 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 654 B
build/block-library/blocks/group/editor.css 654 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/image/editor-rtl.css 830 B
build/block-library/blocks/image/editor.css 829 B
build/block-library/blocks/image/style-rtl.css 652 B
build/block-library/blocks/image/style.css 652 B
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 507 B
build/block-library/blocks/media-text/style.css 505 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 716 B
build/block-library/blocks/navigation-link/editor.css 715 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 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation/editor-rtl.css 2.13 kB
build/block-library/blocks/navigation/editor.css 2.14 kB
build/block-library/blocks/navigation/style-rtl.css 2.22 kB
build/block-library/blocks/navigation/style.css 2.21 kB
build/block-library/blocks/navigation/view-modal.min.js 2.81 kB
build/block-library/blocks/navigation/view.min.js 447 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 401 B
build/block-library/blocks/page-list/editor.css 401 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 501 B
build/block-library/blocks/post-comments-form/style.css 501 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 588 B
build/block-library/blocks/post-featured-image/editor.css 586 B
build/block-library/blocks/post-featured-image/style-rtl.css 322 B
build/block-library/blocks/post-featured-image/style.css 322 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 281 B
build/block-library/blocks/post-template/style.css 281 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 69 B
build/block-library/blocks/post-time-to-read/style.css 69 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 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 335 B
build/block-library/blocks/pullquote/style.css 335 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 288 B
build/block-library/blocks/query-pagination/style.css 284 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 463 B
build/block-library/blocks/query/editor.css 463 B
build/block-library/blocks/quote/style-rtl.css 222 B
build/block-library/blocks/quote/style.css 222 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 149 B
build/block-library/blocks/rss/editor.css 149 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 408 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/site-logo/editor-rtl.css 489 B
build/block-library/blocks/site-logo/editor.css 489 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.4 kB
build/block-library/blocks/social-links/style.css 1.39 kB
build/block-library/blocks/spacer/editor-rtl.css 359 B
build/block-library/blocks/spacer/editor.css 359 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 651 B
build/block-library/blocks/table/style.css 650 B
build/block-library/blocks/table/theme-rtl.css 157 B
build/block-library/blocks/table/theme.css 157 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 404 B
build/block-library/blocks/template-part/editor.css 404 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 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 179 B
build/block-library/blocks/video/style.css 179 B
build/block-library/blocks/video/theme-rtl.css 139 B
build/block-library/blocks/video/theme.css 139 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.12 kB
build/block-library/common.css 1.12 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/style-rtl.css 12.8 kB
build/block-library/style.css 12.8 kB
build/block-library/theme-rtl.css 698 B
build/block-library/theme.css 703 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 51.1 kB
build/commands/style-rtl.css 1.1 kB
build/commands/style.css 1.09 kB
build/components/style-rtl.css 11.7 kB
build/components/style.css 11.7 kB
build/compose/index.min.js 12.4 kB
build/customize-widgets/index.min.js 12.2 kB
build/customize-widgets/style-rtl.css 1.41 kB
build/customize-widgets/style.css 1.41 kB
build/data/index.min.js 8.68 kB
build/date/index.min.js 40.4 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/edit-post/index.min.js 35 kB
build/edit-post/style-rtl.css 7.59 kB
build/edit-post/style.css 7.58 kB
build/edit-widgets/index.min.js 17.3 kB
build/edit-widgets/style-rtl.css 4.56 kB
build/edit-widgets/style.css 4.56 kB
build/editor/style-rtl.css 3.49 kB
build/editor/style.css 3.48 kB
build/element/index.min.js 4.95 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 7.26 kB
build/format-library/style-rtl.css 557 B
build/format-library/style.css 556 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.79 kB
build/keycodes/index.min.js 1.94 kB
build/list-reusable-blocks/index.min.js 2.14 kB
build/list-reusable-blocks/style-rtl.css 865 B
build/list-reusable-blocks/style.css 865 B
build/media-utils/index.min.js 2.99 kB
build/notices/index.min.js 977 B
build/plugins/index.min.js 1.94 kB
build/preferences-persistence/index.min.js 2.23 kB
build/preferences/index.min.js 1.35 kB
build/primitives/index.min.js 960 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 942 B
build/react-i18n/index.min.js 702 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.75 kB
build/reusable-blocks/index.min.js 2.26 kB
build/reusable-blocks/style-rtl.css 265 B
build/reusable-blocks/style.css 265 B
build/rich-text/index.min.js 11.1 kB
build/server-side-render/index.min.js 2.09 kB
build/shortcode/index.min.js 1.52 kB
build/style-engine/index.min.js 1.55 kB
build/token-list/index.min.js 650 B
build/url/index.min.js 3.74 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 1.09 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.3 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@github-actions
Copy link

github-actions bot commented Mar 27, 2023

Flaky tests detected in 7d751d2.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/4685437479
📝 Reported issues:

@jasmussen
Copy link
Contributor

Nice, thank you for tackling this! Already seems like a nice iteration. One thing I'm realizing is that the navigation container itself might also need a width control. This GIF shows a navigation block that's only as wide as its contents inside, and so when I set a "fill" property to a spacer inside, it's zero wide because there's no space for it to fill out:
spacer

content wide container

Presumably the "fill" property would work if the navigation container was 100% wide.

What do you think?

@tellthemachines
Copy link
Contributor Author

This GIF shows a navigation block that's only as wide as its contents inside, and so when I set a "fill" property to a spacer inside, it's zero wide because there's no space for it to fill out

If that Nav block is inside a Row block, it'll have its own fit/fill/fixed controls under "Dimensions" (you might have to look for them in the dropdown because they don't show by default). If it's not inside Row then it should take up 100% of its container's width already.

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.

Very cool idea, the child flex controls are going to be much nicer for playing around with spacing!

The syncing from dragging the handle on the spacer block to the Fixed width/height value in the flex controls appears to be working quite well. Unfortunately it looks like it isn't syncing the other way around when adjusting the value in either the horizontal or vertical orientations. I think it might be a matter of including the flexSize value in the getHeightForVerticalBlocks and getWidthForHorizontalBlocks functions?

2023-03-28.12.20.32.mp4

Other than that, now that the spacer controls are hidden for flex layouts, should we display the child flex controls by default so that the controls aren't hidden when a block is freshly inserted?

if ( isFlexLayout && selfStretch === 'fit' ) {
return undefined;
}
return temporaryHeight || height || undefined;
Copy link
Contributor

Choose a reason for hiding this comment

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

Do we need to also use style.layout.flexSize in this value to sync changes to flexSize back to the styles applied to the Spacer?

if ( isFlexLayout && selfStretch === 'fit' ) {
return undefined;
}
return temporaryWidth || width || undefined;
Copy link
Contributor

Choose a reason for hiding this comment

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

Same comment as above: do we need to also use style.layout.flexSize in this value to sync changes to flexSize back to the styles applied to the Spacer?

@tellthemachines
Copy link
Contributor Author

Thanks for reviewing! I've addressed the issue with resizing when the fixed value changes.

I also noticed something else: the resizing handles always convert whichever unit is used in the input field back to px. It's not great but it's existing behaviour so better fix it separately.

Other than that, now that the spacer controls are hidden for flex layouts, should we display the child flex controls by default so that the controls aren't hidden when a block is freshly inserted?

I'm starting to feel like they should always display for all blocks because I've had to explain multiple times where to find them, which probably means they aren't discoverable enough.

@andrewserong
Copy link
Contributor

I'm starting to feel like they should always display for all blocks because I've had to explain multiple times where to find them, which probably means they aren't discoverable enough.

Now that you mention it, I think that would make a lot of sense. Typically the controls that are hidden by default are ones that we think folks mightn't reach for all that frequently. When a block is a child of the Flex layout, there's a much higher likelihood that people are going to want to make adjustments to it. Might need some design feedback, and there could be some exceptions (Image block perhaps?) where there are other controls that might need to be more prominent than the flex children controls, but sounds like a good thing to explore to me!

@jasmussen
Copy link
Contributor

I also noticed something else: the resizing handles always convert whichever unit is used in the input field back to px. It's not great but it's existing behaviour so better fix it separately.

That seems okay to me. How would the resize handle be able to work with, say, percentages? (Apologies if I'm missing something obvious.)

I'm starting to feel like they should always display for all blocks because I've had to explain multiple times where to find them, which probably means they aren't discoverable enough.

Only on my second coffee so my mind isn't entirely clear. But at this juncture, I'm also leaning that way. However

  • Seems like we should do that separately
  • I also think the ellipsis/show-hide functionality can be revisited so you shouldn't have to explain this

That is to say, I still think there's a place for hiding advanced functionality by default and adding it, but mainly that it's not always clear what is advanced vs. what is basic.

I also think @SaxonF may have had some thoughts around some of these dimensions migrating to the layout panel. I don't recall all the details, but just connecting the dots.

@apeatling
Copy link
Contributor

This seems to be working as expected in terms of the changes here. 👍

Unrelated to this PR I noticed was that the tooltip shows "null" when resizing. I realize this is reflecting a height value that isn't set, but it felt like a bug and would be better to say something else? Is this related to the px conversion?

Screenshot 2023-03-28 at 10 44 14 AM

@tellthemachines
Copy link
Contributor Author

How would the resize handle be able to work with, say, percentages? (Apologies if I'm missing something obvious.)

They might not work with percentages - that's probably why the custom Spacer unit control doesn't allow them - but we could conceivably make them work with rem, em, vw and vh. I agree it's not a super high priority though!

Unrelated to this PR I noticed was that the tooltip shows "null" when resizing

I'm not sure why this happens but given it's also happening on trunk I thought to investigate it separately.

@tellthemachines
Copy link
Contributor Author

I've solved the conflicts from the merge of #44002 - cc @glendaviesnz - and I think this is ready for another round of reviews!

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.

This is generally working pretty well, but I noticed a couple of inconsistencies with how the flex child controls appear to work:

  • In a Row or Stack block, when you insert a Spacer block, the flex child controls default to Fit, but the spacer visually looks like it uses its default value (100px). Should it be defaulting to the Fixed tab?
  • The same issue occurs if you set a Spacer block outside of the flex block, and then drag the block inside the flex block. The tab is on Fit instead of Fixed. Also, if you toggle between the options, Fit always results in 0 size because there's no content.

Here's a quick screengrab of dragging a Spacer block into a Stack block:

2023-04-12 11 18 24

Other than that, I also noticed that Fill in the vertical orientation sometimes behaves inconsistently for me if I don't have a min height value set. With min height set, it appears to be working quite well, though 👍

@tellthemachines
Copy link
Contributor Author

Thanks for testing @andrewserong !

In a Row or Stack block, when you insert a Spacer block, the flex child controls default to Fit, but the spacer visually looks like it uses its default value (100px). Should it be defaulting to the Fixed tab?

Yes, I've fixed that now.

if you toggle between the options, Fit always results in 0 size because there's no content.

That's expected given Fit is based on content size. Ideally, we wouldn't display Fit at all in this context, but I can't think of any good way of doing that doesn't involve adding a block attribute to manage child layout controls. Does that sound like a terrible idea? 😅

Other than that, I also noticed that Fill in the vertical orientation sometimes behaves inconsistently for me if I don't have a min height value set.

Can you provide more details on the inconsistency? Fill shouldn't really work unless the parent has a min height, but I notice it seems to default to 100px.

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 the update! Just left a comment about dragging a Spacer into the Stack block, it looks like the value might need to be updated there to also handle height.

For the Fill issue, I couldn't quite work out what's going on, but hopefully this video will help. It seems that the value set by dragging the control winds up overriding the Fill value possibly? Essentially, when I drag the spacer via the handle, then when I switch between Fixed and Fill, it'll remember the size based on the drag handle, rather than appearing to use Fill, if that makes sense? Here's a screengrab:

2023-04-12.16.52.23.mp4

Happy to give it another test tomorrow!

...blockStyle,
layout: {
...layout,
flexSize: width || '72px',
Copy link
Contributor

Choose a reason for hiding this comment

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

Does this need to account for height and/or the spacing presets values? When dragging into a Stack variation, it looks like it defaults to the 72px value:

2023-04-12 16 48 11

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Ah yes, well spotted! I've fixed the logic in the effect now and the problem with fill state should be addressed.

@andrewserong
Copy link
Contributor

Ideally, we wouldn't display Fit at all in this context, but I can't think of any good way of doing that doesn't involve adding a block attribute to manage child layout controls.

I suppose another possibility would be an attribute in block.json for child layout supports, to disable certain features?

@tellthemachines
Copy link
Contributor Author

I suppose another possibility would be an attribute in block.json for child layout supports, to disable certain features?

Yeah, that's what I was thinking! I guess blocks with no intrinsic width/height are a bit of an edge case so it wouldn't be too cumbersome to do that, but are there any downsides to introducing this new API?

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.

This is feeling closer to me! I ran into another issue while re-testing, but one thing I did notice is that now that Fit is never used as a default value, it doesn't seem to be as offputting that it results in 0 being applied. I think I'd probably lean toward leaving Fit in as an option for this PR, and we could look at reducing the available options potentially in a follow-up PR?

Comment on lines 263 to 266
const newSize =
inheritedOrientation === 'horizontal'
? getSpacingPresetCssVar( width ) || '72px'
: getSpacingPresetCssVar( height ) || '100px';
Copy link
Contributor

Choose a reason for hiding this comment

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

This seems to be working a bit better now, but it looks like there's still a couple of issues when dragging a Spacer block in and out of a flex container. Here's a quick gif:

2023-04-13 15 18 19

I'm not too sure what's happening, unfortunately I've found it a little hard to figure out, but my observations so far are:

  • The conversion from the spacing preset to the px value doesn't appear to populate the Fixed input field
  • When moving into the flex container block and out again, somewhere along the way, it seems that the size values become stale. So some of the time the value appears to be inconsistent (like it's remembering the one set in the flex state or vice-versa)

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 conversion from the spacing preset to the px value doesn't appear to populate the Fixed input field

It's not converting, so the input doesn't understand the value of the preset. Perhaps we should make it possible to set preset sizes in the child layout controls; I'm sure it would be useful outside of this scenario?

When moving into the flex container block and out again, somewhere along the way, it seems that the size values become stale

Oooh well spotted! We're alternately setting height and flexSize and not changing either of them when setting the other, so the block attributes end up something like: {"height":"var:preset|spacing|40","style":{"layout":{"flexSize":"130px","selfStretch":"fixed"}}}. I'll look 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.

It's not converting

Ah, I think I'm following along now. I like the idea of adding support for presets for the child layout controls, but I wonder if we'd ultimately want a different scale for size presets than spacing, given that width and height values will often need to be much bigger than spacing between things?

For now, what do you think about potentially using getCustomValueFromPreset instead of getSpacingPresetCssVar so that when dragging from outside a Row / Stack block into one of them, we switch to using the real pixel value?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I wonder if we'd ultimately want a different scale for size presets than spacing, given that width and height values will often need to be much bigger than spacing between things?

Yeah, that's a great point! I'll convert to px for now.

Comment on lines 291 to 301
}, [
blockStyle,
flexSize,
height,
inheritedOrientation,
isFlexLayout,
layout,
selfStretch,
setAttributes,
width,
] );
Copy link
Contributor

Choose a reason for hiding this comment

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

Does this mean that the logic here will be called more frequently now? And if so, is that a safe change? From a quick skim it sounds like it's intentional for it to be called more frequently, but I wasn't sure if there's a potential state it could get in where setAttributes could result in the effect being run too often 🤔

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yeah that's a good point, I'm not 100% sure there won't be nefarious side effects. I mainly added the dependencies in because the linter was complaining about it 😅 and it didn't seem to do any harm, but negative perf impacts often don't show immediately.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Update: I tried removing them and ended up re-adding as the effect wasn't running when a Spacer changed to "fit" or "fill" and the old width/height value was still showing up when dragging outside of the flex container. It doesn't seem to hugely increase the times the effect runs though I might easily be missing some edge case situations.

Copy link
Contributor

Choose a reason for hiding this comment

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

In practice, I don't think I've encountered any issues with this list of dependencies so far. It might just be something for us to keep an eye on if anyone runs into any issues with the spacer?

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.

This is testing really well, it feels very close to being mergeable to me! Just left a comment about whether we should swap from CSS variables to px when moving styles from width/height to flexSize.

The other thing I noticed is that when dragging into the flex container, the setAttributes call doesn't clear out the width or height attributes, so in the markup and on the site frontend, it's still outputting the inline style for width or height respectively. The flex-basis size winds up overriding it, but for tidiness, should we clear those values when the flexSize is updated?

Here's some block markup:

<!-- wp:spacer {"height":"223px","style":{"layout":{"flexSize":"78px","selfStretch":"fixed"}}} -->
<div style="height:223px" aria-hidden="true" class="wp-block-spacer"></div>
<!-- /wp:spacer -->

What do you think? Thanks for all the back and forth — I don't think we need to get it perfect in this PR, so I reckon we could get pretty close and continue to tweak in follow-ups if that winds up being easier.

Comment on lines 263 to 266
const newSize =
inheritedOrientation === 'horizontal'
? getSpacingPresetCssVar( width ) || '72px'
: getSpacingPresetCssVar( height ) || '100px';
Copy link
Contributor

Choose a reason for hiding this comment

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

It's not converting

Ah, I think I'm following along now. I like the idea of adding support for presets for the child layout controls, but I wonder if we'd ultimately want a different scale for size presets than spacing, given that width and height values will often need to be much bigger than spacing between things?

For now, what do you think about potentially using getCustomValueFromPreset instead of getSpacingPresetCssVar so that when dragging from outside a Row / Stack block into one of them, we switch to using the real pixel value?

Comment on lines 291 to 301
}, [
blockStyle,
flexSize,
height,
inheritedOrientation,
isFlexLayout,
layout,
selfStretch,
setAttributes,
width,
] );
Copy link
Contributor

Choose a reason for hiding this comment

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

In practice, I don't think I've encountered any issues with this list of dependencies so far. It might just be something for us to keep an eye on if anyone runs into any issues with the spacer?

@tellthemachines
Copy link
Contributor Author

Thanks for the latest round of testing @andrewserong ! I've updated the PR to change presets to unit values and remove unnecessary attributes when moving between containers.

@@ -430,6 +430,19 @@ _Returns_

- `string|null`: A font-size value using clamp().

### getCustomValueFromPreset
Copy link
Contributor

Choose a reason for hiding this comment

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

I totally forgot that we're of course working in a different package when making changes to the Spacer block, so this function needs to be exported now.

Shall we rename it to getSpacingCustomValueFromPreset or getCustomSpacingValueFromPreset since it's being exported from the block editor package? That way if we have other functions for different kinds of presets the need to be exported in the future, we won't have a collision?

That said, from a quick search I see that the native version of index.native.js for the block editor package is already exporting this function as-is here: https://github.com/WordPress/gutenberg/blob/trunk/packages/block-editor/src/components/index.native.js#L79.

So, perhaps another option would be to leave it as-is and if in the future we need a more generic getCustomValueFromPreset to be exported that handles other kinds of presets, then we could add a parent function that internally calls the existing spacing one.

What do you think?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I'd leave it as is for now, and then perhaps if/when we need to handle other types of presets, we can reimplement this function to deal with any preset, so we don't have to change existing usage (we'd probably want to move it out of the spacing utils if we did that of course).

Comment on lines 324 to 325
flexSize: null,
selfStretch: null,
Copy link
Contributor

Choose a reason for hiding this comment

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

Nit: it looks like setting to null results in null being serialized to the block markup. Should these be undefined instead?

E.g. here's block markup after this is updated (it's similar with the height and width attributes above):

<!-- wp:spacer {"height":"clamp(7rem, 14vw, 11rem)","style":{"layout":{"flexSize":null,"selfStretch":null}}} -->
<div style="height:clamp(7rem, 14vw, 11rem)" aria-hidden="true" class="wp-block-spacer"></div>
<!-- /wp:spacer -->

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Oh whoops, I fixed that and then didn't push the change 😳

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Done!

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.

This is so very close! Unfortunately, I've run into an odd block validation error and I can't quite work out what's causing it. To reproduce:

  1. Add a spacer block outside of a Stack block and set a custom height
  2. Drag the block into a Stack block
  3. Save the post
  4. Reload, and see that there is now a block validation error:
2023-04-18.14.57.22.mp4

Here's the error message:

Content generated by `save` function:

<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>

Content retrieved from post body:

<div aria-hidden="true" class="wp-block-spacer"></div>

I'm wondering if it has something to do with setting height and width to undefined now? Since the height attributes's default value in block.json is 100px, could it be to do with when height is explicitly set to undefined versus when it simply has no value and defaults to 100px when the page is loaded?

I'm not quite sure what's going on there, but one potential fix might be for us to retain setting width and height to null when clearing them out (but leave setting the flex layout values to undefined 🤔

@tellthemachines
Copy link
Contributor Author

I'm wondering if it has something to do with setting height and width to undefined now?

Yeah this is a funny one. The error only goes away when setting an explicit height value (null causes the same error in my testing) so I've changed it to 0px for now.
I also removed the extra width and height that were getting added inline to children of flex containers.

Hopefully all is working as expected now 😅

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.

Okay, I think that's finally gotten to the bottom of the edge cases for me. Thanks so much again for your patience, and for all the back and forth! 🙇 I've left one tiny non-blocking nit, but this is all working well:

✅ Dragging from root/outside Row or Stack to within the Flex block retains the styling correctly
✅ When using presets that have a px value, that value is pre-populated in the Fixed input field
✅ Fit and Fill work as expected based on the discussion thus far, with known drawback for Fit, but it isn't a default value, so seems fine to retain in the UI for now
✅ For themes using presets that are non-px values, e.g. TT3 that uses clamp() rules, the value is still applied and works in the editor and on the site frontend, but the input field is empty. This is to be expected since the child layout controls don't yet support a presets slider or other kind of UI, and I think an empty field is the most graceful fallback we have at the moment 👍
✅ Default values work correctly when inserting a new Spacer block
✅ Spacer block works correctly outside of flex blocks

LGTM! ✨

setAttributes( {
height: '0px',
width: '72px',
style: {
Copy link
Contributor

Choose a reason for hiding this comment

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

One final nit (and not a blocker), but I just noticed that sometimes the serialized block markup contains an empty layout object within style. We can use cleanEmptyObject to remove these, e.g. like in the Cover block here:

style: cleanEmptyObject( {

It doesn't cause any block validation issues to retain the empty objects in the block markup, though, so I really don't think it's a blocker.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Funnily enough, running the object passed to setAttributes through cleanEmptyObject results in the layout attributes not being unset at all, I'm not sure why. I might leave it as is and avoid going down a rabbit hole with this 😅

Copy link
Contributor

Choose a reason for hiding this comment

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

I might leave it as is and avoid going down a rabbit hole with this 😅

Good thinking! I'm in support of the idea of merging this now that it's in a good and working state, and we can look at further tweaks in isolation 👍

@tellthemachines tellthemachines merged commit f1274c1 into trunk Apr 19, 2023
@tellthemachines tellthemachines deleted the try/spacer-flex-controls branch April 19, 2023 01:11
@github-actions github-actions bot added this to the Gutenberg 15.7 milestone Apr 19, 2023
@richtabor
Copy link
Member

How would the resize handle be able to work with, say, percentages? (Apologies if I'm missing something obvious.)
They might not work with percentages - that's probably why the custom Spacer unit control doesn't allow them - but we could conceivably make them work with rem, em, vw and vh. I agree it's not a super high priority though!

Actually, they do work (within a row/stack):

CleanShot 2023-04-19 at 18 21 32

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Block] Spacer Affects the Spacer Block [Feature] Layout Layout block support, its UI controls, and style output. Needs User Documentation Needs new user documentation [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Spacer: Add toggle to behave as flexible spacer to take up available space (flex-grow)
7 participants