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

Retain the same specificity for non iframed selectors #64534

Merged
merged 33 commits into from
Aug 28, 2024

Conversation

talldan
Copy link
Contributor

@talldan talldan commented Aug 15, 2024

What?

Alternative to #56649
Fixes #63925

Tries to maintain specificity across styles between the iframed and non-iframed canvas. This PR is slightly different to #56649 in that it also seeks to maintain specificity for root selectors.

For a quick recap, in a a non-iframed canvas .editor-styles-wrapper is prefixed onto the majority of selectors to scope the styles. This results in a bump in specificity. For root selectors (any that begin with body, html or :root) prefixing the classname would create an invalid selector, so the root part of the classname is replaced instead. This results in some of these selectors maintaining specificity, while others change ever so slightly.

This inconsistency creates a situation where the specificity of some styles is bumped, others aren't, and so in a non-iframed editor styles often don't apply in the same way and can look completely different to the front end or iframed editor.

How?

For most selectors, the prefix is changed from .editor-styles-wrapper to :where(.editor-styles-wrapper).

For root selectors, a selector like body .some-selector changes to body :where(.editor-styles-wrapper) .some-selector.

Both are maintaining the same specificity.

The tool of choice for prefixing is postcss and in particular a postcss plugin called postcss-prefixwrap is used in trunk. In this PR I've replaced it with the postcss-prefix-selector plugin. This one has a callback that allows us to change how scoping works on a per selector basis, which is how the root selector behavior has been changed.

One drawback of the new library is that it's exclude option doesn't work the same way as the ignoredSelectors option of the old library. Fortunately the callback means it's possible to replicate that behavior.

Testing Instructions

This needs a lot of general smoke testing. Below are instructions to check whether #63925 was fixed:

Test using WordPress playground

  1. Go to Tools > Theme File Editor > theme.json
  2. Add the following snippet to the theme.json under styles.blocks:
"core/heading": {
    "typography": {
        "fontSize": "var(--wp--preset--font-size--small)"
    }
},
  1. Create a post and insert a heading block - observe it should have a small font size
  2. Save the post and in the editor preferences, enable Custom fields to un-iframe the editor
  3. When the editor reloads, observe that the heading block still has a small font size

Here are some diffs that show the styles before and after transformation:

@talldan talldan added [Type] Enhancement A suggestion for improvement. CSS Styling Related to editor and front end styles, CSS-specific issues. labels Aug 15, 2024
@talldan talldan self-assigned this Aug 15, 2024
Copy link

github-actions bot commented Aug 15, 2024

Size Change: +2.62 kB (+0.15%)

Total Size: 1.78 MB

Filename Size Change
build/block-directory/index.min.js 7.31 kB +16 B (+0.22%)
build/block-editor/content-rtl.css 4.57 kB -19 B (-0.41%)
build/block-editor/content.css 4.56 kB -20 B (-0.44%)
build/block-editor/index.min.js 257 kB +1.46 kB (+0.57%)
build/block-editor/style-rtl.css 16.3 kB -41 B (-0.25%)
build/block-editor/style.css 16.3 kB -42 B (-0.26%)
build/block-library/blocks/button/editor-rtl.css 265 B -45 B (-14.52%) 👏
build/block-library/blocks/button/editor.css 265 B -45 B (-14.52%) 👏
build/block-library/blocks/buttons/editor-rtl.css 291 B -45 B (-13.39%) 👏
build/block-library/blocks/buttons/editor.css 291 B -45 B (-13.39%) 👏
build/block-library/blocks/comments-pagination/editor-rtl.css 228 B +7 B (+3.17%)
build/block-library/blocks/comments-pagination/editor.css 217 B +6 B (+2.84%)
build/block-library/blocks/cover/editor-rtl.css 641 B -27 B (-4.04%)
build/block-library/blocks/cover/editor.css 642 B -27 B (-4.04%)
build/block-library/blocks/embed/editor-rtl.css 331 B +17 B (+5.41%) 🔍
build/block-library/blocks/embed/editor.css 331 B +17 B (+5.41%) 🔍
build/block-library/blocks/gallery/style-rtl.css 1.83 kB +113 B (+6.59%) 🔍
build/block-library/blocks/gallery/style.css 1.82 kB +112 B (+6.54%) 🔍
build/block-library/blocks/latest-posts/editor-rtl.css 179 B +40 B (+28.78%) 🚨
build/block-library/blocks/latest-posts/editor.css 179 B +41 B (+29.71%) 🚨
build/block-library/blocks/navigation-link/editor-rtl.css 644 B -19 B (-2.87%)
build/block-library/blocks/navigation-link/editor.css 645 B -19 B (-2.86%)
build/block-library/blocks/navigation/editor-rtl.css 2.2 kB +15 B (+0.69%)
build/block-library/blocks/navigation/editor.css 2.2 kB +13 B (+0.59%)
build/block-library/blocks/post-author/style-rtl.css 188 B +13 B (+7.43%) 🔍
build/block-library/blocks/post-author/style.css 189 B +13 B (+7.39%) 🔍
build/block-library/blocks/post-featured-image/style-rtl.css 347 B +6 B (+1.76%)
build/block-library/blocks/post-featured-image/style.css 347 B +6 B (+1.76%)
build/block-library/blocks/query-pagination/editor-rtl.css 225 B +5 B (+2.27%)
build/block-library/blocks/query-pagination/editor.css 215 B +7 B (+3.37%)
build/block-library/blocks/site-title/editor-rtl.css 85 B -38 B (-30.89%) 🎉
build/block-library/blocks/site-title/editor.css 85 B -38 B (-30.89%) 🎉
build/block-library/blocks/template-part/editor-rtl.css 368 B -25 B (-6.36%)
build/block-library/blocks/template-part/editor.css 368 B -25 B (-6.36%)
build/block-library/editor-rtl.css 11.8 kB -33 B (-0.28%)
build/block-library/editor.css 11.8 kB -36 B (-0.3%)
build/block-library/index.min.js 217 kB +251 B (+0.12%)
build/block-library/style-rtl.css 14.8 kB +109 B (+0.74%)
build/block-library/style.css 14.8 kB +108 B (+0.73%)
build/components/index.min.js 224 kB +442 B (+0.2%)
build/components/style-rtl.css 12.1 kB -5 B (-0.04%)
build/components/style.css 12.1 kB -12 B (-0.1%)
build/core-data/index.min.js 73.2 kB +85 B (+0.12%)
build/customize-widgets/index.min.js 11 kB +19 B (+0.17%)
build/edit-post/index.min.js 12.7 kB +29 B (+0.23%)
build/edit-site/index.min.js 217 kB +44 B (+0.02%)
build/edit-site/posts-rtl.css 7.32 kB -110 B (-1.48%)
build/edit-site/posts.css 7.32 kB -114 B (-1.53%)
build/edit-site/style-rtl.css 12.6 kB -116 B (-0.91%)
build/edit-site/style.css 12.6 kB -120 B (-0.94%)
build/edit-widgets/index.min.js 17.7 kB +37 B (+0.21%)
build/editor/index.min.js 101 kB +75 B (+0.07%)
build/editor/style-rtl.css 9.28 kB -72 B (-0.77%)
build/editor/style.css 9.29 kB -67 B (-0.72%)
build/interactivity/debug.min.js 16.3 kB +1 B (+0.01%)
build/list-reusable-blocks/index.min.js 2.18 kB +21 B (+0.97%)
build/nux/index.min.js 1.61 kB +20 B (+1.26%)
build/patterns/index.min.js 7.34 kB -24 B (-0.33%)
build/reusable-blocks/index.min.js 2.55 kB +2 B (+0.08%)
build/rich-text/index.min.js 10.1 kB +44 B (+0.44%)
build/widgets/index.min.js 7.2 kB +13 B (+0.18%)
build/block-library/blocks/comment-author-name/style-rtl.css 72 B +72 B (new file) 🆕
build/block-library/blocks/comment-author-name/style.css 72 B +72 B (new file) 🆕
build/block-library/blocks/post-author-biography/style-rtl.css 74 B +74 B (new file) 🆕
build/block-library/blocks/post-author-biography/style.css 74 B +74 B (new file) 🆕
build/block-library/blocks/post-author-name/style-rtl.css 69 B +69 B (new file) 🆕
build/block-library/blocks/post-author-name/style.css 69 B +69 B (new file) 🆕
build/block-library/blocks/post-author/editor-rtl.css 107 B +107 B (new file) 🆕
build/block-library/blocks/post-author/editor.css 107 B +107 B (new file) 🆕
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 951 B
build/annotations/index.min.js 2.26 kB
build/api-fetch/index.min.js 2.31 kB
build/autop/index.min.js 2.12 kB
build/blob/index.min.js 579 B
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 394 B
build/block-editor/default-editor-styles.css 394 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 149 B
build/block-library/blocks/audio/editor.css 151 B
build/block-library/blocks/audio/style-rtl.css 132 B
build/block-library/blocks/audio/style.css 132 B
build/block-library/blocks/audio/theme-rtl.css 134 B
build/block-library/blocks/audio/theme.css 134 B
build/block-library/blocks/avatar/editor-rtl.css 115 B
build/block-library/blocks/avatar/editor.css 115 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/button/style-rtl.css 538 B
build/block-library/blocks/button/style.css 538 B
build/block-library/blocks/buttons/style-rtl.css 328 B
build/block-library/blocks/buttons/style.css 328 B
build/block-library/blocks/calendar/style-rtl.css 240 B
build/block-library/blocks/calendar/style.css 240 B
build/block-library/blocks/categories/editor-rtl.css 132 B
build/block-library/blocks/categories/editor.css 131 B
build/block-library/blocks/categories/style-rtl.css 152 B
build/block-library/blocks/categories/style.css 152 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 122 B
build/block-library/blocks/code/theme.css 122 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 420 B
build/block-library/blocks/columns/style.css 420 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 124 B
build/block-library/blocks/comment-author-avatar/editor.css 124 B
build/block-library/blocks/comment-content/style-rtl.css 120 B
build/block-library/blocks/comment-content/style.css 120 B
build/block-library/blocks/comment-date/style-rtl.css 65 B
build/block-library/blocks/comment-date/style.css 65 B
build/block-library/blocks/comment-template/style-rtl.css 200 B
build/block-library/blocks/comment-template/style.css 199 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/style-rtl.css 234 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 832 B
build/block-library/blocks/comments/editor.css 832 B
build/block-library/blocks/comments/style-rtl.css 632 B
build/block-library/blocks/comments/style.css 631 B
build/block-library/blocks/cover/style-rtl.css 1.62 kB
build/block-library/blocks/cover/style.css 1.6 kB
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 B
build/block-library/blocks/details/style-rtl.css 86 B
build/block-library/blocks/details/style.css 86 B
build/block-library/blocks/embed/style-rtl.css 419 B
build/block-library/blocks/embed/style.css 419 B
build/block-library/blocks/embed/theme-rtl.css 133 B
build/block-library/blocks/embed/theme.css 133 B
build/block-library/blocks/file/editor-rtl.css 326 B
build/block-library/blocks/file/editor.css 326 B
build/block-library/blocks/file/style-rtl.css 278 B
build/block-library/blocks/file/style.css 279 B
build/block-library/blocks/file/view.min.js 324 B
build/block-library/blocks/footnotes/style-rtl.css 198 B
build/block-library/blocks/footnotes/style.css 197 B
build/block-library/blocks/form-input/editor-rtl.css 229 B
build/block-library/blocks/form-input/editor.css 229 B
build/block-library/blocks/form-input/style-rtl.css 342 B
build/block-library/blocks/form-input/style.css 342 B
build/block-library/blocks/form-submission-notification/editor-rtl.css 344 B
build/block-library/blocks/form-submission-notification/editor.css 341 B
build/block-library/blocks/form-submit-button/style-rtl.css 69 B
build/block-library/blocks/form-submit-button/style.css 69 B
build/block-library/blocks/form/view.min.js 470 B
build/block-library/blocks/freeform/editor-rtl.css 2.6 kB
build/block-library/blocks/freeform/editor.css 2.6 kB
build/block-library/blocks/gallery/editor-rtl.css 955 B
build/block-library/blocks/gallery/editor.css 958 B
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/editor-rtl.css 344 B
build/block-library/blocks/group/editor.css 344 B
build/block-library/blocks/group/style-rtl.css 103 B
build/block-library/blocks/group/style.css 103 B
build/block-library/blocks/group/theme-rtl.css 79 B
build/block-library/blocks/group/theme.css 79 B
build/block-library/blocks/heading/style-rtl.css 188 B
build/block-library/blocks/heading/style.css 188 B
build/block-library/blocks/html/editor-rtl.css 346 B
build/block-library/blocks/html/editor.css 347 B
build/block-library/blocks/image/editor-rtl.css 894 B
build/block-library/blocks/image/editor.css 892 B
build/block-library/blocks/image/style-rtl.css 1.59 kB
build/block-library/blocks/image/style.css 1.59 kB
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/image/view.min.js 1.65 kB
build/block-library/blocks/latest-comments/style-rtl.css 355 B
build/block-library/blocks/latest-comments/style.css 354 B
build/block-library/blocks/latest-posts/style-rtl.css 509 B
build/block-library/blocks/latest-posts/style.css 510 B
build/block-library/blocks/list/style-rtl.css 107 B
build/block-library/blocks/list/style.css 107 B
build/block-library/blocks/loginout/style-rtl.css 61 B
build/block-library/blocks/loginout/style.css 61 B
build/block-library/blocks/media-text/editor-rtl.css 304 B
build/block-library/blocks/media-text/editor.css 303 B
build/block-library/blocks/media-text/style-rtl.css 516 B
build/block-library/blocks/media-text/style.css 515 B
build/block-library/blocks/more/editor-rtl.css 427 B
build/block-library/blocks/more/editor.css 427 B
build/block-library/blocks/navigation-link/style-rtl.css 192 B
build/block-library/blocks/navigation-link/style.css 191 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 295 B
build/block-library/blocks/navigation-submenu/editor.css 294 B
build/block-library/blocks/navigation/style-rtl.css 2.25 kB
build/block-library/blocks/navigation/style.css 2.23 kB
build/block-library/blocks/navigation/view.min.js 1.03 kB
build/block-library/blocks/nextpage/editor-rtl.css 392 B
build/block-library/blocks/nextpage/editor.css 392 B
build/block-library/blocks/page-list/editor-rtl.css 378 B
build/block-library/blocks/page-list/editor.css 378 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 236 B
build/block-library/blocks/paragraph/editor.css 236 B
build/block-library/blocks/paragraph/style-rtl.css 341 B
build/block-library/blocks/paragraph/style.css 340 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 527 B
build/block-library/blocks/post-comments-form/style.css 528 B
build/block-library/blocks/post-content/editor-rtl.css 74 B
build/block-library/blocks/post-content/editor.css 74 B
build/block-library/blocks/post-content/style-rtl.css 79 B
build/block-library/blocks/post-content/style.css 79 B
build/block-library/blocks/post-date/style-rtl.css 62 B
build/block-library/blocks/post-date/style.css 62 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 155 B
build/block-library/blocks/post-excerpt/style.css 155 B
build/block-library/blocks/post-featured-image/editor-rtl.css 729 B
build/block-library/blocks/post-featured-image/editor.css 726 B
build/block-library/blocks/post-navigation-link/style-rtl.css 215 B
build/block-library/blocks/post-navigation-link/style.css 214 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 399 B
build/block-library/blocks/post-template/style.css 398 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 70 B
build/block-library/blocks/post-time-to-read/style.css 70 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 125 B
build/block-library/blocks/preformatted/style.css 125 B
build/block-library/blocks/pullquote/editor-rtl.css 134 B
build/block-library/blocks/pullquote/editor.css 134 B
build/block-library/blocks/pullquote/style-rtl.css 342 B
build/block-library/blocks/pullquote/style.css 342 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 121 B
build/block-library/blocks/query-pagination-numbers/editor.css 118 B
build/block-library/blocks/query-pagination/style-rtl.css 287 B
build/block-library/blocks/query-pagination/style.css 283 B
build/block-library/blocks/query-title/style-rtl.css 64 B
build/block-library/blocks/query-title/style.css 64 B
build/block-library/blocks/query/editor-rtl.css 452 B
build/block-library/blocks/query/editor.css 451 B
build/block-library/blocks/query/view.min.js 958 B
build/block-library/blocks/quote/style-rtl.css 238 B
build/block-library/blocks/quote/style.css 238 B
build/block-library/blocks/quote/theme-rtl.css 233 B
build/block-library/blocks/quote/theme.css 236 B
build/block-library/blocks/read-more/style-rtl.css 138 B
build/block-library/blocks/read-more/style.css 138 B
build/block-library/blocks/rss/editor-rtl.css 101 B
build/block-library/blocks/rss/editor.css 101 B
build/block-library/blocks/rss/style-rtl.css 288 B
build/block-library/blocks/rss/style.css 287 B
build/block-library/blocks/search/editor-rtl.css 199 B
build/block-library/blocks/search/editor.css 199 B
build/block-library/blocks/search/style-rtl.css 672 B
build/block-library/blocks/search/style.css 671 B
build/block-library/blocks/search/theme-rtl.css 113 B
build/block-library/blocks/search/theme.css 113 B
build/block-library/blocks/search/view.min.js 475 B
build/block-library/blocks/separator/editor-rtl.css 100 B
build/block-library/blocks/separator/editor.css 100 B
build/block-library/blocks/separator/style-rtl.css 248 B
build/block-library/blocks/separator/style.css 248 B
build/block-library/blocks/separator/theme-rtl.css 195 B
build/block-library/blocks/separator/theme.css 195 B
build/block-library/blocks/shortcode/editor-rtl.css 286 B
build/block-library/blocks/shortcode/editor.css 286 B
build/block-library/blocks/site-logo/editor-rtl.css 806 B
build/block-library/blocks/site-logo/editor.css 803 B
build/block-library/blocks/site-logo/style-rtl.css 218 B
build/block-library/blocks/site-logo/style.css 218 B
build/block-library/blocks/site-tagline/editor-rtl.css 87 B
build/block-library/blocks/site-tagline/editor.css 87 B
build/block-library/blocks/site-tagline/style-rtl.css 65 B
build/block-library/blocks/site-tagline/style.css 65 B
build/block-library/blocks/site-title/style-rtl.css 90 B
build/block-library/blocks/site-title/style.css 90 B
build/block-library/blocks/social-link/editor-rtl.css 338 B
build/block-library/blocks/social-link/editor.css 338 B
build/block-library/blocks/social-links/editor-rtl.css 676 B
build/block-library/blocks/social-links/editor.css 675 B
build/block-library/blocks/social-links/style-rtl.css 1.51 kB
build/block-library/blocks/social-links/style.css 1.5 kB
build/block-library/blocks/spacer/editor-rtl.css 346 B
build/block-library/blocks/spacer/editor.css 346 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-of-contents/style-rtl.css 83 B
build/block-library/blocks/table-of-contents/style.css 83 B
build/block-library/blocks/table/editor-rtl.css 394 B
build/block-library/blocks/table/editor.css 394 B
build/block-library/blocks/table/style-rtl.css 640 B
build/block-library/blocks/table/style.css 639 B
build/block-library/blocks/table/theme-rtl.css 152 B
build/block-library/blocks/table/theme.css 152 B
build/block-library/blocks/tag-cloud/editor-rtl.css 144 B
build/block-library/blocks/tag-cloud/editor.css 144 B
build/block-library/blocks/tag-cloud/style-rtl.css 266 B
build/block-library/blocks/tag-cloud/style.css 265 B
build/block-library/blocks/template-part/theme-rtl.css 113 B
build/block-library/blocks/template-part/theme.css 113 B
build/block-library/blocks/term-description/style-rtl.css 126 B
build/block-library/blocks/term-description/style.css 126 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 165 B
build/block-library/blocks/text-columns/style.css 165 B
build/block-library/blocks/verse/style-rtl.css 98 B
build/block-library/blocks/verse/style.css 98 B
build/block-library/blocks/video/editor-rtl.css 541 B
build/block-library/blocks/video/editor.css 542 B
build/block-library/blocks/video/style-rtl.css 192 B
build/block-library/blocks/video/style.css 192 B
build/block-library/blocks/video/theme-rtl.css 134 B
build/block-library/blocks/video/theme.css 134 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.1 kB
build/block-library/common.css 1.1 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 472 B
build/block-library/reset.css 472 B
build/block-library/theme-rtl.css 708 B
build/block-library/theme.css 712 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/blocks/index.min.js 52.4 kB
build/commands/index.min.js 16.1 kB
build/commands/style-rtl.css 955 B
build/commands/style.css 952 B
build/compose/index.min.js 12.9 kB
build/core-commands/index.min.js 2.82 kB
build/customize-widgets/style-rtl.css 1.35 kB
build/customize-widgets/style.css 1.35 kB
build/data-controls/index.min.js 641 B
build/data/index.min.js 8.98 kB
build/date/index.min.js 18 kB
build/deprecated/index.min.js 458 B
build/dom-ready/index.min.js 325 B
build/dom/index.min.js 4.65 kB
build/edit-post/classic-rtl.css 578 B
build/edit-post/classic.css 580 B
build/edit-post/style-rtl.css 2.31 kB
build/edit-post/style.css 2.31 kB
build/edit-widgets/style-rtl.css 4.2 kB
build/edit-widgets/style.css 4.2 kB
build/element/index.min.js 4.83 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 8.09 kB
build/format-library/style-rtl.css 476 B
build/format-library/style.css 476 B
build/hooks/index.min.js 1.54 kB
build/html-entities/index.min.js 445 B
build/i18n/index.min.js 3.58 kB
build/interactivity/file.min.js 447 B
build/interactivity/image.min.js 1.78 kB
build/interactivity/index.min.js 13.2 kB
build/interactivity/navigation.min.js 1.16 kB
build/interactivity/query.min.js 742 B
build/interactivity/router.min.js 2.8 kB
build/interactivity/search.min.js 615 B
build/is-shallow-equal/index.min.js 526 B
build/keyboard-shortcuts/index.min.js 1.31 kB
build/keycodes/index.min.js 1.46 kB
build/list-reusable-blocks/style-rtl.css 846 B
build/list-reusable-blocks/style.css 846 B
build/media-utils/index.min.js 2.92 kB
build/modules/importmap-polyfill.min.js 12.3 kB
build/notices/index.min.js 946 B
build/nux/style-rtl.css 749 B
build/nux/style.css 745 B
build/patterns/style-rtl.css 687 B
build/patterns/style.css 685 B
build/plugins/index.min.js 1.81 kB
build/preferences-persistence/index.min.js 2.06 kB
build/preferences/index.min.js 2.9 kB
build/preferences/style-rtl.css 554 B
build/preferences/style.css 554 B
build/primitives/index.min.js 829 B
build/priority-queue/index.min.js 1.54 kB
build/private-apis/index.min.js 1.01 kB
build/react-i18n/index.min.js 630 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 6.76 kB
build/redux-routine/index.min.js 2.69 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/router/index.min.js 1.96 kB
build/server-side-render/index.min.js 1.94 kB
build/shortcode/index.min.js 1.4 kB
build/style-engine/index.min.js 2.04 kB
build/token-list/index.min.js 581 B
build/url/index.min.js 3.85 kB
build/vendors/react-dom.min.js 41.7 kB
build/vendors/react-jsx-runtime.min.js 560 B
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 965 B
build/warning/index.min.js 250 B
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.03 kB

compressed-size-action

Copy link
Contributor

@aaronrobertshaw aaronrobertshaw left a comment

Choose a reason for hiding this comment

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

Nice work wrangling this one @talldan 👍

It's looking like a promising direction to me!

I still need to do some broader testing, mainly around layout and global styles, but it fixes the issue in #63925.

Screenshot 2024-08-16 at 4 21 49 PM

✅ Heading block global styles remain higher specificity than prefixed element styles
✅ Prefixed selectors match those promised in PR description
✅ Couldn't find any remaining places where .editor-styles-wrapper was programmatically added as scoping selector
✅ Element styles on block instances continue to work

Screenshot 2024-08-16 at 4 32 25 PM

On a side note, the use of snapshots for simple CSS assertions is a bit of a pain when trying to see what the expected outcome is. I like the switch away from snapshots for the new tests. If we proceed with this PR, is it then the best opportunity to get rid of the snapshots entirely?

They also caught me out checking the diff as it looked like a test had been removed.

I'll give this a further test on Monday. If there are any specific areas you'd like focus on, add them to the test instructions and I'll cast an eye over them.

@@ -212,7 +212,7 @@ describe( 'transformStyles', () => {
} );

it( 'should not double wrap selectors', () => {
const input = ` .my-namespace h1, .red { color: red; }`;
const input = ` .my-namespace h1, .my-namespace .red { color: red; }`;
Copy link
Contributor

Choose a reason for hiding this comment

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

Would it be better to leave this as it is, covering different specificities in the selector list, and just update the output?

To me, the original input covered the scenario when the plugin detects that it does need to prefix something and then ensures it doesn't go overboard resulting in a double prefix.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I liked being able to make the test expect( output ).toEqual( [ input ] ), but I've updated it in 6b43b57 to be as it was before (though without snapshots)

Comment on lines 66 to 69
return replaceDoublePrefix(
prefixedSelector,
prefix
);
Copy link
Contributor

Choose a reason for hiding this comment

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

Would it be worth a comment here explaining why this is needed?

My understanding of the old plugin was that it ignored all selectors already starting with the prefix. This one seems to only do a simple comparison between the selectors in exclude and so requires this double handling. Is that correct?

Copy link
Contributor Author

@talldan talldan Aug 21, 2024

Choose a reason for hiding this comment

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

The 'should not double wrap selectors' was failing when I switched to the new library. You're right that the ignoredSelectors seems to be where the old library works differently to the new one. We've been using the string '.editor-styles-wrapper' as an ignored selector. With the old library it uses something akin to selector.includes( ignoredSelector ) to check if it should be ignored, whereas the new library is more like selector === ignoredSelector. Both also support regular expressions, but we weren't using that.

I think this will be an issue as transformStyles is a public API, so ignoredSelectors should work the same as before. 🤔

Probably the best bet would be to replicate how the old library works in the callback rather than the way I've done it using replaceDoublePrefix 😄

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Done in 6b43b57

Copy link
Contributor

Choose a reason for hiding this comment

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

I haven't had a chance to look deeply at the code after the latest updates but did you account for the fact the old plugin allows regex in those ignored selectors?

Here's a snippet from the plugin's readme.

    // You may want to exclude some selectors from being prefixed, this is
    // enabled using the `ignoredSelectors` option.
    ignoredSelectors: [":root", "#my-id", /^\.some-(.+)$/],

As noted in my earlier comment, this new plugin appears to do a direct comparison of selectors. Take that with a grain of salt but something to double all the same.

Copy link
Contributor Author

@talldan talldan Aug 22, 2024

Choose a reason for hiding this comment

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

Yep, the pseudocode is selector.match( ignoredSelector ), and match which will work for both plain strings and regexes.

edit: pushed a commit to make sure there's test coverage for regex ignored selectors.

Copy link
Contributor

Choose a reason for hiding this comment

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

Nice. Appreciate the extra test coverage there 👌

packages/block-editor/src/utils/test/transform-styles.js Outdated Show resolved Hide resolved
@aaronrobertshaw
Copy link
Contributor

If we proceed with the new scoping selector for the non-iframed editor, we might also need to revisit quite a few editor.scss files in the block library as they often use .editor-styles-wrapper in their selectors.

@talldan
Copy link
Contributor Author

talldan commented Aug 20, 2024

On a side note, the use of snapshots for simple CSS assertions is a bit of a pain when trying to see what the expected outcome is. I like the switch away from snapshots for the new tests. If we proceed with this PR, is it then the best opportunity to get rid of the snapshots entirely?

Agree, I also didn't like the use of snapshots.

If we proceed with the new scoping selector for the non-iframed editor, we might also need to revisit quite a few editor.scss files in the block library as they often use .editor-styles-wrapper in their selectors.

This is also a concern for any themes that might have (e.g. .editor-styles-wrapper .my-class already in a selector. Prefixing it would produce a non-matching selector now :where(.editor-styles-wrapper) .editor-styles-wrapper .my-class.

I'm thinking the best option would be to ignore those selectors and not try prefixing them. Alternatively, we could try replacing .editor-styles-wrapper with :where(.editor-styles-wrapper), but I fear that might lead to frustration from theme developers if they want to purposely keep specificity.

I can go through and manually update the block library selectors though.

@aaronrobertshaw
Copy link
Contributor

I'm thinking the best option would be to ignore those selectors and not try prefixing them. Alternatively, we could try replacing .editor-styles-wrapper with :where(.editor-styles-wrapper), but I fear that might lead to frustration from theme developers if they want to purposely keep specificity.

Honestly, I'm not sure either.

Part of the fix/goal here is to ensure consistent specificity. Styles with selectors prefixed with .editor-styles-wrapper would have the intent to override bleed-in from other sources or styles. If this PR ultimately makes the selectors match those from global styles, wrapping .editor-styles-wrapper in :where() might not be such an issue. It could even prevent requiring some updates from block/plugin authors.

Perhaps we could try out that approach here and see how it plays with the block library editor styles before we go changing them?

@talldan
Copy link
Contributor Author

talldan commented Aug 21, 2024

I've pushed a commit that ignores selectors that already contain .editor-styles-wrapper so that they stay valid. To test, I did this:

  1. Enabled Twenty Seventeen (it helps to use an older theme, since block themes tend to enqueue specific editor styles that aren't passed through transformStyles)
  2. Add CSS like this to the editor-styles.scss file:
.editor-styles-wrapper h2 {
	color: orange !important;
}
  1. Load the gutenberg demo post
  2. Check that with the latest commit (25bfa9d), the orange style is applied.
  3. If you check out the commit before that (93455f8), the orange style isn't applied (the selector ends up being :where(.editor-styles-wrapper) .editor-styles-wrapper h2, which won't work).

I think this is a good thing to do, even if using .editor-styles-wrapper in CSS that will be prefixeed is probably not something that themes do a lot.

Copy link

github-actions bot commented Aug 27, 2024

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

Unlinked Accounts

The following contributors have not linked their GitHub and WordPress.org accounts: @ktmn.

Contributors, please read how to link your accounts to ensure your work is properly credited in WordPress releases.

If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message.

Unlinked contributors: ktmn.

Co-authored-by: talldan <talldanwp@git.wordpress.org>
Co-authored-by: aaronrobertshaw <aaronrobertshaw@git.wordpress.org>
Co-authored-by: kevin940726 <kevin940726@git.wordpress.org>
Co-authored-by: mrleemon <leemon@git.wordpress.org>
Co-authored-by: apmeyer <apmeyer@git.wordpress.org>
Co-authored-by: wongjn <wongjn@git.wordpress.org>

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.

Copy link
Contributor

@aaronrobertshaw aaronrobertshaw left a comment

Choose a reason for hiding this comment

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

Thank you for all the hard work wrangling edges on this front 💪

✅ After the latest round of tweaks, the tests are looking good and I couldn't find any plausible ways of breaking the prefixing.
✅ I've searched through the code for remaining uses of .editor-styles-wrapper and they all seem to check out.
✅ The culling of outdated comments look good
✅ Each of the touched editor block styles make sense and I didn't spot any issues there

This is looking good to me @talldan and I'm happy to give it a tentative approval. I think it would be prudent though to get some extra eyes on it given the scope of the changes.

Copy link
Member

@kevin940726 kevin940726 left a comment

Choose a reason for hiding this comment

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

Tested on playground and it worked as expected for me too! 💯

@talldan talldan added the Backport to WP Minor Release Pull request that needs to be backported to a WordPress minor release label Aug 28, 2024
@talldan
Copy link
Contributor Author

talldan commented Aug 28, 2024

Thanks for the testing and reviews! I'll go ahead and merge this, but further testing feedback or code review feedback is still welcome, I'll address anything in follow-up PRs.

@vcanales I've labelled this for backport to 6.6.2, though it might be worth having a conversation about the size and scope of this PR. I think it'd fix a lot of issues for users though, so hopefully it's ok.

@talldan talldan merged commit 1e84959 into trunk Aug 28, 2024
65 checks passed
@talldan talldan deleted the try/keeping-same-specificity-for-non-iframed-editor branch August 28, 2024 04:10
@github-actions github-actions bot added this to the Gutenberg 19.2 milestone Aug 28, 2024
@mrleemon
Copy link
Contributor

Thanks for your work, @talldan! I hope your fix makes it into 6.6.2.

@hellofromtonya
Copy link
Contributor

hellofromtonya commented Aug 28, 2024

Will discuss in today's bug scrub (starting in about 10 minutes). I'm thinking this PR is not well suited for a minor release. Why?

So I'm thinking it's an enhancement that subsequently also fixes a regression bug that (may have) happened in 6.6.0 (or earlier). As an enhancement, it's better suited for 6.7.0.

@aaronjorbin
Copy link
Member

Some additional info to consider: It is fixing an issue (#63925) that is labeled as a regression. If it's a regression from 6.5 to 6.6, that seems to me like this should be considered.

That said, this is not a small PR and based on the other tickets connected, I'm not sure it is a regression from 6.5 or from much earlier (making it a long standing bug that is better fixed in a major version)

@hellofromtonya
Copy link
Contributor

Summary of discussion during today's Core bug scrub:

  • It's not ready for 6.6.2.
  • It needs to be released first in the plugin to gain confidence and, if needed, iteration.
  • Then it could be reconsidered for a future 6.6.x minor release.

Also noting, an enhancement can be considered for a minor release per Core's handbook:

A minor release is intended for bugfixes and enhancements that do not add new deployed files and are at the discretion of the release lead with suggestions/input from component maintainers and committers.

TIL

bph pushed a commit to bph/gutenberg that referenced this pull request Aug 31, 2024
* WIP

* Small fixes, improvements to root selector handling, avoid double prefixing

* Add test for compound :where statements

* Fix too specific layout styles in non-iframed editor

* Update handling of root selectors

* Fix all the problems

* Update comment

* Add text for root selector text in middle of selector

* Also avoid double-prefix of root selectors

* Change how root selectors are transformed, inject the prefix after the root part of the selector

* Remove hard-coded editor-styles-wrapper prefix from selectors

* Update tests and fix double prefixing for root selectors

* Fix test

* Update comment

* Update another test

* Avoid transforming selectors that already contain .editor-styles-wrapper

* Update ignored selectors to match behavior of postcss-prefix-wrap

* Stop using snapshots

* Add more tests

* Fix typo

* Add tests for regex ignores

* Fix ropey root selectors and add tests

* Use a tokenizer for root prefixing

* Small optimization, Use a for loop to avoid unneccessary looping

* Remove outdated comment

* Update block library editor-styles-wrapper styles

* Update comment

* Add comment

* Add more detail to nav block style comment

* Also use same scope specificity in widget editor

* Fix strings that look like regular expressions in ignoredSelectors

* Reduce diff

* Explain the function behavior further

----

Unlinked contributors: ktmn.

Co-authored-by: talldan <talldanwp@git.wordpress.org>
Co-authored-by: aaronrobertshaw <aaronrobertshaw@git.wordpress.org>
Co-authored-by: kevin940726 <kevin940726@git.wordpress.org>
Co-authored-by: mrleemon <leemon@git.wordpress.org>
Co-authored-by: apmeyer <apmeyer@git.wordpress.org>
Co-authored-by: wongjn <wongjn@git.wordpress.org>
@talldan talldan added [Type] Bug An existing feature does not function as intended and removed Backport to WP Minor Release Pull request that needs to be backported to a WordPress minor release [Type] Enhancement A suggestion for improvement. labels Sep 2, 2024
@talldan
Copy link
Contributor Author

talldan commented Sep 2, 2024

Thanks for discussing it. I've removed the Backport label, so it isn't accidentally included 😄

It's marked as an enhancement.

Mislabelled, it's a shame that wasn't questioned a bit more, it's definitely a bug fix 🤦

Agree with the other points discussed though, this is mostly why I raised the question. 👍

@hellofromtonya
Copy link
Contributor

hellofromtonya commented Sep 3, 2024

I think there may be a misunderstanding. Last week's bug scrub, consensus was reached that this fix could potentially be included in a 6.6.x minor release, but first needs to be released in the plugin.

To keep it on the radar for tracking, I'm adding it to the 6.6.x project board. It's already being tracked in the 6.6 Specificity/Style tracking issue #64243.

@talldan
Copy link
Contributor Author

talldan commented Sep 3, 2024

What's the misunderstanding?

@hellofromtonya
Copy link
Contributor

Me not reading it correctly 🤦‍♀️ 🤣

Sorry about that @talldan. I re-read and now understand what you're saying here:

I've removed the Backport label, so it isn't accidentally included 😄

Deserves another 🤦‍♀️ from me.

@talldan
Copy link
Contributor Author

talldan commented Sep 4, 2024

No worries, thanks for handling all the release coordination!

@jeffpaul
Copy link
Member

jeffpaul commented Nov 8, 2024

@ktmn mind sharing your WordPress.org username so I can ensure its included in the 6.7 credits listing?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
CSS Styling Related to editor and front end styles, CSS-specific issues. [Type] Bug An existing feature does not function as intended
Projects
Status: 🔎 Needs Review
Development

Successfully merging this pull request may close these issues.

Differing CSS specificity between Non-Iframed Editor and Front end
7 participants