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

Update: Use elements mechanism for link color instead of a CSS variable #31524

Merged
merged 1 commit into from
May 19, 2021

Conversation

jorgefilipecosta
Copy link
Member

@jorgefilipecosta jorgefilipecosta commented May 5, 2021

This PR updates the link color mechanism to use elements instead of CSS variables.

The attribute is persisted in a paragraph is the same as in theme.json (inside elements). This is the first time we use an elements object at the block level. So we are introducing a new mechanism.
The shape looks like this:

<!-- wp:paragraph {"style":{"elements":{"link":{"color":{"text":"#db0b15"}}}}} -->

The mechanism on the client-side is generic, e.g., it would work for any style and any element. The mechanism on the server is specified for link color for now. We can make it generic, but it requires exposing a method from lib/class-wp-theme-json.php that compiles the styles. To avoid having this PR change the public API of class-wp-theme-json.php, I removed the generic approach and kept things simpler and specific for link color so we can merge this PR faster.

How has this been tested?

I went to the site editor global styles panel and set a global link color and a link color for the heading block.
I verified both link colors were applied correctly on the front and backend.
I went to the post editor and set a red link color for a paragraph. I verified the link color was applied correctly on the editor and frontend.

@jorgefilipecosta jorgefilipecosta added the Global Styles Anything related to the broader Global Styles efforts, including Styles Engine and theme.json label May 5, 2021
@github-actions
Copy link

github-actions bot commented May 5, 2021

Size Change: +46 B (0%)

Total Size: 1.62 MB

Filename Size Change
build/block-editor/index.js 119 kB +267 B (0%)
build/block-library/index.js 146 kB -1 B (0%)
build/blocks/index.js 47.1 kB +48 B (0%)
build/components/index.js 188 kB +1 B (0%)
build/edit-navigation/index.js 13.6 kB +1 B (0%)
build/edit-site/index.js 25.8 kB -268 B (-1%)
build/edit-widgets/index.js 292 kB +1 B (0%)
build/editor/index.js 38.4 kB -1 B (0%)
build/format-library/index.js 5.66 kB -2 B (0%)
build/plugins/index.js 1.99 kB +1 B (0%)
build/reusable-blocks/index.js 2.54 kB -1 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.12 kB 0 B
build/annotations/index.js 2.93 kB 0 B
build/api-fetch/index.js 2.42 kB 0 B
build/autop/index.js 2.28 kB 0 B
build/blob/index.js 673 B 0 B
build/block-directory/index.js 6.61 kB 0 B
build/block-directory/style-rtl.css 989 B 0 B
build/block-directory/style.css 990 B 0 B
build/block-editor/style-rtl.css 12.8 kB 0 B
build/block-editor/style.css 12.8 kB 0 B
build/block-library/blocks/archives/editor-rtl.css 61 B 0 B
build/block-library/blocks/archives/editor.css 60 B 0 B
build/block-library/blocks/audio/editor-rtl.css 58 B 0 B
build/block-library/blocks/audio/editor.css 58 B 0 B
build/block-library/blocks/audio/style-rtl.css 112 B 0 B
build/block-library/blocks/audio/style.css 112 B 0 B
build/block-library/blocks/block/editor-rtl.css 161 B 0 B
build/block-library/blocks/block/editor.css 161 B 0 B
build/block-library/blocks/button/editor-rtl.css 475 B 0 B
build/block-library/blocks/button/editor.css 474 B 0 B
build/block-library/blocks/button/style-rtl.css 601 B 0 B
build/block-library/blocks/button/style.css 600 B 0 B
build/block-library/blocks/buttons/editor-rtl.css 315 B 0 B
build/block-library/blocks/buttons/editor.css 315 B 0 B
build/block-library/blocks/buttons/style-rtl.css 375 B 0 B
build/block-library/blocks/buttons/style.css 375 B 0 B
build/block-library/blocks/calendar/style-rtl.css 208 B 0 B
build/block-library/blocks/calendar/style.css 208 B 0 B
build/block-library/blocks/categories/editor-rtl.css 84 B 0 B
build/block-library/blocks/categories/editor.css 83 B 0 B
build/block-library/blocks/categories/style-rtl.css 79 B 0 B
build/block-library/blocks/categories/style.css 79 B 0 B
build/block-library/blocks/code/style-rtl.css 90 B 0 B
build/block-library/blocks/code/style.css 90 B 0 B
build/block-library/blocks/columns/editor-rtl.css 190 B 0 B
build/block-library/blocks/columns/editor.css 190 B 0 B
build/block-library/blocks/columns/style-rtl.css 422 B 0 B
build/block-library/blocks/columns/style.css 422 B 0 B
build/block-library/blocks/cover/editor-rtl.css 643 B 0 B
build/block-library/blocks/cover/editor.css 645 B 0 B
build/block-library/blocks/cover/style-rtl.css 1.22 kB 0 B
build/block-library/blocks/cover/style.css 1.22 kB 0 B
build/block-library/blocks/embed/editor-rtl.css 486 B 0 B
build/block-library/blocks/embed/editor.css 486 B 0 B
build/block-library/blocks/embed/style-rtl.css 401 B 0 B
build/block-library/blocks/embed/style.css 400 B 0 B
build/block-library/blocks/file/editor-rtl.css 301 B 0 B
build/block-library/blocks/file/editor.css 300 B 0 B
build/block-library/blocks/file/frontend.js 771 B 0 B
build/block-library/blocks/file/style-rtl.css 255 B 0 B
build/block-library/blocks/file/style.css 255 B 0 B
build/block-library/blocks/freeform/editor-rtl.css 2.45 kB 0 B
build/block-library/blocks/freeform/editor.css 2.45 kB 0 B
build/block-library/blocks/gallery/editor-rtl.css 704 B 0 B
build/block-library/blocks/gallery/editor.css 705 B 0 B
build/block-library/blocks/gallery/style-rtl.css 1.06 kB 0 B
build/block-library/blocks/gallery/style.css 1.05 kB 0 B
build/block-library/blocks/group/editor-rtl.css 160 B 0 B
build/block-library/blocks/group/editor.css 160 B 0 B
build/block-library/blocks/group/style-rtl.css 57 B 0 B
build/block-library/blocks/group/style.css 57 B 0 B
build/block-library/blocks/heading/editor-rtl.css 129 B 0 B
build/block-library/blocks/heading/editor.css 129 B 0 B
build/block-library/blocks/heading/style-rtl.css 76 B 0 B
build/block-library/blocks/heading/style.css 76 B 0 B
build/block-library/blocks/home-link/style-rtl.css 259 B 0 B
build/block-library/blocks/home-link/style.css 259 B 0 B
build/block-library/blocks/html/editor-rtl.css 281 B 0 B
build/block-library/blocks/html/editor.css 281 B 0 B
build/block-library/blocks/image/editor-rtl.css 717 B 0 B
build/block-library/blocks/image/editor.css 716 B 0 B
build/block-library/blocks/image/style-rtl.css 481 B 0 B
build/block-library/blocks/image/style.css 485 B 0 B
build/block-library/blocks/latest-comments/style-rtl.css 281 B 0 B
build/block-library/blocks/latest-comments/style.css 282 B 0 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B 0 B
build/block-library/blocks/latest-posts/editor.css 137 B 0 B
build/block-library/blocks/latest-posts/style-rtl.css 523 B 0 B
build/block-library/blocks/latest-posts/style.css 522 B 0 B
build/block-library/blocks/legacy-widget/editor-rtl.css 557 B 0 B
build/block-library/blocks/legacy-widget/editor.css 557 B 0 B
build/block-library/blocks/list/style-rtl.css 63 B 0 B
build/block-library/blocks/list/style.css 63 B 0 B
build/block-library/blocks/media-text/editor-rtl.css 176 B 0 B
build/block-library/blocks/media-text/editor.css 176 B 0 B
build/block-library/blocks/media-text/style-rtl.css 492 B 0 B
build/block-library/blocks/media-text/style.css 489 B 0 B
build/block-library/blocks/more/editor-rtl.css 434 B 0 B
build/block-library/blocks/more/editor.css 434 B 0 B
build/block-library/blocks/navigation-link/editor-rtl.css 633 B 0 B
build/block-library/blocks/navigation-link/editor.css 634 B 0 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B 0 B
build/block-library/blocks/navigation-link/style.css 94 B 0 B
build/block-library/blocks/navigation/editor-rtl.css 1.54 kB 0 B
build/block-library/blocks/navigation/editor.css 1.54 kB 0 B
build/block-library/blocks/navigation/style-rtl.css 1.78 kB 0 B
build/block-library/blocks/navigation/style.css 1.78 kB 0 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B 0 B
build/block-library/blocks/nextpage/editor.css 395 B 0 B
build/block-library/blocks/page-list/editor-rtl.css 310 B 0 B
build/block-library/blocks/page-list/editor.css 311 B 0 B
build/block-library/blocks/page-list/style-rtl.css 233 B 0 B
build/block-library/blocks/page-list/style.css 233 B 0 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B 0 B
build/block-library/blocks/paragraph/editor.css 157 B 0 B
build/block-library/blocks/paragraph/style-rtl.css 247 B 0 B
build/block-library/blocks/paragraph/style.css 248 B 0 B
build/block-library/blocks/post-author/editor-rtl.css 209 B 0 B
build/block-library/blocks/post-author/editor.css 209 B 0 B
build/block-library/blocks/post-author/style-rtl.css 183 B 0 B
build/block-library/blocks/post-author/style.css 184 B 0 B
build/block-library/blocks/post-comments-form/style-rtl.css 140 B 0 B
build/block-library/blocks/post-comments-form/style.css 140 B 0 B
build/block-library/blocks/post-comments/style-rtl.css 360 B 0 B
build/block-library/blocks/post-comments/style.css 359 B 0 B
build/block-library/blocks/post-content/editor-rtl.css 139 B 0 B
build/block-library/blocks/post-content/editor.css 139 B 0 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B 0 B
build/block-library/blocks/post-excerpt/editor.css 73 B 0 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B 0 B
build/block-library/blocks/post-excerpt/style.css 69 B 0 B
build/block-library/blocks/post-featured-image/editor-rtl.css 338 B 0 B
build/block-library/blocks/post-featured-image/editor.css 338 B 0 B
build/block-library/blocks/post-featured-image/style-rtl.css 119 B 0 B
build/block-library/blocks/post-featured-image/style.css 119 B 0 B
build/block-library/blocks/post-title/style-rtl.css 60 B 0 B
build/block-library/blocks/post-title/style.css 60 B 0 B
build/block-library/blocks/preformatted/style-rtl.css 103 B 0 B
build/block-library/blocks/preformatted/style.css 103 B 0 B
build/block-library/blocks/pullquote/editor-rtl.css 183 B 0 B
build/block-library/blocks/pullquote/editor.css 183 B 0 B
build/block-library/blocks/pullquote/style-rtl.css 318 B 0 B
build/block-library/blocks/pullquote/style.css 318 B 0 B
build/block-library/blocks/query-loop/editor-rtl.css 83 B 0 B
build/block-library/blocks/query-loop/editor.css 82 B 0 B
build/block-library/blocks/query-loop/style-rtl.css 315 B 0 B
build/block-library/blocks/query-loop/style.css 317 B 0 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B 0 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B 0 B
build/block-library/blocks/query-pagination/editor-rtl.css 270 B 0 B
build/block-library/blocks/query-pagination/editor.css 262 B 0 B
build/block-library/blocks/query-pagination/style-rtl.css 168 B 0 B
build/block-library/blocks/query-pagination/style.css 168 B 0 B
build/block-library/blocks/query-title/editor-rtl.css 86 B 0 B
build/block-library/blocks/query-title/editor.css 86 B 0 B
build/block-library/blocks/query/editor-rtl.css 131 B 0 B
build/block-library/blocks/query/editor.css 132 B 0 B
build/block-library/blocks/quote/style-rtl.css 169 B 0 B
build/block-library/blocks/quote/style.css 169 B 0 B
build/block-library/blocks/rss/editor-rtl.css 201 B 0 B
build/block-library/blocks/rss/editor.css 202 B 0 B
build/block-library/blocks/rss/style-rtl.css 290 B 0 B
build/block-library/blocks/rss/style.css 290 B 0 B
build/block-library/blocks/search/editor-rtl.css 189 B 0 B
build/block-library/blocks/search/editor.css 189 B 0 B
build/block-library/blocks/search/style-rtl.css 359 B 0 B
build/block-library/blocks/search/style.css 362 B 0 B
build/block-library/blocks/separator/editor-rtl.css 99 B 0 B
build/block-library/blocks/separator/editor.css 99 B 0 B
build/block-library/blocks/separator/style-rtl.css 251 B 0 B
build/block-library/blocks/separator/style.css 251 B 0 B
build/block-library/blocks/shortcode/editor-rtl.css 512 B 0 B
build/block-library/blocks/shortcode/editor.css 512 B 0 B
build/block-library/blocks/site-logo/editor-rtl.css 440 B 0 B
build/block-library/blocks/site-logo/editor.css 441 B 0 B
build/block-library/blocks/site-logo/style-rtl.css 154 B 0 B
build/block-library/blocks/site-logo/style.css 154 B 0 B
build/block-library/blocks/social-link/editor-rtl.css 164 B 0 B
build/block-library/blocks/social-link/editor.css 165 B 0 B
build/block-library/blocks/social-links/editor-rtl.css 800 B 0 B
build/block-library/blocks/social-links/editor.css 799 B 0 B
build/block-library/blocks/social-links/style-rtl.css 1.32 kB 0 B
build/block-library/blocks/social-links/style.css 1.33 kB 0 B
build/block-library/blocks/spacer/editor-rtl.css 308 B 0 B
build/block-library/blocks/spacer/editor.css 308 B 0 B
build/block-library/blocks/spacer/style-rtl.css 48 B 0 B
build/block-library/blocks/spacer/style.css 48 B 0 B
build/block-library/blocks/table/editor-rtl.css 478 B 0 B
build/block-library/blocks/table/editor.css 478 B 0 B
build/block-library/blocks/table/style-rtl.css 485 B 0 B
build/block-library/blocks/table/style.css 485 B 0 B
build/block-library/blocks/tag-cloud/editor-rtl.css 118 B 0 B
build/block-library/blocks/tag-cloud/editor.css 118 B 0 B
build/block-library/blocks/tag-cloud/style-rtl.css 94 B 0 B
build/block-library/blocks/tag-cloud/style.css 94 B 0 B
build/block-library/blocks/template-part/editor-rtl.css 551 B 0 B
build/block-library/blocks/template-part/editor.css 550 B 0 B
build/block-library/blocks/term-description/editor-rtl.css 90 B 0 B
build/block-library/blocks/term-description/editor.css 90 B 0 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B 0 B
build/block-library/blocks/text-columns/editor.css 95 B 0 B
build/block-library/blocks/text-columns/style-rtl.css 166 B 0 B
build/block-library/blocks/text-columns/style.css 166 B 0 B
build/block-library/blocks/verse/style-rtl.css 87 B 0 B
build/block-library/blocks/verse/style.css 87 B 0 B
build/block-library/blocks/video/editor-rtl.css 569 B 0 B
build/block-library/blocks/video/editor.css 570 B 0 B
build/block-library/blocks/video/style-rtl.css 169 B 0 B
build/block-library/blocks/video/style.css 169 B 0 B
build/block-library/common-rtl.css 1.26 kB 0 B
build/block-library/common.css 1.26 kB 0 B
build/block-library/editor-rtl.css 9.92 kB 0 B
build/block-library/editor.css 9.91 kB 0 B
build/block-library/reset-rtl.css 506 B 0 B
build/block-library/reset.css 507 B 0 B
build/block-library/style-rtl.css 10.2 kB 0 B
build/block-library/style.css 10.3 kB 0 B
build/block-library/theme-rtl.css 692 B 0 B
build/block-library/theme.css 693 B 0 B
build/block-serialization-default-parser/index.js 1.29 kB 0 B
build/block-serialization-spec-parser/index.js 3.06 kB 0 B
build/components/style-rtl.css 16.2 kB 0 B
build/components/style.css 16.2 kB 0 B
build/compose/index.js 9.95 kB 0 B
build/core-data/index.js 12.1 kB 0 B
build/customize-widgets/index.js 43.2 kB 0 B
build/customize-widgets/style-rtl.css 1.38 kB 0 B
build/customize-widgets/style.css 1.38 kB 0 B
build/data-controls/index.js 829 B 0 B
build/data/index.js 7.23 kB 0 B
build/date/index.js 31.8 kB 0 B
build/deprecated/index.js 739 B 0 B
build/dom-ready/index.js 577 B 0 B
build/dom/index.js 4.62 kB 0 B
build/edit-navigation/style-rtl.css 2.82 kB 0 B
build/edit-navigation/style.css 2.82 kB 0 B
build/edit-post/classic-rtl.css 454 B 0 B
build/edit-post/classic.css 454 B 0 B
build/edit-post/index.js 335 kB 0 B
build/edit-post/style-rtl.css 6.78 kB 0 B
build/edit-post/style.css 6.77 kB 0 B
build/edit-site/style-rtl.css 4.76 kB 0 B
build/edit-site/style.css 4.75 kB 0 B
build/edit-widgets/style-rtl.css 3.46 kB 0 B
build/edit-widgets/style.css 3.47 kB 0 B
build/editor/style-rtl.css 3.92 kB 0 B
build/editor/style.css 3.91 kB 0 B
build/element/index.js 3.44 kB 0 B
build/escape-html/index.js 739 B 0 B
build/format-library/style-rtl.css 637 B 0 B
build/format-library/style.css 639 B 0 B
build/hooks/index.js 1.76 kB 0 B
build/html-entities/index.js 627 B 0 B
build/i18n/index.js 3.73 kB 0 B
build/is-shallow-equal/index.js 710 B 0 B
build/keyboard-shortcuts/index.js 1.65 kB 0 B
build/keycodes/index.js 1.43 kB 0 B
build/list-reusable-blocks/index.js 2.06 kB 0 B
build/list-reusable-blocks/style-rtl.css 629 B 0 B
build/list-reusable-blocks/style.css 628 B 0 B
build/media-utils/index.js 3.08 kB 0 B
build/navigation/index.js 2.85 kB 0 B
build/notices/index.js 1.07 kB 0 B
build/nux/index.js 2.31 kB 0 B
build/nux/style-rtl.css 718 B 0 B
build/nux/style.css 716 B 0 B
build/primitives/index.js 1.03 kB 0 B
build/priority-queue/index.js 791 B 0 B
build/react-i18n/index.js 923 B 0 B
build/redux-routine/index.js 2.82 kB 0 B
build/reusable-blocks/style-rtl.css 225 B 0 B
build/reusable-blocks/style.css 225 B 0 B
build/rich-text/index.js 10.7 kB 0 B
build/server-side-render/index.js 1.64 kB 0 B
build/shortcode/index.js 1.68 kB 0 B
build/token-list/index.js 846 B 0 B
build/url/index.js 1.95 kB 0 B
build/viewport/index.js 1.28 kB 0 B
build/warning/index.js 1.13 kB 0 B
build/widgets/index.js 1.66 kB 0 B
build/wordcount/index.js 1.24 kB 0 B

compressed-size-action

@jorgefilipecosta jorgefilipecosta force-pushed the update/link-color-mechanism branch from cb8a78f to 30e1f1f Compare May 6, 2021 20:16
@jorgefilipecosta jorgefilipecosta marked this pull request as ready for review May 6, 2021 20:52
lib/global-styles.php Outdated Show resolved Hide resolved
@jorgefilipecosta jorgefilipecosta force-pushed the update/link-color-mechanism branch 2 times, most recently from a9eb5c8 to 04039af Compare May 7, 2021 15:08
@jorgefilipecosta
Copy link
Member Author

Hi @nosolosw, thank you for the review your feedback was addressed. Meanwhile, this PR also got more complex because we were not dealing with some cases. The layout and duotone hooks assume there is always a class attribute present. In this case, we can not make that assumption (e.g: a simple paragraph). So I added code to deal with these cases where our code does not only needs to add a class but also needs to add the attribute.

@oandregal
Copy link
Member

In experimental-default-theme.json we no longer need this bit:

	"styles": {
		"elements": {
			"link": {
				"color": {
					"text": "#00E"
				}
			}
		}
	}

@oandregal
Copy link
Member

I've done the first pass at this: the direction is good! Excited to have this in.

Some thoughts:

  • It looks like some tests need updating.
  • Do we want to migrate the existing blocks to the new way (remove the existing inline styles, migrate the block attribute, etc)?
  • What are your thoughts on a path forward to remove the experimental-link-color theme support further down the road (not for this PR)?

@jorgefilipecosta jorgefilipecosta force-pushed the update/link-color-mechanism branch 3 times, most recently from 6fd8602 to f3c4da0 Compare May 11, 2021 18:15
@oandregal oandregal mentioned this pull request May 12, 2021
82 tasks
@oandregal
Copy link
Member

I'm testing with existing content, to see how this behaves. This is what I've tried:

Using the trunk branch:

  • added a paragraph with a link
  • use a preset as the link color
  • publish
  • check the serialized content and it is:
<!-- wp:paragraph {"style":{"color":{"link":"var:preset|color|red"}}} -->
<p class="has-link-color" style="--wp--style--color--link:var(--wp--preset--color--red)">
Paragraph with <a href="http://wordpress.org">link</a>.
</p>
<!-- /wp:paragraph -->

Switch to this branch:

  • load the post editor
  • check the serialized content and it is (note the p wrapped in a p):
<!-- wp:paragraph {"style":{"color":{"link":"var:preset|color|red"}}} -->
<p class="has-link-color">
<p class="has-link-color" style="--wp--style--color--link:var(--wp--preset--color--red)">
Paragraph with <a href="http://wordpress.org">link</a>.
</p>
</p>
<!-- /wp:paragraph -->
  • select a preset color for link and update
  • in the front-end the output is:
<p class="wp-elements-60a3b78a854cd has-link-color"></p>
<p class="has-link-color" style="--wp--style--color--link:var(--wp--preset--color--red)">Paragraph with <a href="http://wordpress.org">link</a>.</p>
<p></p>
<style>.wp-elements-60a3b78a854cd a{color: var(--wp--preset--color--red);}</style>
  • when I reload the post editor I see the block marked as invalid and the serialized has became:
<!-- wp:paragraph {"style":{"color":{"link":"var:preset|color|red"},"elements":{"link":{"color":{"text":"var:preset|color|red"}}}}} -->
<p class="has-link-color">
<p class="has-link-color" style="--wp--style--color--link:var(--wp--preset--color--red)">
Paragraph with <a href="http://wordpress.org">link</a>.
</p>
</p>
<!-- /wp:paragraph -->

I think we have a couple of issues here:

  • Can you reproduce this weird behavior on your end?
  • If we don't migrate/clean block data for blocks that have existing link color data, we're going to have some conflicts (themes that still use the --wp--style--color--link that is inline, etc).

@oandregal
Copy link
Member

Ok, I've done a second pass at this. The major issues I've found are:

  • Conflicts with themes (both TT1 and TT1-blocks). Proposed fixes for the server & site editor.
  • Existing blocks with link color applied (see).

@jorgefilipecosta
Copy link
Member Author

Note how the textColor and backgroundColor only store the slug but the linkColor stores var:preset|color|red. Can we make linkColor work like the rest and only store the slug?

See related conversation at #31762 (comment) with mobile folks. I'm thinking we want to get rid of the var:preset|color|red format, we don't need that now. That removal needs to be done in a follow-up PR as it also depends on refactoring the font-family to make it work like any other style property #31910 In any case, for the concerns of this PR, we shouldn't use it if possible.

Hi @nosolosw, on the backgroundColor and textColor, we have two attributes one for named colors and one just for values so we can differentiate between color value "red" and present color "red". I think the system we have for link color is much much better. We use a single attribute. The shape of the style attribute is exactly the same as the shape of theme.json. When using a different shape people will be confused: Why on theme.json to set a paragraph link color I use style.elements.link.color for presets and color values but when creating a pattern to style a paragraph I use style.elements.link.color for color values but If I want to use a preset I need to use a linkColor attribute that is not available on theme.json?
This system also opens the possibility to reference variables other than preset variables.
In the textColor and backgroundColor case, the shape difference may be justified because of the class usage, but in this case, there is no class usage so there is no reason to have any difference in shape between what happens on the style attribute and what happens on theme.json.
Regarding the format var:preset|color|red instead of var(--wp--preset--color--red) it is not because of kses it is because the variable format when serialized as json looks like this var(\u002d\u002dwp\u002d\u002dpreset\u002d\u002dcolor\u002d\u002dred), so we created an easier to read format but is converted to variable format.

@jorgefilipecosta jorgefilipecosta force-pushed the update/link-color-mechanism branch from 79d57c1 to 0c55f8d Compare May 18, 2021 16:07
@jorgefilipecosta jorgefilipecosta force-pushed the update/link-color-mechanism branch from 0c55f8d to 4bc2ac2 Compare May 18, 2021 16:24
@jorgefilipecosta
Copy link
Member Author

Hi @nosolosw I applied your suggestions to be compatible with current theme styles and I mitigated the back compatibility issue (we are not breaking the markup of the paragraph anymore).

@oandregal oandregal force-pushed the update/link-color-mechanism branch from 4bc2ac2 to 4b9438f Compare May 19, 2021 11:39
@oandregal
Copy link
Member

Ok, now this works in the tests I've done:

  • Tested post editor with TT1 and TT1-blocks: paragraph with link; paragraph with link, foreground, and background colors; and a bunch of others (heading, site title, etc).
  • Tested site editor with TT1-blocks.
  • Existing content with link color doesn't break.

However, I'm a bit concerned about the resulting markup of existing content. Steps for testing:

  • In the trunk branch, add a paragraph and set a link color from the presets.
  • Switch to this branch.
  • The paragraph doesn't have the color, so I applied it again.
  • This is the result:
<!-- wp:paragraph {"style":{"color":{"link":"var:preset|color|red"},"elements":{"link":{"color":{"text":"var:preset|color|red"}}}}} -->
<p class="has-link-color" style="--wp--style--color--link:var(--wp--preset--color--red)">
Paragraph with <a href="http://wordpress.org">link</a>.
</p>
<!-- /wp:paragraph -->

Note how the legacy mechanism for block attributes is still there (style.color.link) as well as the legacy custom property as inline styles (--wp--style--color--link:var(--wp--preset--color--red)). My concern is both that this can cause bugs and that we should migrate existing content.

Do you think we can ship this as it is and do the migration in a follow-up? Do you think we could modify this PR to use the existing block attribute style.color.link and migrate to the new style.elements.link.color.text in a follow-up?

@oandregal
Copy link
Member

These are the blocks that have support for link color and, hence, would need to be migrated: column, columns, group, heading, media-text, paragraph, post-author, post-comments, post-comments-form, post-comments-link, post-date, post-excerpt, post-terms, post-title, query-pagination-next, query-pagination-previous, site-title, template-part, term-description, verse.

I'm particularly concerned with the inline styles, as that could cause styling issues with themes that use the custom property. Perhaps unlikely for the majority of cases given our use of !important but still can happen. Having those unused block attributes isn't a big deal, although I think we should clean those up as well ― ideally, we'd reuse the existing data to style the link with the new mechanism.

Given the time constraints to get this in the RC, a compromise we could do is to ship this PR as it is and backport those migrations individually later ― if that's something folks agree with or makes sense in general.

@oandregal
Copy link
Member

Ran this and this by some folks. Given this has been an experimental feature not shipped to core, there's going to be a small number of users that need those migrations. The consensus is that this is an important PR to have in today's RC and that we can fix bugs later should they happen. Going to disagree and commit with this one.

Co-authored-by: André <nosolosw@users.noreply.github.com> (+3 squashed commits)
Squashed commits:
[994e5e3] Add link color as an element mechanism.
[e4a72bc] Remove existing link color
[7fcd57c] Fix nav placeholder colors and height. (#31875)
@jorgefilipecosta jorgefilipecosta force-pushed the update/link-color-mechanism branch from 4b9438f to ac7e6da Compare May 19, 2021 16:18
@jorgefilipecosta jorgefilipecosta added this to the Gutenberg 10.7 milestone May 19, 2021
@jorgefilipecosta jorgefilipecosta merged commit 7e2278e into trunk May 19, 2021
@jorgefilipecosta jorgefilipecosta deleted the update/link-color-mechanism branch May 19, 2021 17:48
jffng pushed a commit that referenced this pull request May 19, 2021
…le (#31524)

Co-authored-by: André <nosolosw@users.noreply.github.com> (+3 squashed commits)
@oandregal oandregal mentioned this pull request Jun 2, 2021
15 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Global Styles Anything related to the broader Global Styles efforts, including Styles Engine and theme.json
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Link Color: substitute the CSS Custom Property by the mechanism used in layout and duotone
2 participants