Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Background image support: add background position controls #58592

Conversation

andrewserong
Copy link
Contributor

@andrewserong andrewserong commented Feb 2, 2024

What?

Part of: #54336

Try adding background position controls to the background image block support used by the Group block.

Why?

So that folks can choose a focal point / background position within the set background image. This offers a lot more flexiblity to using Contain or Fixed sizes.

How?

Re-use the FocalPointPicker component and map coords to a real backgroundPosition CSS value.

To-do

For now, I mostly wanted to gather feedback to see if this feels viable for 6.5. Before a final review, I'll need to tidy up:

  • Tidy up coords mapping
  • Fix up reset behaviour
  • Add unit tests for style engine JS changes

Testing Instructions

  1. Add a Group block to a post
  2. Add a background image to it
  3. In the ellipsis menu, enable Background Size
  4. You should now also see the same Focal Point picker as used in the Cover block
  5. Try adjusting the Focal Point (note that realtime updates to the style output haven't been done yet — so the update happens when you release the mouse cursor)

Screenshots or screencast

2024-02-02.16.05.07.mp4

@andrewserong andrewserong added [Type] Enhancement A suggestion for improvement. [Block] Group Affects the Group Block [Feature] Design Tools Tools that impact the appearance of blocks both to expand the number of tools and improve the experi labels Feb 2, 2024
@andrewserong andrewserong self-assigned this Feb 2, 2024
@@ -367,6 +368,64 @@ function backgroundSizeHelpText( value ) {
return __( 'Set a fixed width.' );
}

const coordsToBackgroundPosition = ( value ) => {
Copy link
Contributor Author

Choose a reason for hiding this comment

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

This is just a quick pass at the mapping — if this PR looks okay, I'll fine-tune the logic a bit here and add some tests.

Copy link
Member

Choose a reason for hiding this comment

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

This particular bit LGTM, but just curious: why do we need to do this mapping? Aren't the percentage values enough?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Good question: we need to have at least some form of mapping so that we're not storing values like { x: 0.5, y: 0.5 } in the block attributes for style.background.backgroundPosition. For future proofing the feature, I think it's better if that value can be stored in the block delimiter as a real CSS value, rather than a value that's intended for the internal workings of the focal point picker. So at the very least, I think it's better if we can have the support map { x: 0.5, y: 0.5 } to 50% 50%.

In terms of mapping the natural language values like left, center, etc, that's mostly me thinking of what would be good to support for if/when we get to theme.json support where folks might be writing the JSON a bit by hand. It'd be nice to be able to support mapping potentially handwritten values so that they work naturally with this control.

For now, though, we only really need the generic decimal 0.5 > 50% mapping for this to work, so I'm happy to pare it back for this PR.

Copy link
Member

Choose a reason for hiding this comment

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

In terms of mapping the natural language values like left, center, etc, that's mostly me thinking of what would be good to support for if/when we get to theme.json support where folks might be writing the JSON a bit by hand.

Very good idea!

Copy link
Contributor Author

Choose a reason for hiding this comment

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

For now I've just gone with converting between percentage and coordinate values. There's a bit more nuanced to the multi-value syntax for background position, so I think that'd be better to handle separately in a follow-up code quality PR. For now I've gone with the main use case logic which is background position values that were created using this particular UI control.

Copy link

github-actions bot commented Feb 2, 2024

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

Core SVN

If you're a Core Committer, use this list when committing to wordpress-develop in SVN:

Props: andrewserong, ramonopoly, noisysocks, joen, jameskoster.

GitHub Merge commits

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

Co-authored-by: andrewserong <andrewserong@git.wordpress.org>
Co-authored-by: ramonjd <ramonopoly@git.wordpress.org>
Co-authored-by: noisysocks <noisysocks@git.wordpress.org>
Co-authored-by: jasmussen <joen@git.wordpress.org>
Co-authored-by: jameskoster <jameskoster@git.wordpress.org>

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

@andrewserong
Copy link
Contributor Author

@WordPress/gutenberg-design just a ping to see if the idea in this PR could be viable for 6.5 — I know we're short on time before Beta 1, so I was wondering if it's worth adding the Focal Picker to the background image size controls (just the same as we use in the Cover block) for now, before attempting a redesign of the panel into a popover as raised by @jameskoster back in #57005 (comment)

In short: my main question is whether we can (or should) try to get this control in for 6.5 in a simple way, or if it's better to hold off for a more holistic redesign. Happy for any feedback either way!

Copy link

github-actions bot commented Feb 2, 2024

Size Change: -9.39 kB (-1%)

Total Size: 1.69 MB

Filename Size Change
build/block-editor/index.min.js 251 kB +275 B (0%)
build/block-editor/style-rtl.css 15.5 kB -3 B (0%)
build/block-editor/style.css 15.5 kB -3 B (0%)
build/block-library/blocks/query/style-rtl.css 0 B -312 B (removed) 🏆
build/block-library/blocks/query/style.css 0 B -308 B (removed) 🏆
build/block-library/blocks/query/view.min.js 991 B -114 B (-10%) 👏
build/block-library/index.min.js 215 kB +483 B (0%)
build/components/index.min.js 226 kB -9.06 kB (-4%)
build/components/style-rtl.css 12 kB +4 B (0%)
build/components/style.css 12.1 kB +6 B (0%)
build/edit-post/index.min.js 25.2 kB +224 B (+1%)
build/edit-post/style-rtl.css 5.66 kB -1 B (0%)
build/edit-post/style.css 5.66 kB -2 B (0%)
build/edit-site/index.min.js 195 kB -11 B (0%)
build/edit-site/style-rtl.css 15.1 kB -197 B (-1%)
build/edit-site/style.css 15.1 kB -196 B (-1%)
build/edit-widgets/index.min.js 17.3 kB +35 B (0%)
build/edit-widgets/style-rtl.css 4.23 kB -249 B (-6%)
build/edit-widgets/style.css 4.23 kB -251 B (-6%)
build/editor/index.min.js 61.6 kB +3 B (0%)
build/interactivity/index.min.js 12.9 kB +113 B (+1%)
build/interactivity/query.min.js 769 B -115 B (-13%) 👏
build/interactivity/router.min.js 1.24 kB +270 B (+28%) 🚨
build/style-engine/index.min.js 2.08 kB +14 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.35 kB
build/block-editor/content.css 4.35 kB
build/block-editor/default-editor-styles-rtl.css 381 B
build/block-editor/default-editor-styles.css 381 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 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 316 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 654 B
build/block-library/blocks/group/editor.css 654 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 863 B
build/block-library/blocks/image/editor.css 862 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 2.01 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 103 B
build/block-library/blocks/navigation-link/style.css 103 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.25 kB
build/block-library/blocks/navigation/editor.css 2.26 kB
build/block-library/blocks/navigation/style-rtl.css 2.24 kB
build/block-library/blocks/navigation/style.css 2.23 kB
build/block-library/blocks/navigation/view.min.js 1.1 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/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 614 B
build/block-library/blocks/search/style.css 614 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 471 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 348 B
build/block-library/blocks/spacer/editor.css 348 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.3 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/reset-rtl.css 472 B
build/block-library/reset.css 472 B
build/block-library/style-rtl.css 14.7 kB
build/block-library/style.css 14.7 kB
build/block-library/theme-rtl.css 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/blocks/index.min.js 51.6 kB
build/commands/index.min.js 15.5 kB
build/commands/style-rtl.css 921 B
build/commands/style.css 918 B
build/compose/index.min.js 12.6 kB
build/core-commands/index.min.js 2.71 kB
build/core-data/index.min.js 72.7 kB
build/customize-widgets/index.min.js 12.1 kB
build/customize-widgets/style-rtl.css 1.34 kB
build/customize-widgets/style.css 1.33 kB
build/data-controls/index.min.js 640 B
build/data/index.min.js 8.92 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/editor/style-rtl.css 5.43 kB
build/editor/style.css 5.43 kB
build/element/index.min.js 4.83 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 7.85 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 440 B
build/interactivity/image.min.js 2.15 kB
build/interactivity/navigation.min.js 1.23 kB
build/interactivity/search.min.js 610 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.44 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.07 kB
build/preferences/index.min.js 2.81 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

@jasmussen
Copy link
Contributor

In trunk, you'll see this when you add the non-default size option to the background panel:

background panel trunk

In this branch, you'll instead also see the focal point picker, in the same option:

background panel branch

Given it's non-default, to me this doesn't seem harmful to add. The main issue that's slightly exacerbated is that the similar tools on the Cover block are getting increasingly out of date, living in the settings panel, not using the toolspanel, etc:
Screenshot 2024-02-02 at 09 13 59

That could potentially be a related followup, probably not a blocker, and something we need to do regardless.

@jameskoster
Copy link
Contributor

When the background size is fixed or contain I find the focal point picker a little unexpected. It feels more natural when the background is larger than the container.

I'm likely missing some nuance, but for the fixed/contain cases, I wonder if a version of the matrix control might be more useful? This one:

Screenshot 2024-02-02 at 10 35 39

@noisysocks
Copy link
Member

Love your work. Noticed two things when I gave this a spin.

  • When I set a focal point, deselect the block, and re-select the block, the Size controls are gone and I need to open the ellipsis again.

    Kapture.2024-02-05.at.10.21.26.mp4
  • When I toggle Size off in the ellipsis the value for focal point isn't reset.

    Kapture.2024-02-05.at.10.21.26.2.mp4

@andrewserong
Copy link
Contributor Author

Thanks @noisysocks, I missed those on Friday, I'll fix 'em up! 🙂

@andrewserong
Copy link
Contributor Author

andrewserong commented Feb 5, 2024

Thanks for the reviews, everyone! I've added a couple of tests for part of this, and have fixed up the bugs I'm aware of, so I think this is ready for an "is this good enough" kind of review (I don't like to jinx myself by saying "final" review 😄).

Given it's non-default, to me this doesn't seem harmful to add.

That's my main reasoning behind going with this PR for now — to give users the ability to adjust values here, where we can do more nuanced UI work in follow-ups for WP 6.6 🤞

The main issue that's slightly exacerbated is that the similar tools on the Cover block are getting increasingly out of date, living in the settings panel, not using the toolspanel, etc:

Yes, it'd be great to consolidate controls for consistency. From my perspective, given the complexity of dealing with background images, I've been focusing on building out the missing features of the background image support. Then, once we've got parity in terms of features, we might look at how we could consolidate the two further down the track.

I'm likely missing some nuance, but for the fixed/contain cases, I wonder if a version of the matrix control might be more useful? This one:

That's a good question — in the cases where the image is smaller than the container, we still want users to be able to set values that are percentage-based and not exactly top / left / right / bottom / center, so we'll likely still want a UI control for it. And by using the same focal point picker, we don't have a UI jump when adjusting between background sizes. Also, it's possible to have a fixed image that's larger than the container, so for now, I'm leaning toward going with the existing picker, and seeing if we can improve the UI for 6.6.

For now, though, I've renamed the label from "Focal point" to "Position" so hopefully that makes it a little more general. Here's how it's looking now:

image

So, in terms of the discussion for whether or not this can make it in for 6.5, my main question is:

Is re-using the existing focal point picker UI good enough for this feature for 6.5? If so, we can merge this in and have a bit more flexibility in the controls for this next release, knowing that the controls are hidden by default, so they'll only be exposed when folks reach for them.

Alternately, if we're concerned about exposing the controls prematurely, we could skip the feature for this release and have another go at it with redesigned controls in 6.6.

Personally, I think it's a pretty useful feature, so I'd like to see if we can get it in for 6.5, but this is very much a weakly held position, so very happy for any and all feedback about the idea 🙂

Copy link

github-actions bot commented Feb 5, 2024

Flaky tests detected in d9d87ba.
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/7779288651
📝 Reported issues:

@ramonjd
Copy link
Member

ramonjd commented Feb 5, 2024

we can merge this in and have a bit more flexibility in the controls for this next release, knowing that the controls are hidden by default, so they'll only be exposed when folks reach for them.

I like the congruency between the Cover block control background image controls - hopefully, as you say, they can be unified down the line.

Another point on the the unit-based vs. matrix component: the subject of an image could be anywhere on the image canvas. I imagine therefore preset positions wouldn't be able to position all images in a way the user wants. For folks that are exporting theme.json from the site editor, this could be an important distinction.

On another note: I assume we'd want to support more than just percentage units, e.g., px, when the background position property is eventually supported by theme.json?

@andrewserong
Copy link
Contributor Author

On another note: I assume we'd want to support more than just percentage units, e.g., px, when the background position property is eventually supported by theme.json?

Yes! That's a good point, too. Whatever the outcome of this PR, I'll write up a list of follow-ups to add to #54336 of all the extras we'd like to tackle.

@noisysocks
Copy link
Member

I don't have a problem with merging this and changing to a different control later. Nothing's ever permanent...

I'll take this for another spin and look at the code again.

Copy link
Member

@noisysocks noisysocks left a comment

Choose a reason for hiding this comment

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

I noticed that by default the focal point picker's circle isn't centred:

Screenshot 2024-02-06 at 12 43 21

(It's small, but nailing these details makes the overall product feel polished.)

Other than that this looks good and the code smells nice 👍

@noisysocks
Copy link
Member

One more thing: I don't mind it actually, but just flagging it as it's an edge case that we might have missed. You can add Size without having an image selected, which looks like this:

Screenshot 2024-02-06 at 12 52 42

@andrewserong
Copy link
Contributor Author

Thanks @noisysocks!

I noticed that by default the focal point picker's circle isn't centred:

It turns out the PointerCircle wasn't being centered because the component wasn't happy with x and y values being undefined. I've added a fallback in 5af7895 so that those values can be undefined (so that we default to the empty input fields) while still getting the default centered circle position. I'm sure there are more tweaks we can do to this component to improve it, but this seemed like a relatively benign way to solve it for now (the default 0.5 values are used elsewhere in that component, too, so I think it's pretty consistent). Here's how it looks now:

image

One more thing: I don't mind it actually, but just flagging it as it's an edge case that we might have missed. You can add Size without having an image selected, which looks like this:

Yeah, I think that's probably part of the awkwardness of using the ToolsPanel for this set of controls. For now, I think it's probably not too much of a problem as folks need to manually enable the controls in order to see them. But in future follow-ups, when we look at the popover idea, I think we'll likely guard the controls behind there being an active background image. I'll make a note of that for follow-ups.


I think we're probably in a good place to land this PR now. If there are no objections, with the approving review from @noisysocks, I'll look to merge this PR in tomorrow 🙂. Let me know if anyone feels like any of the wrinkles uncovered so far are blockers to landing!

@noisysocks
Copy link
Member

👍 :shipit:

@andrewserong andrewserong merged commit 99d0653 into trunk Feb 6, 2024
59 checks passed
@andrewserong andrewserong deleted the try/add-background-position-controls-to-background-image-support branch February 6, 2024 22:18
@github-actions github-actions bot added this to the Gutenberg 17.7 milestone Feb 6, 2024
@andrewserong andrewserong changed the title Background image support: Try adding background position controls Background image support: add background position controls Feb 6, 2024
@andrewserong
Copy link
Contributor Author

Thanks folks! I've added the suggested improvements so far to the tracking issue (#54336) under a separate heading for background position. Let me know if I've missed anything and I can update.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Block] Group Affects the Group Block [Feature] Design Tools Tools that impact the appearance of blocks both to expand the number of tools and improve the experi [Type] Enhancement A suggestion for improvement.
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

None yet

5 participants