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

Patterns: Set width of synced pattern editor block wrapper to max width of widest child #54170

Closed
wants to merge 14 commits into from

Conversation

glendaviesnz
Copy link
Contributor

@glendaviesnz glendaviesnz commented Sep 5, 2023

What?

Checks the align setting of child blocks of a synced pattern and sets the editor block wrapper to the same so that the width is respected in the editor. Also adds layout support of type constrained to block wrapper if wide or full align are found to ensure that alignments are correctly applied.

Why?

Because synced blocks have a wrapper in the editor, but not the front end, the full and max-width settings are not respected.

How?

Find the widest align option of the child blocks and apply this same align class to the parent wrapper.

Testing Instructions

  • Add a Cover block and set the alignment to full-width
  • Covert to a Synced pattern and make sure the full width still applied in the editor and frontend
  • Try different blocks with different alignments and make sure the widths are respected in the editor and frontend
  • Try changing the width/align of the cover block after it has been converted to a synced pattern and make sure correct alignment is applied
  • Add a group block with width set to max width and add a cover block to it that has width set to full. Convert to synced pattern and make sure cover block is still constrained by width of parent group block

Screenshots or screencast

Before:

pattern-width-before.mp4

After:

pattern-wide-after.mp4

@glendaviesnz glendaviesnz added [Type] Bug An existing feature does not function as intended [Feature] Synced Patterns Related to synced patterns (formerly reusable blocks) labels Sep 5, 2023
@glendaviesnz glendaviesnz self-assigned this Sep 5, 2023
@github-actions
Copy link

github-actions bot commented Sep 5, 2023

Size Change: +242 B (0%)

Total Size: 1.52 MB

Filename Size Change
build/block-library/index.min.js 204 kB +242 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 955 B
build/annotations/index.min.js 2.69 kB
build/api-fetch/index.min.js 2.28 kB
build/autop/index.min.js 2.1 kB
build/blob/index.min.js 451 B
build/block-directory/index.min.js 7.01 kB
build/block-directory/style-rtl.css 1.02 kB
build/block-directory/style.css 1.02 kB
build/block-editor/content-rtl.css 4.25 kB
build/block-editor/content.css 4.24 kB
build/block-editor/default-editor-styles-rtl.css 381 B
build/block-editor/default-editor-styles.css 381 B
build/block-editor/index.min.js 216 kB
build/block-editor/style-rtl.css 15.1 kB
build/block-editor/style.css 15 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 126 B
build/block-library/blocks/audio/theme.css 126 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 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 584 B
build/block-library/blocks/button/editor.css 582 B
build/block-library/blocks/button/style-rtl.css 629 B
build/block-library/blocks/button/style.css 628 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 421 B
build/block-library/blocks/columns/style.css 421 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 647 B
build/block-library/blocks/cover/editor.css 650 B
build/block-library/blocks/cover/style-rtl.css 1.69 kB
build/block-library/blocks/cover/style.css 1.68 kB
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 B
build/block-library/blocks/details/style-rtl.css 98 B
build/block-library/blocks/details/style.css 98 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 126 B
build/block-library/blocks/embed/theme.css 126 B
build/block-library/blocks/file/editor-rtl.css 316 B
build/block-library/blocks/file/editor.css 316 B
build/block-library/blocks/file/style-rtl.css 311 B
build/block-library/blocks/file/style.css 312 B
build/block-library/blocks/file/view.min.js 318 B
build/block-library/blocks/footnotes/style-rtl.css 201 B
build/block-library/blocks/footnotes/style.css 199 B
build/block-library/blocks/freeform/editor-rtl.css 2.61 kB
build/block-library/blocks/freeform/editor.css 2.61 kB
build/block-library/blocks/gallery/editor-rtl.css 947 B
build/block-library/blocks/gallery/editor.css 952 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 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/html/editor-rtl.css 336 B
build/block-library/blocks/html/editor.css 337 B
build/block-library/blocks/image/editor-rtl.css 834 B
build/block-library/blocks/image/editor.css 833 B
build/block-library/blocks/image/style-rtl.css 1.42 kB
build/block-library/blocks/image/style.css 1.41 kB
build/block-library/blocks/image/theme-rtl.css 126 B
build/block-library/blocks/image/theme.css 126 B
build/block-library/blocks/image/view-interactivity.min.js 1.83 kB
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 505 B
build/block-library/blocks/media-text/style.css 503 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 668 B
build/block-library/blocks/navigation-link/editor.css 669 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 B
build/block-library/blocks/navigation/editor-rtl.css 2.26 kB
build/block-library/blocks/navigation/editor.css 2.26 kB
build/block-library/blocks/navigation/style-rtl.css 2.23 kB
build/block-library/blocks/navigation/style.css 2.22 kB
build/block-library/blocks/navigation/view.min.js 984 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 235 B
build/block-library/blocks/paragraph/editor.css 235 B
build/block-library/blocks/paragraph/style-rtl.css 335 B
build/block-library/blocks/paragraph/style.css 335 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 508 B
build/block-library/blocks/post-comments-form/style.css 508 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 319 B
build/block-library/blocks/post-featured-image/style.css 319 B
build/block-library/blocks/post-navigation-link/style-rtl.css 215 B
build/block-library/blocks/post-navigation-link/style.css 214 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 314 B
build/block-library/blocks/post-template/style.css 314 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 125 B
build/block-library/blocks/preformatted/style.css 125 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 168 B
build/block-library/blocks/pullquote/theme.css 168 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 302 B
build/block-library/blocks/query-pagination/style.css 299 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 450 B
build/block-library/blocks/query/editor.css 449 B
build/block-library/blocks/query/style-rtl.css 370 B
build/block-library/blocks/query/style.css 368 B
build/block-library/blocks/query/view.min.js 555 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 178 B
build/block-library/blocks/search/editor.css 178 B
build/block-library/blocks/search/style-rtl.css 607 B
build/block-library/blocks/search/style.css 607 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/search/view.min.js 468 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 323 B
build/block-library/blocks/shortcode/editor.css 323 B
build/block-library/blocks/site-logo/editor-rtl.css 754 B
build/block-library/blocks/site-logo/editor.css 754 B
build/block-library/blocks/site-logo/style-rtl.css 204 B
build/block-library/blocks/site-logo/style.css 204 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 682 B
build/block-library/blocks/social-links/editor.css 681 B
build/block-library/blocks/social-links/style-rtl.css 1.44 kB
build/block-library/blocks/social-links/style.css 1.43 kB
build/block-library/blocks/spacer/editor-rtl.css 348 B
build/block-library/blocks/spacer/editor.css 348 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 432 B
build/block-library/blocks/table/editor.css 432 B
build/block-library/blocks/table/style-rtl.css 639 B
build/block-library/blocks/table/style.css 639 B
build/block-library/blocks/table/theme-rtl.css 146 B
build/block-library/blocks/table/theme.css 146 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 403 B
build/block-library/blocks/template-part/editor.css 403 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/term-description/style-rtl.css 111 B
build/block-library/blocks/term-description/style.css 111 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 185 B
build/block-library/blocks/video/style.css 185 B
build/block-library/blocks/video/theme-rtl.css 126 B
build/block-library/blocks/video/theme.css 126 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.1 kB
build/block-library/common.css 1.1 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 12.1 kB
build/block-library/editor.css 12.1 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 472 B
build/block-library/reset.css 472 B
build/block-library/style-rtl.css 13.9 kB
build/block-library/style.css 13.9 kB
build/block-library/theme-rtl.css 688 B
build/block-library/theme.css 693 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/blocks/index.min.js 51.4 kB
build/commands/index.min.js 15.5 kB
build/commands/style-rtl.css 921 B
build/commands/style.css 918 B
build/components/index.min.js 255 kB
build/components/style-rtl.css 11.7 kB
build/components/style.css 11.7 kB
build/compose/index.min.js 12.1 kB
build/core-commands/index.min.js 2.6 kB
build/core-data/index.min.js 16.8 kB
build/customize-widgets/index.min.js 12 kB
build/customize-widgets/style-rtl.css 1.48 kB
build/customize-widgets/style.css 1.48 kB
build/data-controls/index.min.js 640 B
build/data/index.min.js 8.84 kB
build/date/index.min.js 17.8 kB
build/deprecated/index.min.js 451 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.64 kB
build/edit-post/classic-rtl.css 544 B
build/edit-post/classic.css 545 B
build/edit-post/index.min.js 35.5 kB
build/edit-post/style-rtl.css 7.84 kB
build/edit-post/style.css 7.83 kB
build/edit-site/index.min.js 91.8 kB
build/edit-site/style-rtl.css 13.5 kB
build/edit-site/style.css 13.5 kB
build/edit-widgets/index.min.js 16.9 kB
build/edit-widgets/style-rtl.css 4.8 kB
build/edit-widgets/style.css 4.79 kB
build/editor/index.min.js 45.5 kB
build/editor/style-rtl.css 3.53 kB
build/editor/style.css 3.52 kB
build/element/index.min.js 4.82 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 7.71 kB
build/format-library/style-rtl.css 554 B
build/format-library/style.css 553 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.58 kB
build/interactivity/index.min.js 11.3 kB
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.72 kB
build/keycodes/index.min.js 1.87 kB
build/list-reusable-blocks/index.min.js 2.2 kB
build/list-reusable-blocks/style-rtl.css 836 B
build/list-reusable-blocks/style.css 836 B
build/media-utils/index.min.js 2.9 kB
build/notices/index.min.js 948 B
build/nux/index.min.js 1.99 kB
build/nux/style-rtl.css 735 B
build/nux/style.css 732 B
build/patterns/index.min.js 2.7 kB
build/patterns/style-rtl.css 240 B
build/patterns/style.css 240 B
build/plugins/index.min.js 1.79 kB
build/preferences-persistence/index.min.js 1.84 kB
build/preferences/index.min.js 1.24 kB
build/primitives/index.min.js 943 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 958 B
build/react-i18n/index.min.js 615 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.7 kB
build/reusable-blocks/index.min.js 2.7 kB
build/reusable-blocks/style-rtl.css 243 B
build/reusable-blocks/style.css 243 B
build/rich-text/index.min.js 10.2 kB
build/router/index.min.js 1.78 kB
build/server-side-render/index.min.js 1.94 kB
build/shortcode/index.min.js 1.39 kB
build/style-engine/index.min.js 1.97 kB
build/sync/index.min.js 53.8 kB
build/token-list/index.min.js 582 B
build/url/index.min.js 3.73 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 958 B
build/warning/index.min.js 249 B
build/widgets/index.min.js 7.16 kB
build/widgets/style-rtl.css 1.15 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.02 kB

compressed-size-action

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.

What an interesting problem!

From testing, this looks like it largely resolves the issue in the post editor, while also fixing up block spacing between blocks — provided that it's expected that synced blocks will be rendered somewhere within a constrained layout.

Before After
image image

Unfortunately opting in to the layout support directly does appear to result in unintended classnames being rendered in the PHP output (I've left a separate comment about that).

I'm wondering if a possible path forward could be to cheat it, so that instead of opting the block in to the layout support, could you call useLayoutClasses within edit.js and then manually add the classnames there in the edit view? That could also add a bit of flexibility if it's important to use the layout of the parent to determine which layout type to use, too... but I'm not sure if that's a requirement for this fix.

Comment on lines 13 to 18
},
"layout": {
"type": "array",
"default": {
"type": "constrained"
}
Copy link
Contributor

Choose a reason for hiding this comment

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

Unfortunately it looks like adding layout support here results in the PHP code for layout being executed on the rendered markup, which is usually what's expected for blocks that opt-in to layout support. For this one, because the wrapper only exists in the editor, the PHP version of the layout support winds up applying the layout classnames to the first block within the rendered markup. For example, if a synced block contains an Image block as the first block, it winds up getting is-layout-flow and wp-block-block-is-layout-flow applied to the markup:

image

@Mamaduka
Copy link
Member

Mamaduka commented Sep 5, 2023

Unless we're careful, this could easily be a breaking change affecting all the sites that use Reusable/Pattern blocks.

I think it's a good idea to check the discussions in the previous attempt to solve this issue by @getdave - #31082.

@getdave
Copy link
Contributor

getdave commented Sep 5, 2023

Find the widest align option of the child blocks and apply this same align class to the parent wrapper.

@glendaviesnz can I check if this is different than the approach I took previously in #31082? I know that approach was abandoned as unworkable but perhaps there's been progress since then I'm unaware of?

@glendaviesnz
Copy link
Contributor Author

glendaviesnz commented Sep 5, 2023

Thanks @getdave and @Mamaduka, appreciate the ping, this is dangerous territory I know 😄. This is very much borrowing from #31082, but with the addition of adding hidden layout support to the reusable block wrapper so that wide/full layouts can still be applied by the children.

Still very experimental at this stage, and very cognisant of the difficulty of solving this issue in a backwards compat way.

@github-actions
Copy link

github-actions bot commented Sep 5, 2023

This pull request changed or added PHP files in previous commits, but none have been detected in the latest commit.

Thank you! ❤️

@glendaviesnz
Copy link
Contributor Author

could you call useLayoutClasses within edit.js and then manually add the classnames there in the edit view?

Thanks @andrewserong, we are already manually applying the classname in the editor anyway, but the children get the align options based on the layout support of the parent I think rather than the parents classnames. Adding skip serialization support to layout seems to fix the issue of the stray classnames though.

@github-actions
Copy link

github-actions bot commented Sep 5, 2023

Flaky tests detected in 98707fb.
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/6169704519
📝 Reported issues:

@andrewserong
Copy link
Contributor

we are already manually applying the classname in the editor anyway, but the children get the align options based on the layout support of the parent I think rather than the parents classnames. Adding skip serialization support to layout seems to fix the issue of the stray classnames though.

Ah, of course that makes sense. One potential issue with introducing skipSerialization in the PHP version of the support but not the JS equivalent is if there's a use case in the future where folks using skipSerialization would expect it to apply equally to both the JS and PHP code. It might be unexpected if the skipSerialization behaves differently for this particular block support 🤔

Since the objective is for the block to have the appearance of opting-in to the layout support without it really opting-in, could an alternative be to somehow include the layout support in only the JS registration of the block, but not the server-side one? I.e. instead of adding in the support in block.json, mutate the metadata object in block-library/src/block/index.js somewhere around here? Not sure how well that would work, so apologies if that winds up being a red herring!

@glendaviesnz
Copy link
Contributor Author

One potential issue with introducing skipSerialization in the PHP version of the support but not the JS equivalent is if there's a use case in the future where folks using skipSerialization would expect it to apply equally to both the JS and PHP code

Good point, I have switched to just explicitly excluding core/block from the server side layout rendering.

@@ -45,8 +55,38 @@ export default function ReusableBlockEdit( { attributes: { ref } } ) {
ref
);

const alignments = [ 'wide', 'full' ];

useEffect( () => {
Copy link
Contributor

Choose a reason for hiding this comment

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

I think the presence of the setAttributes calls in this useEffect results in a post's Update button not being disabled when reloaded in the editor, since the editor believes that something has changed. Here's a quick gif of reloading the editor:

2023-09-06 14 38 25

Copy link
Contributor Author

Choose a reason for hiding this comment

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

yeh, I don't like setAttribs in useEffects, but was struggling to see a different way to handle this - but will take another look.

Copy link
Contributor Author

@glendaviesnz glendaviesnz Sep 6, 2023

Choose a reason for hiding this comment

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

trying to handle this outside a useEffect causes trying to render while something else is still rendering errors. I have added __unstableMarkNextChangeAsNotPersistent for now which prevents the editor from seeing the post as dirty after the updates. Is sort of nice having this anyway as makes it clear that these attribute changes are not persisted.

Let me now if you can see a way of running this on changes to blocks without using a useEffect.

Copy link
Contributor

Choose a reason for hiding this comment

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

Can we move this logic into the reusable block creation action instead ?

Copy link
Contributor

Choose a reason for hiding this comment

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

Can we move this logic into the reusable block creation action instead ?

The source pattern can be edited via the wp_block post type editor as well. We'd need to make sure the pattern instance reflected any changes in child alignment there. Same for the frontend, once we add the wrapper.

There's a more detailed comment on this in the PR description for #54289 which attempts to add the frontend wrapper in a BC way.

@@ -10,6 +10,12 @@
"attributes": {
"ref": {
"type": "number"
},
"layout": {
Copy link
Contributor

Choose a reason for hiding this comment

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

If I'm not mistaken, I think you might not need to explicitly add the layout attribute in order to set a default? Within the layout object in supports, you can set a default object. For example, here's the one from the Columns block:

"layout": {
"allowSwitching": false,
"allowInheriting": false,
"allowEditing": false,
"default": {
"type": "flex",
"flexWrap": "nowrap"
}
},

Copy link
Contributor Author

Choose a reason for hiding this comment

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

That seems to work - and saves having a documented attrib for the block that shouldn't actually be used. Thanks.

@Mamaduka
Copy link
Member

Mamaduka commented Sep 6, 2023

I found my notes for this issue. I was also planning to work on it, but I got carried away with other shiny things. :)

I will share them, just in case they're helpful to anyone.

Notes

  • I like @youknowriad's suggestion to make the Block an actual wrapper - Try to make Reusable blocks inherit alignment #31082 (comment). I also think that it should have been a wrapper from the start.
  • Enable full and wide alignments for the block, but set the default to none. This will keep old block instances backward compatible.
  • Render a wrapper element on the front-end when the alignment is set. We could display a hint in the editor so users aren't "surprised."
  • Don't set alignment based on children - I know this is the opposite of what you're doing here 😅

@glendaviesnz
Copy link
Contributor Author

glendaviesnz commented Sep 6, 2023

Thanks for the extra context @Mamaduka

Don't set alignment based on children - I know this is the opposite of what you're doing here 😅

This may just be a temporary approach to fix the broken feel of the block for wide and full align - and trying to do it in a way that does not affect the serialized markup at all so that the approach is easily changed down the line if we do move to a wrapper. Still very draft and a way of exploring all the possible alternatives for a possible fix for 6.4. Will keep you in the loop if we get past the exploration phase.

'blocks.registerBlockType',
'core/synced-patterns/add-editor-only-layout-support-for-patterns',
addEditorOnlyLayoutSupportForPatterns
);
Copy link
Contributor

Choose a reason for hiding this comment

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

Why is this done in a filter instead of just updating the block.json?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Because we don't want the layout supports serialized in the frontend by the server-side rendering. Without the wrapper on the frontend it adds the layout classes to the first child block instead which causes issues.

We did look at adding __experimentalSkipSerialization to layouts, but it was a bit quirky only applying this on the server end as all other uses of __experimentalSkipSerialization apply to both js and php sides.

We also explored adding a new __experimentalSkipServerSerialization, but this leaves us with yet another API that needs to be supported, just for what is currently a single edge case.

In the end we decided that given this is a background/hidden use of the support to get around the layout quirk in the editor only, that the filter was the best approach, but open to other suggestions.

Copy link
Contributor Author

@glendaviesnz glendaviesnz Sep 6, 2023

Choose a reason for hiding this comment

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

BTW, we are seeing this as a quick fix for the most obvious/immediate issue with the wide/full layouts. It is not perfect but the main advantage of this approach is that it does not serialize any changes to the block content so makes it easier to then move to the wider/more long-term fixes covering more layout flexibility mentioned in #8288

Copy link
Contributor

Choose a reason for hiding this comment

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

Because we don't want the layout supports serialized in the frontend by the server-side rendering. Without the wrapper on the frontend it adds the layout classes to the first child block instead which causes issues.

Can you clarify this, why don't we want that? There something I might be missing?

Copy link
Contributor

Choose a reason for hiding this comment

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

Oh I guess because the reusable blocks have no wrapper in the frontend 🤔 I feel we should solve that first as otherwise it's going to be hacks on top of hacks. Maybe we can create the wrapper for reusable blocks v2 basically and leave the existing ones untouched.

Copy link
Contributor

@youknowriad youknowriad Sep 6, 2023

Choose a reason for hiding this comment

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

Adding a wrapper also solves the issue of reusable blocks showing up differently between frontend and backend.

Copy link
Contributor Author

@glendaviesnz glendaviesnz Sep 6, 2023

Choose a reason for hiding this comment

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

ok, will try and modify the approach to also add the wrapper on the frontend for new blocks only.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@Mamaduka I probably won't get back to this until next week as I have some pattern category stuff to wrap up first, so feel free to take a look in the meantime if you get your other shiny things all polished up 😃

Copy link
Member

Choose a reason for hiding this comment

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

I also need to stabilize the Table of Contents block before WP 6.4, so I'm not sure how much time I'll have outside of that. But I will give it a try if I find extra time :)

Copy link
Contributor

@tellthemachines tellthemachines left a comment

Choose a reason for hiding this comment

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

I'm probably missing some context here, but shouldn't we be able to get the correct alignments by adding layout to the wrapper and skipping serialization on both server and editor? The alignment code only looks at the layout type, which should be present even if serialization is skipped, right?

blockSettings.supports = {};
}
blockSettings.supports.layout = {
allowSizingOnChildren: true,
Copy link
Contributor

Choose a reason for hiding this comment

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

allowSizingOnChildren is only relevant for flex type layouts so it won't apply here.

@aaronrobertshaw
Copy link
Contributor

After recent discussions on how best to solve the synced patterns alignment problem, the general consensus was to try wrapping synced patterns on the frontend to match the editor.

I have a draft PR that attempts to do this in a backwards-compatible manner - #54289.

It isn't quite ready for review as I've run out of time today. I still need to fully get my head around the layout support for this use case. As it stands, if you remove the last wide or full alignment from an immediate child of the pattern, the pattern has a layout config that now prevents wide or full alignments being reapplied.

@aaronrobertshaw
Copy link
Contributor

Thanks for all the efforts in exploring solutions here @glendaviesnz 👍

I'll close this as #54416 has been merged fixing the original issue in a slightly different way.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Synced Patterns Related to synced patterns (formerly reusable blocks) [Type] Bug An existing feature does not function as intended
Projects
No open projects
Status: Done
Development

Successfully merging this pull request may close these issues.

7 participants