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

Fix for link color in containers #34689

Merged
merged 5 commits into from Sep 13, 2021
Merged

Fix for link color in containers #34689

merged 5 commits into from Sep 13, 2021

Conversation

@oandregal
Copy link
Member

@oandregal oandregal commented Sep 9, 2021

Fixes #33437

When we landed support for elements (the link color) we made it so the generated class was this:

.wp-element-id a { color: color-value !important; }

Notice the !important. This was to make sure user-provided styles weren't overridden by theme-provided styles. However, the selector is too far-reaching and it's affecting blocks that use the a but, arguably, should not be considered "links" (such as button and social links).

This PR removes the !important so the styles for the link color are:

.wp-element-id a { color: color-value; }

If we go ahead with this change, themes that add additional CSS for link colors need to make sure that user-provided styles are respected in every situation.

Testing

Blocks at the top-level

I tested this with the TT1-blocks:

  • A paragraph with a link without any user color provided.
  • A paragraph with a link and user-provided text color. Make sure links are unaffected by the user-provided text color.
  • A paragraph with a link and user-provided text & link colors. Make sure links are affected by the user-provided link color.

tt1-blocks-top-level

Note that the TwentyTwentyOne theme needs to be updated to not override user styles (see the last paragraph, which should show the links in red):

twentytwentyone-top-level

Blocks within containers

I tested this with the TwentyTwentyOne theme:

  • Add a group that contains a paragraph with a link, the button block, and the social links. Do not assign any color to the group.
  • Add a group that contains a paragraph with a link, the button block, and the social links. Set the text color for the group. Make sure links are unaffected by the text color.
  • Add a group that contains a paragraph with a link, the button block, and the social links. Set the text and link color for the group. Make sure links are affected by the link color.

twentytwentyone-group

Note that the TT1-blocks theme needs to be updated to make sure link color is not used in the button block:

tt1-blocks-group

Nested blocks

See #34689 (comment) for testing instructions.

@@ -38,7 +38,7 @@ function gutenberg_render_elements_support( $block_content, $block ) {
}
$link_color_declaration = esc_html( safecss_filter_attr( "color: $link_color" ) );

$style = "<style>.$class_name a{" . $link_color_declaration . " !important;}</style>\n";

This comment has been minimized.

@oandregal

oandregal Sep 9, 2021
Author Member

This is going to need changes in the tests. Will update them once we're certain this is the right direction.

This comment has been minimized.

@oandregal

oandregal Sep 9, 2021
Author Member

This is going to have 011 specificity.

I've looked at all current cases of core blocks and this change will still work well with global styles. The reason is that the current global styles generated for links have 011 or 002, depending on whether they are .wp-block-* a or element a. The element styles are loaded after the global styles, so the element styles win.

I was thinking that we could add the :not(.has-link-color) selector to the global styles we generate. Should any block have higher than 011 specificity this selector will prevent it from applying. However! This is also not complete: it won't work for some blocks that declare __experimentalSelector and target an inner element. Use case:

  • some block has a wrapper such as .wp-block-wrapper
  • for whatever reason, the block declares that the styles should match some inner element instead __experimentalSelector: .wp-block-wrapper-inner .wp-block-wrapper-extra

Adding the negation in this situation would render .wp-block-wrapper-inner .wp-block-wrapper-extra:not(.has-link-color) { /* link color */ } which has higher specificity that the link color element and still targets the link in the block because the .has-link-color class lives in the wrapper.

@github-actions
Copy link

@github-actions github-actions bot commented Sep 9, 2021

Size Change: +32 B (0%)

Total Size: 1.05 MB

Filename Size Change
build/block-editor/index.min.js 120 kB -19 B (0%)
build/block-library/blocks/paragraph/style-rtl.css 273 B +12 B (+5%) 🔍
build/block-library/blocks/paragraph/style.css 273 B +12 B (+5%) 🔍
build/block-library/style-rtl.css 10.3 kB +14 B (0%)
build/block-library/style.css 10.3 kB +13 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 931 B
build/admin-manifest/index.min.js 1.09 kB
build/annotations/index.min.js 2.7 kB
build/api-fetch/index.min.js 2.19 kB
build/autop/index.min.js 2.08 kB
build/blob/index.min.js 459 B
build/block-directory/index.min.js 6.2 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-editor/style-rtl.css 13.8 kB
build/block-editor/style.css 13.8 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 58 B
build/block-library/blocks/audio/editor.css 58 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 474 B
build/block-library/blocks/button/editor.css 474 B
build/block-library/blocks/button/style-rtl.css 600 B
build/block-library/blocks/button/style.css 600 B
build/block-library/blocks/buttons/editor-rtl.css 315 B
build/block-library/blocks/buttons/editor.css 315 B
build/block-library/blocks/buttons/style-rtl.css 370 B
build/block-library/blocks/buttons/style.css 370 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 90 B
build/block-library/blocks/code/style.css 90 B
build/block-library/blocks/code/theme-rtl.css 131 B
build/block-library/blocks/code/theme.css 131 B
build/block-library/blocks/columns/editor-rtl.css 206 B
build/block-library/blocks/columns/editor.css 205 B
build/block-library/blocks/columns/style-rtl.css 497 B
build/block-library/blocks/columns/style.css 496 B
build/block-library/blocks/cover/editor-rtl.css 666 B
build/block-library/blocks/cover/editor.css 670 B
build/block-library/blocks/cover/style-rtl.css 1.23 kB
build/block-library/blocks/cover/style.css 1.23 kB
build/block-library/blocks/embed/editor-rtl.css 488 B
build/block-library/blocks/embed/editor.css 488 B
build/block-library/blocks/embed/style-rtl.css 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 322 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 983 B
build/block-library/blocks/gallery/editor.css 988 B
build/block-library/blocks/gallery/style-rtl.css 1.6 kB
build/block-library/blocks/gallery/style.css 1.59 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 159 B
build/block-library/blocks/group/editor.css 159 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 70 B
build/block-library/blocks/group/theme.css 70 B
build/block-library/blocks/heading/style-rtl.css 114 B
build/block-library/blocks/heading/style.css 114 B
build/block-library/blocks/home-link/style-rtl.css 247 B
build/block-library/blocks/home-link/style.css 247 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 728 B
build/block-library/blocks/image/editor.css 728 B
build/block-library/blocks/image/style-rtl.css 482 B
build/block-library/blocks/image/style.css 487 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B
build/block-library/blocks/latest-posts/editor.css 137 B
build/block-library/blocks/latest-posts/style-rtl.css 528 B
build/block-library/blocks/latest-posts/style.css 527 B
build/block-library/blocks/list/style-rtl.css 94 B
build/block-library/blocks/list/style.css 94 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 488 B
build/block-library/blocks/media-text/style.css 485 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 489 B
build/block-library/blocks/navigation-link/editor.css 488 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B
build/block-library/blocks/navigation-link/style.css 94 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 300 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/style-rtl.css 298 B
build/block-library/blocks/navigation-submenu/style.css 298 B
build/block-library/blocks/navigation-submenu/view.min.js 343 B
build/block-library/blocks/navigation/editor-rtl.css 1.72 kB
build/block-library/blocks/navigation/editor.css 1.72 kB
build/block-library/blocks/navigation/style-rtl.css 1.44 kB
build/block-library/blocks/navigation/style.css 1.44 kB
build/block-library/blocks/navigation/view.min.js 2.52 kB
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 310 B
build/block-library/blocks/page-list/editor.css 310 B
build/block-library/blocks/page-list/style-rtl.css 241 B
build/block-library/blocks/page-list/style.css 241 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/post-author/editor-rtl.css 210 B
build/block-library/blocks/post-author/editor.css 210 B
build/block-library/blocks/post-author/style-rtl.css 182 B
build/block-library/blocks/post-author/style.css 181 B
build/block-library/blocks/post-comments-form/style-rtl.css 140 B
build/block-library/blocks/post-comments-form/style.css 140 B
build/block-library/blocks/post-comments/style-rtl.css 360 B
build/block-library/blocks/post-comments/style.css 359 B
build/block-library/blocks/post-content/editor-rtl.css 138 B
build/block-library/blocks/post-content/editor.css 138 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 398 B
build/block-library/blocks/post-featured-image/editor.css 398 B
build/block-library/blocks/post-featured-image/style-rtl.css 143 B
build/block-library/blocks/post-featured-image/style.css 143 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 378 B
build/block-library/blocks/post-template/style.css 379 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 60 B
build/block-library/blocks/post-title/style.css 60 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 378 B
build/block-library/blocks/pullquote/style.css 378 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 301 B
build/block-library/blocks/query-pagination/editor.css 292 B
build/block-library/blocks/query-pagination/style-rtl.css 259 B
build/block-library/blocks/query-pagination/style.css 257 B
build/block-library/blocks/query-title/editor-rtl.css 85 B
build/block-library/blocks/query-title/editor.css 85 B
build/block-library/blocks/query/editor-rtl.css 131 B
build/block-library/blocks/query/editor.css 132 B
build/block-library/blocks/quote/style-rtl.css 187 B
build/block-library/blocks/quote/style.css 187 B
build/block-library/blocks/quote/theme-rtl.css 220 B
build/block-library/blocks/quote/theme.css 222 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 374 B
build/block-library/blocks/search/style.css 375 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 99 B
build/block-library/blocks/separator/editor.css 99 B
build/block-library/blocks/separator/style-rtl.css 250 B
build/block-library/blocks/separator/style.css 250 B
build/block-library/blocks/separator/theme-rtl.css 172 B
build/block-library/blocks/separator/theme.css 172 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 462 B
build/block-library/blocks/site-logo/editor.css 464 B
build/block-library/blocks/site-logo/style-rtl.css 153 B
build/block-library/blocks/site-logo/style.css 153 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 165 B
build/block-library/blocks/social-link/editor.css 165 B
build/block-library/blocks/social-links/editor-rtl.css 812 B
build/block-library/blocks/social-links/editor.css 811 B
build/block-library/blocks/social-links/style-rtl.css 1.3 kB
build/block-library/blocks/social-links/style.css 1.3 kB
build/block-library/blocks/spacer/editor-rtl.css 307 B
build/block-library/blocks/spacer/editor.css 307 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 471 B
build/block-library/blocks/table/editor.css 472 B
build/block-library/blocks/table/style-rtl.css 481 B
build/block-library/blocks/table/style.css 481 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 146 B
build/block-library/blocks/tag-cloud/style.css 146 B
build/block-library/blocks/template-part/editor-rtl.css 636 B
build/block-library/blocks/template-part/editor.css 635 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/term-description/editor-rtl.css 90 B
build/block-library/blocks/term-description/editor.css 90 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 571 B
build/block-library/blocks/video/editor.css 572 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 853 B
build/block-library/common.css 849 B
build/block-library/editor-rtl.css 9.69 kB
build/block-library/editor.css 9.68 kB
build/block-library/index.min.js 153 kB
build/block-library/reset-rtl.css 527 B
build/block-library/reset.css 527 B
build/block-library/theme-rtl.css 658 B
build/block-library/theme.css 663 B
build/block-serialization-default-parser/index.min.js 1.09 kB
build/block-serialization-spec-parser/index.min.js 2.79 kB
build/blocks/index.min.js 46.9 kB
build/components/index.min.js 209 kB
build/components/style-rtl.css 15.8 kB
build/components/style.css 15.8 kB
build/compose/index.min.js 10.2 kB
build/core-data/index.min.js 12.3 kB
build/customize-widgets/index.min.js 11.1 kB
build/customize-widgets/style-rtl.css 1.5 kB
build/customize-widgets/style.css 1.49 kB
build/data-controls/index.min.js 614 B
build/data/index.min.js 7.1 kB
build/date/index.min.js 31.5 kB
build/deprecated/index.min.js 428 B
build/dom-ready/index.min.js 304 B
build/dom/index.min.js 4.45 kB
build/edit-navigation/index.min.js 15.4 kB
build/edit-navigation/style-rtl.css 3.41 kB
build/edit-navigation/style.css 3.41 kB
build/edit-post/classic-rtl.css 492 B
build/edit-post/classic.css 494 B
build/edit-post/index.min.js 29 kB
build/edit-post/style-rtl.css 7.2 kB
build/edit-post/style.css 7.2 kB
build/edit-site/index.min.js 26.6 kB
build/edit-site/style-rtl.css 5.07 kB
build/edit-site/style.css 5.07 kB
build/edit-widgets/index.min.js 16.1 kB
build/edit-widgets/style-rtl.css 4.06 kB
build/edit-widgets/style.css 4.06 kB
build/editor/index.min.js 37.7 kB
build/editor/style-rtl.css 3.74 kB
build/editor/style.css 3.73 kB
build/element/index.min.js 3.17 kB
build/escape-html/index.min.js 517 B
build/format-library/index.min.js 5.34 kB
build/format-library/style-rtl.css 668 B
build/format-library/style.css 670 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 424 B
build/i18n/index.min.js 3.6 kB
build/is-shallow-equal/index.min.js 501 B
build/keyboard-shortcuts/index.min.js 1.72 kB
build/keycodes/index.min.js 1.26 kB
build/list-reusable-blocks/index.min.js 1.85 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.88 kB
build/notices/index.min.js 845 B
build/nux/index.min.js 2.03 kB
build/nux/style-rtl.css 747 B
build/nux/style.css 743 B
build/plugins/index.min.js 1.83 kB
build/primitives/index.min.js 921 B
build/priority-queue/index.min.js 582 B
build/react-i18n/index.min.js 671 B
build/redux-routine/index.min.js 2.63 kB
build/reusable-blocks/index.min.js 2.28 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.6 kB
build/server-side-render/index.min.js 1.32 kB
build/shortcode/index.min.js 1.48 kB
build/token-list/index.min.js 562 B
build/url/index.min.js 1.74 kB
build/viewport/index.min.js 1.02 kB
build/warning/index.min.js 248 B
build/widgets/index.min.js 7.27 kB
build/widgets/style-rtl.css 1.17 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.04 kB

compressed-size-action

Copy link
Contributor

@getdave getdave left a comment

Thank you for working on this 🏅

I don't feel in a position to approve this as I don't know enough about the implications.

However, the original case which I raised is now fixed.

Screen Shot 2021-09-09 at 12 39 15

Screen Shot 2021-09-09 at 12 38 48

@ryelle
Copy link
Contributor

@ryelle ryelle commented Sep 9, 2021

This fixes the issue in the patterns I flagged, so thanks!

Themes that add additional CSS for link colors need to make sure that user-provided styles are respected in every situation.

Link color is still an experimental feature, so changing the behavior is to be expected, right? Or is this something that will need to be documented?

I did manage to find one more edge case, where a nested link color is overridden by a link color on the parent container, but only on the frontend.

Editor Front end
Screen Shot 2021-09-09 at 10 19 44 AM Screen Shot 2021-09-09 at 10 19 35 AM

The group block has a white link color, but that individual paragraph uses a bright orange. In the editor, the <style>… is output before the block it applies to, but on the front end, the styles are output after the block. So the white link rule comes "after" the orange rule, and overrides it.

In the editor…

/* Before the group `div` */
.wp-elements-613a1a9b8f7d4 a {
    color: var(--wp--preset--color--white);
}
/* Before the `p` */
.wp-elements-613a1a9b8f45f a {
    color: #cf6100;
}

Link is orange

On the front end…

/* After the `p` */
.wp-elements-613a1a9b8f45f a {
    color: #cf6100;
}
/* After the group `div` */
.wp-elements-613a1a9b8f7d4 a {
    color: var(--wp--preset--color--white);
}

Link is white

@oandregal oandregal requested a review from ellatrix as a code owner Sep 9, 2021
@oandregal
Copy link
Member Author

@oandregal oandregal commented Sep 9, 2021

Nice one @ryelle ! Pushed a fix at 8d38f00

@oandregal
Copy link
Member Author

@oandregal oandregal commented Sep 9, 2021

Link color is still an experimental feature, so changing the behavior is to be expected, right? Or is this something that will need to be documented?

It needs to be documented. For themes that use the theme.json is not experimental.

@ryelle
Copy link
Contributor

@ryelle ryelle commented Sep 9, 2021

Now it works in all the scenarios I could think of 👍🏻

Copy link
Member

@Mamaduka Mamaduka left a comment

@oandregal, I think the snapshot in PHP unit tests needs an update.

@oandregal
Copy link
Member Author

@oandregal oandregal commented Sep 10, 2021

ok, this PR may work at a practical level. Theoretically, this could break in some situations #34689 (comment)

What I don't like about this is that themes will need to fix some CSS and that they need to take care of not overriding user-provided styles. However, the current situation is also not ideal as blocks that use the a element are affected (button and cover, for example).

I'm going to let this sit for a few days in case we can come with an alternative that fixes the issues and doesn't have the drawbacks. If we don't, I'll update the tests and merge this.

cc @jorgefilipecosta @jasmussen in case you have thoughts.

@jasmussen
Copy link
Contributor

@jasmussen jasmussen commented Sep 10, 2021

What I don't like about this is that themes will need to fix some CSS and that they need to take care of not overriding user-provided styles. However, the current situation is also not ideal as blocks that use the a element are affected (button and cover, for example).

Themes will always be able to break things, whether for good or for bad. In this case, the removal of !important's feels worth any followup we might have to do. Thanks for the PR.

Copy link
Member

@jorgefilipecosta jorgefilipecosta left a comment

It seems to work well and I think in the long term it is better to not use important. We should just create a dev not and let themes beware of this change in case link color stops working as expected on some theme.

@getsource
Copy link
Member

@getsource getsource commented Sep 13, 2021

Thanks so much for your work on this @oandregal !
I agree with the comments re: leaning towards removing the !important if it's possible.

I'm guessing this applies to some of the comments about specific theme issues:
I noticed that when testing this PR with Twenty Twenty-One, in the editor, paragraph and group link color overrides weren't reflected, but they displayed properly when rendered on the front-end.

@oandregal
Copy link
Member Author

@oandregal oandregal commented Sep 13, 2021

Thanks all for the help. I'm going to fix the tests for this one and will merge it.

@oandregal oandregal force-pushed the fix/link-color-element branch from 8d38f00 to be65b1c Sep 13, 2021
@getdave
Copy link
Contributor

@getdave getdave commented Sep 13, 2021

@oandregal FYI I tried to build a block theme over the weekend and ran into this !important issue several times. I'm very glad it will be removed.

oandregal added 5 commits Sep 9, 2021
The reason for this is nested content such as:

    <group class="wp-element-1">
      <p>Text with <link> and colors inherited from group</p>
      <p class="wp-element-2">Text with <link> and own colors</p>
    </group>

The selectors for the link are

- ".wp-element 1 a" => generated by the group
- ".wp-element-2 a" => generated by the paragraph

because they have the same specificity the latest will win.
We need the styles to respect the DOM order of the elements
that have them.

    <style .wp-element-1>
    <style .wp-element-2>
    <group ...>...</group>
@oandregal oandregal force-pushed the fix/link-color-element branch from be65b1c to 7f697a9 Sep 13, 2021
@oandregal
Copy link
Member Author

@oandregal oandregal commented Sep 13, 2021

Rebased to get #34776 in (a potential fix for a failing e2e test)

@oandregal oandregal merged commit c71a933 into trunk Sep 13, 2021
20 checks passed
20 checks passed
@github-actions
Compute current and next stable release branches
Details
@github-actions
Check (14)
Details
@github-actions
Checks (12)
Details
@github-actions
Admin - 1
Details
@github-actions
Run performance tests
Details
@github-actions
pull-request-automation (14)
Details
@github-actions
test (gutenberg-editor-initial-html, 14)
Details
@github-actions
test (12.2, gutenberg-editor-initial-html, 14)
Details
@github-actions
JavaScript (12)
Details
@github-actions
Checks (14)
Details
@github-actions
Admin - 2
Details
@github-actions
JavaScript (14)
Details
@github-actions
Admin - 3
Details
@github-actions
Admin - 4
Details
@github-actions
Bump version
Details
@github-actions
Build Release Artifact
Details
@github-actions
Mobile
Details
@github-actions
Create Release Draft and Attach Asset
Details
@oandregal oandregal deleted the fix/link-color-element branch Sep 13, 2021
@github-actions github-actions bot added this to the Gutenberg 11.6 milestone Sep 13, 2021
@oandregal
Copy link
Member Author

@oandregal oandregal commented Sep 13, 2021

Devnote

To review/clarify/check when time comes to publish it:

We've made some changes to the link color feature that affect its specificity and helped to fix some issues with links within container blocks:

  • We've lowered the specificity of the link color rule in the block-library package. The selector is now :where(p.has-text-color:not(.has-link-color)) a, which resolves to 001 specificity.
  • By doing so, we could lower the global styles specifitiy as well by no longer making it !important (only affects themes with theme.json). The global link uses the a selector and the link property within blocks uses <block-selector> a. By loading after the block-styles stylesheet, they'll have higher priority.
  • When users select a color for the link, two things happen: the block wrapper gets assigned the class has-link-color and a new .wp-element-ID class. The styles for the link color are generated dynamically using the .wp-element-ID a selector, which is 011 specificity.

Given these changes, the theme needs to make sure its styles play well with user choices.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment