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

WIP Experiment: combine gradient and background image into background-image #60739

Draft
wants to merge 3 commits into
base: trunk
Choose a base branch
from

Conversation

ramonjd
Copy link
Member

@ramonjd ramonjd commented Apr 15, 2024

Initial test of an experiment to combinecolor.gradient and background.backgroundImage into one CSS property background-image

I'm testing merging values from two leafs in the theme.json styles tree:

  1. color.gradient
  2. background.backgroundImage

The merge also needs to occur where one of those two values is defined by global styles.

It's all a bit messy, which makes me think that a neater approach might be to focus on the background block supports and add gradient support there.

TODO

  • Think about ordering: what if users what to have a transparent png overlaying a gradient background? Can be part of an alternative theme.json type, e.g., an array of values.
  • To merge the CSS in the editor on the clientside, the block needs to know if it has a global style value. Need a standard way to do this, in another PR. Possibly in useBlockProps?
  • The same point above applies for the background backend block supports.

What?

Why?

How?

Testing Instructions

Test theme.json
{
	"$schema": "../../schemas/json/theme.json",
	"version": 3,
	"settings": {
		"appearanceTools": true,
		"color": {
			"defaultGradients": true,
			"gradients": [
				{
					"slug": "fiery-cavern-of-doom",
					"gradient": "linear-gradient(180deg, rgba(100,201,231,0.26936712184873945) 0%, rgba(212,183,64,0.5746892507002801) 46%, rgba(255,0,0,0.6335127801120448) 100%)",
					"name": "Fiery cavern of doom"
				}
			]
		}
	},
	"styles": {
		"color": {
			"gradient": "var(--wp--preset--gradient--fiery-cavern-of-doom)",
			"text": "#ffffff"
		},
		"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"
		},
		"blocks": {
			"core/quote": {
				"color": {
					"gradient": "linear-gradient(180deg, rgba(158,231,100,0.26936712184873945) 0%, rgba(64,212,151,0.5746892507002801) 46%, rgba(0,168,255,0.6335127801120448) 100%)"
				},
				"background": {
					"backgroundImage": {
						"url": "https://images.pexels.com/photos/22484288/pexels-photo-22484288/free-photo-of-the-circular-stone-terraces-of-the-inca-ruins.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2"
					},
					"backgroundSize": "cover"
				},
				"dimensions": {
					"minHeight": "100px"
				}
			},
			"core/verse": {
				"color": {
					"gradient": "var(--wp--preset--gradient--fiery-cavern-of-doom)"
				},
				"background": {
					"backgroundImage": {
						"url": "https://images.pexels.com/photos/27269578/pexels-photo-27269578/free-photo-of-marti.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2"
					},
					"backgroundSize": "60px"
				},
				"dimensions": {
					"minHeight": "100px"
				}
			}
		}
	}
}

Test block code.
<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph {"backgroundColor":"base"} -->
<p class="has-base-background-color has-background">This quote is being styled by styles.block['core/quote'] in theme.json only.</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:quote {"gradient":"fiery-cavern-of-doom"} -->
<blockquote class="wp-block-quote has-fiery-cavern-of-doom-gradient-background has-background"><!-- wp:paragraph {"backgroundColor":"base"} -->
<p class="has-base-background-color has-background">This quote has a gradient preset applied to it in the editor.</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:quote {"style":{"background":{"backgroundImage":{"url":"http://localhost:8888/wp-content/uploads/2024/07/budgie4-1.jpg","id":17,"source":"file","title":"budgie4"},"backgroundPosition":"50% 0"},"color":{"gradient":"linear-gradient(180deg,rgba(240,235,183,0.27) 0%,rgba(249,149,234,0.57) 44%,rgba(255,26,206,0.63) 100%)"}}} -->
<blockquote class="wp-block-quote has-background" style="background:linear-gradient(180deg,rgba(240,235,183,0.27) 0%,rgba(249,149,234,0.57) 44%,rgba(255,26,206,0.63) 100%)"><!-- wp:paragraph {"backgroundColor":"base"} -->
<p class="has-base-background-color has-background">This quote has an image and custom gradient applied to it in the editor.</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:quote {"style":{"background":{"backgroundImage":{"url":"http://localhost:8888/wp-content/uploads/2024/07/budgie4-1.jpg","id":17,"source":"file","title":"budgie4"},"backgroundPosition":"50% 0"},"color":{"gradient":"var:preset|gradient|fiery-cavern-of-doom"}},"gradient":"fiery-cavern-of-doom"} -->
<blockquote class="wp-block-quote has-background"><!-- wp:paragraph {"backgroundColor":"base"} -->
<p class="has-base-background-color has-background">This quote has an image and preset gradient applied to it in the editor.</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:verse -->
<pre class="wp-block-verse">This verse is being styled by styles.block[‘core/verse’] in theme.json only.<br><br></pre>
<!-- /wp:verse -->

Testing Instructions for Keyboard

Screenshots or screencast

Copy link

github-actions bot commented Apr 15, 2024

Size Change: +302 B (+0.02%)

Total Size: 1.76 MB

Filename Size Change
build/block-editor/index.min.js 254 kB +251 B (+0.1%)
build/style-engine/index.min.js 2.08 kB +51 B (+2.51%)
ℹ️ 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.59 kB
build/block-editor/content.css 4.59 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.2 kB
build/block-editor/style.css 16.2 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-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 958 B
build/block-library/blocks/gallery/editor.css 962 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 402 B
build/block-library/blocks/group/editor.css 402 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 862 B
build/block-library/blocks/image/editor.css 861 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 204 B
build/block-library/blocks/latest-posts/editor.css 204 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/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.2 kB
build/block-library/blocks/navigation/editor.css 2.21 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-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 141 B
build/block-library/blocks/post-excerpt/style.css 141 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 221 B
build/block-library/blocks/quote/theme.css 225 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 193 B
build/block-library/blocks/search/editor.css 193 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-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 71 B
build/block-library/blocks/site-title/style.css 71 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/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 63 B
build/block-library/blocks/tag-cloud/editor.css 63 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 553 B
build/block-library/blocks/video/editor.css 554 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 216 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.6 kB
build/block-library/theme-rtl.css 702 B
build/block-library/theme.css 707 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.3 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 221 kB
build/components/style-rtl.css 12 kB
build/components/style.css 12 kB
build/compose/index.min.js 12.9 kB
build/core-commands/index.min.js 2.81 kB
build/core-data/index.min.js 72.8 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/index.min.js 213 kB
build/edit-site/posts-rtl.css 6.78 kB
build/edit-site/posts.css 6.79 kB
build/edit-site/style-rtl.css 12 kB
build/edit-site/style.css 12 kB
build/edit-widgets/index.min.js 17.6 kB
build/edit-widgets/style-rtl.css 4.2 kB
build/edit-widgets/style.css 4.2 kB
build/editor/index.min.js 99.4 kB
build/editor/style-rtl.css 9.32 kB
build/editor/style.css 9.32 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 506 B
build/format-library/style.css 505 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.5 kB
build/interactivity/file.min.js 447 B
build/interactivity/image.min.js 1.78 kB
build/interactivity/index.min.js 13.4 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.36 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.54 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

'background-color' => array( 'color', 'background' ),
'background-image' => array( 'background', 'backgroundImage' ),
'background-image' => array(
array( 'color', 'gradient' ),
Copy link
Member Author

@ramonjd ramonjd Apr 15, 2024

Choose a reason for hiding this comment

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

Order matters here, determining the order of values within the property, e.g.,

    background-image: linear-gradient(180deg, rgba(217, 97, 61, 0.69) 0%, rgba(250, 250, 250, 0.24) 100%), url(http://localhost:8888/wp-content/uploads/2024/04/Westwood-Pizza-newtown-1.jpg);

The background image doesn't yet officially support opacity but the gradient does, so I think it's fine to keep this order for now.

Let's assume the background image does support opacity for a minute: the order would have to be specified somehow, perhaps by an index or foreground/background property in backgroundImage?

Thinking further ahead, background-image also supports multiple images. The order in which they appear in theme.json or via some sorting UI control should suffice here.

@ramonjd ramonjd self-assigned this Apr 15, 2024
@ramonjd ramonjd added [Type] Experimental Experimental feature or API. [Status] In Progress Tracking issues with work in progress labels Apr 15, 2024
@@ -124,7 +124,9 @@ protected static function filter_declaration( $property, $value, $spacer = '' )
$filtered_value = wp_strip_all_tags( $value, true );

if ( '' !== $filtered_value ) {
return safecss_filter_attr( "{$property}:{$spacer}{$filtered_value}" );
// @TODO safecss_filter_attr can't handle background-image with multiple values.
Copy link
Member Author

Choose a reason for hiding this comment

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

Need a core patch to test that the following background-image CSS is allowed by safecss_filter_attr:

  • Linear gradient + image: background-image: linear-gradient(rgba(0, 0, 255, 0.5), rgba(255, 255, 0, 0.5)), url("https://domain/some/image.png");
  • The reverse: background-image: url("https://domain/some/image.png"), linear-gradient(rgba(0, 0, 255, 0.5), rgba(255, 255, 0, 0.5));
  • Multiple images: background-image: url("some/image.png"), url("https://domain/some/other/image.png");
  • Any other valid values, e.g.,
background-image: linear-gradient(
    to bottom,
    rgb(255 255 0 / 50%),
    rgb(0 0 255 / 50%)
  ), url("catfront.png");

Source: MDN

Copy link
Member Author

Choose a reason for hiding this comment

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

@@ -85,7 +103,9 @@ function gutenberg_render_background_support( $block_content, $block ) {

$updated_style .= $styles['css'];
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 not ideal, and I'm not convinced we should be skipping serialization for for background images as we're doing here:

[ `${ BACKGROUND_SUPPORT_KEY }` ]: [ BACKGROUND_SUPPORT_KEY ], // Skip serialization of background support in save mode.

Color gradients output values using the background shorthand CSS property. Since serialization is not skipped in this case it will exist in the CSS output along with any background-image styles, since the updated CSS is concatenated.

For the record, here's are some stated reasons why they're being skipped:

#53934 (comment)

#53934 (comment)

#53934 (comment) (argument against)

Copy link
Member Author

Choose a reason for hiding this comment

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

As it is, where there is an image:

  • where a background: ....; inline CSS rule exists, it needs to be parsed out of the string to make way for the combined background-image value.
  • where a preset classname exists, e.g., has-very-light-gray-to-cyan-bluish-gray-gradient-background, it needs to be removed in favour of an inline CSS rule that uses the CSS var, e.g., background-image: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray), url(http://localhost:8888/wp-content/uploads/2024/04/white-bellied-swallow.jpg);

@ramonjd
Copy link
Member Author

ramonjd commented Apr 23, 2024

There are some seriously undesirable gymnastics involved in getting background (color.gradient) to merge with the CSS background-image property.

Presets have !important so a gradient's class will override all background-* CSS rules. Not great, hey 😅

Variables include, a block has a:

  • preset gradient only, then don't do anything
  • preset gradient + image, then merge into background-image and remove background CSS declaration and any preset classnames
  • image only, then don't do anything
  • custom gradient + image, then merge into background-image and remove background CSS declaration

The UX is not great either because it seems random when a background image can be used with a gradient. Hint: it's only visibly beneficial where there are alpha values in a gradient to allow the image to be seen underneath.

I'm starting to think a change in the UI might be worth an experiment, whereby we merge the gradient and background image controls and control the styles from one location.

Not sure. It's a bit of a mess.

@ramonjd
Copy link
Member Author

ramonjd commented Apr 24, 2024

I'm starting to think a change in the UI might be worth an experiment, whereby we merge the gradient and background image controls and control the styles from one location.

Fooling around with this today, here's my current thinking about an iterative way to extricate Gutenberg from the background gradient conundrum:

The problem

Gutenberg currently uses the background shorthand CSS property for gradient backgrounds (color.gradient).

The shorthand CSS property overrides sub properties as detailed in this issue: #60401

Gradient backgrounds should use the background-image CSS property.

Unfortunately, that's now being used by background.backgroundImage.

So, Gutenberg needs a way to:

  1. Migrate gradients from background to background-image.
  2. Deprecate color.gradient over time.
  3. Merge background gradients and images under background-image.
  4. Ensure gradient presets continue to work in an intuitive fashion when used alone, but their classnames are ignored when combined with background images.
  5. ??

How to tackle the problem

Background images are out of the bag, but site-wide background images and theme.json are not yet in WordPress.

  1. One option is to delay this until we migrate/deprecate color.gradient and it's stable.
  2. Another is to integrate a gradient control into the background image control UI, and do the rest iteratively. That way we can make calls about a UI that incorporates gradients and background images, as we ultimately merge values into one background-image CSS property.

The following headings and text relate to the second option.

Why integrate gradient and background image?

They should both apply to the same property — background-image.

What about the current background gradient UI control and the value of color.gradient?

In the first iteration, they stay.

That means it'll be possible to add a background gradient via the color and the background UI controls, the important difference being that the color UI control applies the linear gradient to the background CSS property, whereas the background UI control applies background images and linear gradients to the background-image CSS property.

As part of the first iteration, the background style object will receive a new property: background.gradient.

In the next iteration, I think the following should occur:

  • the current gradient UI controls should be removed in the editor and the color.gradient property deprecated.
  • Gutenberg maintains color.gradient support for backwards compatibility, e.g., it continues to render linear gradient values using the CSS background property.
    1. Blocks: for content with existing color.gradient values, Gutenberg should migrate them over to background-image if and when a background image/gradient is added in the editor using the background controls.
    2. Theme.json styles: existing color.gradient values function as they are unless a background image is also specified either in theme json or in the site editor (user styles). In this case the two values will be merged into background-image Example

The problem of theme.json gradient presets

Gradient presets generate classnames and CSS rules whose declarations (background: linear-gradient(...)) are marked as !important.

Blocks with gradient backgrounds have these classnames, which means the background property overrides any subsequent background-* declarations.

Where a block has a background image AND a gradient preset, these classnames should be removed from the block attributes, and the value of the preset merged into background-image. Example attempt.

All this should also work for styles defined in theme.json. E.g.,

{
	"$schema": "https://schemas.wp.org/trunk/theme.json",
	"version": 2,
	"styles": {
		"blocks": {
      		"core/quote": {
					"background": {"
							"backgroundImage":  {
			     				"url": "file:./img/untitled.jpg"
		   					 }
					},
					"color": {"
							"gradient":  "..."
					},
			}
         }
	}
}

From below:

One option could be that background.backgroundImage supports another key -background.backgroundImage.gradient.

This might be a way forward. We introduce a new key and deprecate the old one (color.gradient).

If the new key has a value, color.gradient is unset.

If color.gradient is set it's migrated to the new key.

I'm probably missing a lot. 😄

@andrewserong
Copy link
Contributor

Nicely laid out @ramonjd! One of the things I really like about the description of the problem is that the proposal plans forward for how to integrate the two when a user does something (adding a gradient or background image). Since gradients are widely used right now, planning this in a way that preserves backwards compat by not trying to migrate any older markup, but just support things as-is, I think is a good path forward.

Just to add one more thought, if we were to pursue support for layers in the background (i.e. multiple images or multiple gradients) how might that affect the shape of the style.background object?

@ramonjd
Copy link
Member Author

ramonjd commented Apr 29, 2024

Just to add one more thought, if we were to pursue support for layers in the background (i.e. multiple images or multiple gradients) how might that affect the shape of the style.background object?

Excellent question 😄

There's nothing (aside from the safe css filter at the moment) preventing users from using the string value of background.backgroundImage to do this manually.

But parsing and integrating these values with the editor would be tricky so I agree it'd be good to plan it out.

One option could be that background.backgroundImage supports another key -background.backgroundImage.gradient.

The two could be exclusive, so either:

		"background": {
			"backgroundImage": {
				"source": "theme",
				"url": "img/untitled.jpg",
			},
		}

Or

		"background": {
			"backgroundImage": {
                                  "gradient": "linear-gradient(...)",
			},
		}

Then the "backgroundImage" key could support arrays:

{
	"$schema": "https://schemas.wp.org/trunk/theme.json",
	"version": 2,
	"styles": {
		"background": {
			"backgroundImage": [
                                 {
				     "source": "theme",
				     "url": "img/untitled.jpg"
			         },
                                  {
                                      "gradient": "linear-gradient(...)"
                                  }
                          ],
			"backgroundPosition": "center center",
			"backgroundRepeat": "no-repeat",
			"backgroundSize": "cover"
		}
	}
}

This would result in:

:where(body) {
    background-image: url(http://....untitled.jpg), linear-gradient(...); 
    background-position: ...
    ....
}

"gradient/url" exclusivity doesn't have to be mandatory, but it could avoid overloading/order problems.

This is just one idea I came up with in 10 mins - I'm sure there are better ones!

@andrewserong
Copy link
Contributor

andrewserong commented Apr 29, 2024

Then the "backgroundImage" key could support arrays:

Oh, interesting idea! I wonder if we'd want to move the array one level up? It looks like background-position also supports multiple backgrounds, so if folks were deliberately wanting to layer and position multiple images, we might need to support other properties, too?

@ramonjd
Copy link
Member Author

ramonjd commented Apr 29, 2024

Oh, interesting idea! I wonder if we'd want to move the array one level up? It looks like background-position also supports multiple backgrounds, so if folks were deliberately wanting to layer and position multiple images, we might need to support other properties, too?

Oh yeah, good call. 🎉

Unless I'm missing something, the advantage of supporting two types is that it's possible to implement it later even if the current object structure makes it to core.

@andrewserong
Copy link
Contributor

Unless I'm missing something, the advantage of supporting two types is that it's possible to implement it later even if the current object structure makes it to core.

Yes, that's my understanding, too 👍

Copy link

github-actions bot commented Jun 19, 2024

Flaky tests detected in d4fc571.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/9867709576
📝 Reported issues:

@ramonjd ramonjd force-pushed the try/styles-combine-background-image-values branch from ad7beb0 to e9b71ef Compare July 4, 2024 05:21
@@ -42,6 +42,139 @@ const migrateAttributes = ( attributes ) => {
};

const deprecated = [
// Version with preset gradient color and background image.
Copy link
Member Author

Choose a reason for hiding this comment

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

A note on this.

Merging color gradient and background image is technically a migration, not a deprecation. Custom blocks might need this as well.

Furthermore, if migrating color.gradient from background to background-image, which, in my opinion, should happen some day, we won't want to deprecate n blocks.

Filters or https://github.com/WordPress/gutenberg/blob/trunk/packages/blocks/src/api/parser/convert-legacy-block.js might required?

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 main issue is the !important on preset styles.

So, if an existing block has a preset gradient set, and a background image, we'd like to merge the two values into something like background-image: var(--wp--preset--gradient-slug), url(...) but the classname has-slug-gradient-background overwrites all this with background: var(--wp--preset--gradient-slug) !important.

So this deprecation strips the classname and classname attribute.

But then, when resetting the background image, the classname attribute need to be set back.

It makes me think we're going about this the wrong way. Maybe a new property in theme.json or something. I don't know.

Copy link
Member Author

Choose a reason for hiding this comment

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

It makes me think we're going about this the wrong way

It's this.

My thinking is fuzzy.

There is no deprecation. Blocks before the background-image migration will continue to work as they did before.

Only newly-added blocks will receive the new feature.

That means blocks that have already added a background image and a preset gradient will continue to work as they did before until they're edited, whereupon they'll be merged into one CSS property.

Deprecations are not required, so I'll remove this change.

@ramonjd ramonjd force-pushed the try/styles-combine-background-image-values branch from e9b71ef to 58cf7f1 Compare July 9, 2024 06:27
…und.backgroundImage` into one CSS property `background-image`

Merge for block supports

Moving logic to style engine

Background for gradients will exist if there's no background image

Ensuring gradient classnames aren't shown

Need to strip classnames

Add test deprecation for Group block. Need to do Quote, Pullquote, Post content and Verse
PHP linting
@ramonjd ramonjd force-pushed the try/styles-combine-background-image-values branch from d4fc571 to 6bfef3c Compare July 26, 2024 02:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Status] In Progress Tracking issues with work in progress [Type] Experimental Experimental feature or API.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants