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

Full width alignments and root padding combined. #41377

Closed
wants to merge 12 commits into from

Conversation

scruffian
Copy link
Contributor

What?

This combines #39871 and #39926 which makes it clear that there are some shortcomings with the approach in these PRs.

The problem is that the root padding PR assumes that blocks that implement "inherit default layout" will always be at the root of the document, so it uses .wp-site-blocks > * > .alignfull to target them.

However this is not always the case - the current behaviour in trunk is that alignfull items inside the outermost block in the document that implements inherit default layout will stretch to the edge of the screen.

I have made some adjustments so that we can achieve the aims of both PRs...

Why?

So we can remove custom CSS from block themes.

How?

This is difficult to achieve, because we want the padding set on the root element, but the negative margins set on the outermost .alignfull block. The approach here is to set the negative margins to counteract the root padding on all .alignfull blocks, and then to override this with more specific negative margins for inner alignfull blocks.

To achieve this it was necessary to add a utility class (.wp-containter-default-layout) to all blocks that inherit the default layout, so that we can target those that are more than one level deep. I appreciate this is convoluted, but it's the only way I could get this to work.

Another benefit of the approach here is that we don't have to force blocks that implement "inherit default layout" to use the root padding - they can have their own padding values, which should work, and the alignfull blocks should adjust for this. I haven't yet implemented this, but I believe it will work.

Right now this is only working in the frontend

Still to do:
-[ ] Remove the code that prevents users from changing padding on "inherit default layout" blocks
-[ ] Update WP_Theme_JSON to use the set padding values if they are defined
-[ ] Move WP_Theme_JSON changes to the 6.1 compat dir
-[ ] Update the CSS in the editor to match the changes in the frontend.

Testing Instructions

Screenshots or screencast

TODO

@WordPress/block-themers

@scruffian scruffian added the [Feature] Themes Questions or issues with incorporating or styling blocks in a theme. label May 26, 2022
@scruffian scruffian self-assigned this May 26, 2022
@github-actions
Copy link

Size Change: +745 B (0%)

Total Size: 1.24 MB

Filename Size Change
build/block-editor/index.min.js 151 kB +267 B (0%)
build/block-editor/style-rtl.css 14.6 kB +55 B (0%)
build/block-editor/style.css 14.6 kB +57 B (0%)
build/blocks/index.min.js 47.2 kB +73 B (0%)
build/edit-post/index.min.js 30.4 kB +32 B (0%)
build/edit-site/index.min.js 48.2 kB +261 B (+1%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.77 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 487 B
build/block-directory/index.min.js 6.51 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 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/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 59 B
build/block-library/blocks/avatar/style.css 59 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 445 B
build/block-library/blocks/button/editor.css 445 B
build/block-library/blocks/button/style-rtl.css 560 B
build/block-library/blocks/button/style.css 560 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 103 B
build/block-library/blocks/code/style.css 103 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 406 B
build/block-library/blocks/columns/style.css 406 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 127 B
build/block-library/blocks/comment-template/style.css 127 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 95 B
build/block-library/blocks/comments/editor.css 95 B
build/block-library/blocks/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/cover/style-rtl.css 1.56 kB
build/block-library/blocks/cover/style.css 1.56 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 417 B
build/block-library/blocks/embed/style.css 417 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/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 961 B
build/block-library/blocks/gallery/editor.css 964 B
build/block-library/blocks/gallery/style-rtl.css 1.51 kB
build/block-library/blocks/gallery/style.css 1.51 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 333 B
build/block-library/blocks/group/editor.css 333 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 738 B
build/block-library/blocks/image/editor.css 737 B
build/block-library/blocks/image/style-rtl.css 529 B
build/block-library/blocks/image/style.css 535 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 199 B
build/block-library/blocks/latest-posts/editor.css 198 B
build/block-library/blocks/latest-posts/style-rtl.css 463 B
build/block-library/blocks/latest-posts/style.css 462 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 493 B
build/block-library/blocks/media-text/style.css 490 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 708 B
build/block-library/blocks/navigation-link/editor.css 706 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-submenu/view.min.js 375 B
build/block-library/blocks/navigation/editor-rtl.css 2.03 kB
build/block-library/blocks/navigation/editor.css 2.04 kB
build/block-library/blocks/navigation/style-rtl.css 1.95 kB
build/block-library/blocks/navigation/style.css 1.94 kB
build/block-library/blocks/navigation/view-modal.min.js 2.78 kB
build/block-library/blocks/navigation/view.min.js 395 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 363 B
build/block-library/blocks/page-list/editor.css 363 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 260 B
build/block-library/blocks/paragraph/style.css 260 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 69 B
build/block-library/blocks/post-comments-form/editor.css 69 B
build/block-library/blocks/post-comments-form/style-rtl.css 495 B
build/block-library/blocks/post-comments-form/style.css 495 B
build/block-library/blocks/post-comments/editor-rtl.css 77 B
build/block-library/blocks/post-comments/editor.css 77 B
build/block-library/blocks/post-comments/style-rtl.css 628 B
build/block-library/blocks/post-comments/style.css 628 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 721 B
build/block-library/blocks/post-featured-image/editor.css 721 B
build/block-library/blocks/post-featured-image/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 323 B
build/block-library/blocks/post-template/style.css 323 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 80 B
build/block-library/blocks/post-title/style.css 80 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 370 B
build/block-library/blocks/pullquote/style.css 370 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 369 B
build/block-library/blocks/query/editor.css 369 B
build/block-library/blocks/quote/style-rtl.css 213 B
build/block-library/blocks/quote/style.css 213 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 397 B
build/block-library/blocks/search/style.css 398 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 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 233 B
build/block-library/blocks/separator/style.css 233 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 759 B
build/block-library/blocks/site-logo/editor.css 759 B
build/block-library/blocks/site-logo/style-rtl.css 192 B
build/block-library/blocks/site-logo/style.css 192 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 177 B
build/block-library/blocks/social-link/editor.css 177 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.37 kB
build/block-library/blocks/social-links/style.css 1.36 kB
build/block-library/blocks/spacer/editor-rtl.css 332 B
build/block-library/blocks/spacer/editor.css 332 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 504 B
build/block-library/blocks/table/editor.css 504 B
build/block-library/blocks/table/style-rtl.css 625 B
build/block-library/blocks/table/style.css 625 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 226 B
build/block-library/blocks/tag-cloud/style.css 227 B
build/block-library/blocks/template-part/editor-rtl.css 149 B
build/block-library/blocks/template-part/editor.css 149 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 561 B
build/block-library/blocks/video/editor.css 563 B
build/block-library/blocks/video/style-rtl.css 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 993 B
build/block-library/common.css 990 B
build/block-library/editor-rtl.css 10.2 kB
build/block-library/editor.css 10.3 kB
build/block-library/index.min.js 181 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 11.6 kB
build/block-library/style.css 11.6 kB
build/block-library/theme-rtl.css 689 B
build/block-library/theme.css 694 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/components/index.min.js 227 kB
build/components/style-rtl.css 14.5 kB
build/components/style.css 14.5 kB
build/compose/index.min.js 11.7 kB
build/core-data/index.min.js 14.6 kB
build/customize-widgets/index.min.js 11.2 kB
build/customize-widgets/style-rtl.css 1.4 kB
build/customize-widgets/style.css 1.4 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 7.98 kB
build/date/index.min.js 32 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.69 kB
build/edit-navigation/index.min.js 16 kB
build/edit-navigation/style-rtl.css 4.05 kB
build/edit-navigation/style.css 4.05 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/style-rtl.css 7.08 kB
build/edit-post/style.css 7.08 kB
build/edit-site/style-rtl.css 7.73 kB
build/edit-site/style.css 7.71 kB
build/edit-widgets/index.min.js 16.4 kB
build/edit-widgets/style-rtl.css 4.4 kB
build/edit-widgets/style.css 4.4 kB
build/editor/index.min.js 38.5 kB
build/editor/style-rtl.css 3.71 kB
build/editor/style.css 3.7 kB
build/element/index.min.js 4.3 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 6.62 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 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.83 kB
build/keycodes/index.min.js 1.41 kB
build/list-reusable-blocks/index.min.js 1.75 kB
build/list-reusable-blocks/style-rtl.css 835 B
build/list-reusable-blocks/style.css 835 B
build/media-utils/index.min.js 2.9 kB
build/notices/index.min.js 957 B
build/nux/index.min.js 2.1 kB
build/nux/style-rtl.css 744 B
build/nux/style.css 741 B
build/plugins/index.min.js 1.98 kB
build/preferences-persistence/index.min.js 2.23 kB
build/preferences/index.min.js 1.32 kB
build/primitives/index.min.js 949 B
build/priority-queue/index.min.js 628 B
build/react-i18n/index.min.js 704 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.69 kB
build/reusable-blocks/index.min.js 2.24 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11.2 kB
build/server-side-render/index.min.js 1.61 kB
build/shortcode/index.min.js 1.52 kB
build/token-list/index.min.js 668 B
build/url/index.min.js 1.99 kB
build/vendors/react-dom.min.js 38.5 kB
build/vendors/react.min.js 4.34 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.2 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.07 kB

compressed-size-action

@colorful-tones
Copy link
Member

colorful-tones commented May 27, 2022

@scruffian can you please verify that this is the definition of fullwidth we're going for here?

Given the depth and complexity of this issue we will want to try to help define what the Testing Step: Check that the alignments work as expected means.

@colorful-tones
Copy link
Member

colorful-tones commented May 27, 2022

I've done some testing of this PR while matching the Testing Instructions above. One issue I noticed is that the 3rd image on the page (using the markup provided in the Gist) with caption: "This one is VERY wide. So wide that I would call it FULL WIDTH. This full width image should go all the way to the edge of the viewport." However, the image does not go full width and does not touch the edges of the viewport.

Note: I did go into the Site Editor and add 108px of Global padding, which is making the image not touch the edges. However, I believe this PR is aiming to address that particular scenario, correct?

Here is a screenshot of this particular issue:
Screen Shot 2022-05-27 at 4 10 57 PM

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.

Thanks for working on this! It's not a straightforward issue and part of the problem is we're not all agreed on what the behaviour should be.

The problem is that the root padding PR assumes that blocks that implement "inherit default layout" will always be at the root of the document, so it uses .wp-site-blocks > * > .alignfull to target them.

The root padding PR makes no assumptions about "inherit default layout". Its only purpose is to allow full width for direct children of the site root, including any direct children of those children (hence the .wp-site-blocks > * > .alignfull). It was purposely tackled separately from full width in all nested blocks (covered in #39871) because there was no single satisfactory solution for both problems at once.

However this is not always the case - the current behaviour in trunk is that alignfull items inside the outermost block in the document that implements inherit default layout will stretch to the edge of the screen.

This only happens if the block set to inherit default layout is either a direct child of the root block, or is itself set to full width. If it's not, then its full width children will only stretch to the limits of the block.

The approach here is to set the negative margins to counteract the root padding on all .alignfull blocks, and then to override this with more specific negative margins for inner alignfull blocks.

Not all containers of alignfull blocks have any padding at all, so blanket setting negative margins on all of them may not be the best approach.

I think overall it would be best to assume as little as possible: whether about the behaviour of "inherit default layout" (should it also use the root padding? it's unclear at the best of times what this setting is supposed to do.), or the padding of parent blocks in general. I kind of like the idea of the default gap value being set as default root padding, but I wonder if even that isn't over-assuming too.

// Add padding to full wide blocks that inherit default layout, so the content doesn't touch the edges.
$style .= "$selector > .alignfull {";
$style .= isset( $padding['left'] ) ? sprintf( 'padding-left: %s !important;', $padding['left'] ) : '';
$style .= isset( $padding['right'] ) ? sprintf( 'padding-right: %s !important;', $padding['right'] ) : '';
Copy link
Contributor

Choose a reason for hiding this comment

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

$padding['left'] and $padding['right'] are coming from core theme.json, so they'll never not be set. This has the side-effect of adding a --wp--style--block-gap-sized negative margin to any full-width child of a default layout block, whether a root padding is set by the user or not.

Also, do we really need to use !important here?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

$padding['left'] and $padding['right'] are coming from core theme.json

Not always. They can be coming from the parent block's padding settings (I 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.

Also, do we really need to use !important here?

Probably not, this is just a PoC to see if the idea is even workable :)

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 wait I see what you mean, this should be passed default padding...

opacity: 1;
}
}

Copy link
Contributor

Choose a reason for hiding this comment

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

Is this change unrelated?

@scruffian
Copy link
Contributor Author

Thanks for taking a look...

The root padding PR makes no assumptions about "inherit default layout". Its only purpose is to allow full width for direct children of the site root, including any direct children of those children (hence the .wp-site-blocks > * > .alignfull)

This is a problem because full width blocks only make sense inside blocks that inherit default layout. Without that setting toggled then all child block content will already stretch to the edge of the parent block. Alignfull isn't an option unless the parent has "inherit default layout". (I notice that this isn't the case for direct children of the post content block, but I think that's the only case and that it's a bug. I'm not sure we have yet created a theme that doesn't apply "inherit default layout" to the post content block.)

This only happens if the block set to inherit default layout is either a direct child of the root block, or is itself set to full width. If it's not, then its full width children will only stretch to the limits of the block.

It depends what themes you're looking that. The problem is that the behaviour of alignments is defined by the theme not by core, so there is no consistent model for it. I've been basing my work on the alignment styles in TwentyTwentyTwo and the themes that Automattic has created. However in the cases I've looked at I believe that the first "inherit default layout" block can be nested as deep as you like, and as long as none of the parents have padding set on them, align full blocks will go right to the edge of the screen.

Not all containers of alignfull blocks have any padding at all, so blanket setting negative margins on all of them may not be the best approach.

This is true, but because we need to set that on the first level, then we need to on the lower levels in order to override that setting, even if it just means putting the margins back to zero.

I think overall it would be best to assume as little as possible: whether about the behaviour of "inherit default layout" (should it also use the root padding? it's unclear at the best of times what this setting is supposed to do.), or the padding of parent blocks in general. I kind of like the idea of the default gap value being set as default root padding, but I wonder if even that isn't over-assuming too.

The problem we have at the moment is a lot of themes already make a lot of assumptions about how this works. In general they all try to replicate the same behaviour and simply copy/paste the same code between every theme. My intention in this PR is to replicate that behaviour in core so that themes no longer have to use this CSS. I believe that approach taken by themes has evolved to best describe the behaviour that the majority of themes want from this setting. My concern with taking a different approach in core is that themes will continue to ship the custom CSS they already have as it gives them the behaviour they want, which I feel would make this a somewhat futile exercise.

I do agree that this model is hard to understand, and we should probably look into adding other, simpler layout options, but this one already has a history that would be hard to escape I think.

@tellthemachines
Copy link
Contributor

This is a problem because full width blocks only make sense inside blocks that inherit default layout

To be honest I'm not sure inherit default layout makes sense as a control at all. There's quite a bit on that in #36082, but for the root padding part of #35607 we're only looking at blocks that are direct children of root. Those may not necessarily be Group blocks, so they may not have the inherit default setting (e.g. they might be a Cover block). That's why we ignored it.

(I notice that this isn't the case for direct children of the post content block, but I think that's the only case and that it's a bug. I'm not sure we have yet created a theme that doesn't apply "inherit default layout" to the post content block.)

I'm not sure I get it: should we or shouldn't we allow direct children of post content to go full width?

This is true, but because we need to set that on the first level, then we need to on the lower levels in order to override that setting, even if it just means putting the margins back to zero.

This is why we tried separate solutions for root level blocks and nested blocks: at root, we can simply add the root padding to the blocks themselves while allowing them to go full width, whereas for nested blocks we need to calculate based on whatever padding they have. An overall solution will likely result in code bloat, with no real benefit attached.

An alternative approach for root padding if we didn't want all root blocks to be full width by default could be to allow root blocks to set themselves as full width or not, when root padding is set. I feel that would be more intuitive UI-wise, not sure if there are good reasons not to do it though.

The problem we have at the moment is a lot of themes already make a lot of assumptions about how this works. In general they all try to replicate the same behaviour and simply copy/paste the same code between every theme. My intention in this PR is to replicate that behaviour in core so that themes no longer have to use this CSS

This makes sense but we do need to make sure the assumptions we're dealing with are solid, and consistent with the UI options we're trying to provide.

@scruffian
Copy link
Contributor Author

I'm not sure I get it: should we or shouldn't we allow direct children of post content to go full width?

I think that should depend on whether or not the post content block has the "inherit default layout" option selected.

@DaveBoydy
Copy link

DaveBoydy commented Jun 25, 2022

I think it's best to manually set the outer side padding using the group block exlusively(from gutenbergs UI), specifcally on a group block that has inherit default layout set to on.

The only thing that's lacking in my opinion is the ability to set dyanmic padding I.E. padding that responds to variable screen sizes. If a theme author had the ability to define custom sizes for side padding E.G. max(3.5vw, 16px) or clamp(16px, 3.5vw, 32px) and be able to set that manually from the group block UI that would be awsome!

I've been working on my own theme for a while and went through plenty of prototypes as iv'e been learning gutenberg, for my last protoype i used a block style on group blocks to set the sites outer side padding. On my current prototype I'm using a custom class in the additional classes section as an alternative, if i could set a custom size directly from the gutenberg UI, for me that would be a perfect solution to setting a sites (responsive) side padding.

tellthemachines and others added 3 commits July 1, 2022 14:33
Root vars shouldn't apply to block global styles

Fix issue with shorthand padding on server side.

Temp fix for file path error

Fix site editor top padding not updating

Support shorthand properties in site editor.

Fix full widths in the post editor

Check selector inside function.

Fix kebab-casing of CSS variables.

Fix borked merge conflict solving

Move post editor full width styles to edit-post package.

Set default padding value to 0.

Update test string.

Fix PHP unit tests

Fix PHP lint

Fix failing PHP tests.

Use block gap variable as default root padding value.

Fix linting errors.

Add opt-in setting via package.json

Generate correct block editor styles

Fix tests and add prop to core theme.json

Fix unit tests properly this time

Merge remote-tracking branch 'origin/trunk' into try/root-padding-fix

Added missing doc comment for parameter "$use_root_vars"

fix rebase
@scruffian scruffian force-pushed the combine/root-padding-full-width branch from 9c506cb to 75bf1d7 Compare July 1, 2022 13:41
@scruffian
Copy link
Contributor Author

I rebased this and it broke...

@tellthemachines
Copy link
Contributor

Now that #42085 has been merged, can we close this one?

@scruffian
Copy link
Contributor Author

Yes!

@scruffian scruffian closed this Aug 9, 2022
@scruffian scruffian deleted the combine/root-padding-full-width branch August 9, 2022 07:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Themes Questions or issues with incorporating or styling blocks in a theme.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants