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

Global styles: add background image to top-level theme.json styles #59354

Merged
merged 17 commits into from
Feb 29, 2024

Conversation

ramonjd
Copy link
Member

@ramonjd ramonjd commented Feb 26, 2024

Dev Note 📓

#59354 (comment)

What?

Part of:

Enabling background image block supports at the root level of global styles.

TODO

  • Check santization and parsing. Could we assume relative path to the theme and use get_theme_file_uri( $path )?
  • Unit tests
  • Ensure styles appear in site editor (New PR?)
  • Documentation
  • Add UI controls to global styles (top level) Global styles: background UI controls #59454

How?

Add style.background properties as valid top-level styles in theme.json.

Testing Instructions

Check this branch out and enable emptytheme for ease of testing.

Below are some test theme.jsons.

Ensure that the background-* CSS appears in the body selector and that everything looks fine.

{
	"$schema": "../../schemas/json/theme.json",
	"version": 2,
	"styles": {
		"color": {
			"background": "tomato"
		},
		"background": {
			"backgroundImage": {
				"url": "https://i0.wp.com/wordpress.org/files/2023/12/sotw-dotorg-drawer.png?w=1807&ssl=1",
				"source": "file"
			},
			"backgroundPosition": "center center",
			"backgroundRepeat": "repeat",
			"backgroundSize": "cover"
		}
	}
}
{
	"$schema": "../../schemas/json/theme.json",
	"version": 2,
	"styles": {
		"color": {
			"background": "tomato"
		},
		"background": {
			"backgroundImage": "url('https://i0.wp.com/wordpress.org/files/2023/12/sotw-dotorg-drawer.png?w=1807&ssl=1')",
			"backgroundPosition": "center center",
			"backgroundRepeat": "no-repeat",
			"backgroundSize": "cover"
		}
	}
}

Testing Instructions for Keyboard

Screenshots or screencast

@ramonjd ramonjd added [Type] Enhancement A suggestion for improvement. [Status] In Progress Tracking issues with work in progress Global Styles Anything related to the broader Global Styles efforts, including Styles Engine and theme.json labels Feb 26, 2024
@ramonjd ramonjd self-assigned this Feb 26, 2024
@ramonjd ramonjd force-pushed the add/background-theme-json-top-level branch from a230e0f to 841e782 Compare February 26, 2024 05:34
Copy link

github-actions bot commented Feb 26, 2024

This pull request has changed or added PHP files. Please confirm whether these changes need to be synced to WordPress Core, and therefore featured in the next release of WordPress.

If so, it is recommended to create a new Trac ticket and submit a pull request to the WordPress Core Github repository soon after this pull request is merged.

If you're unsure, you can always ask for help in the #core-editor channel in WordPress Slack.

Thank you! ❤️

View changed files
❔ lib/block-supports/background.php
❔ lib/class-wp-theme-json-gutenberg.php
❔ phpunit/block-supports/background-test.php
❔ phpunit/class-wp-theme-json-test.php

Copy link

github-actions bot commented Feb 26, 2024

Size Change: +35 B (0%)

Total Size: 1.71 MB

Filename Size Change
build/block-editor/index.min.js 251 kB +5 B (0%)
build/blocks/index.min.js 51.8 kB +15 B (0%)
build/style-engine/index.min.js 2.1 kB +15 B (+1%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 955 B
build/annotations/index.min.js 2.69 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.22 kB
build/block-directory/style-rtl.css 1.02 kB
build/block-directory/style.css 1.02 kB
build/block-editor/content-rtl.css 4.37 kB
build/block-editor/content.css 4.37 kB
build/block-editor/default-editor-styles-rtl.css 381 B
build/block-editor/default-editor-styles.css 381 B
build/block-editor/style-rtl.css 15.5 kB
build/block-editor/style.css 15.5 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 126 B
build/block-library/blocks/audio/theme.css 126 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 647 B
build/block-library/blocks/cover/editor.css 650 B
build/block-library/blocks/cover/style-rtl.css 1.69 kB
build/block-library/blocks/cover/style.css 1.68 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 98 B
build/block-library/blocks/details/style.css 98 B
build/block-library/blocks/embed/editor-rtl.css 322 B
build/block-library/blocks/embed/editor.css 322 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 126 B
build/block-library/blocks/embed/theme.css 126 B
build/block-library/blocks/file/editor-rtl.css 316 B
build/block-library/blocks/file/editor.css 316 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 947 B
build/block-library/blocks/gallery/editor.css 952 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 647 B
build/block-library/blocks/group/editor.css 647 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 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 894 B
build/block-library/blocks/image/editor.css 893 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 126 B
build/block-library/blocks/image/theme.css 126 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 266 B
build/block-library/blocks/media-text/editor.css 263 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 259 B
build/block-library/blocks/navigation-link/style.css 257 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.02 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 666 B
build/block-library/blocks/post-featured-image/editor.css 662 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 354 B
build/block-library/blocks/pullquote/theme-rtl.css 168 B
build/block-library/blocks/pullquote/theme.css 168 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 223 B
build/block-library/blocks/quote/theme.css 226 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 629 B
build/block-library/blocks/search/style.css 628 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 229 B
build/block-library/blocks/separator/style.css 229 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 754 B
build/block-library/blocks/site-logo/editor.css 754 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 682 B
build/block-library/blocks/social-links/editor.css 681 B
build/block-library/blocks/social-links/style-rtl.css 1.49 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 146 B
build/block-library/blocks/table/theme.css 146 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 403 B
build/block-library/blocks/template-part/editor.css 403 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/term-description/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 126 B
build/block-library/blocks/video/theme.css 126 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 12.4 kB
build/block-library/editor.css 12.3 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.8 kB
build/block-library/style.css 14.8 kB
build/block-library/theme-rtl.css 688 B
build/block-library/theme.css 693 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/commands/index.min.js 15.6 kB
build/commands/style-rtl.css 921 B
build/commands/style.css 918 B
build/components/index.min.js 223 kB
build/components/style-rtl.css 11.8 kB
build/components/style.css 11.8 kB
build/compose/index.min.js 12.6 kB
build/core-commands/index.min.js 2.77 kB
build/core-data/index.min.js 72.8 kB
build/customize-widgets/index.min.js 12.1 kB
build/customize-widgets/style-rtl.css 1.32 kB
build/customize-widgets/style.css 1.32 kB
build/data-controls/index.min.js 640 B
build/data/index.min.js 8.95 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 544 B
build/edit-post/classic.css 545 B
build/edit-post/index.min.js 23.7 kB
build/edit-post/style-rtl.css 5.64 kB
build/edit-post/style.css 5.63 kB
build/edit-site/index.min.js 216 kB
build/edit-site/style-rtl.css 15.4 kB
build/edit-site/style.css 15.4 kB
build/edit-widgets/index.min.js 17.3 kB
build/edit-widgets/style-rtl.css 4.22 kB
build/edit-widgets/style.css 4.22 kB
build/editor/index.min.js 64 kB
build/editor/style-rtl.css 5.32 kB
build/editor/style.css 5.32 kB
build/element/index.min.js 4.83 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 7.89 kB
build/format-library/style-rtl.css 478 B
build/format-library/style.css 477 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/file.min.js 447 B
build/interactivity/image.min.js 1.67 kB
build/interactivity/index.min.js 12.9 kB
build/interactivity/navigation.min.js 1.15 kB
build/interactivity/query.min.js 740 B
build/interactivity/router.min.js 1.36 kB
build/interactivity/search.min.js 618 B
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.74 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 836 B
build/list-reusable-blocks/style.css 836 B
build/media-utils/index.min.js 2.9 kB
build/modules/importmap-polyfill.min.js 12.2 kB
build/notices/index.min.js 948 B
build/nux/index.min.js 2 kB
build/nux/style-rtl.css 735 B
build/nux/style.css 732 B
build/patterns/index.min.js 5.78 kB
build/patterns/style-rtl.css 540 B
build/patterns/style.css 539 B
build/plugins/index.min.js 1.8 kB
build/preferences-persistence/index.min.js 2.05 kB
build/preferences/index.min.js 2.82 kB
build/preferences/style-rtl.css 698 B
build/preferences/style.css 700 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.72 kB
build/reusable-blocks/style-rtl.css 243 B
build/reusable-blocks/style.css 243 B
build/rich-text/index.min.js 10.4 kB
build/router/index.min.js 1.79 kB
build/server-side-render/index.min.js 1.95 kB
build/shortcode/index.min.js 1.39 kB
build/token-list/index.min.js 582 B
build/url/index.min.js 3.72 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 957 B
build/warning/index.min.js 249 B
build/widgets/index.min.js 7.21 kB
build/widgets/style-rtl.css 1.15 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.02 kB

compressed-size-action

backgroundImage: {
value: [ 'background', 'backgroundImage' ],
support: [ 'background', 'backgroundImage' ],
useEngine: false,
Copy link
Member Author

@ramonjd ramonjd Feb 26, 2024

Choose a reason for hiding this comment

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

Possibly temporary, possibly not.

Bypass style engine because it's expecting url and source properties.

if ( _backgroundImage?.source === 'file' && _backgroundImage?.url ) {

But I'm not yet convinced these need to be replicated in theme.json, which should support at first an image path string value for background.backgroundImage (?), and potentially ref paths in blocks, e.g., "backgroundImage": { "ref": "styles.background.backgroundImage" }

Options:

  1. Convert background.backgroundImage (string) to array() with url and source properties in the backend after processing theme.json
  2. Imply in all contexts that URL-like strings coming from styles.background.backgroundImage are equal to { source: 'file', url: styles.background.backgroundImage }
  3. ...

cc @andrewserong

Copy link
Contributor

Choose a reason for hiding this comment

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

I think we might want to support an object for background.backgroundImage in each context (block attributes and theme.json) in order to allow source to be set to things other than file (e.g. featuredImage, theme if we want to prepend the theme's directory to the URL, etc). But, for ease of use, it'd likely be good have it support a simple string, too.

How bad would it be to allow the property to be a string or an object?

Copy link
Member Author

@ramonjd ramonjd Feb 26, 2024

Choose a reason for hiding this comment

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

source to be set to things other than file (e.g. featuredImage, theme if we want to prepend the theme's directory to the URL, etc)

Thanks for the explainer @andrewserong I couldn't find any background on why source was there.

I suppose having source as a context marker would be handy to add extra functionality.

How bad would it be to allow the property to be a string or an object?

In that case, my opinion is that we could support both in theme.json.

Where "backgroundImage": "http://some_url/image.gif" is the equivalent of { source: 'file', url: 'http://some_url/image.gif' }

Thank you!

Copy link
Contributor

Choose a reason for hiding this comment

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

Where "backgroundImage": "http://some_url/image.gif" is the equivalent of { source: 'file', url: 'http://some_url/image.gif' }

Sounds great to me!

Copy link
Member Author

@ramonjd ramonjd Feb 28, 2024

Choose a reason for hiding this comment

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

Interesting... the style engine expects string values and does nothing with them

https://github.com/WordPress/gutenberg/blob/d3a74ac1feb9ed6d230118db2f45ce90ab725843/packages/style-engine/class-wp-style-engine.php#L611-L611

I just realized this is a good idea in case users want something like:

background-image: linear-gradient(
    to bottom,
    rgb(255 255 0 / 50%),
    rgb(0 0 255 / 50%)
  ), url("catfront.png");

Example taken from https://developer.mozilla.org/en-US/docs/Web/CSS/background-image

I've updated the branch to wave strings through like this.

@ramonjd ramonjd force-pushed the add/background-theme-json-top-level branch from 8dbde9c to 0514a4c Compare February 28, 2024 04:44

/*
* @TODO document
* $background_styles['backgroundImage']['url'] and file source implies an image URL path.
Copy link
Member Author

@ramonjd ramonjd Feb 28, 2024

Choose a reason for hiding this comment

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

This needs to be documented. The logic, I believe, is as follows:

  1. backgroundImage is a string: We accept whatever the value is. It could be url(...) or some combination thereof. The style engine will sanitize.
  2. backgroundImage is an object with url and source props: it will be processed by Gutenberg, in the case of "file" or "theme" wrapped in a url() function and escaped. CSS defaults like cover will kick in.

@ramonjd
Copy link
Member Author

ramonjd commented Feb 28, 2024

Note to self:

I was playing around with patterns and templates, where we specify relative paths + "source": "theme".

Here's an example pattern:

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

It could also be HTML.

It works fine on the frontend given that the block supports functions render the image.

In the editor it's a bit trickier: there's no equivalent of get_theme_file_uri(), and getCurrentTheme() doesn't return anything helpful. Not to mention that it's a core-data selector and can't be fetched from the block editor package (no core data imports).

Perhaps they can be parsed when the patterns are registered 🤷🏻

Anyway, I'm just jotting this down so we can be aware of it in follow up. I think this PR shouldn't support "theme" just yet, but its commits demonstrate that it's possible and the "source": "theme" seems like a useful approach.

@ramonjd ramonjd force-pushed the add/background-theme-json-top-level branch from d4bd5ec to 6bfcb74 Compare February 28, 2024 23:47
@ramonjd
Copy link
Member Author

ramonjd commented Mar 4, 2024

Similarly, if we use repeat, then the background image is repeated at a different height in the site frontend as to the site editor (I think because the site editor has styling rules that extends the height of the html element in the editor canvas?)

Confirmed.

A min-height: 100% was added in #51374 to ensure that gradient backgrounds don't repeat.

If we remove this rule then the frontend and editor background behaviour matches more closely.

@t-hamano What do you think about removing that min-height: 100% added in #51374?

Even with that rule in the editor, the behaviour is still apparent on the frontend

Screenshot 2024-03-04 at 3 45 06 pm

I guess the real question is: how closely do we want the site editor and frontend to match?

@andrewserong andrewserong changed the title Global styles: add background to top-level theme.json styles Global styles: add background image to top-level theme.json styles Mar 4, 2024
@andrewserong
Copy link
Contributor

Nice sleuthing!

What do you think about removing that min-height: 100% added in #51374?

I wonder if there's an opportunity for a feature of backgrounds (image or gradient) for folks to be able to set this in some way? (either on or off?) Or is that too "advanced settings" as an idea 🤔

@ramonjd
Copy link
Member Author

ramonjd commented Mar 4, 2024

I wonder if there's an opportunity for a feature of backgrounds (image or gradient) for folks to be able to set this in some way? (either on or off?) Or is that too "advanced settings" as an idea

Yeah, good idea. I suppose it might sit under Dimensions at the top level? Not sure if it's an intuitive control.

I guess an alternative might be to add the same style to the frontend when there's a gradient background or background image.

🤷🏻

@andrewserong
Copy link
Contributor

I suppose it might sit under Dimensions at the top level? Not sure if it's an intuitive control.

Yeah, I'd imagine it might be something that's sort of set implicitly, but that folks could then control if they really needed to (or adjust in theme.json) potentially? I'd imagine we wouldn't want folks to have to go looking for it in order for it to work correctly.

I guess an alternative might be to add the same style to the frontend when there's a gradient background or background image.

It is a tricky one — IMO if we're outputting styles on the site frontend, then there'll likely be someone who'd like to have control over it somewhere. If we need to output a min height, we could always allow dimensions.minHeight at the root level of theme.json. Then there could potentially be a few different ways to "activate" it. I.e. folks could set a value directly, or we could set it when someone adds a gradient or background image, but still allow control over it, or something like that? So adding a background might add a minHeight value at the same time 🤔. I'm just thinking out loud, though!

@ramonjd
Copy link
Member Author

ramonjd commented Mar 4, 2024

allow dimensions.minHeight at the root level of theme.json. Then there could potentially be a few different ways to "activate" it. I.e. folks could set a value directly, or we could set it when someone adds a gradient or background image, but still allow control over it, or something like that? So adding a background might add a minHeight value at the same time

Thanks! Agree, that is an approach definitely worth considering. It'd have to be set on :root I think to work as intended.

@ramonjd
Copy link
Member Author

ramonjd commented Mar 4, 2024

Just one more question 😄

I noticed there's an item on the Tracking issue:

Get the block support to work with gradient backgrounds in a logical way

Was the intention here to move gradient backgrounds over to "background"?

@andrewserong
Copy link
Contributor

andrewserong commented Mar 4, 2024

Was the intention here to move gradient backgrounds over to "background"?

That line wasn't so much about the UI as about the fact that at the moment, gradient backgrounds use the background shorthand property, so you can't set a background image and a gradient at the same time. With textured transparent backgrounds, it's nice being able to use a textured image and a background color, but we can't do the same with a gradient background.

Eventually, it'd be cool to allow layered backgrounds with images and gradients, and potentially multiple images, etc. That item was sort of a placeholder for any and all of the above ideas 🙂

Separately, though, it'd be cool to explore ideas with designers for how the controls could potentially be combined?

@t-hamano
Copy link
Contributor

t-hamano commented Mar 4, 2024

Sorry for the late reply!

What do you think about removing that min-height: 100% added in #51374?

If a gradient is applied to the background, I would expect the gradient not to repeat. That's why I submitted #51374.

we could always allow dimensions.minHeight at the root level of theme.json.

dimensions.minHeight at the root level already appears to work, although the JSON schema doesn't allow it 🤔 One approach would be to apply minHeight to the default theme.json, taking into account the admin bar. For example, is the following definition?

{
	"$schema": "https://schemas.wp.org/trunk/theme.json",
	"version": 2,
	"styles": {
		"color": {
			"background": "tomato"
		},
		"dimensions": {
			"minHeight": "calc(100vh - var(--wp-admin--admin-bar--height))"
		},
		"background": {
			"backgroundImage": "url('https://i0.wp.com/wordpress.org/files/2023/12/sotw-dotorg-drawer.png?w=1807&ssl=1')",
			"backgroundPosition": "center center",
			"backgroundRepeat": "no-repeat",
			"backgroundSize": "cover"
		}
	}
}

frontend-min-height

@ramonjd
Copy link
Member Author

ramonjd commented Mar 4, 2024

@t-hamano thanks for looking into it! I think it's worth an experiment 😄

@ramonjd
Copy link
Member Author

ramonjd commented Mar 5, 2024

Just jotting down some notes...

calc(100vh - var(--wp-admin--admin-bar--height))

In the frontend logged-in view (with admin bar), to avoid scrolling, it looks like we'd also have to account for any other dimensions on the root tags.

E.g.,

https://github.com/WordPress/wordpress-develop/blob/115b2970b802f4a158e74694d0372d055609e01e/src/wp-includes/admin-bar.php#L1306

It's a bit of voodoo to get it perfect, e.g,. tweaking reveals that min-height: calc(100vh - 54px); works.

Maybe it's not that important.

dimensions.minHeight at the root level already appears to work, although the JSON schema doesn't allow it

Seems like a useful property to allow in theme.json, getting background and dimensions.minHeight to interact nicely in styles generation would be the challenge. We would also have to cater for gradient backgrounds to match the intentions of #51374 😄

Regardless, to dynamically add minHeight to the root styles based on background properties, it might be possible to piggy back off WP_Theme_JSON_Gutenberg::get_root_layout_rules

I'll add this task to the tracking issue regardless. Thanks for the help, folks!

@ramonjd
Copy link
Member Author

ramonjd commented May 30, 2024

Dev Note

In WordPress 6.6 you can define site-wide background images in theme.json and the Site Editor.

A "site-wide" background image is one whose value is set on the body element using the background-image CSS property, and, therefore, appears on every page of a site.

An example might be a photo that stretches with the window size, or a repeating pattern background.

To customize how background images appear, WordPress 6.6 supports the following background style properties:

  • background position
  • background size
  • background repeat

Usage

In theme.json

In theme.json, site-wide background images and their properties are defined under "styles.background".

For example, as a single image URI in styles.background.backgroundImage.url:

{
	"styles": {
		"background": {
			"backgroundImage": {
				"url": "http://path.to/some/image.png"
			},
			"backgroundSize": "cover"
		}
	}
}

For the above, WordPress will automatically wrap the image in the CSS url() function.

styles.background.backgroundImage also accepts string values, which can be any valid CSS value for background-image :

{
	"styles": {
		"background": {
			"backgroundImage": "url(http://path.to/some/image.png)",
			"backgroundPosition": "center"
		}
	}
}

The above examples use absolute paths to image files. Such files would need to be hosted and maintained.

Most likely, theme developers will want to define background images using paths to a theme's own assets. This ensures that the theme is self-contained and portable.

Relative paths to theme assets are defined using the file:./ prefix:

{
	"styles": {
		"background": {
			"backgroundImage": {
				"url": "file:./assets/my-theme-background.jpg"
			},
			"backgroundSize": "cover"
		}
	}
}

Paths are resolved on the backend using get_theme_file_uri.

Paths defined this way must be relative to the theme root, regardless of where the theme.json sits in your theme's directory. This follows an existing pattern for web fonts.

Despite the dot in file:./, the special symbols dot (.) and double dot (..) for directory navigation are not supported in theme.json relative paths. This means, for example, that theme style variation files, which reside under the style/ directory, would use the same path as the theme's main theme.json.

An issue exists to make the syntax more consistent.

In the Site Editor

Background images can be also be uploaded, and their properties tweaked through the Site Editor's styles panel.

In WordPress 6.6, background image controls are located under Styles > Layout. The styles panel navigation is undergoing review however, so in upcoming versions the location may change.

As well as setting new background images, it's possible to "unset" a theme's default background image in the Site Editor.

Relative paths to any images in theme.json are resolved on the backend, and are sent in the _links array of Global Styles REST responses. The Editor uses the resolved values to generate theme CSS in the client.

Limitations

In WordPress 6.6, the ability to define background images in theme.json exists only for top-level styles. Top-level styles apply to the body element. An open PR aims to also enable the feature at the block level in the next WordPress release.

Work is also underway to:

  • add support for fixed images, using the background-attachment CSS property.
  • avoid conflicts between gradient backgrounds, whose values are currently set to the background property, and background-image. The proposal is that gradient backgrounds will also be set to background-image, and, where both an image and a gradient are defined, their values are merged .

Backwards compatibility

WordPress already has support for custom site-wide background images in the Customizer.
The theme.json variant will not affect themes that have enabled this feature.

Background images added in the Customizer take precedence over those set in theme.json or in the Site Editor.

An ongoing discussion seeks to harmonize the two features.

What's next

Progress on upcoming work is tracked on Background Image block support follow-up tasks

@ramonjd ramonjd added has dev note when dev note is done (for upcoming WordPress release) and removed Needs Dev Note Requires a developer note for a major WordPress release cycle labels May 30, 2024
@bph
Copy link
Contributor

bph commented Jun 13, 2024

Hi there @ramonjd The dev note looks good. Do you have bandwidth to post it in draft on the Make Blog for first and second review? cc @juanmaguitar

@ramonjd
Copy link
Member Author

ramonjd commented Jun 13, 2024

Do you have bandwidth to post it in draft on the Make Blog for first and second review?

Yes definitely. I'll post the review link on the 6.6 Dev note tracking issue soon. Thank you!

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 has dev note when dev note is done (for upcoming WordPress release) [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants