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 reducing specificity of layout margin rules #47858

Merged
merged 11 commits into from
Apr 3, 2023

Conversation

tellthemachines
Copy link
Contributor

@tellthemachines tellthemachines commented Feb 8, 2023

What?

Hypothetical alternative to #47399: trying to reduce the specificity of the layout rules to the point that they don't override block global margins.

This assumes that in a layout container:

  • first child top margin is always 0;
  • last child bottom margin is always 0;
  • top margins of non-first children are always set to gap value and bottom margins to 0, UNLESS the child itself has its own margin value.

Why?

#43404, #44736, #33795, #40813, #35267 and #46902... the issues keep piling up. Essentially, layout spacing styles shouldn't override global block margins.

Testing Instructions

See #47399.

Testing Instructions for Keyboard

Screenshots or screencast

@github-actions
Copy link

github-actions bot commented Feb 8, 2023

Size Change: +735 B (0%)

Total Size: 1.34 MB

Filename Size Change
build/block-editor/index.min.js 201 kB +24 B (0%)
build/block-editor/style-rtl.css 14.5 kB +12 B (0%)
build/block-editor/style.css 14.5 kB +9 B (0%)
build/block-library/blocks/columns/style-rtl.css 409 B +3 B (+1%)
build/block-library/blocks/columns/style.css 409 B +3 B (+1%)
build/block-library/blocks/file/style-rtl.css 269 B +4 B (+2%)
build/block-library/blocks/file/style.css 270 B +5 B (+2%)
build/block-library/blocks/post-excerpt/style-rtl.css 141 B +7 B (+5%) 🔍
build/block-library/blocks/post-excerpt/style.css 141 B +7 B (+5%) 🔍
build/block-library/blocks/pullquote/style-rtl.css 335 B +9 B (+3%)
build/block-library/blocks/pullquote/style.css 335 B +10 B (+3%)
build/block-library/common-rtl.css 1.12 kB +3 B (0%)
build/block-library/common.css 1.12 kB +3 B (0%)
build/block-library/index.min.js 202 kB +12 B (0%)
build/block-library/style-rtl.css 12.8 kB +19 B (0%)
build/block-library/style.css 12.8 kB +17 B (0%)
build/edit-post/index.min.js 34.9 kB -3 B (0%)
build/edit-site/index.min.js 63.7 kB +417 B (+1%)
build/edit-site/style-rtl.css 10.2 kB +81 B (+1%)
build/edit-site/style.css 10.2 kB +81 B (+1%)
build/editor/index.min.js 45.9 kB +12 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.78 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 483 B
build/block-directory/index.min.js 7.2 kB
build/block-directory/style-rtl.css 1.04 kB
build/block-directory/style.css 1.04 kB
build/block-editor/content-rtl.css 4.11 kB
build/block-editor/content.css 4.1 kB
build/block-editor/default-editor-styles-rtl.css 403 B
build/block-editor/default-editor-styles.css 403 B
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 138 B
build/block-library/blocks/audio/theme.css 138 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 91 B
build/block-library/blocks/avatar/style.css 91 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 587 B
build/block-library/blocks/button/editor.css 587 B
build/block-library/blocks/button/style-rtl.css 628 B
build/block-library/blocks/button/style.css 627 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 649 B
build/block-library/blocks/cover/editor.css 651 B
build/block-library/blocks/cover/style-rtl.css 1.61 kB
build/block-library/blocks/cover/style.css 1.6 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 138 B
build/block-library/blocks/embed/theme.css 138 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/view.min.js 353 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 984 B
build/block-library/blocks/gallery/editor.css 988 B
build/block-library/blocks/gallery/style-rtl.css 1.55 kB
build/block-library/blocks/gallery/style.css 1.55 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 654 B
build/block-library/blocks/group/editor.css 654 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 830 B
build/block-library/blocks/image/editor.css 829 B
build/block-library/blocks/image/style-rtl.css 652 B
build/block-library/blocks/image/style.css 652 B
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 507 B
build/block-library/blocks/media-text/style.css 505 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 716 B
build/block-library/blocks/navigation-link/editor.css 715 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation/editor-rtl.css 2.13 kB
build/block-library/blocks/navigation/editor.css 2.14 kB
build/block-library/blocks/navigation/style-rtl.css 2.22 kB
build/block-library/blocks/navigation/style.css 2.21 kB
build/block-library/blocks/navigation/view-modal.min.js 2.81 kB
build/block-library/blocks/navigation/view.min.js 447 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 401 B
build/block-library/blocks/page-list/editor.css 401 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 501 B
build/block-library/blocks/post-comments-form/style.css 501 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-featured-image/editor-rtl.css 588 B
build/block-library/blocks/post-featured-image/editor.css 586 B
build/block-library/blocks/post-featured-image/style-rtl.css 322 B
build/block-library/blocks/post-featured-image/style.css 322 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 281 B
build/block-library/blocks/post-template/style.css 281 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 69 B
build/block-library/blocks/post-time-to-read/style.css 69 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 288 B
build/block-library/blocks/query-pagination/style.css 284 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 463 B
build/block-library/blocks/query/editor.css 463 B
build/block-library/blocks/quote/style-rtl.css 222 B
build/block-library/blocks/quote/style.css 222 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 149 B
build/block-library/blocks/rss/editor.css 149 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 408 B
build/block-library/blocks/search/style.css 406 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 489 B
build/block-library/blocks/site-logo/editor.css 489 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.4 kB
build/block-library/blocks/social-links/style.css 1.39 kB
build/block-library/blocks/spacer/editor-rtl.css 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 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 651 B
build/block-library/blocks/table/style.css 650 B
build/block-library/blocks/table/theme-rtl.css 157 B
build/block-library/blocks/table/theme.css 157 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 404 B
build/block-library/blocks/template-part/editor.css 404 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 179 B
build/block-library/blocks/video/style.css 179 B
build/block-library/blocks/video/theme-rtl.css 139 B
build/block-library/blocks/video/theme.css 139 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 11.7 kB
build/block-library/editor.css 11.6 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/theme-rtl.css 698 B
build/block-library/theme.css 703 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 51.1 kB
build/components/index.min.js 208 kB
build/components/style-rtl.css 11.7 kB
build/components/style.css 11.7 kB
build/compose/index.min.js 12.4 kB
build/core-data/index.min.js 16.3 kB
build/customize-widgets/index.min.js 12.2 kB
build/customize-widgets/style-rtl.css 1.41 kB
build/customize-widgets/style.css 1.41 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 8.68 kB
build/date/index.min.js 40.4 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.72 kB
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/edit-post/style-rtl.css 7.6 kB
build/edit-post/style.css 7.59 kB
build/edit-widgets/index.min.js 17.3 kB
build/edit-widgets/style-rtl.css 4.56 kB
build/edit-widgets/style.css 4.56 kB
build/editor/style-rtl.css 3.49 kB
build/editor/style.css 3.48 kB
build/element/index.min.js 4.95 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 7.26 kB
build/format-library/style-rtl.css 557 B
build/format-library/style.css 556 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.79 kB
build/keycodes/index.min.js 1.94 kB
build/list-reusable-blocks/index.min.js 2.14 kB
build/list-reusable-blocks/style-rtl.css 865 B
build/list-reusable-blocks/style.css 865 B
build/media-utils/index.min.js 2.99 kB
build/notices/index.min.js 977 B
build/plugins/index.min.js 1.94 kB
build/preferences-persistence/index.min.js 2.23 kB
build/preferences/index.min.js 1.35 kB
build/primitives/index.min.js 960 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 937 B
build/react-i18n/index.min.js 702 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.75 kB
build/reusable-blocks/index.min.js 2.26 kB
build/reusable-blocks/style-rtl.css 265 B
build/reusable-blocks/style.css 265 B
build/rich-text/index.min.js 11.1 kB
build/server-side-render/index.min.js 2.09 kB
build/shortcode/index.min.js 1.52 kB
build/style-engine/index.min.js 1.55 kB
build/token-list/index.min.js 650 B
build/url/index.min.js 3.74 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 1.09 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.3 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@github-actions
Copy link

github-actions bot commented Feb 8, 2023

Flaky tests detected in c7d8c25.
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/4592857915
📝 Reported issues:

@tellthemachines
Copy link
Contributor Author

It seems to be working! except for the small issue of global spacing values in Group block being overridden by the default because they now both have 0 specificity 😂

Update: I bumped the specificity of the block rule ever so slightly by prefacing it with :root, and now it's working as expected:
Screenshot 2023-02-09 at 12 04 43 pm

Copy link
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

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

This is a very compelling exploration! Really cool that it appears to largely resolve the block-level-in-global styles margin case 👍

One challenge here, though, is the introduction of !important rules. From a quick test, it looks like the layout's !important rules for the first and last child blocks results in those rules overriding block-level-in-block-attributes margin rules:

image

In the above screenshot, this particular cover block has a margin-top value set to one of the spacing presets, and that style is output in the block's inline styles. However, the layout support's rule wins out:

image

@andrewserong
Copy link
Contributor

Just noticed another couple of challenges with reducing the layout specificity / removing the bottom margin overrides and existing block styles:

  • The Cover block includes a margin bottom rule of 1.75em (here) which doesn't get overridden by the layout rules in this PR (due to the removal of resetting the bottom margin + lower rules specificity?)

image

  • For themes that opt in to the wp-block-styles theme support (e.g. TT2), then the audio block outputs a figure element margin override, which wins out over the layout rules in this PR.

image

So, in terms of evaluating whether we can reliably reduce the layout specificity, a couple of questions might be:

  • If we were to audit the core blocks and remove all margin rules (or reduce specificity) that would conflict with layout, would that be reliable enough to allow the layout rules to be lowered in specificity?
  • Do 3rd party blocks set margin rules and expect layout rules (E.g. Group block) to overwrite those margin rules? I suspect this might be the case, given that core blocks already have margin rules that layout overrides 🤔

In any case, I think the ideas in this PR are super valuable to explore, particularly given that the complexity of the change (and style output) is much simpler than what's being explored over in #47399. Thanks again for digging in here!

@tellthemachines
Copy link
Contributor Author

Thanks for thoroughly poking holes in this experiment @andrewserong 😄

I removed the !importants and managed to fiddle with :where() and pseudoclass repetition to the point that I think everything is working in the correct order now. (The pseudoclass repetition was only necessary because otherwise in the editor there wasn't enough specificity to override global margins applied on a class selector such as .wp-block-heading; it actually worked with a single one in the front end.)

  • If we were to audit the core blocks and remove all margin rules (or reduce specificity) that would conflict with layout, would that be reliable enough to allow the layout rules to be lowered in specificity?
  • Do 3rd party blocks set margin rules and expect layout rules (E.g. Group block) to overwrite those margin rules? I suspect this might be the case, given that core blocks already have margin rules that layout overrides 🤔

These are great questions!

Regarding 1, I can go through the core blocks in this PR and try to lower specificity where needed. I'm pretty sure we can manage that.

As for 2, it's hard to know what might be expected, but over time we've consistently had pointed complaints about the over-specificity of our styles, and I suspect we won't get much pushback on lowering them. It is a breaking change, and should be announced as such (dev notes etc.) but ultimately any change in specificity is a breaking change, and even just adding rules can break something somewhere. I'm optimistic that we can get away with it 😅

@tellthemachines tellthemachines self-assigned this Feb 14, 2023
Copy link
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

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

Thanks for continuing down this particular path @tellthemachines, I still think it's a really compelling direction 👍

From giving this a re-test, I think there's another wrinkle with the update to the non-first-or-last rules, in that it looks like we still need to reset the margin-block-end for each of these rules to 0 so that we can override the user agent styles for elements like paragraph tags. Otherwise, it looks like the 1em rules creep back into play. Here's a screenshot:

image

I'd be curious to hear what other folks think about this as a potential solution, so I'll just copy in @t-hamano for visibility, too.

@tellthemachines
Copy link
Contributor Author

I re-added the bottom margin override and reduced the specificity of the Columns block margin rule. I think everything's working as it should now.

Regarding a possible clash with #47952, I'm pretty sure we can make things work with the compound class added in that PR, because the rule as it is in this PR - :root :where(%s.%s) %s only needs the specificity of one classname, and that could be the compound classname instead of :root.

I'm going to go ahead and mark this ready for review, but I'll hold off on updating the test markup for now because it's likely that #47952 will be merged soon, and I don't love solving merge conflicts that much 😂

@andrewserong
Copy link
Contributor

Thanks for the update @tellthemachines! From a quick search of blocks' CSS, here are some other blocks where the specificity may need to be reduced (or at least, we should test to see whether or not it'll need adjusting)

  • File: has bottom margin
  • Image: left aligned top/bottom margins
  • Image: right aligned top/bottom margins
  • Post Excerpt block: looks like top/bottom margin rules might have been added recently? (The ones at the root level of the block might be able to be removed?)
  • Post Template block (this one zeros out top/bottom margins, so might be able to be parked until we do the post template block refactor, but we should probably test it anyway)
  • Pullquote block: has shorthand margin rule

@MaggieCabrera
Copy link
Contributor

Maybe this is another example of this being the case?

@MaggieCabrera
Copy link
Contributor

/cc @WordPress/block-themers for more eyes on this

@tellthemachines
Copy link
Contributor Author

Thanks for the list of blocks with margins @andrewserong ! I lowered the specificity on File, Post Excerpt and Pullquote. Left and right-aligned images only seem to have inline margins, unless I'm missing something 🤔 and in my testing Post Template seems to be getting the right styles whichever position it's in inside Query.

Regarding #45107 and similar uses of "__experimentalStyle": is there anything stopping us from wrapping the output of "__experimentalStyle" in a :where? Any margins added to blocks in that way will override the layout styles in this PR.

@andrewserong
Copy link
Contributor

is there anything stopping us from wrapping the output of "__experimentalStyle" in a :where? Any margins added to blocks in that way will override the layout styles in this PR.

I don't think so. It would probably involve adding a bit of logic — currently I think __experimentalStyle is implemented in a fairly naive way in that the values entered there wind up being part of the theme.json structure, as if the theme had provided those values at the block level. Separately to this PR, I think it'd be good to explore your idea of ensuring that layer of styles (those provided by the block) have a lowered specificity in a :where() rule — or, at the very least, that margin rules have it 👍

@andrewserong
Copy link
Contributor

Left and right-aligned images only seem to have inline margins, unless I'm missing something 🤔

I did a little bit of digging: it looks like there are top/bottom margin rules for a deprecated form of the image block that target .alignleft and .alignright but only as a child of the image block's wrapper (here and here), so they won't interfere with these layout rules changes. As far as I can tell, those alignment rules still exist to support unmigrated old image block markup. The PR that removed the wrapper div (where these rules used to apply) was #38657. So, looks like we're all good for the image block, at least!

@tellthemachines
Copy link
Contributor Author

Now that #47952 is merged, I've updated the rules in this PR to take those changes into account. I also updated the global styles output to reflect the changed rules and fixed the test markup. This is now ready for another round of review/testing!

Copy link
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

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

This is testing really well for me so far @tellthemachines, and I think it's looking like the most promising direction for addressing the styling conflicts between margin and layout rules 👍

Just adding a few more pings for visibility now that this is ready for another round of review, as some of these folks have been involved in the discussions so far: @t-hamano, @aaronrobertshaw, @youknowriad, @WordPress/gutenberg-design

Will do some more detailed testing when I'm back on Tuesday!

@jasmussen
Copy link
Contributor

I'd love a @youknowriad take on this.

In principle, I'm a fan of using where, however we've seen some pushback on the usage for it for functionality that's crucial for basic functionality, such as navigation menu dropdowns open/close behaviors. While the use of legacy browsers will drop every single day to eventually become negligible, it's worth considering the feedback in light of margins. Does the benefit of vastly reduced specificity outweigh the downsides? Probably, yes, as noted it wasn't the case for navigation dropdowns.

I haven't had a chance to deeply test this either, but from a glance it looks like it's changing the owl selector and the "stack" behavior. Is the net result the same? That is: it's so nice to not have to worry about the top margin of the first child, and the bottom margin of the last child, and have the margin behave like "gap", essentially. Ideally we can keep that behavior.

Adjacent, I looked at using margin-inline as a replacement for centering a column, and still allowing negative margins left and right: https://codepen.io/joen/pen/vYrYqya — useful if we want left/right margin controls to be able to be negative. Doesn't seem entirely related as that property is mainly for the horizontal positioning, but wanted to share in case it inspired ideas.

@@ -2488,8 +2488,9 @@ public function get_root_layout_rules( $selector, $block_metadata ) {
$has_block_gap_support = _wp_array_get( $this->theme_json, array( 'settings', 'spacing', 'blockGap' ) ) !== null;
if ( $has_block_gap_support ) {
$block_gap_value = static::get_property_value( $this->theme_json, array( 'styles', 'spacing', 'blockGap' ) );
$css .= '.wp-site-blocks > * { margin-block-start: 0; margin-block-end: 0; }';
$css .= ".wp-site-blocks > * + * { margin-block-start: $block_gap_value; }";
$css .= ":where(.wp-site-blocks) > * { margin-block-start: $block_gap_value; }";
Copy link
Contributor

Choose a reason for hiding this comment

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

It looks like this and the JS version are missing the margin-block-end: 0; rule, so the user agent stylesheet rules for paragraph are poking through:

image

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Oh whoops, I copied the old rule and forgot to add the end margin 😳

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Fixed!

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.

Nice one, thanks for all the updates @tellthemachines and for persevering with this! All the issues I've raised are now resolved, and this is testing well:

✅ Re-tested with a wide range of blocks, and couldn't find any issues
✅ Spacing between post title and post content within the post editor now respects the margin rules for the post title block
✅ Root-level site block spacing works as expected, with rules correctly overridden by block margin rules where appropriate
✅ Block-level margin rules in global styles apply as expected in positions within the layout container
✅ Global styles rules are overridden correctly by block-level styles

I think this is in a great place to land now, and would be worth trying out in the plugin.
LGTM! ✨

@tellthemachines tellthemachines merged commit 9c5ce7e into trunk Apr 3, 2023
@tellthemachines tellthemachines deleted the try/minimal-margin branch April 3, 2023 06:03
@github-actions github-actions bot added this to the Gutenberg 15.6 milestone Apr 3, 2023
@ndiego ndiego added [Type] Bug An existing feature does not function as intended [Feature] Layout Layout block support, its UI controls, and style output. labels Apr 11, 2023
@tellthemachines tellthemachines added Needs Dev Note Requires a developer note for a major WordPress release cycle Needs PHP backport Needs PHP backport to Core labels Jun 2, 2023
@ramonjd ramonjd removed the Needs PHP backport Needs PHP backport to Core label Jun 27, 2023
@tellthemachines
Copy link
Contributor Author

Dev note

Changes in CSS specificity for some layout types

The CSS output for the margin styles of children of constrained and flow(default) layout containers has changed. The generic rules used to have a specificity of 0,1,0 for all blocks; they have now changed to 0,0,0, for all blocks with an extra 0,2,0 rule applied only to the first and last blocks in the container.

This fixes the issue of global margin styles for specific blocks being overridden by layout styles (see #43404).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Layout Layout block support, its UI controls, and style output. Needs Dev Note Requires a developer note for a major WordPress release cycle [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants