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

Stacked/unified block toolbar #31134

Merged
merged 3 commits into from
May 7, 2021
Merged

Conversation

ellatrix
Copy link
Member

@ellatrix ellatrix commented Apr 23, 2021

Description

Best reviewed without whitespace changes.

Alternative to #30234.
Also fixes #26114, a long standing accessibility issue with the inline rich text toolbar.

Also unifies toolbar APIs under one simple <BlockTools /> component and removes the need for implementors to render a dedicated block toolbar popover slot.

unified-toolbar

How has this been tested?

Screenshots

Types of changes

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

@github-actions
Copy link

github-actions bot commented Apr 23, 2021

Size Change: -1.02 kB (0%)

Total Size: 1.31 MB

Filename Size Change
build/block-directory/index.js 6.6 kB +1 B (0%)
build/block-editor/index.js 116 kB +134 B (0%)
build/block-editor/style-rtl.css 13 kB -42 B (0%)
build/block-editor/style.css 13 kB -40 B (0%)
build/block-library/index.js 142 kB -10 B (0%)
build/components/index.js 186 kB +59 B (0%)
build/customize-widgets/index.js 5.79 kB -27 B (0%)
build/customize-widgets/style-rtl.css 698 B +9 B (+1%)
build/customize-widgets/style.css 699 B +9 B (+1%)
build/edit-navigation/index.js 13.6 kB -69 B (-1%)
build/edit-navigation/style-rtl.css 2.81 kB -72 B (-2%)
build/edit-navigation/style.css 2.81 kB -73 B (-3%)
build/edit-post/index.js 333 kB -161 B (0%)
build/edit-post/style-rtl.css 6.79 kB -187 B (-3%)
build/edit-post/style.css 6.78 kB -183 B (-3%)
build/edit-site/index.js 26.1 kB -69 B (0%)
build/edit-site/style-rtl.css 4.79 kB -113 B (-2%)
build/edit-site/style.css 4.78 kB -113 B (-2%)
build/edit-widgets/index.js 12.6 kB -35 B (0%)
build/edit-widgets/style-rtl.css 2.96 kB -16 B (-1%)
build/edit-widgets/style.css 2.96 kB -16 B (-1%)
build/editor/index.js 60.5 kB -6 B (0%)
build/format-library/index.js 5.68 kB +1 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.11 kB 0 B
build/annotations/index.js 2.93 kB 0 B
build/api-fetch/index.js 2.42 kB 0 B
build/autop/index.js 2.28 kB 0 B
build/blob/index.js 673 B 0 B
build/block-directory/style-rtl.css 993 B 0 B
build/block-directory/style.css 995 B 0 B
build/block-library/blocks/archives/editor-rtl.css 61 B 0 B
build/block-library/blocks/archives/editor.css 60 B 0 B
build/block-library/blocks/audio/editor-rtl.css 58 B 0 B
build/block-library/blocks/audio/editor.css 58 B 0 B
build/block-library/blocks/audio/style-rtl.css 112 B 0 B
build/block-library/blocks/audio/style.css 112 B 0 B
build/block-library/blocks/block/editor-rtl.css 161 B 0 B
build/block-library/blocks/block/editor.css 161 B 0 B
build/block-library/blocks/button/editor-rtl.css 475 B 0 B
build/block-library/blocks/button/editor.css 474 B 0 B
build/block-library/blocks/button/style-rtl.css 515 B 0 B
build/block-library/blocks/button/style.css 515 B 0 B
build/block-library/blocks/buttons/editor-rtl.css 315 B 0 B
build/block-library/blocks/buttons/editor.css 315 B 0 B
build/block-library/blocks/buttons/style-rtl.css 368 B 0 B
build/block-library/blocks/buttons/style.css 368 B 0 B
build/block-library/blocks/calendar/style-rtl.css 208 B 0 B
build/block-library/blocks/calendar/style.css 208 B 0 B
build/block-library/blocks/categories/editor-rtl.css 84 B 0 B
build/block-library/blocks/categories/editor.css 83 B 0 B
build/block-library/blocks/categories/style-rtl.css 79 B 0 B
build/block-library/blocks/categories/style.css 79 B 0 B
build/block-library/blocks/code/style-rtl.css 90 B 0 B
build/block-library/blocks/code/style.css 90 B 0 B
build/block-library/blocks/columns/editor-rtl.css 190 B 0 B
build/block-library/blocks/columns/editor.css 190 B 0 B
build/block-library/blocks/columns/style-rtl.css 422 B 0 B
build/block-library/blocks/columns/style.css 422 B 0 B
build/block-library/blocks/cover/editor-rtl.css 603 B 0 B
build/block-library/blocks/cover/editor.css 604 B 0 B
build/block-library/blocks/cover/style-rtl.css 1.22 kB 0 B
build/block-library/blocks/cover/style.css 1.22 kB 0 B
build/block-library/blocks/embed/editor-rtl.css 486 B 0 B
build/block-library/blocks/embed/editor.css 486 B 0 B
build/block-library/blocks/embed/style-rtl.css 401 B 0 B
build/block-library/blocks/embed/style.css 400 B 0 B
build/block-library/blocks/file/editor-rtl.css 301 B 0 B
build/block-library/blocks/file/editor.css 300 B 0 B
build/block-library/blocks/file/frontend.js 773 B 0 B
build/block-library/blocks/file/style-rtl.css 255 B 0 B
build/block-library/blocks/file/style.css 255 B 0 B
build/block-library/blocks/freeform/editor-rtl.css 2.45 kB 0 B
build/block-library/blocks/freeform/editor.css 2.45 kB 0 B
build/block-library/blocks/gallery/editor-rtl.css 704 B 0 B
build/block-library/blocks/gallery/editor.css 705 B 0 B
build/block-library/blocks/gallery/style-rtl.css 1.06 kB 0 B
build/block-library/blocks/gallery/style.css 1.05 kB 0 B
build/block-library/blocks/group/editor-rtl.css 160 B 0 B
build/block-library/blocks/group/editor.css 160 B 0 B
build/block-library/blocks/group/style-rtl.css 57 B 0 B
build/block-library/blocks/group/style.css 57 B 0 B
build/block-library/blocks/heading/editor-rtl.css 129 B 0 B
build/block-library/blocks/heading/editor.css 129 B 0 B
build/block-library/blocks/heading/style-rtl.css 76 B 0 B
build/block-library/blocks/heading/style.css 76 B 0 B
build/block-library/blocks/html/editor-rtl.css 281 B 0 B
build/block-library/blocks/html/editor.css 281 B 0 B
build/block-library/blocks/image/editor-rtl.css 717 B 0 B
build/block-library/blocks/image/editor.css 716 B 0 B
build/block-library/blocks/image/style-rtl.css 476 B 0 B
build/block-library/blocks/image/style.css 478 B 0 B
build/block-library/blocks/latest-comments/style-rtl.css 281 B 0 B
build/block-library/blocks/latest-comments/style.css 282 B 0 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B 0 B
build/block-library/blocks/latest-posts/editor.css 137 B 0 B
build/block-library/blocks/latest-posts/style-rtl.css 523 B 0 B
build/block-library/blocks/latest-posts/style.css 522 B 0 B
build/block-library/blocks/legacy-widget/editor-rtl.css 557 B 0 B
build/block-library/blocks/legacy-widget/editor.css 557 B 0 B
build/block-library/blocks/list/style-rtl.css 63 B 0 B
build/block-library/blocks/list/style.css 63 B 0 B
build/block-library/blocks/media-text/editor-rtl.css 176 B 0 B
build/block-library/blocks/media-text/editor.css 176 B 0 B
build/block-library/blocks/media-text/style-rtl.css 492 B 0 B
build/block-library/blocks/media-text/style.css 489 B 0 B
build/block-library/blocks/more/editor-rtl.css 434 B 0 B
build/block-library/blocks/more/editor.css 434 B 0 B
build/block-library/blocks/navigation-link/editor-rtl.css 617 B 0 B
build/block-library/blocks/navigation-link/editor.css 619 B 0 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B 0 B
build/block-library/blocks/navigation-link/style.css 94 B 0 B
build/block-library/blocks/navigation/editor-rtl.css 1.32 kB 0 B
build/block-library/blocks/navigation/editor.css 1.31 kB 0 B
build/block-library/blocks/navigation/style-rtl.css 1.27 kB 0 B
build/block-library/blocks/navigation/style.css 1.27 kB 0 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B 0 B
build/block-library/blocks/nextpage/editor.css 395 B 0 B
build/block-library/blocks/page-list/editor-rtl.css 239 B 0 B
build/block-library/blocks/page-list/editor.css 240 B 0 B
build/block-library/blocks/page-list/style-rtl.css 167 B 0 B
build/block-library/blocks/page-list/style.css 167 B 0 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B 0 B
build/block-library/blocks/paragraph/editor.css 157 B 0 B
build/block-library/blocks/paragraph/style-rtl.css 247 B 0 B
build/block-library/blocks/paragraph/style.css 248 B 0 B
build/block-library/blocks/post-author/editor-rtl.css 209 B 0 B
build/block-library/blocks/post-author/editor.css 209 B 0 B
build/block-library/blocks/post-author/style-rtl.css 183 B 0 B
build/block-library/blocks/post-author/style.css 184 B 0 B
build/block-library/blocks/post-comments-form/style-rtl.css 140 B 0 B
build/block-library/blocks/post-comments-form/style.css 140 B 0 B
build/block-library/blocks/post-content/editor-rtl.css 139 B 0 B
build/block-library/blocks/post-content/editor.css 139 B 0 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B 0 B
build/block-library/blocks/post-excerpt/editor.css 73 B 0 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B 0 B
build/block-library/blocks/post-excerpt/style.css 69 B 0 B
build/block-library/blocks/post-featured-image/editor-rtl.css 338 B 0 B
build/block-library/blocks/post-featured-image/editor.css 338 B 0 B
build/block-library/blocks/post-featured-image/style-rtl.css 100 B 0 B
build/block-library/blocks/post-featured-image/style.css 100 B 0 B
build/block-library/blocks/post-title/style-rtl.css 60 B 0 B
build/block-library/blocks/post-title/style.css 60 B 0 B
build/block-library/blocks/preformatted/style-rtl.css 103 B 0 B
build/block-library/blocks/preformatted/style.css 103 B 0 B
build/block-library/blocks/pullquote/editor-rtl.css 183 B 0 B
build/block-library/blocks/pullquote/editor.css 183 B 0 B
build/block-library/blocks/pullquote/style-rtl.css 318 B 0 B
build/block-library/blocks/pullquote/style.css 318 B 0 B
build/block-library/blocks/query-loop/editor-rtl.css 83 B 0 B
build/block-library/blocks/query-loop/editor.css 82 B 0 B
build/block-library/blocks/query-loop/style-rtl.css 315 B 0 B
build/block-library/blocks/query-loop/style.css 317 B 0 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B 0 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B 0 B
build/block-library/blocks/query-pagination/editor-rtl.css 270 B 0 B
build/block-library/blocks/query-pagination/editor.css 262 B 0 B
build/block-library/blocks/query-pagination/style-rtl.css 168 B 0 B
build/block-library/blocks/query-pagination/style.css 168 B 0 B
build/block-library/blocks/query-title/editor-rtl.css 86 B 0 B
build/block-library/blocks/query-title/editor.css 86 B 0 B
build/block-library/blocks/query/editor-rtl.css 131 B 0 B
build/block-library/blocks/query/editor.css 132 B 0 B
build/block-library/blocks/quote/style-rtl.css 169 B 0 B
build/block-library/blocks/quote/style.css 169 B 0 B
build/block-library/blocks/rss/editor-rtl.css 201 B 0 B
build/block-library/blocks/rss/editor.css 202 B 0 B
build/block-library/blocks/rss/style-rtl.css 290 B 0 B
build/block-library/blocks/rss/style.css 290 B 0 B
build/block-library/blocks/search/editor-rtl.css 189 B 0 B
build/block-library/blocks/search/editor.css 189 B 0 B
build/block-library/blocks/search/style-rtl.css 359 B 0 B
build/block-library/blocks/search/style.css 362 B 0 B
build/block-library/blocks/separator/editor-rtl.css 99 B 0 B
build/block-library/blocks/separator/editor.css 99 B 0 B
build/block-library/blocks/separator/style-rtl.css 251 B 0 B
build/block-library/blocks/separator/style.css 251 B 0 B
build/block-library/blocks/shortcode/editor-rtl.css 512 B 0 B
build/block-library/blocks/shortcode/editor.css 512 B 0 B
build/block-library/blocks/site-logo/editor-rtl.css 440 B 0 B
build/block-library/blocks/site-logo/editor.css 441 B 0 B
build/block-library/blocks/site-logo/style-rtl.css 154 B 0 B
build/block-library/blocks/site-logo/style.css 154 B 0 B
build/block-library/blocks/social-link/editor-rtl.css 164 B 0 B
build/block-library/blocks/social-link/editor.css 165 B 0 B
build/block-library/blocks/social-links/editor-rtl.css 796 B 0 B
build/block-library/blocks/social-links/editor.css 795 B 0 B
build/block-library/blocks/social-links/style-rtl.css 1.32 kB 0 B
build/block-library/blocks/social-links/style.css 1.33 kB 0 B
build/block-library/blocks/spacer/editor-rtl.css 308 B 0 B
build/block-library/blocks/spacer/editor.css 308 B 0 B
build/block-library/blocks/spacer/style-rtl.css 48 B 0 B
build/block-library/blocks/spacer/style.css 48 B 0 B
build/block-library/blocks/table/editor-rtl.css 478 B 0 B
build/block-library/blocks/table/editor.css 478 B 0 B
build/block-library/blocks/table/style-rtl.css 485 B 0 B
build/block-library/blocks/table/style.css 485 B 0 B
build/block-library/blocks/tag-cloud/editor-rtl.css 118 B 0 B
build/block-library/blocks/tag-cloud/editor.css 118 B 0 B
build/block-library/blocks/tag-cloud/style-rtl.css 94 B 0 B
build/block-library/blocks/tag-cloud/style.css 94 B 0 B
build/block-library/blocks/template-part/editor-rtl.css 551 B 0 B
build/block-library/blocks/template-part/editor.css 550 B 0 B
build/block-library/blocks/term-description/editor-rtl.css 90 B 0 B
build/block-library/blocks/term-description/editor.css 90 B 0 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B 0 B
build/block-library/blocks/text-columns/editor.css 95 B 0 B
build/block-library/blocks/text-columns/style-rtl.css 166 B 0 B
build/block-library/blocks/text-columns/style.css 166 B 0 B
build/block-library/blocks/verse/style-rtl.css 87 B 0 B
build/block-library/blocks/verse/style.css 87 B 0 B
build/block-library/blocks/video/editor-rtl.css 569 B 0 B
build/block-library/blocks/video/editor.css 570 B 0 B
build/block-library/blocks/video/style-rtl.css 169 B 0 B
build/block-library/blocks/video/style.css 169 B 0 B
build/block-library/common-rtl.css 1.26 kB 0 B
build/block-library/common.css 1.26 kB 0 B
build/block-library/editor-rtl.css 9.62 kB 0 B
build/block-library/editor.css 9.61 kB 0 B
build/block-library/reset-rtl.css 506 B 0 B
build/block-library/reset.css 507 B 0 B
build/block-library/style-rtl.css 9.45 kB 0 B
build/block-library/style.css 9.46 kB 0 B
build/block-library/theme-rtl.css 692 B 0 B
build/block-library/theme.css 693 B 0 B
build/block-serialization-default-parser/index.js 1.3 kB 0 B
build/block-serialization-spec-parser/index.js 3.06 kB 0 B
build/blocks/index.js 47 kB 0 B
build/components/style-rtl.css 16.2 kB 0 B
build/components/style.css 16.2 kB 0 B
build/compose/index.js 9.96 kB 0 B
build/core-data/index.js 12.1 kB 0 B
build/data-controls/index.js 829 B 0 B
build/data/index.js 7.23 kB 0 B
build/date/index.js 31.8 kB 0 B
build/deprecated/index.js 738 B 0 B
build/dom-ready/index.js 576 B 0 B
build/dom/index.js 4.62 kB 0 B
build/edit-post/classic-rtl.css 454 B 0 B
build/edit-post/classic.css 454 B 0 B
build/editor/style-rtl.css 3.95 kB 0 B
build/editor/style.css 3.95 kB 0 B
build/element/index.js 3.44 kB 0 B
build/escape-html/index.js 739 B 0 B
build/format-library/style-rtl.css 637 B 0 B
build/format-library/style.css 639 B 0 B
build/hooks/index.js 1.76 kB 0 B
build/html-entities/index.js 628 B 0 B
build/i18n/index.js 3.73 kB 0 B
build/is-shallow-equal/index.js 710 B 0 B
build/keyboard-shortcuts/index.js 1.65 kB 0 B
build/keycodes/index.js 1.43 kB 0 B
build/list-reusable-blocks/index.js 2.06 kB 0 B
build/list-reusable-blocks/style-rtl.css 629 B 0 B
build/list-reusable-blocks/style.css 628 B 0 B
build/media-utils/index.js 3.08 kB 0 B
build/notices/index.js 1.07 kB 0 B
build/nux/index.js 2.3 kB 0 B
build/nux/style-rtl.css 718 B 0 B
build/nux/style.css 716 B 0 B
build/plugins/index.js 2 kB 0 B
build/primitives/index.js 1.03 kB 0 B
build/priority-queue/index.js 791 B 0 B
build/react-i18n/index.js 924 B 0 B
build/redux-routine/index.js 2.82 kB 0 B
build/reusable-blocks/index.js 2.56 kB 0 B
build/reusable-blocks/style-rtl.css 225 B 0 B
build/reusable-blocks/style.css 225 B 0 B
build/rich-text/index.js 11.9 kB 0 B
build/server-side-render/index.js 1.64 kB 0 B
build/shortcode/index.js 1.68 kB 0 B
build/token-list/index.js 847 B 0 B
build/url/index.js 1.95 kB 0 B
build/viewport/index.js 1.28 kB 0 B
build/warning/index.js 1.13 kB 0 B
build/widgets/index.js 1.68 kB 0 B
build/wordcount/index.js 1.24 kB 0 B

compressed-size-action

@ellatrix ellatrix closed this Apr 23, 2021
@ellatrix ellatrix deleted the try/stacked-unified-block-toolbar branch April 23, 2021 11:53
@ellatrix ellatrix restored the try/stacked-unified-block-toolbar branch April 23, 2021 13:39
@ellatrix ellatrix reopened this Apr 23, 2021
@ellatrix ellatrix force-pushed the try/stacked-unified-block-toolbar branch from bb43d82 to 1f190db Compare April 23, 2021 13:40
@@ -34,7 +35,7 @@ function MyEditorComponent() {
onChange={ ( blocks ) => updateBlocks( blocks ) }
>
<SlotFillProvider>
<Popover.Slot name="block-toolbar" />
Copy link
Member Author

Choose a reason for hiding this comment

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

@youknowriad I think you'll be happy to see this 😄


return (
<div className="block-editor-block-contextual-toolbar-wrapper">
Copy link
Member Author

Choose a reason for hiding this comment

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

This class is not used anywhere, so it should be safe to remove this useless div.

@@ -512,6 +512,25 @@
border-right-color: $gray-900;
}

&.is-fixed {
position: sticky;
Copy link
Contributor

Choose a reason for hiding this comment

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

I feel the is-fixed styles and logic are misplaced, they make more sense in the edit-* packages because we don't really know the container here and these styles depend on their container right?

Copy link
Member Author

Choose a reason for hiding this comment

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

Sure, we could move it. I don't mind either way. sticky just falls back to being relative if there's no scroll container though.

Copy link
Member Author

Choose a reason for hiding this comment

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

For example, in the site editor there's no scroll container, but the content box below is scrollable.

@ellatrix ellatrix force-pushed the try/stacked-unified-block-toolbar branch from 27a0b7e to e7dbc43 Compare April 23, 2021 23:37
@ellatrix ellatrix requested review from nerrad and ntwb as code owners April 24, 2021 13:14
@draganescu
Copy link
Contributor

I love this so much! 👏🏻

@youknowriad youknowriad requested a review from jasmussen April 26, 2021 08:06
@jasmussen jasmussen mentioned this pull request Apr 26, 2021
7 tasks
@jasmussen
Copy link
Contributor

Thanks so much for working on this, it's a big one! Mostly I love the huge amount of red code in this one. Let me dive in.

Here's the post editor before:

post editor before

Here's after:

post editor after

Here's the site editor before:

site editor before

Here's the site editor after:

site editor after

I'm seeing one issue:

bottom padding

Note how there's always a little extra scrollspace at the bottom. I'm also seeing this in the site editor, but it's less pronounced there. Let me know if you need help debugging this.


Let's get back to the "Why" of this PR, especially if you're used to seeing this:

Screenshot 2021-04-26 at 11 04 59

Because it isn't immediately obvious why this is better:

Screenshot 2021-04-26 at 11 06 02

The empty toolbar also takes up space even when you have unselected blocks:

Screenshot 2021-04-26 at 11 06 37

Those are good questions, and they are opportunities to improve the overall design of the top toolbar. There's in fact a dedicated issue for it, #20592, wherein I think we should explore those solutions.

However here's why I think it's still important to land this PR today. Firstly, the toolbar is entirely broken in the site editor:

b

Even when the toolbar arbitrarily stacks, it covers content:

Screenshot 2021-04-26 at 11 13 56

The tabbing order is also broken as soon as stacked:

a

This PR fixes all that:

  • It doesn't cover content
  • The toolbar is consistently placed, stacked always from mobile to desktop
  • The toolbar does not get cropped
  • Tabbing order matches visual order
  • The implementation seems vastly simpler

For that reason, I'm a fan, and I think we can follow up on improving the visuals even further as part of #20592.

@ellatrix
Copy link
Member Author

It makes sense both visually, for accessibility and in the code. I'll look into the issues in a bit.

@jasmussen
Copy link
Contributor

One other thing, in the post editor, the scrollbar starts at the top:

Screenshot 2021-04-26 at 14 12 07

In the site editor, it starts under the white bar. The latter is ideal, the former less so. But I presume that if/when the iframe could land for the post editor, we'd get the latter there as well?

@ellatrix
Copy link
Member Author

@jasmussen What do you mean, do you not expect it to start at the top? There's no way to avoid that with sticky positioning. That's just how sticky works.

@ellatrix ellatrix force-pushed the try/stacked-unified-block-toolbar branch from b98040a to 0c4b6d2 Compare April 26, 2021 16:32
Copy link
Contributor

@talldan talldan left a comment

Choose a reason for hiding this comment

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

I'm definitely in favour of this, especially the removal of all those styles.

[]
);

if ( hasFixedToolbar ) {
Copy link
Contributor

@talldan talldan Apr 27, 2021

Choose a reason for hiding this comment

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

Testing this PR and on mobile viewports (with Top Toolbar disabled), there's no block toolbar.

My understanding is that the desired behavior is for the fixed toolbar to show on mobile viewports.

I think there are still a few files that have some viewport logic for hiding the floating toolbar on mobile viewports (BlockPopover, BlockToolbar).

I wonder if as much of that viewport logic could be consolidated into one place, possibly this component and this if statement.

One of the difficult parts of implementing an editor is that the mobile version of the block toolbar doesn't work out of the box, a developer has to specifically add the fixed toolbar even if they're not implementing top toolbar mode, so it'd be nice if UnifiedBlockToolbar helped solve that.

At the same time, if an implementor wants the responsiveness of the toolbar to behave differently to the post editor, that's difficult to do as the viewport logic is implicit to much of the block editor package. I think ideally BlockToolbar would be just a plain configurable toolbar that we build abstractions around.

@ellatrix
Copy link
Member Author

ellatrix commented Apr 29, 2021

@tellthemachines I have to check trunk, but the toolbar was previously fixed too, so I preserved the styling. The fixed toolbar is also not enabled there (no option and no small viewport), so I don't think sticky positioning is enabled at all.

@ellatrix ellatrix force-pushed the try/stacked-unified-block-toolbar branch 2 times, most recently from 15a5cdf to df4f39a Compare April 29, 2021 17:59
@tellthemachines
Copy link
Contributor

In trunk, the toolbar in the customizer isn't showing at all on mobile, so this PR is already an improvement on that 😄
It'll need a few styling tweaks to get it to stick to the top of the viewport, but that can be fixed separately - we already have #30720 to track it.

return (
<InsertionPoint>
{ ( hasFixedToolbar || ! isLargeViewport ) && (
Copy link
Contributor

@talldan talldan May 6, 2021

Choose a reason for hiding this comment

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

In an earlier iteration this component was just implementing the two forms of the block toolbar, and I think it was good to include the viewport logic in that iteration. The UnifiedBlockToolbar component became a convenient and quick way to implement that kind of responsive toolbar.

But now this is bundled with some pretty key functionality for the block editor it seems fairly opinionated to say that someone implementing an editor should have a fixed toolbar on small viewports.

I don't think it's a blocker, this PR still makes things much easier overall. And an implementer can still reimplement this component without the viewport code. But I think it does pose a question about whether BlockEditor should be exporting high-level or low-level components.

Copy link
Member Author

@ellatrix ellatrix May 6, 2021

Choose a reason for hiding this comment

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

We can have a prop on this component hasFixedToolbar that overrides the setting? That's easy to add. :)

Copy link
Contributor

Choose a reason for hiding this comment

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

No rush to do that right now, just some food for thought. 😄

@ellatrix ellatrix force-pushed the try/stacked-unified-block-toolbar branch from e2c2fbe to 1de2eb8 Compare May 6, 2021 10:12
Copy link
Contributor

@talldan talldan left a comment

Choose a reason for hiding this comment

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

This is working really well, great job @ellatrix 🎉

I tested back compat by reverting the navigation editor's files back to trunk and it works perfectly.

The only issue I spotted is this behaviour when there are notices with the Top Toolbar or Fixed Toolbar, which would be good to tackle in a follow up:
scrolly-toolbar

I'll go ahead and merge and follow up myself with any needed adjustments for the widgets screens.

Comment on lines +3 to +4
display: flex;
flex-flow: column;
Copy link
Contributor

Choose a reason for hiding this comment

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

It doesn't seem to cause any issues, but I couldn't quite see why this change was made.

Copy link
Member Author

Choose a reason for hiding this comment

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

flex-flow: column; is a magical way to stack elements with the total height remaining 100%. If one of the elements sets its height to 100%, it will just fill up the remaining height. Cc @jasmussen

Copy link
Contributor

Choose a reason for hiding this comment

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

Very cool indeed.

I'll keep an eye on any flex related issues that might occur from this, but in my testing this worked as intended, and it lets us avoid doing something like height: calc(100% - #{ $block-toolbar-height } ) for the canvas.

return (
<InsertionPoint>
{ ( hasFixedToolbar || ! isLargeViewport ) && (
Copy link
Contributor

Choose a reason for hiding this comment

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

No rush to do that right now, just some food for thought. 😄

@talldan talldan merged commit 57a3054 into trunk May 7, 2021
@talldan talldan deleted the try/stacked-unified-block-toolbar branch May 7, 2021 06:56
@github-actions github-actions bot added this to the Gutenberg 10.7 milestone May 7, 2021
@talldan talldan added [Package] Block editor /packages/block-editor [Type] New API New API to be used by plugin developers or package users. labels May 7, 2021
@jasmussen
Copy link
Contributor

💯

@ellatrix
Copy link
Member Author

ellatrix commented May 7, 2021

Thanks for the reviews!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Package] Block editor /packages/block-editor [Type] New API New API to be used by plugin developers or package users.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Keyboard navigation to image caption toolbar
6 participants