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 image: add support for absolute theme path URLs #60578

Closed
wants to merge 15 commits into from

Conversation

ramonjd
Copy link
Member

@ramonjd ramonjd commented Apr 9, 2024

Moved to #61401

Note

This PR is experimental and will be a reference for ongoing work. See #60578 (comment)

What? And How??!!!

Part of:

This PR proposes a way to add support for theme relative url paths for theme.json/templates/patterns by:

  • for the frontend, checking for "source": "theme" on the background image object in background supports, and appending the current theme path. It uses get_stylesheet_directory_uri instead of get_template_directory_uri so that the path will reflect any active child theme.
  • for the editor, adding a new property to editor settings currentTheme, that contains the current theme directory path. It also uses get_stylesheet_directory_uri instead of get_template_directory_uri so that the path will reflect any active child theme.

Why?

So that themes don't have to use global styles and rather, insert theme-relative paths into templates, patterns and theme.json.

This enhances portability of themes as Gutenberg will use the theme's current directory, regardless of install.

Testing Instructions

Assuming that img/Untitled.jpg exists in the theme dir, here's some test theme.json. Note only top-level background images are possible until #60100 gets in.

{
	"$schema": "https://schemas.wp.org/trunk/theme.json",
	"version": 2,
	"settings": {
		"appearanceTools": true
	},
	"styles": {
		"background": {
			"backgroundImage": {
				"source": "theme",
				"url": "img/Untitled.jpg"
			},
			"backgroundPosition": "center center",
			"backgroundRepeat": "no-repeat",
			"backgroundSize": "cover"
		}
	}
}

Here's a test pattern (could also be HTML). Add it under /patterns in the theme directory:

<?php
/**
 * Title: Empty theme pattern
 * Slug: emptytheme/empty-pattern
 * Categories: featured
 */
?>
<!-- wp:group {"style":{"background":{"backgroundImage":{"url":"img/Untitled.jpg","source":"theme"}},"dimensions":{"minHeight":"299px"}},"layout":{"type":"constrained"}} -->
<div class="wp-block-group" style="min-height:299px"></div>
<!-- /wp:group -->

It should also work with templates. Add it under /templates in the theme directory:

<!-- wp:group {"style":{"background":{"backgroundImage":{"url":"img/Untitled.jpg","source":"theme"}},"dimensions":{"minHeight":"500px"}},"layout":{"type":"constrained"}} -->
<div class="wp-block-group" style="min-height:500px">
<!-- wp:template-part {"slug":"header","tagName":"header","theme":"emptytheme"} /-->
<!-- wp:query {"queryId":1,"query":{"offset":0,"postType":"post","order":"desc","orderBy":"date","author":"","search":"","sticky":""}} -->
<div class="wp-block-query">
	<!-- wp:post-template -->
	<!-- wp:post-title {"isLink":true} /-->
	<!-- wp:post-excerpt /-->
	<!-- /wp:post-template -->
</div>
<!-- /wp:query -->
</div>
<!-- /wp:group -->
  1. For each approach above, check that the background image's absolute path is rendered into the background-image CSS value for both the frontend and editor.
  2. Ensure to check both the site editor (global styles) and post editor (block supports).

Testing Instructions for Keyboard

/*
* "theme" source implies relative path to the theme directory
*/
if ( ! empty( $background_styles['backgroundImage']['url'] ) && 'theme' === $background_image_source ) {
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 will take care of rendering block and global styles on the frontend.

lib/compat/wordpress-6.6/rest-api.php Outdated Show resolved Hide resolved
return {
allowRightClickOverrides: get(
'core',
'allowRightClickOverrides'
),
blockTypes: getBlockTypes(),
currentTheme: {
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's where my lack of imagination or sleep failed me. I couldn't think of another way, though there probably is one, to ensure the current theme data is available in the editor context.

@@ -369,6 +388,12 @@ const elementTypes = [
];

function useBlockProps( { name, style } ) {
const { themeDirURI } = useSelect( ( select ) => {
Copy link
Member Author

Choose a reason for hiding this comment

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

Not sure about this either.

For the record, this PR should just take care of theme.json/global styles but it would be good to know in advance how we'll deal with blocks.

These blocks could come from template or pattern files as well.

Copy link

github-actions bot commented Apr 9, 2024

Size Change: +543 B (+0.03%)

Total Size: 1.74 MB

Filename Size Change
build/block-editor/index.min.js 256 kB +287 B (+0.11%)
build/core-data/index.min.js 72.7 kB +180 B (+0.25%)
build/editor/index.min.js 81.1 kB +87 B (+0.11%)
build/style-engine/index.min.js 2.02 kB -11 B (-0.54%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 955 B
build/annotations/index.min.js 2.27 kB
build/api-fetch/index.min.js 2.32 kB
build/autop/index.min.js 2.1 kB
build/blob/index.min.js 578 B
build/block-directory/index.min.js 7.26 kB
build/block-directory/style-rtl.css 1.03 kB
build/block-directory/style.css 1.03 kB
build/block-editor/content-rtl.css 4.43 kB
build/block-editor/content.css 4.43 kB
build/block-editor/default-editor-styles-rtl.css 395 B
build/block-editor/default-editor-styles.css 395 B
build/block-editor/style-rtl.css 15.4 kB
build/block-editor/style.css 15.4 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 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 133 B
build/block-library/blocks/audio/theme.css 133 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 415 B
build/block-library/blocks/button/editor.css 414 B
build/block-library/blocks/button/style-rtl.css 627 B
build/block-library/blocks/button/style.css 626 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 421 B
build/block-library/blocks/columns/style.css 421 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 671 B
build/block-library/blocks/cover/editor.css 674 B
build/block-library/blocks/cover/style-rtl.css 1.7 kB
build/block-library/blocks/cover/style.css 1.69 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 312 B
build/block-library/blocks/embed/editor.css 312 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 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 327 B
build/block-library/blocks/file/style-rtl.css 280 B
build/block-library/blocks/file/style.css 281 B
build/block-library/blocks/file/view.min.js 324 B
build/block-library/blocks/footnotes/style-rtl.css 201 B
build/block-library/blocks/footnotes/style.css 199 B
build/block-library/blocks/form-input/editor-rtl.css 227 B
build/block-library/blocks/form-input/editor.css 227 B
build/block-library/blocks/form-input/style-rtl.css 343 B
build/block-library/blocks/form-input/style.css 343 B
build/block-library/blocks/form-submission-notification/editor-rtl.css 340 B
build/block-library/blocks/form-submission-notification/editor.css 340 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 471 B
build/block-library/blocks/freeform/editor-rtl.css 2.61 kB
build/block-library/blocks/freeform/editor.css 2.61 kB
build/block-library/blocks/gallery/editor-rtl.css 956 B
build/block-library/blocks/gallery/editor.css 960 B
build/block-library/blocks/gallery/style-rtl.css 1.72 kB
build/block-library/blocks/gallery/style.css 1.72 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 394 B
build/block-library/blocks/group/editor.css 394 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 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 189 B
build/block-library/blocks/heading/style.css 189 B
build/block-library/blocks/html/editor-rtl.css 336 B
build/block-library/blocks/html/editor.css 337 B
build/block-library/blocks/image/editor-rtl.css 878 B
build/block-library/blocks/image/editor.css 878 B
build/block-library/blocks/image/style-rtl.css 1.6 kB
build/block-library/blocks/image/style.css 1.59 kB
build/block-library/blocks/image/theme-rtl.css 133 B
build/block-library/blocks/image/theme.css 133 B
build/block-library/blocks/image/view.min.js 1.54 kB
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 306 B
build/block-library/blocks/media-text/editor.css 305 B
build/block-library/blocks/media-text/style-rtl.css 505 B
build/block-library/blocks/media-text/style.css 503 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 668 B
build/block-library/blocks/navigation-link/editor.css 669 B
build/block-library/blocks/navigation-link/style-rtl.css 193 B
build/block-library/blocks/navigation-link/style.css 192 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 B
build/block-library/blocks/navigation/editor-rtl.css 2.26 kB
build/block-library/blocks/navigation/editor.css 2.26 kB
build/block-library/blocks/navigation/style-rtl.css 2.26 kB
build/block-library/blocks/navigation/style.css 2.25 kB
build/block-library/blocks/navigation/view.min.js 1.03 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 377 B
build/block-library/blocks/page-list/editor.css 377 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 235 B
build/block-library/blocks/paragraph/editor.css 235 B
build/block-library/blocks/paragraph/style-rtl.css 335 B
build/block-library/blocks/paragraph/style.css 335 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 508 B
build/block-library/blocks/post-comments-form/style.css 508 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-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 734 B
build/block-library/blocks/post-featured-image/editor.css 732 B
build/block-library/blocks/post-featured-image/style-rtl.css 342 B
build/block-library/blocks/post-featured-image/style.css 342 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 409 B
build/block-library/blocks/post-template/style.css 408 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 69 B
build/block-library/blocks/post-time-to-read/style.css 69 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 125 B
build/block-library/blocks/preformatted/style.css 125 B
build/block-library/blocks/pullquote/editor-rtl.css 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 354 B
build/block-library/blocks/pullquote/style.css 353 B
build/block-library/blocks/pullquote/theme-rtl.css 174 B
build/block-library/blocks/pullquote/theme.css 174 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 288 B
build/block-library/blocks/query-pagination/style.css 284 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 486 B
build/block-library/blocks/query/editor.css 486 B
build/block-library/blocks/query/view.min.js 958 B
build/block-library/blocks/quote/style-rtl.css 237 B
build/block-library/blocks/quote/style.css 237 B
build/block-library/blocks/quote/theme-rtl.css 233 B
build/block-library/blocks/quote/theme.css 235 B
build/block-library/blocks/read-more/style-rtl.css 140 B
build/block-library/blocks/read-more/style.css 140 B
build/block-library/blocks/rss/editor-rtl.css 149 B
build/block-library/blocks/rss/editor.css 149 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 184 B
build/block-library/blocks/search/editor.css 184 B
build/block-library/blocks/search/style-rtl.css 690 B
build/block-library/blocks/search/style.css 689 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/search/view.min.js 478 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 239 B
build/block-library/blocks/separator/style.css 239 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 323 B
build/block-library/blocks/shortcode/editor.css 323 B
build/block-library/blocks/site-logo/editor-rtl.css 805 B
build/block-library/blocks/site-logo/editor.css 805 B
build/block-library/blocks/site-logo/style-rtl.css 204 B
build/block-library/blocks/site-logo/style.css 204 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 676 B
build/block-library/blocks/social-links/editor.css 675 B
build/block-library/blocks/social-links/style-rtl.css 1.48 kB
build/block-library/blocks/social-links/style.css 1.48 kB
build/block-library/blocks/spacer/editor-rtl.css 350 B
build/block-library/blocks/spacer/editor.css 350 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 395 B
build/block-library/blocks/table/editor.css 395 B
build/block-library/blocks/table/style-rtl.css 639 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/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 431 B
build/block-library/blocks/template-part/editor.css 431 B
build/block-library/blocks/template-part/theme-rtl.css 107 B
build/block-library/blocks/template-part/theme.css 107 B
build/block-library/blocks/term-description/style-rtl.css 111 B
build/block-library/blocks/term-description/style.css 111 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 185 B
build/block-library/blocks/video/style.css 185 B
build/block-library/blocks/video/theme-rtl.css 133 B
build/block-library/blocks/video/theme.css 133 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.11 kB
build/block-library/common.css 1.11 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 12.2 kB
build/block-library/editor.css 12.2 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 218 kB
build/block-library/reset-rtl.css 472 B
build/block-library/reset.css 472 B
build/block-library/style-rtl.css 14.8 kB
build/block-library/style.css 14.8 kB
build/block-library/theme-rtl.css 707 B
build/block-library/theme.css 713 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 51.7 kB
build/commands/index.min.js 15.2 kB
build/commands/style-rtl.css 953 B
build/commands/style.css 951 B
build/components/index.min.js 220 kB
build/components/style-rtl.css 11.9 kB
build/components/style.css 11.9 kB
build/compose/index.min.js 12.8 kB
build/core-commands/index.min.js 2.77 kB
build/customize-widgets/index.min.js 11 kB
build/customize-widgets/style-rtl.css 1.36 kB
build/customize-widgets/style.css 1.36 kB
build/data-controls/index.min.js 640 B
build/data/index.min.js 9 kB
build/date/index.min.js 17.9 kB
build/deprecated/index.min.js 451 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.65 kB
build/edit-post/classic-rtl.css 578 B
build/edit-post/classic.css 578 B
build/edit-post/index.min.js 16.2 kB
build/edit-post/style-rtl.css 3.79 kB
build/edit-post/style.css 3.79 kB
build/edit-site/index.min.js 223 kB
build/edit-site/style-rtl.css 13.7 kB
build/edit-site/style.css 13.7 kB
build/edit-widgets/index.min.js 17.6 kB
build/edit-widgets/style-rtl.css 4.17 kB
build/edit-widgets/style.css 4.16 kB
build/editor/style-rtl.css 7.56 kB
build/editor/style.css 7.55 kB
build/element/index.min.js 4.83 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 8.07 kB
build/format-library/style-rtl.css 493 B
build/format-library/style.css 492 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.58 kB
build/interactivity/debug.min.js 16.2 kB
build/interactivity/file.min.js 447 B
build/interactivity/image.min.js 1.67 kB
build/interactivity/index.min.js 13 kB
build/interactivity/navigation.min.js 1.17 kB
build/interactivity/query.min.js 740 B
build/interactivity/router.min.js 2.79 kB
build/interactivity/search.min.js 618 B
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.3 kB
build/keycodes/index.min.js 1.46 kB
build/list-reusable-blocks/index.min.js 2.11 kB
build/list-reusable-blocks/style-rtl.css 851 B
build/list-reusable-blocks/style.css 851 B
build/media-utils/index.min.js 2.92 kB
build/modules/importmap-polyfill.min.js 12.2 kB
build/notices/index.min.js 948 B
build/nux/index.min.js 1.57 kB
build/nux/style-rtl.css 748 B
build/nux/style.css 744 B
build/patterns/index.min.js 6.44 kB
build/patterns/style-rtl.css 595 B
build/patterns/style.css 595 B
build/plugins/index.min.js 1.8 kB
build/preferences-persistence/index.min.js 2.06 kB
build/preferences/index.min.js 2.85 kB
build/preferences/style-rtl.css 710 B
build/preferences/style.css 712 B
build/primitives/index.min.js 975 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 1 kB
build/react-i18n/index.min.js 623 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 6.78 kB
build/redux-routine/index.min.js 2.7 kB
build/reusable-blocks/index.min.js 2.7 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10 kB
build/router/index.min.js 1.88 kB
build/server-side-render/index.min.js 1.96 kB
build/shortcode/index.min.js 1.39 kB
build/token-list/index.min.js 582 B
build/url/index.min.js 3.74 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.7 kB
build/vendors/react.min.js 4.03 kB
build/viewport/index.min.js 957 B
build/warning/index.min.js 249 B
build/widgets/index.min.js 7.23 kB
build/widgets/style-rtl.css 1.17 kB
build/widgets/style.css 1.17 kB
build/wordcount/index.min.js 1.02 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.

Thanks for digging in! Hope you don't mind, but looking over the code change sparked a couple of thoughts, so I thought I'd jot them down here in case it's helpful 🧠 📔

Is there another way to get the theme directory to the editor?

Great question. Also, to further complicate matters, in PHP the get_theme_file_uri() function will resolve files from a child theme (i.e. checks if the file exists in the child theme, and if not, moves up to the parent theme to see if the file exists, and then it also supports the theme_file_uri filter). This presents some challenges for the editor as we can't call get_theme_file_uri() with each individual file that might be in a template or theme.json.

A couple of off-the-top-of-my-head thoughts:

  • If we don't support resolving between child and parent themes, then if someone goes to create a child theme from a theme that includes background images in theme.json or patterns, then the background images will likely be broken in the child theme.
  • One potential workaround could be to also output get_template_directory_uri() in the theme API endpoint?
  • Or, a more complex but potentially explicit approach could be: what if it were possible to register or declare theme assets that are available within a theme? I.e. either in theme.json and/or via a PHP function? Then we could have an endpoint that returns the URLs for each of the registered assets.

That last point could be a "good" way to handle it explicitly, but even as I write that, I can't imagine it being at all simple to come up with a reliable way to do it that everyone would agree to. So, another potential idea:

What if instead of extending the theme API endpoint, we injected the theme URI (and potentially the template / parent theme URI) into block editor settings via the 'block_editor_settings_all' hook? That way we'd be hacking the URIs into block settings without touching any API endpoints?

@ramonjd
Copy link
Member Author

ramonjd commented Apr 9, 2024

Thanks for looking at this one @andrewserong! 🙇🏻

Also, to further complicate matters, in PHP the get_theme_file_uri() function will resolve files from a child theme (i.e. checks if the file exists in the child theme, and if not, moves up to the parent theme to see if the file exists, and then it also supports the theme_file_uri filter)

Yeah - I used get_stylesheet_directory_uri in the endpoint to test out some things as well. That or get_template_directory_uri() should work.

What if instead of extending the theme API endpoint, we injected the theme URI (and potentially the template / parent theme URI) into block editor settings via the 'block_editor_settings_all' hook? That way we'd be hacking the URIs into block settings without touching any API endpoints?

Definitely more pragmatic, given we're touching settings anyway. I like!

Or, a more complex but potentially explicit approach could be: what if it were possible to register or declare theme assets that are available within a theme?

This would be more bullet proof, but I agree that it might be a larger feature that would require wider buy in. Also it introduces another registration layer for folks to think about.

An MVP could be get_stylesheet_directory_uri() || get_template_directory_uri() + $path_to_image for now. What do you reckon?

@andrewserong
Copy link
Contributor

An MVP could be get_stylesheet_directory_uri() || get_template_directory_uri() + $path_to_image for now. What do you reckon?

Sounds worth trying to me! Then, once things are working well enough in both the editor and server-side, we could ping Gutenberg core folks for more visibility to confidence check the approach?

@@ -76,6 +76,13 @@ function gutenberg_get_block_editor_settings( $settings ) {
}
}

// Could house also `__unstableIsBlockBasedTheme` as 'isBlockTheme' => $current_theme->is_block_theme().
$current_theme = wp_get_theme();
Copy link
Member Author

Choose a reason for hiding this comment

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

Using wp_get_theme to get full WP_Theme object in case folks want to use other helpful methods.

@ramonjd ramonjd force-pushed the add/background-image-theme-source branch from d19c285 to a66c5e7 Compare April 11, 2024 05:10
@ramonjd ramonjd force-pushed the add/background-image-theme-source branch from a66c5e7 to f7bf075 Compare April 11, 2024 05:22
* Only applies to background styles for now.
*/
if ( !! blockStyles?.background ) {
blockStyles = setBackgroundStyleDefaults( blockStyles, {
Copy link
Member Author

@ramonjd ramonjd Apr 11, 2024

Choose a reason for hiding this comment

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

Will also cater for #60405 and #60100

@ramonjd ramonjd force-pushed the add/background-image-theme-source branch from de024f1 to 16e830b Compare April 15, 2024 01:36
_backgroundImage?.source === 'file' &&
_backgroundImage?.url
) {
if ( typeof _backgroundImage === 'object' && _backgroundImage?.url ) {
Copy link
Member Author

Choose a reason for hiding this comment

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

Removing _backgroundImage?.source === 'file' check as we only care if background image is an object. There's no special processing for file or theme in the style engine.

* Only applies to background styles for now.
*/
if ( !! style.background ) {
style = setBackgroundStyleDefaults( style, editorSettings );
Copy link
Member Author

Choose a reason for hiding this comment

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

The rationale is that some style values need to have sensible defaults that are output as CSS, but not necessarily part of the styles attribute.

setBackgroundStyleDefaults could one day be setStylesDefaults or something.

This could theoretically be done in the style engine if we wanted to make the style engine opinionated.

@ramonjd ramonjd changed the title Try: Add/background image theme source Background image: add support for absolute theme path URLs Apr 15, 2024
@ramonjd ramonjd marked this pull request as ready for review April 15, 2024 02:12
@ramonjd ramonjd self-assigned this Apr 15, 2024
Copy link

github-actions bot commented Apr 15, 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: andrewserong <andrewserong@git.wordpress.org>
Co-authored-by: noisysocks <noisysocks@git.wordpress.org>
Co-authored-by: Mamaduka <mamaduka@git.wordpress.org>
Co-authored-by: draganescu <andraganescu@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 added the [Type] Enhancement A suggestion for improvement. label Apr 15, 2024
@ramonjd ramonjd added [Feature] Themes Questions or issues with incorporating or styling blocks in a theme. Global Styles Anything related to the broader Global Styles efforts, including Styles Engine and theme.json CSS Styling Related to editor and front end styles, CSS-specific issues. and removed Global Styles Anything related to the broader Global Styles efforts, including Styles Engine and theme.json labels Apr 15, 2024
@@ -1230,6 +1246,7 @@ export function useGlobalStylesOutputWithConfig( mergedConfig = {} ) {
disableLayoutStyles,
isTemplate
);
console.log( 'globalStyles', globalStyles );
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 a marker to remind me that getThemeFileURI isn't implemented for global styles yet either.

Maybe it needs to be done by injecting a CSS rule into the DOM post-render, something like layout does.

I don't know. This is getting out of hand. 😄

style: {
// @TODO this should be backgroundImage. How to do that?
// Also, maybe consider reinstating https://github.com/WordPress/gutenberg/blob/fc98542a7dbba194bb4096d49cd0bd093b63f43e/packages/block-editor/src/hooks/background.js#L82
background: `url( '${ encodeURI(
Copy link
Member Author

Choose a reason for hiding this comment

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

Quick question for @noisysocks or @ellatrix

How can I update the value of a style property via useBlockProps or another hook?

I want to overwrite backgroundImage, but I'm guessing the useBlockProps won't overwrite already-set props, only add new ones.... 🤔

Thank you! 🙇🏻

Copy link
Member Author

Choose a reason for hiding this comment

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

Oh never mind 😆

I finally worked it out it's the filter order:

createBlockListBlockFilter( [

@@ -896,3 +896,34 @@ export const getRevision =
dispatch.receiveRevisions( kind, name, recordKey, record, query );
}
};

export const getThemeFileURI =
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 all highly speculative and experimental. Don't worry folks! 😅

@andrewserong is this closer to what you were thinking?

It kinda works, but it's proving difficult to use for block props, and no idea yet how to implement for global styles.

Considering generating some temp CSS rules and injecting into the DOM 🙃

See comment: https://github.com/WordPress/gutenberg/pull/60578/files#r1584350221

Copy link
Contributor

Choose a reason for hiding this comment

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

That was the general idea I had in mind, yes, thanks for exploring it! It's a challenging one, though, as it is a bit of a messy way to handle things, but I do like the idea of us having a JS equivalent to the PHP logic, and I like how you've gone for a generic approach that could be used for things other than just the background image support 👍

@draganescu
Copy link
Contributor

the original idea was for three intended states (full urls, theme relative urls, and featured images)

I think featured images should be bound to background-url via block bindings, not a concern of the style engine? In the UI of the editor we'll have to have a distinct way to indicate this binding, unlike static files (relative or absolute) which use the normal styling UI.

if we remove theme as an explicit prop, we could lose the ability to do other things in the future, such as if the relative path should actually refer to an uploads directory?

When would that be the case? I mean if the background is from uploads we should maybe use the full URL?

@ramonjd
Copy link
Member Author

ramonjd commented Apr 30, 2024

Thanks for continuing the discussion!

I think featured images should be bound to background-url via block bindings, not a concern of the style engine?

To clarify, the style engine won't be doing any of the block-editor-specifics of resolving background image paths, despite the chaotic nature of this PR's commits (all experimental).

Totally agree that it should occur at the block level. Looking at that now for this PR.

I mean if the background is from uploads we should maybe use the full URL?

It's pretty edge case, but it might be useful to have relative paths to uploads for testing across dev/prod environments where the installations are mirrored but the domain names are different?

I dunno. 😄

Though possible, I'd wager it'd be detrimental to portability for a theme to add absolute paths to uploaded files in template/pattern/theme.json files.

Back to what this PR is trying to do, if we assume relative paths are relative to the theme, I still think that makes sense for theme assets (template/pattern/theme.json files). It doesn't have to mean we can't introduce the "source" prop later.

@andrewserong
Copy link
Contributor

I think featured images should be bound to background-url via block bindings, not a concern of the style engine?

What would that look like in practice? I was imagining that for the background image support, it'd feel a bit more "first party" and be a canonical part of how the block support works, so it'd be exposed in a similar way as it is in the Cover block, but as part of the backgroundImage object instead of a separate attribute (which is what the Cover block appears to use). Here's the current UI for the cover block for quick reference:

image

When would that be the case? I mean if the background is from uploads we should maybe use the full URL?

My wording was likely off, but my point was more about the value of a source property for potential future uses rather than any one specific use case. At this stage, I'm thinking more about what choices we can make that unlock future uses rather than box us in too much.

Back to what this PR is trying to do, if we assume relative paths are relative to the theme, I still think that makes sense for theme assets (template/pattern/theme.json files). It doesn't have to mean we can't introduce the "source" prop later.

I think that's a pragmatic path forward. We still need backgroundImage to support an object, as the url prop indicates that we'll wrap the value in a url() for the background-image CSS property, but I agree that including default behaviour that can detect if it's a relative or absolute path and then prepend the theme directory is a good path forward for now. And as you mention, it doesn't preclude a more explicit way of handling it in the future.

ramonjd added 15 commits May 1, 2024 13:07
- get the theme directory URI, and
- ensure background styles are parsed for theme.json and pattern/template files
…heme` both parent and child dir

Update tests to check for image paths with leading slash

Revert rogue tab
…_file_uri (would be extracted into a new PR)

Haven't worked out global styles yet. CSS rules might need to be injected into the DOM???
Feature complete, but hacky
@ramonjd ramonjd force-pushed the add/background-image-theme-source branch from 30f4fed to 1aa8f6a Compare May 1, 2024 03:19
@ramonjd
Copy link
Member Author

ramonjd commented May 1, 2024

Thanks for sticking with me on this one, folks.

Status

This PR, though hacky, is feature complete:

  • relative paths to theme files are resolved in the block editor for top level theme.json styles, templates, patterns
  • same above for backend
  • background UI control preview icon image path is also resolved
  • in both block editor and frontend, Gutenberg will first attempt to resolve the image in the stylesheet directory, which could be a child theme directory if activated, and, where that's not found, it'll default to the template theme directory (the parent).

Exceptions

Path forward for WordPress 6.6 🤞🏻

  1. Remove requirement for background.backgroundImage.source = 'theme'
  2. Support background image relative paths for theme.json top-level background image paths only

Beyond WordPress 6.6

  1. Merge Global styles: block background UI controls  #60100
  2. Propose addition of new core data selector getThemeFileURI
  3. Support relative paths for theme.json block style image paths
  4. Support relative paths for theme template and pattern files (requires changes to background hook/block bindings, see useBlockProps in this PR)

@ramonjd
Copy link
Member Author

ramonjd commented May 1, 2024

Closing this PR as it'll be used as a reference for future PRs

See: #60578 (comment)

@ramonjd ramonjd closed this May 1, 2024
@ellatrix ellatrix deleted the add/background-image-theme-source branch May 1, 2024 13:55
@ramonjd ramonjd restored the add/background-image-theme-source branch May 6, 2024 10:29
@ramonjd
Copy link
Member Author

ramonjd commented May 6, 2024

Forced push and didn't realised this PR had been closed 🙃

So moving experiment to

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
CSS Styling Related to editor and front end styles, CSS-specific issues. [Feature] Themes Questions or issues with incorporating or styling blocks in a theme. [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants