Directory

WIP Experiment: combine gradient and background image into `background-image` by ramonjd · Pull Request #60739 · WordPress/gutenberg · GitHub
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 10 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

What?

Why?

How?

Testing Instructions

Testing Instructions for Keyboard

Screenshots or screencast

…und.backgroundImage` into one CSS property `background-image`
Copy link

github-actions bot commented Apr 15, 2024

Size Change: -3.99 kB (0%)

Total Size: 1.75 MB

Filename Size Change
build/block-editor/content-rtl.css 4.53 kB +35 B (+1%)
build/block-editor/content.css 4.53 kB +34 B (+1%)
build/block-editor/index.min.js 256 kB +919 B (0%)
build/block-editor/style-rtl.css 15.6 kB +68 B (0%)
build/block-editor/style.css 15.6 kB +78 B (+1%)
build/block-library/blocks/cover/editor-rtl.css 671 B +24 B (+4%)
build/block-library/blocks/cover/editor.css 674 B +24 B (+4%)
build/block-library/blocks/gallery/editor-rtl.css 956 B +9 B (+1%)
build/block-library/blocks/gallery/editor.css 960 B +8 B (+1%)
build/block-library/blocks/group/style-rtl.css 103 B +46 B (+81%) 🆘
build/block-library/blocks/group/style.css 103 B +46 B (+81%) 🆘
build/block-library/blocks/post-featured-image/editor-rtl.css 729 B +63 B (+9%) 🔍
build/block-library/blocks/post-featured-image/editor.css 727 B +65 B (+10%) ⚠️
build/block-library/blocks/separator/style-rtl.css 239 B +10 B (+4%)
build/block-library/blocks/separator/style.css 239 B +10 B (+4%)
build/block-library/blocks/site-logo/editor-rtl.css 801 B +47 B (+6%) 🔍
build/block-library/blocks/site-logo/editor.css 801 B +47 B (+6%) 🔍
build/block-library/editor-rtl.css 12.4 kB +55 B (0%)
build/block-library/editor.css 12.4 kB +57 B (0%)
build/block-library/index.min.js 219 kB +590 B (0%)
build/block-library/style-rtl.css 14.8 kB +24 B (0%)
build/block-library/style.css 14.8 kB +25 B (0%)
build/blocks/index.min.js 51.6 kB +110 B (0%)
build/components/index.min.js 220 kB -2.02 kB (-1%)
build/components/style-rtl.css 12 kB +97 B (+1%)
build/components/style.css 12 kB +100 B (+1%)
build/customize-widgets/index.min.js 11 kB -232 B (-2%)
build/edit-post/classic-rtl.css 578 B -1 B (0%)
build/edit-post/classic.css 578 B -1 B (0%)
build/edit-post/index.min.js 17.9 kB -5.95 kB (-25%) 🎉
build/edit-post/style-rtl.css 4.24 kB -1.26 kB (-23%) 🎉
build/edit-post/style.css 4.23 kB -1.27 kB (-23%) 🎉
build/edit-site/index.min.js 224 kB -5.94 kB (-3%)
build/edit-site/style-rtl.css 13.9 kB -1.14 kB (-8%)
build/edit-site/style.css 13.9 kB -1.14 kB (-8%)
build/edit-widgets/index.min.js 17.6 kB -109 B (-1%)
build/edit-widgets/style-rtl.css 4.16 kB +6 B (0%)
build/edit-widgets/style.css 4.16 kB +3 B (0%)
build/editor/index.min.js 77.9 kB +7.94 kB (+11%) ⚠️
build/editor/style-rtl.css 6.95 kB +1.46 kB (+27%) 🚨
build/editor/style.css 6.95 kB +1.47 kB (+27%) 🚨
build/interactivity/router.min.js 2.79 kB +1.43 kB (+105%) 🆘
build/patterns/index.min.js 6.47 kB +89 B (+1%)
build/plugins/index.min.js 1.8 kB +2 B (0%)
build/preferences-persistence/index.min.js 2.06 kB +8 B (0%)
build/preferences/index.min.js 2.85 kB +26 B (+1%)
build/style-engine/index.min.js 2.07 kB +41 B (+2%)
ℹ️ 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/default-editor-styles-rtl.css 395 B
build/block-editor/default-editor-styles.css 395 B
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/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 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 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/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/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 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.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/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/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/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/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 472 B
build/block-library/reset.css 472 B
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/commands/index.min.js 15.2 kB
build/commands/style-rtl.css 953 B
build/commands/style.css 951 B
build/compose/index.min.js 12.6 kB
build/core-commands/index.min.js 2.77 kB
build/core-data/index.min.js 72.5 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/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/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/style-rtl.css 595 B
build/patterns/style.css 595 B
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.73 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.02 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

'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

@@ -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.

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 👍

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.

None yet

2 participants