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

Cover block: Allow setting the height from the placeholder state. #35068

Merged
merged 9 commits into from Oct 13, 2021

Conversation

ramonjd
Copy link
Member

@ramonjd ramonjd commented Sep 23, 2021

Description

This PR allows us to set the min-height value for the Cover Block by resizing the placeholder. 🪄

It's part of a wider issue to improve the Cover Block UX.

This PR also updates the copy in the placeholder to describe this functionality. Note, there's a PR to update the Cover Block placeholder copy, so we don't have to do it here.

kitty-resize.mp4

Kudos to @jasmussen for the original UX idea. 🎉

Resolves #34706

Testing

  1. Add a Cover Block
  2. Adjust placeholder's height using the resize handle
  3. The min-height value in the block inspector controls (in the Dimensions panel) should reflect the resized placeholder's min-height
  4. Ensure that the placeholder's background color and border is otherwise unaffected by window resizing.
  5. Check that you can interact with all controls and text inside the placeholder, and also drag an image on top of it.
  6. Also make sure that the resizer itself only appears for large placeholders. You can test this by resizing the window or inserting a cover block into a narrow column. You shouldn't be able to resize placeholders with a width of < 480px
  7. Select a color or a media file
  8. Ensure that the min-height value is retained and displays correctly in the editor and the frontend.
  9. Check that the resizer works as expected, with a min-height of 50px after we've inserted the Cover Block.
  10. Things should work as above on a mobile device as well.

Types of changes

UX enhancement on a block placeholder.

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • I've tested my changes with keyboard and screen readers.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • I've updated all React Native files affected by any refactorings/renamings in this PR (please manually search all *.native.js files for terms that need renaming or removal).

@ramonjd ramonjd added [Status] In Progress Tracking issues with work in progress [Block] Cover Affects the Cover Block - used to display content laid over a background image labels Sep 23, 2021
@ramonjd ramonjd self-assigned this Sep 23, 2021
@github-actions
Copy link

github-actions bot commented Sep 23, 2021

Size Change: +237 B (0%)

Total Size: 1.07 MB

Filename Size Change
build/block-editor/index.min.js 135 kB +14 B (0%)
build/block-library/blocks/cover/editor-rtl.css 733 B +67 B (+10%) ⚠️
build/block-library/blocks/cover/editor.css 734 B +64 B (+10%) ⚠️
build/block-library/editor-rtl.css 9.93 kB +35 B (0%)
build/block-library/editor.css 9.93 kB +38 B (0%)
build/block-library/index.min.js 147 kB +19 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 931 B
build/admin-manifest/index.min.js 1.09 kB
build/annotations/index.min.js 2.7 kB
build/api-fetch/index.min.js 2.21 kB
build/autop/index.min.js 2.08 kB
build/blob/index.min.js 459 B
build/block-directory/index.min.js 6.2 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-editor/style-rtl.css 13.9 kB
build/block-editor/style.css 13.9 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 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 58 B
build/block-library/blocks/audio/editor.css 58 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 474 B
build/block-library/blocks/button/editor.css 474 B
build/block-library/blocks/button/style-rtl.css 600 B
build/block-library/blocks/button/style.css 600 B
build/block-library/blocks/buttons/editor-rtl.css 315 B
build/block-library/blocks/buttons/editor.css 315 B
build/block-library/blocks/buttons/style-rtl.css 370 B
build/block-library/blocks/buttons/style.css 370 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 90 B
build/block-library/blocks/code/style.css 90 B
build/block-library/blocks/code/theme-rtl.css 131 B
build/block-library/blocks/code/theme.css 131 B
build/block-library/blocks/columns/editor-rtl.css 206 B
build/block-library/blocks/columns/editor.css 205 B
build/block-library/blocks/columns/style-rtl.css 497 B
build/block-library/blocks/columns/style.css 496 B
build/block-library/blocks/cover/style-rtl.css 1.24 kB
build/block-library/blocks/cover/style.css 1.24 kB
build/block-library/blocks/embed/editor-rtl.css 488 B
build/block-library/blocks/embed/editor.css 488 B
build/block-library/blocks/embed/style-rtl.css 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 322 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 977 B
build/block-library/blocks/gallery/editor.css 982 B
build/block-library/blocks/gallery/style-rtl.css 1.6 kB
build/block-library/blocks/gallery/style.css 1.59 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 159 B
build/block-library/blocks/group/editor.css 159 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 114 B
build/block-library/blocks/heading/style.css 114 B
build/block-library/blocks/home-link/style-rtl.css 247 B
build/block-library/blocks/home-link/style.css 247 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 731 B
build/block-library/blocks/image/editor.css 730 B
build/block-library/blocks/image/style-rtl.css 491 B
build/block-library/blocks/image/style.css 494 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B
build/block-library/blocks/latest-posts/editor.css 137 B
build/block-library/blocks/latest-posts/style-rtl.css 528 B
build/block-library/blocks/latest-posts/style.css 527 B
build/block-library/blocks/list/style-rtl.css 94 B
build/block-library/blocks/list/style.css 94 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 493 B
build/block-library/blocks/media-text/style.css 490 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 568 B
build/block-library/blocks/navigation-link/editor.css 570 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B
build/block-library/blocks/navigation-link/style.css 94 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 300 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/style-rtl.css 195 B
build/block-library/blocks/navigation-submenu/style.css 195 B
build/block-library/blocks/navigation-submenu/view.min.js 343 B
build/block-library/blocks/navigation/editor-rtl.css 1.72 kB
build/block-library/blocks/navigation/editor.css 1.72 kB
build/block-library/blocks/navigation/style-rtl.css 1.62 kB
build/block-library/blocks/navigation/style.css 1.61 kB
build/block-library/blocks/navigation/view.min.js 2.74 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 198 B
build/block-library/blocks/page-list/style.css 198 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 273 B
build/block-library/blocks/paragraph/style.css 273 B
build/block-library/blocks/post-author/editor-rtl.css 210 B
build/block-library/blocks/post-author/editor.css 210 B
build/block-library/blocks/post-author/style-rtl.css 182 B
build/block-library/blocks/post-author/style.css 181 B
build/block-library/blocks/post-comments-form/style-rtl.css 140 B
build/block-library/blocks/post-comments-form/style.css 140 B
build/block-library/blocks/post-comments/style-rtl.css 360 B
build/block-library/blocks/post-comments/style.css 359 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 396 B
build/block-library/blocks/post-featured-image/editor.css 397 B
build/block-library/blocks/post-featured-image/style-rtl.css 146 B
build/block-library/blocks/post-featured-image/style.css 146 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 391 B
build/block-library/blocks/post-template/style.css 392 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 60 B
build/block-library/blocks/post-title/style.css 60 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 378 B
build/block-library/blocks/pullquote/style.css 378 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 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 262 B
build/block-library/blocks/query-pagination/editor.css 255 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query-title/editor-rtl.css 85 B
build/block-library/blocks/query-title/editor.css 85 B
build/block-library/blocks/query/editor-rtl.css 131 B
build/block-library/blocks/query/editor.css 132 B
build/block-library/blocks/quote/style-rtl.css 187 B
build/block-library/blocks/quote/style.css 187 B
build/block-library/blocks/quote/theme-rtl.css 220 B
build/block-library/blocks/quote/theme.css 222 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 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 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 374 B
build/block-library/blocks/search/style.css 375 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 99 B
build/block-library/blocks/separator/editor.css 99 B
build/block-library/blocks/separator/style-rtl.css 250 B
build/block-library/blocks/separator/style.css 250 B
build/block-library/blocks/separator/theme-rtl.css 172 B
build/block-library/blocks/separator/theme.css 172 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 769 B
build/block-library/blocks/site-logo/editor.css 769 B
build/block-library/blocks/site-logo/style-rtl.css 165 B
build/block-library/blocks/site-logo/style.css 165 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 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 165 B
build/block-library/blocks/social-link/editor.css 165 B
build/block-library/blocks/social-links/editor-rtl.css 812 B
build/block-library/blocks/social-links/editor.css 811 B
build/block-library/blocks/social-links/style-rtl.css 1.3 kB
build/block-library/blocks/social-links/style.css 1.3 kB
build/block-library/blocks/spacer/editor-rtl.css 307 B
build/block-library/blocks/spacer/editor.css 307 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 471 B
build/block-library/blocks/table/editor.css 472 B
build/block-library/blocks/table/style-rtl.css 481 B
build/block-library/blocks/table/style.css 481 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 146 B
build/block-library/blocks/tag-cloud/style.css 146 B
build/block-library/blocks/template-part/editor-rtl.css 636 B
build/block-library/blocks/template-part/editor.css 635 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/editor-rtl.css 90 B
build/block-library/blocks/term-description/editor.css 90 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 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 571 B
build/block-library/blocks/video/editor.css 572 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 853 B
build/block-library/common.css 849 B
build/block-library/reset-rtl.css 474 B
build/block-library/reset.css 474 B
build/block-library/style-rtl.css 10.4 kB
build/block-library/style.css 10.5 kB
build/block-library/theme-rtl.css 665 B
build/block-library/theme.css 669 B
build/block-serialization-default-parser/index.min.js 1.09 kB
build/block-serialization-spec-parser/index.min.js 2.79 kB
build/blocks/index.min.js 45.7 kB
build/components/index.min.js 217 kB
build/components/style-rtl.css 15.3 kB
build/components/style.css 15.3 kB
build/compose/index.min.js 10.3 kB
build/core-data/index.min.js 12.4 kB
build/customize-widgets/index.min.js 11.2 kB
build/customize-widgets/style-rtl.css 1.5 kB
build/customize-widgets/style.css 1.49 kB
build/data-controls/index.min.js 614 B
build/data/index.min.js 7.1 kB
build/date/index.min.js 31.5 kB
build/deprecated/index.min.js 428 B
build/dom-ready/index.min.js 304 B
build/dom/index.min.js 4.45 kB
build/edit-navigation/index.min.js 15.3 kB
build/edit-navigation/style-rtl.css 3.74 kB
build/edit-navigation/style.css 3.74 kB
build/edit-post/classic-rtl.css 492 B
build/edit-post/classic.css 494 B
build/edit-post/index.min.js 29.2 kB
build/edit-post/style-rtl.css 7.2 kB
build/edit-post/style.css 7.19 kB
build/edit-site/index.min.js 29.4 kB
build/edit-site/style-rtl.css 5.5 kB
build/edit-site/style.css 5.5 kB
build/edit-widgets/index.min.js 15.7 kB
build/edit-widgets/style-rtl.css 4.1 kB
build/edit-widgets/style.css 4.1 kB
build/editor/index.min.js 37.5 kB
build/editor/style-rtl.css 3.76 kB
build/editor/style.css 3.75 kB
build/element/index.min.js 3.17 kB
build/escape-html/index.min.js 517 B
build/format-library/index.min.js 5.93 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 424 B
build/i18n/index.min.js 3.6 kB
build/is-shallow-equal/index.min.js 501 B
build/keyboard-shortcuts/index.min.js 1.72 kB
build/keycodes/index.min.js 1.3 kB
build/list-reusable-blocks/index.min.js 1.85 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.92 kB
build/notices/index.min.js 845 B
build/nux/index.min.js 2.03 kB
build/nux/style-rtl.css 747 B
build/nux/style.css 743 B
build/plugins/index.min.js 1.83 kB
build/primitives/index.min.js 921 B
build/priority-queue/index.min.js 582 B
build/react-i18n/index.min.js 671 B
build/redux-routine/index.min.js 2.63 kB
build/reusable-blocks/index.min.js 2.19 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.6 kB
build/server-side-render/index.min.js 1.52 kB
build/shortcode/index.min.js 1.48 kB
build/token-list/index.min.js 562 B
build/url/index.min.js 1.74 kB
build/viewport/index.min.js 1.02 kB
build/warning/index.min.js 248 B
build/widgets/index.min.js 7.11 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.04 kB

compressed-size-action

@ramonjd ramonjd force-pushed the try/cover-min-height-placeholder-resizer branch from 5706513 to f8ed363 Compare September 28, 2021 04:44
@ramonjd ramonjd changed the title [WIP] Cover block: Allow setting the height from the placeholder state. Cover block: Allow setting the height from the placeholder state. Sep 28, 2021
@ramonjd ramonjd removed the [Status] In Progress Tracking issues with work in progress label Sep 28, 2021
@ramonjd ramonjd marked this pull request as ready for review September 28, 2021 05:32
Copy link
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

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

Nice work @ramonjd! This is testing well for me, and it's great being able to interact with the minimum height while in the placeholder state. I've left a comment about whether it'd be worth constraining the minimum height in the placeholder state to leave clearance for the placeholder, and a tiny comment about the classnames (but feel free to ignore if it isn't relevant).

The wording looks good to me, but CC: @apeatling since he's been working on the placeholder wording, too.

setAttributes( { minHeight: newMinHeight } );
setTemporaryMinHeight( null );
} }
showHandle={ isSelected }
Copy link
Contributor

Choose a reason for hiding this comment

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

I was wondering if it'd be worth adding the minHeight={ 250 } prop to this ResizableCover so that it gets passed down to ResizableBox? While values less than 250 are valid for the cover block, it looked a little odd being able to drag the control over the placeholder area. This shouldn't affect the ability to have a smaller height once a background colour is chosen 🤞

Before After
Kapture 2021-09-28 at 16 50 44 Kapture 2021-09-28 at 16 49 02

Copy link
Member Author

Choose a reason for hiding this comment

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

Good idea. I'll have a play around with your suggestion.

.wp-block-cover.is-placeholder .cover-block__cover-placeholder-container {
background: $white;
width: 100%;
.block-editor-media-placeholder {
Copy link
Contributor

Choose a reason for hiding this comment

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

Tiniest of nits: it looks like the box-shadow comes from the .components-placeholder class, but the element here also happens to have the .block-editor-media-placeholder class name. Would it be worth switching to the other class name for consistency, or is it better to keep it as-is for specificity?

Copy link
Contributor

Choose a reason for hiding this comment

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

This will need massaging as well, as we need the resting and focus states to be the same as other placeholders, which very probably requires we use a box shadow after all. Happy to help if this turns gnarly.

Copy link
Member Author

Choose a reason for hiding this comment

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

Thanks for noticing this! I'll work on it and get back to you if the gnarliness defeats me! :)

@andrewserong andrewserong added the [Type] Enhancement A suggestion for improvement. label Sep 28, 2021
@jasmussen
Copy link
Contributor

Nice, this is working better than I had expected. I was happy to see the min height also being present in the inspector. Here's a GIF showing the cover resize:
cover resize

A few small things:

  • The focus style is now off, so you see both the black border and the blue outline. This is likely due to the addition of the separate black border. I can help you figure this out if need be. You can compare with the Image placeholder and the style of border should be the same.
  • The 2px border radius on the placeholder is missing.

Some of the larger stuff, Andrew suggests adding a min-height while it's still in a placeholder state. That might be a good temporary solution, but it doesn't feel like a longer term solution to have separate min-heights depending on state. One thing that might or might not work would be to enhance the resizeobserver system that's built into the Placeholder component. Right now it applies is-small, is-medium and is-large classes to the placeholder so that when they are inserted in narrow contexts (such as a column) we can hide descriptions or otherwise minimize the content of the placeholders. If this were built right, we could potentially minimize the placeholder both vertically and horizontally to the point that the entire thing just becomes an upload button, a la the Site Logo placeholder (#35096). It might simply be enough to apply theis-small CSS class not just based on the width, but based on the height as well. Can you take a quick look and see if enhancing this with height awareness would be easy or complex?

@apeatling apeatling self-requested a review September 28, 2021 17:01
Copy link
Contributor

@apeatling apeatling left a comment

Choose a reason for hiding this comment

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

This works well for me. I do agree we need some way to stop the resizable placeholder from sizing smaller than the contents of the placeholder.

2021-09-28 10 03 13

@ramonjd
Copy link
Member Author

ramonjd commented Sep 29, 2021

Thanks @andrewserong @apeatling and @jasmussen for the feedback. I didn't catch the min-height of the container and the focus states, so it's really helpful. I'll work on your suggestions and aim to get a revision up soon.

@ramonjd ramonjd added the [Status] In Progress Tracking issues with work in progress label Sep 30, 2021
@ramonjd ramonjd marked this pull request as draft September 30, 2021 03:09
@ramonjd ramonjd force-pushed the try/cover-min-height-placeholder-resizer branch from f8ed363 to 1ff0d25 Compare September 30, 2021 05:05
@ramonjd
Copy link
Member Author

ramonjd commented Sep 30, 2021

I've converted this PR back to draft in order to experiment.

Firstly, sorry for the wall of text and images. I thought it best to document my progress and gather feedback here.

Secondly, it turns out most of the style/outline/focus issues can be resolved by moving the ResizableCover component inside the CoverPlaceholder component. 🎉

Some of the larger stuff, Andrew suggests adding a min-height while it’s still in a placeholder state. That might be a good temporary solution, but it doesn’t feel like a longer term solution to have separate min-heights depending on state.

Actually, having played around with things I agree. For example, giving the resizer a static min-height of 250 requires us also to set the .components-placeholder min-height to 250.

This is so the initial state of both matches up and the resize handler knows where to position itself, and there's no overlap. Here's what happens when we don't do this and insert a Cover Block:

Screen Shot 2021-09-30 at 11 46 18 am

Furthermore, a value of 250 (or whatever it is) is fairly arbitrary and doesn’t take into account the contents of the placeholder.

So for example, we might set 250, which works for now in for the large placeholder, but later content might be added which will bring the height of the placeholder above 250.

To demonstrate what I'm talking about, here's what happens when we set the min-height to 200:

min-height-cover-200

Can you take a quick look and see if enhancing this with height awareness would be easy or complex?

Thanks for suggesting this. 🙇

So observing the height as well as the width in the Placeholder component is trivial using the react-resize-aware library –

const [ resizeListener, { width, height } ] = useResizeObserver();

let modifierClassNames;
if ( typeof width === 'number' ) {
	modifierClassNames = {
                 // TODO rename these classes, e.g., `is-width-large`, `is-height-large` etc
		'is-large': width >= 480, 
		'is-medium': width >= 160 && width < 480,
		'is-small': width < 160,
                 // TODO determine the most appropriate breakpoint values for height
		'is-tall': height >= 250,
		'is-middle': height >= 100 && height < 250,
		'is-short': height < 100,
	};
}

– it's how we apply it to this specific use case.

Using a combination of the vertical and horizontal classes we might pull off a consistent experience of the following:

reveal-cover

It's a promising direction.

The placeholders might be taller or shorter depending on the content however, so it's been challenging to reconcile where and when we hide and show elements.

Before I dive down that rabbit hole, it would be great to know if I've understood your comments @jasmussen 😆

Another option (the one I've just committed), is one that allows us to test the behaviour with a smaller footprint, would be to limit the resize behaviour to is-large placeholders for now, e.g.,

	.components-resizable-box__container {
		display: none;
	}
	.components-placeholder {
		&.is-large {
			min-height: 250px;
			.components-resizable-box__container {
				min-height: 250px;
				display: block;
			}
		}

Here's what that would look like:

only-large-cover-block

The benefit would be that we expose the functionality, and then work in parallel on exposing vertical Placeholder classes.

@ramonjd ramonjd force-pushed the try/cover-min-height-placeholder-resizer branch from 1ff0d25 to 20ddf00 Compare September 30, 2021 05:09
@jasmussen
Copy link
Contributor

So observing the height as well as the width in the Placeholder component is trivial using the react-resize-aware library –

I like the sound of that.

Instead of creating separate cases for width and height, though, I think it might be worth it to just lump them together as one, to keep things simple. So instead of:

if ( typeof width === 'number' ) {
	modifierClassNames = {
                 // TODO rename these classes, e.g., `is-width-large`, `is-height-large` etc
		'is-large': width >= 480, 
		'is-medium': width >= 160 && width < 480,
		'is-small': width < 160,
                 // TODO determine the most appropriate breakpoint values for height
		'is-tall': height >= 250,
		'is-middle': height >= 100 && height < 250,
		'is-short': height < 100,
	};
}

maybe something like:

if ( typeof width === 'number' ) {
	modifierClassNames = {
		'is-large': width >= 480 || height >=250, 
		'is-medium': width >= 160 && width < 480 || height >= 100 && height < 250,
		'is-small': width < 160 || height < 100,
	};
}

On the one hand, many third party blocks might be leveraging the existing classes, so it's risky to rename them. Additionally, by simply having at most three sizes to handle in the placeholder, it makes it easier to handle the responsive behavior across all placeholders, which is important if we are to keep using it.

I also think, separate from this PR, that we can enhance the design of these placeholder components across the board, and in doing so find a better design for the minimal version of placeholders. For example, here's what a minimal site logo placeholder could look like, and here's a work in progress exploration on adding the color control to the Cover block toolbar, which would at least make it available in the smaller breakpoints.

@ramonjd
Copy link
Member Author

ramonjd commented Oct 1, 2021

On the one hand, many third party blocks might be leveraging the existing classes, so it's risky to rename them.

Definitely. What's more, I noticed that Cover Blocks within narrow columns for example, can be both very tall but narrow, so it'd be a difficult one to categorize.

It might be worth an experimental PR just to see what's possible with various placeholder dimensions in light of the work you've linked to (thank you for that too!).

@ramonjd ramonjd marked this pull request as ready for review October 1, 2021 05:57
@ramonjd ramonjd requested a review from ellatrix as a code owner October 1, 2021 05:57
@jasmussen
Copy link
Contributor

It might be worth an experimental PR just to see what's possible with various placeholder dimensions in light of the work you've linked to (thank you for that too!).

There's definitely work to do, including designwise. But in light of that, it's also good to keep things as simple as possible, as simplicity is definitely what we'll seek more of for any iterations!

Nice work.

@ramonjd ramonjd removed the [Status] In Progress Tracking issues with work in progress label Oct 5, 2021
Copy link
Contributor

@apeatling apeatling left a comment

Choose a reason for hiding this comment

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

Working well, LGTM 👍

@ramonjd ramonjd force-pushed the try/cover-min-height-placeholder-resizer branch from 20ddf00 to 4bb5315 Compare October 8, 2021 02:03
@ramonjd
Copy link
Member Author

ramonjd commented Oct 8, 2021

More testing reveals that the resizer is sitting on top of the controls, meaning that we can't interact with the upload/media library buttons.

Screen Shot 2021-10-08 at 1 15 07 pm

I suspect the reordering of the resizeable placeholder component in e97b6937536b4087248db7717f73c1b2e0edd987

Investigating...

@ramonjd ramonjd force-pushed the try/cover-min-height-placeholder-resizer branch from 4bb5315 to 7145dff Compare October 8, 2021 03:25
@ramonjd ramonjd requested a review from apeatling October 8, 2021 03:26
@ramonjd
Copy link
Member Author

ramonjd commented Oct 8, 2021

@apeatling Thanks for the review!

I've reordered the markup and added a z-index to the placeholder so that we can interact with the controls this time 😄

Everything should work as before if you get time to do another round of reviewing. 🙇

@jasmussen
Copy link
Contributor

Visually this is looking good, and it's a nice feature. However I'm seeing a 250px min-height on the placeholder:
Screenshot 2021-10-08 at 09 25 42

One problem that exists with enforcing a min-height just to accommodate the big placeholder, is that it doesn't account for the is-medium and is-small breakpoints. In those cases even now (try putting a cover in column 1 of a 3 column setup) font sizes are reduced, the description is hidden, and things get smaller. The 250px min-height is invisible there because the color swatches are still shown. But that's arguably a bug, and the color swatches should be hidden at states less than is-large, at which point the min-height becomes problematic.

250px is also taller than the 220 ish px that seem needed in my testing. It seems like we could possibly land this by reducing that min-height.

However I think it's worth doing or ticketing a followup to revisit the cover placeholder and enhance its narrow-context behavior. It seems like with nice flex rules, we should be able to reduce the required min-height all the way down to about 72px:

Screenshot 2021-10-08 at 09 29 11

Bad inspector mockup, we'd of course want things to align.

@ramonjd
Copy link
Member Author

ramonjd commented Oct 8, 2021

One problem that exists with enforcing a min-height just to accommodate the big placeholder, is that it doesn't account for the is-medium and is-small breakpoints.

True. That's why we restricted the resizer to show only for is-large placeholders. Not an ideal long term solution, I know, but it's the only way I could think of getting around the constraints you mentioned.

250px is also taller than the 220 ish px that seem needed in my testing. It seems like we could possibly land this by reducing that min-height.

WIll do! Thanks! 🙇

However I think it's worth doing or ticketing a followup to revisit the cover placeholder and enhance its narrow-context behavior. It seems like with nice flex rules, we should be able to reduce the required min-height all the way down to about 72px:

For sure. I think we should be able to find a way to have the placeholder content respond to the container's dimensions. I really only spent an hour or two hacking at it. How that plays with the resizer, assuming we unleash it across medium and small dimensions is well is to be seen 😄

@ramonjd
Copy link
Member Author

ramonjd commented Oct 8, 2021

250px is also taller than the 220 ish px that seem needed in my testing.

The copy is new so it's still untranslated, but I think the 250px was originally set to accommodate two lines of text, which might be required for German or Russian for example.

At 220px we get a bit of overlap:

Oct-08-2021 19-26-39

It's not a huge eyesore I think. 240px seems to be the spot where we don't see this effect if we want to avoid it.

It does expose fragility in that we're relying on unknown content height. We should try to overcome this limitation in future explorations. 👍

Cheers!

@jasmussen
Copy link
Contributor

It does expose fragility in that we're relying on unknown content height. We should try to overcome this limitation in future explorations. 👍

It seems fine to hide elements, including the description and color swatches, as the placeholder gets resized, same as we already do for horizontal narrowing. So long as we come back to this, probably just pick a value and go!

…etermine the min-height of the resizeable placeholder.
Reverting changes to the Placeholder `useResizeObserver` since it was a test.
limit the resize behaviour to `is-large` placeholders
- a user can interact with the placeholder controls
- we can target the resizer as a sibling of `.components-placeholder.is-large`

Also cleaning up the CSS and removing unused styles.
@ramonjd ramonjd force-pushed the try/cover-min-height-placeholder-resizer branch from 7145dff to eb6cfe3 Compare October 10, 2021 22:31
… container so that our changes in editor.scss take precedence, we have to reinstate the COVER_MIN_HEIGHT of 50px now via css
Copy link
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

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

Nice work @ramonjd! This is testing nicely for me, and aside from the additional control while selected, the placeholder state looks consistent with other placeholders like the Image block. Like Joen, I noticed that the min height of the placeholder is now a little taller, however that also seems to help things in smaller viewport widths where the descriptive text wraps on a second line, so I think the extra breathing room there seems worth it (as you mentioned with factoring in the potential length of translations, too).

✅ Min height control in placeholder state updates values correctly
✅ Control is not shown on smaller Cover placeholder state when inserted within a Column block
✅ Placeholder's background and border colors are as they were before
✅ Interacting within the Cover block is working as before (selecting color, image, dragging an image from the desktop onto the placeholder, etc)
✅ Tested on Safari, FF, Chrome, and Edge on Mac and Safari and Chrome on iOS (iPhone 8)

Kapture 2021-10-12 at 14 34 38

LGTM! 🎉

@ramonjd
Copy link
Member Author

ramonjd commented Oct 12, 2021

Thanks again the thorough review @andrewserong 🙇

@ramonjd ramonjd merged commit 388e63e into trunk Oct 13, 2021
@ramonjd ramonjd deleted the try/cover-min-height-placeholder-resizer branch October 13, 2021 00:38
@github-actions github-actions bot added this to the Gutenberg 11.8 milestone Oct 13, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Block] Cover Affects the Cover Block - used to display content laid over a background image [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Allow setting the height from the placeholder state.
4 participants