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

Try to make Reusable blocks inherit alignment #31082

Closed
wants to merge 4 commits into from

Conversation

getdave
Copy link
Contributor

@getdave getdave commented Apr 22, 2021

Description

Addresses #8288.

Currently, when reusable blocks are created from a set of blocks which have various alignments set these are "lost". This is because the reusable block is always "centered" within the editor and has no concept of "wide" or "full".

This PR:

  • adds alignment support to reusable blocks
  • grabs the widest alignment setting of the blocks being placed into the reusable block and applies that setting to the reusable block itself.

This sort of works, but this issue is that the blocks within reusable block that do not have an alignment set are no longer centered within the viewport. This is because they are missing the special CSS rules that are based on the root container which cause them to be centered.

@jasmussen mentioned that @youknowriad is working on some Layout controls which might help to solve this.

Essentially what we need is a way to make the alignment of blocks contained within the reusable block behave (lay out) as they do within the normal editor canvas.

Update: this layout centering issue now seems to be fixed.

Closes #8288

How has this been tested?

Screenshots

Screen.Capture.on.2021-08-05.at.14-54-43.mp4

Types of changes

Checklist:

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

Uploading Screen Capture on 2021-04-22 at 12-32-58.mov…

@getdave getdave added the [Status] In Progress Tracking issues with work in progress label Apr 22, 2021
@getdave getdave self-assigned this Apr 22, 2021
@jasmussen
Copy link
Contributor

This is an interesting approach, that on the face of it seems simple and reasonably functional. It'll need a great deal of testing, and I'd love another code gut check, but this might just work.

@getdave getdave changed the title Try/reusable blocks inherit alignment Try to make Reusable blocks inherit alignment Apr 22, 2021
@getdave
Copy link
Contributor Author

getdave commented Apr 22, 2021

this might just work.

But only if we find a way to have the blocks within the reusable block inherit the same styles as if they were inserted into the main editor canvas.

@github-actions
Copy link

github-actions bot commented Apr 22, 2021

Size Change: -45.7 kB (-4%)

Total Size: 1.03 MB

Filename Size Change
build/a11y/index.min.js 931 B -186 B (-17%) 👏
build/admin-manifest/index.min.js 1.09 kB -365 B (-25%) 🎉
build/annotations/index.min.js 2.7 kB -230 B (-8%)
build/api-fetch/index.min.js 2.19 kB -250 B (-10%) 👏
build/autop/index.min.js 2.08 kB -201 B (-9%)
build/blob/index.min.js 459 B -214 B (-32%) 🎉
build/block-directory/index.min.js 6.21 kB -409 B (-6%)
build/block-editor/index.min.js 118 kB -8.96 kB (-7%)
build/block-editor/style-rtl.css 13.9 kB +6 B (0%)
build/block-editor/style.css 13.9 kB +10 B (0%)
build/block-library/blocks/file/view.min.js 322 B -389 B (-55%) 🏆
build/block-library/blocks/navigation/editor-rtl.css 1.69 kB +19 B (+1%)
build/block-library/blocks/navigation/editor.css 1.69 kB +18 B (+1%)
build/block-library/blocks/navigation/view.min.js 2.52 kB -313 B (-11%) 👏
build/block-library/blocks/search/editor-rtl.css 165 B -44 B (-21%) 🎉
build/block-library/blocks/search/editor.css 165 B -44 B (-21%) 🎉
build/block-library/blocks/search/style-rtl.css 374 B +6 B (+2%)
build/block-library/blocks/search/style.css 375 B +3 B (+1%)
build/block-library/editor-rtl.css 9.86 kB -12 B (0%)
build/block-library/editor.css 9.84 kB -10 B (0%)
build/block-library/index.min.js 146 kB -1.16 kB (-1%)
build/block-library/reset-rtl.css 527 B +13 B (+3%)
build/block-library/reset.css 527 B +13 B (+3%)
build/block-library/style-rtl.css 10.2 kB +5 B (0%)
build/block-library/style.css 10.3 kB +4 B (0%)
build/block-serialization-default-parser/index.min.js 1.09 kB -209 B (-16%) 👏
build/block-serialization-spec-parser/index.min.js 2.79 kB -267 B (-9%)
build/blocks/index.min.js 46.8 kB -465 B (-1%)
build/components/index.min.js 208 kB +10.6 kB (+5%) 🔍
build/compose/index.min.js 10.2 kB -67 B (-1%)
build/core-data/index.min.js 12.3 kB -233 B (-2%)
build/customize-widgets/index.min.js 10.4 kB -366 B (-3%)
build/data-controls/index.min.js 614 B -217 B (-26%) 🎉
build/data/index.min.js 7.03 kB -192 B (-3%)
build/date/index.min.js 31.5 kB -366 B (-1%)
build/deprecated/index.min.js 428 B -310 B (-42%) 🎉
build/dom-ready/index.min.js 304 B -272 B (-47%) 🎉
build/dom/index.min.js 4.53 kB -247 B (-5%)
build/edit-navigation/index.min.js 13.4 kB -537 B (-4%)
build/edit-post/classic-rtl.css 492 B +13 B (+3%)
build/edit-post/classic.css 494 B +13 B (+3%)
build/edit-post/index.min.js 28.4 kB -31 kB (-52%) 🏆
build/edit-site/index.min.js 25.7 kB -278 B (-1%)
build/edit-widgets/index.min.js 15.9 kB -736 B (-4%)
build/editor/index.min.js 37.5 kB -716 B (-2%)
build/element/index.min.js 3.16 kB -280 B (-8%)
build/escape-html/index.min.js 517 B -222 B (-30%) 🎉
build/format-library/index.min.js 5.36 kB -360 B (-6%)
build/hooks/index.min.js 1.55 kB -213 B (-12%) 👏
build/html-entities/index.min.js 424 B -204 B (-32%) 🎉
build/i18n/index.min.js 3.59 kB -138 B (-4%)
build/is-shallow-equal/index.min.js 501 B -209 B (-29%) 🎉
build/keyboard-shortcuts/index.min.js 1.49 kB -250 B (-14%) 👏
build/keycodes/index.min.js 1.25 kB -236 B (-16%) 👏
build/list-reusable-blocks/index.min.js 1.85 kB -215 B (-10%) 👏
build/media-utils/index.min.js 2.88 kB -206 B (-7%)
build/notices/index.min.js 845 B -225 B (-21%) 🎉
build/nux/index.min.js 2.03 kB -279 B (-12%) 👏
build/plugins/index.min.js 1.83 kB -156 B (-8%)
build/primitives/index.min.js 921 B -142 B (-13%) 👏
build/priority-queue/index.min.js 582 B -209 B (-26%) 🎉
build/react-i18n/index.min.js 671 B -253 B (-27%) 🎉
build/redux-routine/index.min.js 2.63 kB -190 B (-7%)
build/reusable-blocks/index.min.js 2.36 kB -207 B (-8%)
build/rich-text/index.min.js 10.5 kB -303 B (-3%)
build/server-side-render/index.min.js 1.32 kB -320 B (-20%) 🎉
build/shortcode/index.min.js 1.48 kB -204 B (-12%) 👏
build/token-list/index.min.js 562 B -286 B (-34%) 🎉
build/url/index.min.js 1.72 kB -236 B (-12%) 👏
build/viewport/index.min.js 1.02 kB -259 B (-20%) 🎉
build/warning/index.min.js 248 B -913 B (-79%) 🏆
build/widgets/index.min.js 6.27 kB -213 B (-3%)
build/wordcount/index.min.js 1.04 kB -202 B (-16%) 👏
ℹ️ View Unchanged
Filename Size
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 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 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 58 B
build/block-library/blocks/audio/editor.css 58 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 474 B
build/block-library/blocks/button/editor.css 474 B
build/block-library/blocks/button/style-rtl.css 605 B
build/block-library/blocks/button/style.css 604 B
build/block-library/blocks/buttons/editor-rtl.css 315 B
build/block-library/blocks/buttons/editor.css 315 B
build/block-library/blocks/buttons/style-rtl.css 370 B
build/block-library/blocks/buttons/style.css 370 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 90 B
build/block-library/blocks/code/style.css 90 B
build/block-library/blocks/code/theme-rtl.css 131 B
build/block-library/blocks/code/theme.css 131 B
build/block-library/blocks/columns/editor-rtl.css 189 B
build/block-library/blocks/columns/editor.css 188 B
build/block-library/blocks/columns/style-rtl.css 474 B
build/block-library/blocks/columns/style.css 475 B
build/block-library/blocks/cover/editor-rtl.css 666 B
build/block-library/blocks/cover/editor.css 670 B
build/block-library/blocks/cover/style-rtl.css 1.23 kB
build/block-library/blocks/cover/style.css 1.23 kB
build/block-library/blocks/embed/editor-rtl.css 488 B
build/block-library/blocks/embed/editor.css 488 B
build/block-library/blocks/embed/style-rtl.css 400 B
build/block-library/blocks/embed/style.css 400 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/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 707 B
build/block-library/blocks/gallery/editor.css 706 B
build/block-library/blocks/gallery/style-rtl.css 1.05 kB
build/block-library/blocks/gallery/style.css 1.05 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 159 B
build/block-library/blocks/group/editor.css 159 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 93 B
build/block-library/blocks/group/theme.css 93 B
build/block-library/blocks/heading/editor-rtl.css 152 B
build/block-library/blocks/heading/editor.css 152 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/home-link/style-rtl.css 247 B
build/block-library/blocks/home-link/style.css 247 B
build/block-library/blocks/html/editor-rtl.css 283 B
build/block-library/blocks/html/editor.css 284 B
build/block-library/blocks/image/editor-rtl.css 728 B
build/block-library/blocks/image/editor.css 728 B
build/block-library/blocks/image/style-rtl.css 482 B
build/block-library/blocks/image/style.css 487 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B
build/block-library/blocks/latest-posts/editor.css 137 B
build/block-library/blocks/latest-posts/style-rtl.css 528 B
build/block-library/blocks/latest-posts/style.css 527 B
build/block-library/blocks/list/style-rtl.css 63 B
build/block-library/blocks/list/style.css 63 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 488 B
build/block-library/blocks/media-text/style.css 485 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 474 B
build/block-library/blocks/navigation-link/editor.css 474 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B
build/block-library/blocks/navigation-link/style.css 94 B
build/block-library/blocks/navigation/style-rtl.css 1.65 kB
build/block-library/blocks/navigation/style.css 1.64 kB
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 310 B
build/block-library/blocks/page-list/editor.css 310 B
build/block-library/blocks/page-list/style-rtl.css 242 B
build/block-library/blocks/page-list/style.css 242 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 248 B
build/block-library/blocks/paragraph/style.css 248 B
build/block-library/blocks/post-author/editor-rtl.css 210 B
build/block-library/blocks/post-author/editor.css 210 B
build/block-library/blocks/post-author/style-rtl.css 182 B
build/block-library/blocks/post-author/style.css 181 B
build/block-library/blocks/post-comments-form/style-rtl.css 140 B
build/block-library/blocks/post-comments-form/style.css 140 B
build/block-library/blocks/post-comments/style-rtl.css 360 B
build/block-library/blocks/post-comments/style.css 359 B
build/block-library/blocks/post-content/editor-rtl.css 138 B
build/block-library/blocks/post-content/editor.css 138 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 412 B
build/block-library/blocks/post-featured-image/editor.css 412 B
build/block-library/blocks/post-featured-image/style-rtl.css 143 B
build/block-library/blocks/post-featured-image/style.css 143 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 378 B
build/block-library/blocks/post-template/style.css 379 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 60 B
build/block-library/blocks/post-title/style.css 60 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 361 B
build/block-library/blocks/pullquote/style.css 360 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 270 B
build/block-library/blocks/query-pagination/editor.css 262 B
build/block-library/blocks/query-pagination/style-rtl.css 168 B
build/block-library/blocks/query-pagination/style.css 168 B
build/block-library/blocks/query-title/editor-rtl.css 85 B
build/block-library/blocks/query-title/editor.css 85 B
build/block-library/blocks/query/editor-rtl.css 131 B
build/block-library/blocks/query/editor.css 132 B
build/block-library/blocks/quote/style-rtl.css 169 B
build/block-library/blocks/quote/style.css 169 B
build/block-library/blocks/quote/theme-rtl.css 220 B
build/block-library/blocks/quote/theme.css 222 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/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 99 B
build/block-library/blocks/separator/editor.css 99 B
build/block-library/blocks/separator/style-rtl.css 250 B
build/block-library/blocks/separator/style.css 250 B
build/block-library/blocks/separator/theme-rtl.css 172 B
build/block-library/blocks/separator/theme.css 172 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 462 B
build/block-library/blocks/site-logo/editor.css 464 B
build/block-library/blocks/site-logo/style-rtl.css 153 B
build/block-library/blocks/site-logo/style.css 153 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 165 B
build/block-library/blocks/social-link/editor.css 165 B
build/block-library/blocks/social-links/editor-rtl.css 812 B
build/block-library/blocks/social-links/editor.css 811 B
build/block-library/blocks/social-links/style-rtl.css 1.33 kB
build/block-library/blocks/social-links/style.css 1.33 kB
build/block-library/blocks/spacer/editor-rtl.css 307 B
build/block-library/blocks/spacer/editor.css 307 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 471 B
build/block-library/blocks/table/editor.css 472 B
build/block-library/blocks/table/style-rtl.css 481 B
build/block-library/blocks/table/style.css 481 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 146 B
build/block-library/blocks/tag-cloud/style.css 146 B
build/block-library/blocks/template-part/editor-rtl.css 636 B
build/block-library/blocks/template-part/editor.css 635 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/editor-rtl.css 90 B
build/block-library/blocks/term-description/editor.css 90 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 571 B
build/block-library/blocks/video/editor.css 572 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 1.29 kB
build/block-library/common.css 1.29 kB
build/block-library/theme-rtl.css 688 B
build/block-library/theme.css 692 B
build/components/style-rtl.css 15.8 kB
build/components/style.css 15.8 kB
build/customize-widgets/style-rtl.css 1.5 kB
build/customize-widgets/style.css 1.49 kB
build/edit-navigation/style-rtl.css 3.1 kB
build/edit-navigation/style.css 3.1 kB
build/edit-post/style-rtl.css 7.18 kB
build/edit-post/style.css 7.17 kB
build/edit-site/style-rtl.css 5.01 kB
build/edit-site/style.css 5.01 kB
build/edit-widgets/style-rtl.css 4.01 kB
build/edit-widgets/style.css 4.02 kB
build/editor/style-rtl.css 3.92 kB
build/editor/style.css 3.91 kB
build/format-library/style-rtl.css 668 B
build/format-library/style.css 669 B
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/nux/style-rtl.css 747 B
build/nux/style.css 743 B
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/widgets/style-rtl.css 1.04 kB
build/widgets/style.css 1.04 kB

compressed-size-action

@youknowriad
Copy link
Contributor

I'm going to say something that could be controvertial. I feel reusable blocks should have a wrapper like template parts... That way, no issues. It does have impact though: You can't insert reusable blocks in places where groups are not allowed.

Alignment are specific to the default layout we have now but imagine a world where we have more layouts: Imagine we have a "grid" container: wide/full/left alignments don't make any sense there, what would you assign to the group block?

@paaljoachim
Copy link
Contributor

paaljoachim commented Apr 22, 2021

I feel reusable blocks should have a wrapper like template parts...

I will call the wrapper a lid. A type of overlay (lid) is being added for Reusable blocks in this PR by @Addison-Stavlo .
#30156 (comment)

This is in relation to the click-through approach. Clicking a template first selects the parent container. Clicking again selects the inner/child blocks.

@Addison-Stavlo
Copy link
Contributor

is being added for Reusable blocks in this PR by @Addison-Stavlo .

I have been exploring a click-through pattern for template parts, but haven't looked at reusable blocks specifically yet. In the end it sounds like the same click-through pattern should be implemented for both. Im not very familiar with Reusable blocks in general and uncertain about whether or not this missing wrapper (is it missing entirely? or lacking functionality?) @youknowriad mentions would be any issue there or not.

@jasmussen
Copy link
Contributor

I'm going to say something that could be controvertial. I feel reusable blocks should have a wrapper like template parts... That way, no issues. It does have impact though: You can't insert reusable blocks in places where groups are not allowed.

I could personally see that working. What would be the consequences for existing content if a change such as this were to be explored?

@youknowriad
Copy link
Contributor

I could personally see that working. What would be the consequences for existing content if a change such as this were to be explored?

If we go that route, we'll have to create some kind of attribute in the reusable block to indicate that it's v2 and avoid touching the old ones.

@jasmussen
Copy link
Contributor

If we go that route, we'll have to create some kind of attribute in the reusable block to indicate that it's v2 and avoid touching the old ones.

Should it be an option on the block, denoting the downsides of not having a wrapper? I seem to recall there being some benefits to the reusable block interface not adding a wrapper, though I can't immediately recall them.

@getdave getdave removed their assignment Jul 29, 2021
@getdave getdave added Needs Dev Ready for, and needs developer efforts and removed [Status] In Progress Tracking issues with work in progress labels Jul 29, 2021
@getdave getdave force-pushed the try/reusable-blocks-inherit-alignment branch from 828f0a8 to 17f3058 Compare August 5, 2021 13:43
@getdave
Copy link
Contributor Author

getdave commented Aug 5, 2021

@paaljoachim This now seems to be working much better.

Only problem I can see is this:

  1. Create some blocks with one of them having a "Full" width.
  2. Convert to reusuable.
  3. Edit the reusable block by browsing to it via http://localhost:8888/wp-admin/edit.php?post_type=wp_block.
  4. Notice that once loaded into the editor the "full width" settings are preserved on the inner blocks. That's expected.
  5. Create a new Post.
  6. Insert the reusable block you just created.
  7. See that the alignment is now lost.

Seems that the alignment is not persisted on the reusable block when saving.

@getdave getdave marked this pull request as ready for review August 10, 2021 09:08
@getdave
Copy link
Contributor Author

getdave commented Aug 10, 2021

Moving to Ready for Review so we get the Plugin build and contributors can test it.

cc @paaljoachim

@paaljoachim
Copy link
Contributor

The first test.

Using WordPress 5.8.
Gutenberg plugin 11.2.1
Twenty Twenty One.

I made a Group block with 3 columns inside. Set it at Full Width. Duplicated the Group block.
Made the second Group block into a Reusable block.

The result
Backend:
Screen Shot 2021-08-10 at 11 18 16

Frontend:
Screen Shot 2021-08-10 at 11 18 34


Using the Gutenberg PR build (How to test with the Gutenberg PR build can be seen here.). Duplicated the original Group block with columns. Full width.

Backend (shows the correct alignment.)
Screen Shot 2021-08-10 at 11 26 14

Frontend:
Screen Shot 2021-08-10 at 11 26 34

This avoids having the toolbar show up or clashing with existing alignments
Copy link
Contributor

@youknowriad youknowriad 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 giving this a try.

The fundamental issue here is that the reusable block doesn't have any wrapper in the frontend but does have one in the editor constraining its content.

I don't think there's a perfect solution for this because alignments styles depend on the presence of wrappers meaning if you define a layout on a container block, that layout will apply its styles on its children, and the children are different between frontend and backend.

The current PR tries to be "smart" by guessing the widest alignment applied in the children of the reusable block. Though, there several main problem here:

  • this is going to add an "align" attribute to the reusable block and that attribute is persisted but useless since its value should ideally always be computed based on the children, if I align a children (add "full") after the creation of the reusable block, it won't have any impact on the parent's attribute.
  • The other fundamental problem is that this solution only works in "classic themes" where alignments works the same way regardless of the container (aka applying align full in a root block or in a child of a group block has the same effect), in the context of block themes, this doesn't work at all because the layout (aka alignments styles) is defined by the direct parent, in the case of the reusable block's content, the direct parent shouldn't be the reusable block itself but it should be the parent of the reusable block (currently broken in trunk too and this solution doesn't solve that)

I personally don't have a perfect solution for this problem though, my crazy ideas (not sure if acceptable or realistic) tend to be around:

  • Forbid any alignments in the reusable block's children (remove the attributes once the block is made reusable and forbid them in the UI)
  • Support wrapper-less blocks in the editor (I don't think it's realistic because I don't see how we can render a block UI in the editor without rendering any Dom node for it)

@paaljoachim
Copy link
Contributor

paaljoachim commented Aug 10, 2021

I am not fully certain what you are saying Riad.....
Here are my thoughts.

Creating a Reusable block should automatically take on the regular blocks alignment.
Nested block with no alignment defined (using default) should listen to the parent block alignment. For instance in the above example using a Group block with 3 columns nested inside using default width. Changing the Group block alignment to Full width did not automatically change the nested column block to use the same Full width alignment as the parent Group block.

I would assume this:
Changing the alignment of the parent block the child blocks should automatically change its alignment to reflect the parent alignment. (If the child blocks have alignment controls then the user can of course go in and readjust the alignment.)

I believe this issue is also very much associated:
Using a shortcode block inside a Group block - Using alignment to make the shortcode block wider.
#33886

@getdave
Copy link
Contributor Author

getdave commented Aug 10, 2021

The fundamental issue here is that the reusable block doesn't have any wrapper in the frontend but does have one in the editor constraining its content.

I might have missed something here, but I don't fully understand why that is an issue. The reusable block is - as you say - a transparent wrapper. It just "holds" existing blocks.

If I have some blocks with a "full" alignment, then when I make a reusable block they should remain visually aligned exactly as they were before I made them reusable.

Here's how I see it:

  • Front of site: should simply render the blocks (with respective alignments) but not render the reusable block (this happens already).
  • Editor: should render the reusable block wrapper (ie: core/block), but that wrapper should visually adapt to allow the aligned blocks to visually display at the widest width setting.

this is going to add an "align" attribute to the reusable block and that attribute is persisted but useless since its value should ideally always be computed based on the children, if I align a children (add "full") after the creation of the reusable block, it won't have any impact on the parent's attribute.

I just figured that one out 😆

I've adjusted the code so that now when the blocks are available we compute the widest block and set an editor-only attribute on the core/block to visually align the block as expected.

Screen.Capture.on.2021-08-10.at.10-55-45.1.mp4

Note: I've not used align as the attribute name because this creates toolbars and all sorts of stuff we don't want appearing. Reusable blocks themselves should not have alignment - they should simply respect the alignment of their children.

Also note: the attribute on the core/block is not persisted. It's purely for editor alignment convenience.

This also works perfectly on the front of the site:

Screenshot 2021-08-10 at 11 01 55

if I align a children (add "full") after the creation of the reusable block, it won't have any impact on the parent's attribute.

My new solution accounts for that. Change the width of a child and the (editor only) attribute of the Reusable block adapts as necessary.

Screen.Capture.on.2021-08-10.at.11-06-36.mov

The other fundamental problem is that this solution only works in "classic themes" where alignments works the same way regardless of the container

Yeh this bit I'm confused about...

@getdave
Copy link
Contributor Author

getdave commented Aug 10, 2021

Also to be clear, I do not support the idea that you should be able to set an alignment on the Reusable block itself and have the wrapped blocks take on that alignment. No no no.

The reusable block is a transparent wrapper. It should adapt to its children and do nothing else.

IMHO... 😄

@youknowriad
Copy link
Contributor

Here's the code adding the alignments styles:

${ appendSelectors( selector, '> *' ) } {
max-width: ${ contentSize ?? wideSize };
margin-left: auto !important;
margin-right: auto !important;
}
${ appendSelectors( selector, '> [data-align="wide"]' ) } {
max-width: ${ wideSize ?? contentSize };
}
${ appendSelectors( selector, '> [data-align="full"]' ) } {
max-width: none;
}

As you can see, the styles apply only to the direct children of the container block. Meaning If you detect the widest alignments of a list of blocks, apply it to a newly added element container of the blocks in the editor (like this PR does), here's what happens: The width of that newly added container will be correct but since that newly added container doesn't have any layout definition itself, the blocks inside it will all just take the full width of that block. (alignments of the inner blocks won't have any effect). This is in an FSE theme.

@youknowriad
Copy link
Contributor

The reason I think alignments should be forbidden in a reusable block is simple: Alignments don't make sense on their own, they depend on the context of where the block is used and since this block is "reusable", it should be independent of its context.

@getdave
Copy link
Contributor Author

getdave commented Aug 10, 2021

The width of that newly added container will be correct but since that newly added container doesn't have any layout definition itself, the blocks inside it will all just take the full width of that block. (alignments of the inner blocks won't have any effect). This is in an FSE theme.

Ok this is the piece of the puzzle I was missing.

@getdave
Copy link
Contributor Author

getdave commented Jan 7, 2022

Closing this as there doesn't seem to be consensus on an approach.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Needs Dev Ready for, and needs developer efforts
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Synced Patterns: Not receiving alignment attribute in editor
5 participants