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

Ensure block toolbar doesn't overlap block by modifying forcePosition and shift popover props #42887

Merged
merged 20 commits into from
Aug 23, 2022

Conversation

talldan
Copy link
Contributor

@talldan talldan commented Aug 2, 2022

What?

Fixes #41575

Restores the previous behavior where the block toolbar flips below the block when there's not enough space at the top of the canvas.

How?

Modifies the popover props on the fly. When there's enough space at the top of the canvas, the props { __unstableForcePosition: true, __unstableShift: true } are used, disabling the toolbar 'flip' behavior and enabling the 'shift' behavior.

When there's a restricted amount of space, the props { __unstableForcePosition: false, __unstableShift: false } are used, which enable the 'flip' behavior and disable the 'shift' behavior.

Testing Instructions

  1. Open the site editor, go to 'Templates' and choose Blank (which appears in the Twenty Twenty Two theme)
  2. Insert some blocks, ideally enough for the page to be scrollable.
  3. Select the first block—if there isn't enough space above the block it should appear below.

Video

Kapture.2022-08-02.at.17.36.26.mp4

@talldan talldan added the [Type] Experimental Experimental feature or API. label Aug 2, 2022
@talldan talldan requested review from ciampo and ntsekouras August 2, 2022 09:32
@talldan talldan self-assigned this Aug 2, 2022
@github-actions
Copy link

github-actions bot commented Aug 2, 2022

Size Change: +520 B (0%)

Total Size: 1.24 MB

Filename Size Change
build/block-editor/index.min.js 159 kB +656 B (0%)
build/block-editor/style-rtl.css 15 kB -22 B (0%)
build/block-editor/style.css 15 kB -19 B (0%)
build/block-library/blocks/navigation/editor-rtl.css 2.05 kB +23 B (+1%)
build/block-library/blocks/navigation/editor.css 2.06 kB +18 B (+1%)
build/block-library/blocks/post-title/style-rtl.css 100 B +20 B (+25%) 🚨
build/block-library/blocks/post-title/style.css 100 B +20 B (+25%) 🚨
build/block-library/editor-rtl.css 11 kB +31 B (0%)
build/block-library/editor.css 11 kB +31 B (0%)
build/block-library/index.min.js 186 kB +329 B (0%)
build/block-library/style-rtl.css 11.9 kB +12 B (0%)
build/block-library/style.css 11.9 kB +12 B (0%)
build/components/index.min.js 198 kB -767 B (0%)
build/customize-widgets/style-rtl.css 1.38 kB -24 B (-2%)
build/customize-widgets/style.css 1.38 kB -24 B (-2%)
build/edit-navigation/index.min.js 16 kB +8 B (0%)
build/edit-post/index.min.js 30.5 kB +14 B (0%)
build/edit-site/index.min.js 57.4 kB +136 B (0%)
build/widgets/index.min.js 7.2 kB +11 B (0%)
build/widgets/style-rtl.css 1.18 kB +27 B (+2%)
build/widgets/style.css 1.19 kB +28 B (+2%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 982 B
build/annotations/index.min.js 2.76 kB
build/api-fetch/index.min.js 2.26 kB
build/autop/index.min.js 2.14 kB
build/blob/index.min.js 475 B
build/block-directory/index.min.js 7.06 kB
build/block-directory/style-rtl.css 990 B
build/block-directory/style.css 991 B
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 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 65 B
build/block-library/blocks/archives/style.css 65 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 110 B
build/block-library/blocks/audio/theme.css 110 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 59 B
build/block-library/blocks/avatar/style.css 59 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 441 B
build/block-library/blocks/button/editor.css 441 B
build/block-library/blocks/button/style-rtl.css 539 B
build/block-library/blocks/button/style.css 539 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 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 103 B
build/block-library/blocks/code/style.css 103 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 406 B
build/block-library/blocks/columns/style.css 406 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 187 B
build/block-library/blocks/comment-template/style.css 185 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 834 B
build/block-library/blocks/comments/editor.css 832 B
build/block-library/blocks/comments/style-rtl.css 632 B
build/block-library/blocks/comments/style.css 630 B
build/block-library/blocks/cover/editor-rtl.css 615 B
build/block-library/blocks/cover/editor.css 616 B
build/block-library/blocks/cover/style-rtl.css 1.55 kB
build/block-library/blocks/cover/style.css 1.55 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 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 110 B
build/block-library/blocks/embed/theme.css 110 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 253 B
build/block-library/blocks/file/style.css 254 B
build/block-library/blocks/file/view.min.js 346 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 948 B
build/block-library/blocks/gallery/editor.css 950 B
build/block-library/blocks/gallery/style-rtl.css 1.53 kB
build/block-library/blocks/gallery/style.css 1.53 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 412 B
build/block-library/blocks/group/editor.css 412 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 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 327 B
build/block-library/blocks/html/editor.css 329 B
build/block-library/blocks/image/editor-rtl.css 876 B
build/block-library/blocks/image/editor.css 873 B
build/block-library/blocks/image/style-rtl.css 627 B
build/block-library/blocks/image/style.css 630 B
build/block-library/blocks/image/theme-rtl.css 110 B
build/block-library/blocks/image/theme.css 110 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 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 463 B
build/block-library/blocks/latest-posts/style.css 462 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 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 705 B
build/block-library/blocks/navigation-link/editor.css 703 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 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-submenu/view.min.js 423 B
build/block-library/blocks/navigation/style-rtl.css 1.98 kB
build/block-library/blocks/navigation/style.css 1.97 kB
build/block-library/blocks/navigation/view-modal.min.js 2.78 kB
build/block-library/blocks/navigation/view.min.js 443 B
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 363 B
build/block-library/blocks/page-list/editor.css 363 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 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 260 B
build/block-library/blocks/paragraph/style.css 260 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 493 B
build/block-library/blocks/post-comments-form/style.css 493 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 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 507 B
build/block-library/blocks/post-featured-image/editor.css 505 B
build/block-library/blocks/post-featured-image/style-rtl.css 166 B
build/block-library/blocks/post-featured-image/style.css 166 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 282 B
build/block-library/blocks/post-template/style.css 282 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/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 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 326 B
build/block-library/blocks/pullquote/style.css 325 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 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 282 B
build/block-library/blocks/query-pagination/style.css 278 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 439 B
build/block-library/blocks/query/editor.css 439 B
build/block-library/blocks/quote/style-rtl.css 213 B
build/block-library/blocks/quote/style.css 213 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 132 B
build/block-library/blocks/read-more/style.css 132 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 396 B
build/block-library/blocks/search/style.css 393 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 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 233 B
build/block-library/blocks/separator/style.css 233 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 464 B
build/block-library/blocks/shortcode/editor.css 464 B
build/block-library/blocks/site-logo/editor-rtl.css 455 B
build/block-library/blocks/site-logo/editor.css 455 B
build/block-library/blocks/site-logo/style-rtl.css 192 B
build/block-library/blocks/site-logo/style.css 192 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 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.39 kB
build/block-library/blocks/social-links/style.css 1.38 kB
build/block-library/blocks/spacer/editor-rtl.css 322 B
build/block-library/blocks/spacer/editor.css 322 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 494 B
build/block-library/blocks/table/editor.css 494 B
build/block-library/blocks/table/style-rtl.css 611 B
build/block-library/blocks/table/style.css 609 B
build/block-library/blocks/table/theme-rtl.css 175 B
build/block-library/blocks/table/theme.css 175 B
build/block-library/blocks/tag-cloud/style-rtl.css 239 B
build/block-library/blocks/tag-cloud/style.css 239 B
build/block-library/blocks/template-part/editor-rtl.css 235 B
build/block-library/blocks/template-part/editor.css 235 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/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 561 B
build/block-library/blocks/video/editor.css 563 B
build/block-library/blocks/video/style-rtl.css 174 B
build/block-library/blocks/video/style.css 174 B
build/block-library/blocks/video/theme-rtl.css 110 B
build/block-library/blocks/video/theme.css 110 B
build/block-library/common-rtl.css 1.01 kB
build/block-library/common.css 1 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 478 B
build/block-library/reset.css 478 B
build/block-library/theme-rtl.css 695 B
build/block-library/theme.css 700 B
build/block-serialization-default-parser/index.min.js 1.11 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 49.5 kB
build/components/style-rtl.css 11.6 kB
build/components/style.css 11.6 kB
build/compose/index.min.js 12 kB
build/core-data/index.min.js 15.4 kB
build/customize-widgets/index.min.js 11.3 kB
build/data-controls/index.min.js 653 B
build/data/index.min.js 8.03 kB
build/date/index.min.js 32 kB
build/deprecated/index.min.js 507 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.69 kB
build/edit-navigation/style-rtl.css 4 kB
build/edit-navigation/style.css 4.01 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/style-rtl.css 6.94 kB
build/edit-post/style.css 6.94 kB
build/edit-site/style-rtl.css 8.22 kB
build/edit-site/style.css 8.2 kB
build/edit-widgets/index.min.js 16.5 kB
build/edit-widgets/style-rtl.css 4.35 kB
build/edit-widgets/style.css 4.35 kB
build/editor/index.min.js 41.5 kB
build/editor/style-rtl.css 3.66 kB
build/editor/style.css 3.65 kB
build/element/index.min.js 4.68 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 6.75 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.64 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.77 kB
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.78 kB
build/keycodes/index.min.js 1.81 kB
build/list-reusable-blocks/index.min.js 1.74 kB
build/list-reusable-blocks/style-rtl.css 835 B
build/list-reusable-blocks/style.css 835 B
build/media-utils/index.min.js 2.93 kB
build/notices/index.min.js 953 B
build/nux/index.min.js 2.05 kB
build/nux/style-rtl.css 732 B
build/nux/style.css 728 B
build/plugins/index.min.js 1.94 kB
build/preferences-persistence/index.min.js 2.22 kB
build/preferences/index.min.js 1.3 kB
build/primitives/index.min.js 933 B
build/priority-queue/index.min.js 612 B
build/react-i18n/index.min.js 696 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.74 kB
build/reusable-blocks/index.min.js 2.21 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11.2 kB
build/server-side-render/index.min.js 1.61 kB
build/shortcode/index.min.js 1.53 kB
build/token-list/index.min.js 644 B
build/url/index.min.js 3.61 kB
build/vendors/react-dom.min.js 38.5 kB
build/vendors/react.min.js 4.34 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 268 B
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@ciampo
Copy link
Contributor

ciampo commented Aug 3, 2022

I'm a bit behind with my review queue at the moment, but I'll try to take a look soon enough!

Copy link
Contributor

@ciampo ciampo left a comment

Choose a reason for hiding this comment

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

I know that this is still a rough implementation and it's far from final code, but I stil gave this PR a try. The behavior is quite inconsistent:

  • the toolbar is flipped also for blocks that shouldn't be flipped
  • the "flip" doesn't always revert to the normal position
Kapture.2022-08-05.at.11.47.16.mp4

The main thing to discuss is the idea behind the approach:

Passes a different placement to the Popover component depending on the amount of space at the top of the canvas. It does this in the SelectedBlockPopover component, which seems to be the one responsible for the floating block toolbar.

The good thing is that this doesn't touch the popover component, it works consistently in the post and site editors, and it doesn't completely prevent the shift behavior of the toolbar for blocks lower down in the canvas.

Personally I'm not sure about this approach — it's still potentially quite a lot of code with non-trivial logic (one we polish it), which can be error prone (and therefore not too different from a custom middleware).

I'd like to rely on floating-ui as much as possible, so here's another idea that came to mind:

  • when a block is selected (or shifted across the document), we could still read (outside of the Popover component) the distance of the selected block from the start of the page (and not of the viewport)
  • if the distance if less than a certain threshold (which can be the toolbar's height or any arbitrary number), we could simply set a prop on Popover to enable the flip behavior

This would keep the block editor-specific code separate from Popover, but would also avoid writing any popover-specific code outside of the Popover.

@talldan
Copy link
Contributor Author

talldan commented Aug 12, 2022

@ciampo Sorry for the delay in replying, have been working across a few areas lately.

if the distance if less than a certain threshold (which can be the toolbar's height or any arbitrary number), we could simply set a prop on Popover to enable the flip behavior

I've updated the code to work like this. I agree that it is nicer 👍

I think it probably has the same problems to solve, that we'd need to update on block movement or resizing to determine the new props. That's still not an insurmountable problem, but I haven't attempted to solve it yet, just aiming for a proof of concept.

the toolbar is flipped also for blocks that shouldn't be flipped
the "flip" doesn't always revert to the normal position

I noticed something like this. There's the same problem with the new approach too. I think floating-ui may not support modifying placement or middleware on the fly. I had little success in calling floating-ui's update function to get it to recalculate, but I think this would be the right way to solve the problem.

To solve it for now, I've forced the popover to remount when a different block is selected - see d06ade5. I don't think this is a long term fix, but I've pushed it so that the PR demonstrates the desired behavior.

@ciampo
Copy link
Contributor

ciampo commented Aug 12, 2022

I think it probably has the same problems to solve, that we'd need to update on block movement or resizing to determine the new props. That's still not an insurmountable problem, but I haven't attempted to solve it yet, just aiming for a proof of concept.

Yeah, we should calculate the distance of the currently selected block from the top of the page (not the viewport):

  • when the block is selected
  • when the block is resized
  • when the block is moved across the page (i.e. changed order)

I noticed something like this. There's the same problem with the new approach too. I think floating-ui may not support modifying placement or middleware on the fly. I had little success in calling floating-ui's update function to get it to recalculate, but I think this would be the right way to solve the problem.
To solve it for now, I've forced the popover to remount when a different block is selected - see d06ade5. I don't think this is a long term fix, but I've pushed it so that the PR demonstrates the desired behavior.

That's unfortunate — it was also my impression that at most we'd need to call update. To be investigated (we may even open an issue on floating-ui's repo if we believe it's an actual bug)

@@ -328,7 +329,7 @@ const Popover = (
}

return autoUpdate( usedRef, refs.floating.current, update );
}, [ anchorRef, anchorRect, getAnchorRect ] );
}, [ anchorRef, anchorRect, getAnchorRect, middlewares ] );
Copy link
Contributor

Choose a reason for hiding this comment

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

Interesting that this is also not enough to trigger an update of the popover behavior when changing its behavior through enabling/disabling middlewares

@talldan talldan force-pushed the try/flip-block-toolbar-by-modifying-placement branch from d06ade5 to afcd109 Compare August 18, 2022 06:50
@talldan talldan changed the title Try flip block toolbar popover position by modifying placement Ensure block toolbar doesn't overlap block by modifying forcePosition and shift popover props Aug 18, 2022
@talldan talldan added [Type] Bug An existing feature does not function as intended [Feature] Blocks Overall functionality of blocks and removed [Type] Experimental Experimental feature or API. labels Aug 18, 2022
@talldan talldan marked this pull request as ready for review August 18, 2022 07:02
@talldan talldan requested a review from ellatrix as a code owner August 18, 2022 07:02
@talldan
Copy link
Contributor Author

talldan commented Aug 18, 2022

With the other popover fixes, this is working much better now. I've removed any hacks and tidied up the code.

Open to more feedback, testing and reviews now.

I haven't fixed the issue where the toolbar doesn't shift fully below the block in the site editor, but there are other PRs looking at that problem.

@talldan talldan force-pushed the try/flip-block-toolbar-by-modifying-placement branch from e504f79 to 8ca5616 Compare August 18, 2022 08:27
@ciampo
Copy link
Contributor

ciampo commented Aug 18, 2022

Thanks Dan! I'll try to have a look soon at this

Copy link
Contributor

@ciampo ciampo left a comment

Choose a reason for hiding this comment

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

Code looks much cleaner!

I think we will still need to listen to more events that can change the distance of the selected block from the toolbar.

For example, if a block is re-ordered, the toolbar currently doesn't adjust its position:

Kapture.2022-08-18.at.20.44.45.mp4

What if we undo an action that causes the block to change its distance from the top of the page (eg adding a block on top, and then cmd+z, which would remove it)?

I also checked multi-block selection and it seems to work

@talldan
Copy link
Contributor Author

talldan commented Aug 19, 2022

For example, if a block is re-ordered, the toolbar currently doesn't adjust its position

I thought I'd solved that, but yes I see that issue. It seems to work ok when a block is moved down, but that's because flip remains active. It seems like there's still an issue switching from one set of middleware to another.

I'll look into it.

@talldan talldan force-pushed the try/flip-block-toolbar-by-modifying-placement branch from 9a14434 to 5a8c121 Compare August 19, 2022 03:58
@talldan
Copy link
Contributor Author

talldan commented Aug 19, 2022

I think I've covered most of the edge cases now, but more testing is welcome.

Copy link
Contributor

@ciampo ciampo left a comment

Choose a reason for hiding this comment

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

This PR is testing well for me! I couldn't find a way to "trip" the logic, which is great — and the code looks clean.

Apart from a few remaining comments, my only reservation left is about performance — measuring the offsetHeight and calling getBoundingClientRect are expensive functions to run, and so I wonder if we can find ways to call getProps as sparingly as possible (without introducing regressions, of course). For example, in my tests I could notice that function being called up to 4 times when clicking a single block

Copy link
Contributor

@ntsekouras ntsekouras left a comment

Choose a reason for hiding this comment

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

This PR is testing well for me too, thanks Dan!

@talldan talldan force-pushed the try/flip-block-toolbar-by-modifying-placement branch from f33eae9 to bc43d19 Compare August 22, 2022 02:15
Copy link
Contributor

@ciampo ciampo left a comment

Choose a reason for hiding this comment

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

Code changes LGTM 🚀

My only doubt, as mentioned before, is regarding performance: the getBoundingClientRect() function are a relatively expensive call to make (as they cause layout reflow), and as of now they are executed 3 to 6 times (instead of only 1).

Kapture.2022-08-23.at.10.57.29.mp4

I don't think it's a blocker for this PR, especially given how useful this fix is — but definitely something that I'd like to ideally follow-up on in order to keep the site editor as snappy as possible (for example, we could store the result of getBoundingClientRect() calls in a ref, and update it less frequently?)

@talldan
Copy link
Contributor Author

talldan commented Aug 23, 2022

@ciampo Thanks for helping this through!

Looks like an oversight in one of the places getProps is called. I've pushed a commit that fixes it. It should have been

useState( () => getProps( contentElement, selectedBlockElement, toolbarHeight ) )

to set the initial state lazily instead of:

useState( getProps( contentElement, selectedBlockElement, toolbarHeight ) )

(this only solves one of the calls. There are still two happening whenever switching blocks.)

@ciampo
Copy link
Contributor

ciampo commented Aug 23, 2022

Looks like an oversight in one of the places getProps is called. I've pushed a commit that fixes it. It should have been

That's definitely a step in the right direction!

I believe we can merge this PR and iterate in a lower-priority follow-up.

We could also now have a look at reworking the props around the flip, shift and resize behaviors

@talldan talldan merged commit dc2ba4b into trunk Aug 23, 2022
@talldan talldan deleted the try/flip-block-toolbar-by-modifying-placement branch August 23, 2022 12:10
@github-actions github-actions bot added this to the Gutenberg 14.0 milestone Aug 23, 2022
@ciampo
Copy link
Contributor

ciampo commented Aug 24, 2022

I realized that the props applied conditionally by the useBlockToolbarPopoverProps only make sense when the toolbar has a top or bottom placement — should we add placement: 'top-start' to the props returned by that hook?

@mtias
Copy link
Member

mtias commented Sep 10, 2022

Thanks for addressing this little obnoxious issue :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Blocks Overall functionality of blocks [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Block Toolbar Regression - Toolbar obstructs selected blocks.
4 participants