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

Background images: add support for theme.json ref value resolution #64128

Merged
merged 11 commits into from
Aug 15, 2024

Conversation

ramonjd
Copy link
Member

@ramonjd ramonjd commented Jul 31, 2024

What?

Part of:

So, you know how you can "reference" another value in theme.json using "ref"?

Well, this PR adds support for ref resolution to "background" style properties.

Why?

The "background" style properties haven't supported this feature, until now!

The theme.json schema has already been updated to reflect this change.

How?

By passing the resolved background image value to the style engine.

In the client (editor JS), I'm doing it long-hand, as you can see. It's a bit fugly. In both the frontend (PHP) and editor, the style engine does the work of escaping background-image values and also ensuring they're wrapped in url().

The WP_Theme_JSON class resolves values before passing to the style engine, however the editor does it the other way around.

However, the style engine does not perform any "ref" resolution. And since the work of escaping and wrapping in url() needs to happen after ref resolution, we need to make an exception for background image.

Alternatives

  1. We add logic to WP_Theme_JSON and use-global-styles-output.js to sanitize/build url() values and bypass the style engine for background-image values. Involves duplicating code.

  2. The style engine could handle ref resolution (and possibly defaults) via a public API, used both internally and externally. Theme.json tree and defaults could be passed as options.

Example (not prescriptive):

// Input
const themeJson = {
   styles: {
    background: {
         backgroundImage: {
             url: 'http://some.host/someimage.gif',
         }
     }
   }
};

const blockStyles = {
    background: {
         backgroundImage: { ref: 'styles.background.backgroundImage' }
    }
};

// Output
const styles = getCSSRules( blockStyles, {
     themeJson,
} );

// Somewhere in getCSSRules

const resolvedRefValue = get( options.themeJson, blockStyles.background.backgroundImage.ref );
const backgroundImageValue = ``url( '${ encodeURI( safeDecodeURI( resolvedRefValue.url ) ) }' )`

Testing Instructions

  1. Create a theme.json with valid background ref values (see theme.json example below). The example below also includes a relative path to an image.
  2. Ensure that the values resolve in the frontend and site editor (and post editor for the heck of it)
  3. Check that, when you replace a block image in global styles, that the image appears correctly in the frontend and backend.
Example block HTML
<!-- wp:group {"layout":{"type":"constrained"}} -->
<div class="wp-block-group">
<!-- wp:paragraph -->
<p>Group</p>
<!-- /wp:paragraph --></div>
<!-- /wp:group -->

<!-- wp:verse -->
<pre class="wp-block-verse">Verse</pre>
<!-- /wp:verse -->

<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p>Quote</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->
Example theme.json
{
	"$schema": "../../schemas/json/theme.json",
	"version": 3,
	"settings": {
		"appearanceTools": true,
		"layout": {
			"contentSize": "840px",
			"wideSize": "1100px"
		}
	},
	"styles": {

		"background": {
			"backgroundImage": {
				"url": "https://images.pexels.com/photos/105819/pexels-photo-105819.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr="
			},
			"backgroundSize": "cover",
			"backgroundAttachment": "fixed",
			"backgroundPosition": "top left"
		},
		"blocks": {
			"core/verse": {
				"background": {
					"backgroundImage": {
						"url": "file:./img/1024x768_emptytheme_test_image.jpg"
					},
					"backgroundAttachment": "fixed",
					"backgroundSize": "61px"
				},
				"color": {
					"text": "white"
				},
				"dimensions": {
					"minHeight": "100px"
				}
			},
			"core/quote": {
				"background": {
					"backgroundImage": {
						"ref": "styles.background.backgroundImage"
					}
				},
				"dimensions": {
					"minHeight": "100px"
				}
			},
			"core/group": {
				"background": {
					"backgroundImage": {
						"ref": "styles.blocks.core/verse.background.backgroundImage"
					},
					"backgroundAttachment": {
						"ref": "styles.blocks.core/verse.background.backgroundAttachment"
					},
					"backgroundSize": {
						"ref": "styles.blocks.core/verse.background.backgroundSize"
					},
					"backgroundPosition":  {
						"ref": "styles.background.backgroundPosition"
					}
				},
				"color": {
					"text": {
						"ref": "styles.blocks.core/verse.color.text"
					}
				},
				"dimensions": {
					"minHeight": "111px"
				}
			}
		}
	}
}




Screenshot 2024-07-31 at 3 37 45 PM

TODO

Split this PR up into (in order of merge priority):

@ramonjd ramonjd added [Type] Enhancement A suggestion for improvement. Global Styles Anything related to the broader Global Styles efforts, including Styles Engine and theme.json labels Jul 31, 2024
@ramonjd ramonjd self-assigned this Jul 31, 2024
Copy link

github-actions bot commented Jul 31, 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.

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

Co-authored-by: ramonjd <ramonopoly@git.wordpress.org>
Co-authored-by: aaronrobertshaw <aaronrobertshaw@git.wordpress.org>
Co-authored-by: andrewserong <andrewserong@git.wordpress.org>
Co-authored-by: kevin940726 <kevin940726@git.wordpress.org>

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

@ramonjd ramonjd force-pushed the update/background-image-ref-support branch from 1f3fe7c to aa6bb1d Compare July 31, 2024 05:40
lib/class-wp-theme-json-gutenberg.php Show resolved Hide resolved
lib/class-wp-theme-json-gutenberg.php Show resolved Hide resolved
$ref_value = _wp_array_get( $theme_json, $value_path );
$ref_value = _wp_array_get( $theme_json, $value_path, null );
// Background Image refs can refer to a string or an array containing a URL string.
$ref_value_url = $ref_value['url'] ?? null;
Copy link
Member Author

Choose a reason for hiding this comment

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

This is specifically for background images.

It's part of the reason why I think this could be a style engine util, used both internally, and externally by WP_Theme_JSON.

The style engine could subsume many style-related utils and potentially reduce the site of WP_Theme_JSON.

Copy link
Contributor

Choose a reason for hiding this comment

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

Anything that can chip away at the size of WP_Theme_JSON sounds like a win to me.

Copy link

github-actions bot commented Jul 31, 2024

Size Change: -62 B (0%)

Total Size: 1.77 MB

Filename Size Change
build/block-editor/index.min.js 255 kB -18 B (-0.01%)
build/edit-site/index.min.js 217 kB -64 B (-0.03%)
build/editor/index.min.js 101 kB +25 B (+0.02%)
build/style-engine/index.min.js 2.04 kB -5 B (-0.24%)
ℹ️ 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/index.min.js 7.29 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/content-rtl.css 4.58 kB
build/block-editor/content.css 4.58 kB
build/block-editor/default-editor-styles-rtl.css 394 B
build/block-editor/default-editor-styles.css 394 B
build/block-editor/style-rtl.css 16.3 kB
build/block-editor/style.css 16.3 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 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/editor-rtl.css 310 B
build/block-library/blocks/button/editor.css 310 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/editor-rtl.css 336 B
build/block-library/blocks/buttons/editor.css 336 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 90 B
build/block-library/blocks/comment-content/style.css 90 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/editor-rtl.css 221 B
build/block-library/blocks/comments-pagination/editor.css 211 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/editor-rtl.css 668 B
build/block-library/blocks/cover/editor.css 669 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/editor-rtl.css 314 B
build/block-library/blocks/embed/editor.css 314 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/style-rtl.css 1.71 kB
build/block-library/blocks/gallery/style.css 1.71 kB
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/editor-rtl.css 139 B
build/block-library/blocks/latest-posts/editor.css 138 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/editor-rtl.css 663 B
build/block-library/blocks/navigation-link/editor.css 664 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/editor-rtl.css 2.18 kB
build/block-library/blocks/navigation/editor.css 2.19 kB
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-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 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-featured-image/style-rtl.css 341 B
build/block-library/blocks/post-featured-image/style.css 341 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/editor-rtl.css 220 B
build/block-library/blocks/query-pagination/editor.css 208 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/editor-rtl.css 123 B
build/block-library/blocks/site-title/editor.css 123 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/editor-rtl.css 393 B
build/block-library/blocks/template-part/editor.css 393 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/editor-rtl.css 11.9 kB
build/block-library/editor.css 11.9 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 217 kB
build/block-library/reset-rtl.css 472 B
build/block-library/reset.css 472 B
build/block-library/style-rtl.css 14.7 kB
build/block-library/style.css 14.7 kB
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/components/index.min.js 224 kB
build/components/style-rtl.css 12.1 kB
build/components/style.css 12.1 kB
build/compose/index.min.js 12.9 kB
build/core-commands/index.min.js 2.82 kB
build/core-data/index.min.js 73.1 kB
build/customize-widgets/index.min.js 11 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/index.min.js 12.6 kB
build/edit-post/style-rtl.css 2.31 kB
build/edit-post/style.css 2.31 kB
build/edit-site/posts-rtl.css 7.43 kB
build/edit-site/posts.css 7.43 kB
build/edit-site/style-rtl.css 12.7 kB
build/edit-site/style.css 12.7 kB
build/edit-widgets/index.min.js 17.7 kB
build/edit-widgets/style-rtl.css 4.2 kB
build/edit-widgets/style.css 4.2 kB
build/editor/style-rtl.css 9.36 kB
build/editor/style.css 9.35 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/debug.min.js 16.3 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/index.min.js 2.16 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/index.min.js 1.59 kB
build/nux/style-rtl.css 749 B
build/nux/style.css 745 B
build/patterns/index.min.js 7.37 kB
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/index.min.js 2.55 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.1 kB
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/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/index.min.js 7.19 kB
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

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

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

Nice work! I've only taken it for a quick spin so far, but can give this some more testing tomorrow. It's mostly testing well for me 👍

I noticed that it looks like the default of cover background size, and the thumbnail for the image in the UI control don't appear to be included when using the ref-based value. Are you able to replicate?

image

Tiny bit of theme.json snippet:

			"core/quote": {
				"background": {
					"backgroundImage": {
						"ref": "styles.background.backgroundImage"
					}
				},

Overall I like your idea of abstracting things away in the style engine in the future. For now, though, it doesn't look like this has added too much code so far, so seems a reasonable approach to me! But curious to hear what other folks think, too 🙂

@andrewserong
Copy link
Contributor

I think I just noticed another issue: I wasn't able to update a block in global styles with a user set image. The ref based one set in theme.json appears to stick. Here's what it looks like for a Quote block when giving it a background image at the block level in global styles (note the thumbnail has the "correct" image uploaded by the user, but the editor canvas still shows the one derived from the ref):

image

@ramonjd
Copy link
Member Author

ramonjd commented Jul 31, 2024

Thanks for testing @andrewserong

I'll give it belt tomorrow and straighten things out.

@ramonjd ramonjd marked this pull request as draft July 31, 2024 06:39
@ramonjd
Copy link
Member Author

ramonjd commented Jul 31, 2024

I noticed that it looks like the default of cover background size, and the thumbnail for the image in the UI control don't appear to be included when using the ref-based value.

Very interesting. So I think we never output defaults at the block level in theme.json - I'll have to fix that in general.

As for the thumbnail, we're passing inheritedValues to the block panel controls, but we're not resolving the refs.

All fixable!

Thanks again for testing 🙇🏻

@andrewserong
Copy link
Contributor

Very interesting. So I think we never output defaults at the block level in theme.json - I'll have to fix that in general.

Oh, good point! I can't remember the discussion now... maybe we decided that we'd only set the default when a user uploads versus when someone is using theme.json since in theme.json folks can be explicit about what they want to include? Happy to take your lead on what you think makes sense here 🙂

@ramonjd
Copy link
Member Author

ramonjd commented Aug 1, 2024

maybe we decided that we'd only set the default when a user uploads versus when someone is using theme.json since in theme.json folks can be explicit about what they want to include?

I think that was the intention, looking at the commit at the time.

I can't find any specific conversation though.

Adding defaults only to user-uploaded backgrounds makes sense to me - I'll test it through.

@ramonjd ramonjd force-pushed the update/background-image-ref-support branch from 2f17492 to 6f2a83e Compare August 1, 2024 04:26
Copy link
Member Author

@ramonjd ramonjd left a comment

Choose a reason for hiding this comment

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

Another round of updates to address:

  • resolving ref-based image values for thumbnails
  • ensuring only uploaded background images in block get the block defaults, e.g., "cover"

@@ -334,6 +340,7 @@ function BackgroundImageControls( {
! positionValue && ( 'auto' === sizeValue || ! sizeValue )
? '50% 0'
: positionValue,
backgroundSize: sizeValue,
Copy link
Member Author

Choose a reason for hiding this comment

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

Uploaded images will receive any incoming default values.

For example, hooks/background.js defines "cover" - this will affect blocks only.

}
);
return resolvedValues;
}, [ globalStyles, inheritedValue ] );
Copy link
Member Author

Choose a reason for hiding this comment

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

Here I'm consolidating all the data and resolution logic.

That now includes themeURIs for relative URIs, which really only affects background images.

It's a first step towards linking globalStyles with all styles controls, at least for one panel.

Where themeURIs have been passed around as props before, I've removed it.

packages/block-editor/src/hooks/background.js Outdated Show resolved Hide resolved
@ramonjd
Copy link
Member Author

ramonjd commented Aug 2, 2024

This PR does too much:

  • resolves refs for background images
  • centralizes clientside code for ref and URI path resolution and does refactoring around global styles
  • adds tests

I'll split it up (in order of merge priority):

  • Abstracting the ref and theme URI resolution in the client and tests (new PR)
  • Adding support for background theme.json ref resolution (this PR)
  • Export getCSSVarFromStyleValue from style engine in place of compileStyleValue (new PR)

@andrewserong
Copy link
Contributor

I'll split it up (in order of merge priority):

Sounds great, I like the direction of the refactors in this PR so far!

Another round of updates to address:
resolving ref-based image values for thumbnails

Has that been addressed? When re-testing, it looks like I'm still seeing an "Add background image" button at the block level in global styles, and in the block inspector when selecting a block instance. Just wanted to double-check in case I've messed something up in my testing locally 🙂

image

@andrewserong
Copy link
Contributor

Update: in my screenshot above, my root styles.background.backgroundImage was a string that used an external url. When I update to using a theme url, it works fine:

image

@ramonjd
Copy link
Member Author

ramonjd commented Aug 2, 2024

in my screenshot above, my root styles.background.backgroundImage was a string that used an external url.

Ah, that would be it 👍🏻

That was a concession we made a few cycles ago, that is, not to try to prioritize parsing out the image URI from such string values because those values could be anything, not just url('happy-path.jpg').

I suppose we could do a simple regex and URI sanitization in a follow up. I'll add it to the tracking issue as an enhancement.

@andrewserong
Copy link
Contributor

I suppose we could do a simple regex and URI sanitization in a follow up. I'll add it to the tracking issue as an enhancement.

Yeah, not a blocker at all! I wouldn't worry about it for now, just glad we got to the bottom of it 😄

lib/class-wp-theme-json-gutenberg.php Outdated Show resolved Hide resolved
$ref_value = _wp_array_get( $theme_json, $value_path );
$ref_value = _wp_array_get( $theme_json, $value_path, null );
// Background Image refs can refer to a string or an array containing a URL string.
$ref_value_url = $ref_value['url'] ?? null;
Copy link
Contributor

Choose a reason for hiding this comment

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

Anything that can chip away at the size of WP_Theme_JSON sounds like a win to me.

lib/class-wp-theme-json-gutenberg.php Show resolved Hide resolved
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.

Thanks for the explanatory comments and detailed PR description @ramonjd 👍

I've followed the test instructions, including those in #64128 (comment), and it is working pretty well for me.

I think I'm missing some context around then removal of the _links data and theme file uri stuff. I think it makes sense. Was this part of what you were planning to split into separate PRs?

On the code side of things, I noticed a few minor issues that I'll push commits for shortly. Feel free to revert anything you disagree with 🙂

Once the dust settles, I'll give it another proper test tomorrow.

phpunit/class-wp-theme-json-test.php Outdated Show resolved Hide resolved
phpunit/class-wp-theme-json-test.php Outdated Show resolved Hide resolved
phpunit/class-wp-theme-json-test.php Show resolved Hide resolved
@ramonjd
Copy link
Member Author

ramonjd commented Aug 14, 2024

Huge thanks for testing this one and pushing those changes @aaronrobertshaw LGTM

I think I'm missing some context around then removal of the _links data and theme file uri stuff. I think it makes sense.

I was pushing the _links data around from component to component, when I really only needed it in the background-panel component.

The _links data is used to resolve any relative paths.

Most of the ground work for this was already done in #64182, so this PR is mainly putting all the resolution operations required for background panels in one place.

Was this part of what you were planning to split into separate PRs?

It's kinda related. My idea was to abstract what the background panel is doing in terms of resolution so, eventually other styles could take advantage.

It was a bit of forward work for the following issue:

So, not really required right now, and I think it makes more sense to do afterwards.

I do see a couple of follow ups to this PR for the very immediate or for the longer term scope. In opinionated order of least complex to most complex:

  • Add loading layer to focal point picker, similar to image block
  • Export getCSSVarFromStyleValue from style engine in place of compileStyleValue (new PR)
  • Generally, move some style utils to the style engine:
  • As mentioned above, abstract all ref/URI resolving to a separate hook or whatever so any block style control can use it.

@ramonjd ramonjd force-pushed the update/background-image-ref-support branch from aaf0cc9 to f6f7f7a Compare August 14, 2024 04:18
@ramonjd ramonjd marked this pull request as ready for review August 14, 2024 04:22
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 all this @ramonjd

Special thanks for the detailed PR description and extra explanations to help get me up to speed here.

This tests well for me across the board.

✅ Theme.json set background styles apply correctly in both editors and frontend
✅ Background ref values resolve correctly
✅ Updating Global Styles overrides background image values, including ref values
✅ Updating Global Styles background image that is the source for another block's ref value does get reflected on the block referencing it
✅ Global Styles changes apply consistently across editors and frontend
✅ Block instance styles override Global Styles correctly

LGTM 🚢

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.

Thanks for the PR!

I tested it but noticed something I can't explain. I'm not sure if there's anything I'm doing wrong or this is not even related to this PR?

When I set the global styles background for core/quote to a custom image like shown below, the quote block is still referencing the background image.

image

However, the frontend is correctly showing the custom image I uploaded.

image

The block itself doesn't have per-block style.

You can also find the inconsistency on the group block above 🤔. I'm not too familiar with the feature and the code base so I could use some sanity check here 🙇.

@ramonjd
Copy link
Member Author

ramonjd commented Aug 15, 2024

Thanks for testing @kevin940726 and @aaronrobertshaw 🙇🏻

When I set the global styles background for core/quote to a custom image like shown below, the quote block is still referencing the background image.

I can't seem to reproduce 🤔 I checked in Firefox, Chrome and Safari.

Kapture.2024-08-15.at.10.30.35.mp4

I recognize the behavior, as it was the reason behind this change.

When uploading an image there's a slight delay I see, but that's because we're waiting on the upload callback to fire.

Which makes me wonder if we should have some loading UI there to indicate that an image is being uploaded, like the image block has 🤔

I'll add it as a follow up 👍🏻

ramonjd and others added 11 commits August 15, 2024 12:46
- add tests

- adds tests

Check for string types in background image so it will apply defaults for blocks.
Update comments
- remove useGlobalStyleLinks completely
- delete theme URI utils

Remove string condition

LInto
… exists. This will occur when base and user configs are merged.

Update tests and perform check for background size before use.

Update tests and perform check for background size before use.
… merged, but replaced when merged theme.json configs. So, for example, an incoming config such as a saved user config should overwrite the background styles of the base theme.json, where it exists.
…und styles as general styles are tested above in test_merge_incoming_data
@ramonjd ramonjd force-pushed the update/background-image-ref-support branch from f6f7f7a to f21a3e9 Compare August 15, 2024 02:46
@aaronrobertshaw
Copy link
Contributor

I'm also having trouble replicating this issue (#64128 (review)).

The global styles background image for the quote block gets applied correctly for me. I tried a few approaches and all worked well:

  • Selecting an existing image from the media library
  • Uploading a new image
  • Throttling the connection to slow 3g and uploading a new image

A loading UI as a follow-up sounds like a nice touch to me 👍

Screenshot 2024-08-15 at 10 00 56 AM

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.

Well, I certainly can't reproduce #64128 (review) either 🤦. I'm guessing an outdated or branch locally on my end. Sorry for the false alarm!

In other words, this works well in my testing! Thanks!

@ramonjd ramonjd merged commit d669eb6 into trunk Aug 15, 2024
63 checks passed
@ramonjd ramonjd deleted the update/background-image-ref-support branch August 15, 2024 03:44
@github-actions github-actions bot added this to the Gutenberg 19.1 milestone Aug 15, 2024
ramonjd added a commit to ramonjd/wordpress-develop that referenced this pull request Aug 15, 2024
ramonjd added a commit to ramonjd/wordpress-develop that referenced this pull request Aug 16, 2024
ramonjd added a commit to ramonjd/wordpress-develop that referenced this pull request Aug 26, 2024
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 [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants