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

Improve Block Toolbar Semantics/Accessibility #54513

Closed
wants to merge 60 commits into from

Conversation

jeryj
Copy link
Contributor

@jeryj jeryj commented Sep 15, 2023

Fixes #53013 and #45767. Likely others too.

All mouse + visual placements should be the same as in trunk.

This is a big commit with a large potential for bugs.

TODOs:

  • Refactor shared code between empty-block-inserter and selected-block-tools
  • Semantically group all document and block tools into the header
  • escape via entire visual header as well as block and rich text toolbars (for when the editor is loaded without the WP chrome) : Focus loss when closing the block toolbar with the Escape key #45767
  • Communicate rich text and block toolbar relationship better. Combine them?
  • Notice/announcement for first time focusing the block tools from the shortcut
  • Inline Tools either move to the top toolbar or get inserted into the main block toolbar (think image caption formatting tools)
  • Communicate that Tab/Shift+Tab can navigate between different toolbars, potentially via a dismissible notice the first time focus is moved into it via the shortcut: "Tip: Press Tab/Shift+Tab to navigate to other toolbars, and press Escape to return focus to the editor"
  • Visual styles for the top toolbar:
    • Site Editor: When top toolbar is expanded, hide the central command + k button
    • Post Editor: When top toolbar is expanded at smaller screens, block toolbar should scroll the overflow so it's available but hidden.
    • On smaller screens, top toolbar should push down the editor canvas.
  • Update broken tests
  • Add tests for escape keypress to return focus to editor
  • Address shared naming of slots between packages
  • Fix select mode

What?

This PR refactors how the block toolbar structure works to be more like a classic word editor where alt + f10 moves you to all of the block tools. An escape keypress would bring you back to where you were in the editor.

Why?

  • Find a more accessible implementation of the toolbars that can be better communicated to AT.
  • Address major pain points from the Top Toolbar implementation (tracking: Tracking: Top Toolbar Improvements #47723) due to absolutely positioning the block tools in the header.

How?

  • If there is a __experimentalSelectedBlockTools slot in the header, then render the selected block tools as a fill in that slot.
  • Add a lastFocus state of the editor canvas in block editor store to save the last focus position of the block editor when focus leaves the canvas.
  • Removes bubblesVirtually from the BlockControls slot so the NavigableToolbar can handle the escape keypress to return focus to the editor. Otherwise, due to how React Portals bubble via the React Tree instead of the DOM, the unselect shortcut catches the keypress before the NavigableToolbar. If this isn't a valid approach, then there are two others documented:
  • Lots of Fixed Top Toolbar CSS refactoring due to the block tools being rendered within the header (a good thing).

Potential Follow-ups

I don't want to include these in this PR, as it's already so large, but these are identified issues for potential follow-ups afterwards:

  • Big win: Implement tab keypress indentation for rich text blocks and indenting list items. Example: 25a79f2
  • Shortcut to return focus to the block from anywhere outside the block toolbar. Example: c3c76b9
  • For Top Toolbar, should the Select popover appear in the top toolbar or as a popover?
  • alt + f10 should preserve toolbar button roving tabindex
  • Bring back the Navigation Mode button that is removed when Top Toolbar setting is on (Update fixed block toolbar #52123). The top toolbar now overflow scrolls via CSS instead of a JS calculation, so depending on what we want to prioritize, we could add that button back.

Testing Instructions

Visual and mouse interactions should all be identical to trunk for both Top Toolbar and the default floating block toolbar. Ideally, you don't notice any changes.

Testing Instructions for Keyboard

Combined Toolbar Controls

  • The block toolbar is now always positioned within the header toolbar, even if it is visually floating next to a block.
  • Edit a block
  • Press alt + f10to reach the block toolbar
  • Shift + tab should focus the document tools
  • Tab should move focus back to the selected block toolbar

Focusing the block toolbar

  • Press alt + f10 to reach the block toolbar
  • This should work from anywhere in or outside of the editor, no change from trunk

Returning focus to the block

  • Edit a block
  • Press alt + f10 to reach the block toolbar
  • Press escape to return the caret to the same place in the editor
  • This currently does not have a "reset" so if you tab off and back into the block toolbar, an escape keypress will still return you to the editor canvas.

Related PRs

  • Improve Block Toolbar Semantics: Divergent Block Tool DOM #55223: The top toolbar has a Slot within the header. If the Top Toolbar setting is on, then the block tools are rendered within the header DOM. If the Top Toolbar setting is off, then the block toolbar is rendered within the editor canvas DOM as on trunk and the Shift + Tab behavior to reach the toolbar is preserved.

@aristath
Copy link
Member

cc @afercia

@afercia afercia added the [Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). label Sep 18, 2023
@afercia
Copy link
Contributor

afercia commented Sep 18, 2023

Added the Accessibility label so that this gets into the radar of other contributors willing to have a look into it. Cc @alexstine

@afercia
Copy link
Contributor

afercia commented Sep 19, 2023

Thanks @jeryj for your effort with fixing the DOM order of the toolbar and improving the intereaction. I tested a bit this PR in the Post Editor and I'd think it's moving in a good direction. Some of the changes here are necessary to fix the accessibility breakage introduced in #52123 and I'd encourage anyone to help this PR move on.

There are a few things to consider though.

First of all, it is necessary to preserve some affordance and always provide a consistent mechanism to move / exit the block toolbar. So far, the convention in the editor is that when editing a block:

  • Shift+Tab moves focus to the Block toolbar. This is the most intuitive interaction and needs to be preserved. Alt+F10 is good to keep but it was implemented only to keep a consistent behavior with the classic editor.
  • Escape moves focus from the Block toolbar to the edited block.

There's a lot of different modes to take into account and I do realize such a big change is complex. So far I noticed a few things that don't work as expected. Trying to summarize:

Default (top toolbar not enabled)

Select mode

  • Tab moves to the next block: it worls.
  • Shift+Tab moves to the previous block: it worls.
  • Right and Left arrow keys move through nested blocks: it worls. However when using a screen reader, Right and Left arrow keys are intercecpted by the screen reaer so this will not work. Users would have to force the screen reader to focus mode, which is unexpected. We should find a way to make screen readers switch to focus mode or use a different keyboard shortcut or entirely rethink the navigation to nested blocks.

Edit mode

  • Tab moves to the Settings panelL it works.
  • Shift+Tab moves to the floating block toolbar: it does not work. Unexpectedly, focus moves to the Options button in the top bar. Instead, Shift+Tab should always move focus to the block toolbar, regardless whether the fixed toolbar is enabled or not.

RIght now, in this PR the Shift+Tab order is the one illustrated in the screenshot below:

Screenshot 2023-09-19 at 09 37 43

From the edited block:

  • Shift+Tab: moves focus to the Options button: Not OK.
  • After tabbing backwards through all the buttons: Options, Settings, Publish etc...
  • Shift+Tab again: moves focus to the Block toolbar: Not OK.
  • Shift+Tab again: moves focus to the Document tools toolbar: Not OK.

The ordeer should be:
Block toolbar > all the Options, Settings, Publish, etc. buttons > Document toolt toolbar.

Top toolbar enabled

  • The Tools icon in the top bar (ToolSelector) is not rendered. Not sure why, it is another chante that originates from Update fixed block toolbar #52123. Please restore it.
  • Select mode doesn't seem to work correctly:
    • Click on a paragraph block and edit it. You are now in Edit mode.
    • Press Escape: The editor should switch to Select mode. Instead, it's still in Edit mode.
    • Press Tab or Shift+Tab: the next or previous blocks should be selected, instead it does not work.

Basically, navigation through the blocks in Select mode seems broken in this PR.

Edit mode

What Shift+Tab should do from an edited block? Visually, the Document tools toolbar and the Block tools toolbar look like a unique toolbad. However, they are still separated. They are two separated ARIA toolbars.

  • Should focus move to the Block toolbar? I'd think it is unexpected to see focus land in the middle of a series of buttons.
  • Should focus move to the Document toolbar? Visually, it would be more intuitive.

However, when the Top bar is enabled, does it really make sense to have two separated ARIA toolbars? Seantically, DOcument tools and Block tools have.a different purpose and belong to a different context. However, the real advantage of the ARIA toolbar pattern is to reduce the amount of tab stops. As such, I'd recommend to try to combine Document and Block tools in only one ARIA toolbar:

  • All the block controls should be added to the Document tools toolbar.
  • The Document toolbar should be renamed to somethign more generic, as it now contains both document-level and block-level controls.
  • Shift+Tab should move focus to the unified toolbar, preserving all the expected interaction:
    • Roving tabindex.
    • RIght arrow key moves focus to next control.
    • Left arrow key moves focus to next control.
    • End key moves focus to last control.
    • Home key moves focus to last control.
    • When on the last / first control, arrow keys cycle to first / last control

Things that need more accessibility thoughts

Tab/Shift+Tab can navigate between different toolbars,

I'm a bit thorn on this. While on one hand it could help, on the other hand it could be very unexpected interaction. I'd like to see this idea considered carefully by the accessibility team cc @alexstine @joedolson

Show block tools / Hide block tools buttons in the Top toolbar

These buttons and the underlying functionality are something I'd really like to be reconsidered. I'm not sure hiding UI controls just because there's not enough space and making the reappaer on request is any goof from an usability and accessibility perspective. The root problem is that the UI doesn't provide enough space. Hiding or squeesing content just to make it fit into a limited space is what I'd consider an anti-pattern and generally not a great idea. The root problem should be solved instead. I'd say the current implementation cures the symptom rather than the actual disease.

Visual breakage in the Post editor

Right now, looks like the Block toolbar in the Top toolbar has some max-widht applied os some other CSS that limits its width and makes only a few button appears. When arrowing through thte buttons, a horizontal scrollbar appears. See animated GIF below:

top toolbar

@alexstine
Copy link
Contributor

I think the Alt+F10 shortcut is a well established pattern in not only editing programs but a good majority of online editors. I disagree that Shift+Tab should move to the options button but I also disagree that Shift+Tab should move to the block toolbar by default. I want Shift+Tab/Tab reserved for in-block actions and if you want to move to other parts of the editor, there is region navigation/landmarks for that. This is a common pattern that Slack and Microsoft Teams alike have started to implement. Keeping the Tab/Shift+Tab keys constrained to content within a region and drawing hard separation for how you move around the application. It takes a little bit for users to learn these new interactions, but it is far more stable in the long term.

As far as screen readers switching modes in navigation mode, this is expected and not a bug from this PR. It has happened for the longest time now which is why I'm in favor of stripping this feature out completely. The only way to prevent it would be to wrap it in role="application". NVDA will always switch modes when it comes in contact with a button unless you manually force it not to. Its a bug.

We currently have the problem of pressing Shift+Tab/Tab to navigate toolbars. I think, now that all 3 toolbars could appear in the same DOM position, we can add instructional nags to let users know how to switch between them. Having all these different toolbars everywhere is not working out and it does not mirror other editing applications where there is one huge toolbar. I would much rather there be just one toolbar but if the comprimise is combining all the toolbars and then giving users some education on how to navigate them, that works as well.

@jeryj
Copy link
Contributor Author

jeryj commented Sep 19, 2023

@afercia Thank you for the detailed review and sharing so many high-level thoughts! I appreciate you testing it, and I hope it was clear enough that I know this has plenty of work left on it. I'm still working on the CSS for the top toolbar.

I think for this PR, and to establish the direction of the next pieces, we need to focus on: Do we need to preserve Shift + Tab for moving to the toolbar or can we move away from this pattern and rely on alt + f10 to move to the toolbar?

If we can reach agreement on what to do with that, then I think it'll be easier to discuss all the other things as follow-up conversations, like if we need to merge the document and block tools into one toolbar, etc.

@@ -42,7 +42,7 @@ export default function BlockControlsSlot( { group = 'default', ...props } ) {
return null;
}

const slot = <Slot { ...props } bubblesVirtually fillProps={ fillProps } />;
Copy link
Contributor Author

Choose a reason for hiding this comment

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

We need to validate this approach of removing bubblesVirtually from BlockControl slot fills so we can bubble the escape keypress. If this is fine, then it would also allow introducing priority ordering to Block toolbar items. If not, then we can use one of the other approaches documented in #53779.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Not valid. It causes an issue with buttons being added to the navigable toolbar after render (such as the apply and cancel buttons when cropping an image) don't get event listeners applied to them.

@github-actions
Copy link

github-actions bot commented Sep 28, 2023

Size Change: +92 B (0%)

Total Size: 1.65 MB

Filename Size Change
build/block-editor/index.min.js 218 kB +54 B (0%)
build/components/index.min.js 249 kB +34 B (0%)
build/customize-widgets/style-rtl.css 1.43 kB -74 B (-5%)
build/customize-widgets/style.css 1.43 kB -73 B (-5%)
build/edit-post/index.min.js 35.7 kB +52 B (0%)
build/edit-post/style-rtl.css 7.82 kB -61 B (-1%)
build/edit-post/style.css 7.82 kB -54 B (-1%)
build/edit-site/index.min.js 205 kB +354 B (0%)
build/edit-site/style-rtl.css 14.2 kB -33 B (0%)
build/edit-site/style.css 14.2 kB -27 B (0%)
build/edit-widgets/index.min.js 17.1 kB +108 B (+1%)
build/edit-widgets/style-rtl.css 4.75 kB -99 B (-2%)
build/edit-widgets/style.css 4.75 kB -89 B (-2%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 964 B
build/annotations/index.min.js 2.71 kB
build/api-fetch/index.min.js 2.29 kB
build/autop/index.min.js 2.11 kB
build/blob/index.min.js 461 B
build/block-directory/index.min.js 7.25 kB
build/block-directory/style-rtl.css 1.04 kB
build/block-directory/style.css 1.04 kB
build/block-editor/content-rtl.css 4.28 kB
build/block-editor/content.css 4.27 kB
build/block-editor/default-editor-styles-rtl.css 403 B
build/block-editor/default-editor-styles.css 403 B
build/block-editor/style-rtl.css 15.6 kB
build/block-editor/style.css 15.6 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 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 138 B
build/block-library/blocks/audio/theme.css 138 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 587 B
build/block-library/blocks/button/editor.css 587 B
build/block-library/blocks/button/style-rtl.css 633 B
build/block-library/blocks/button/style.css 632 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 421 B
build/block-library/blocks/columns/style.css 421 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 647 B
build/block-library/blocks/cover/editor.css 650 B
build/block-library/blocks/cover/style-rtl.css 1.7 kB
build/block-library/blocks/cover/style.css 1.69 kB
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 B
build/block-library/blocks/details/style-rtl.css 98 B
build/block-library/blocks/details/style.css 98 B
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 138 B
build/block-library/blocks/embed/theme.css 138 B
build/block-library/blocks/file/editor-rtl.css 316 B
build/block-library/blocks/file/editor.css 316 B
build/block-library/blocks/file/style-rtl.css 311 B
build/block-library/blocks/file/style.css 312 B
build/block-library/blocks/file/view.min.js 321 B
build/block-library/blocks/footnotes/style-rtl.css 201 B
build/block-library/blocks/footnotes/style.css 199 B
build/block-library/blocks/form-input/editor-rtl.css 229 B
build/block-library/blocks/form-input/editor.css 228 B
build/block-library/blocks/form-input/style-rtl.css 343 B
build/block-library/blocks/form-input/style.css 343 B
build/block-library/blocks/form-submission-notification/editor-rtl.css 343 B
build/block-library/blocks/form-submission-notification/editor.css 342 B
build/block-library/blocks/form-submit-button/style-rtl.css 69 B
build/block-library/blocks/form-submit-button/style.css 69 B
build/block-library/blocks/form/view.min.js 452 B
build/block-library/blocks/freeform/editor-rtl.css 2.61 kB
build/block-library/blocks/freeform/editor.css 2.61 kB
build/block-library/blocks/gallery/editor-rtl.css 957 B
build/block-library/blocks/gallery/editor.css 962 B
build/block-library/blocks/gallery/style-rtl.css 1.55 kB
build/block-library/blocks/gallery/style.css 1.55 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 654 B
build/block-library/blocks/group/editor.css 654 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 189 B
build/block-library/blocks/heading/style.css 189 B
build/block-library/blocks/html/editor-rtl.css 340 B
build/block-library/blocks/html/editor.css 341 B
build/block-library/blocks/image/editor-rtl.css 834 B
build/block-library/blocks/image/editor.css 833 B
build/block-library/blocks/image/style-rtl.css 1.48 kB
build/block-library/blocks/image/style.css 1.47 kB
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/image/view.min.js 1.93 kB
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 505 B
build/block-library/blocks/media-text/style.css 503 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 671 B
build/block-library/blocks/navigation-link/editor.css 672 B
build/block-library/blocks/navigation-link/style-rtl.css 103 B
build/block-library/blocks/navigation-link/style.css 103 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation/editor-rtl.css 2.26 kB
build/block-library/blocks/navigation/editor.css 2.26 kB
build/block-library/blocks/navigation/style-rtl.css 2.26 kB
build/block-library/blocks/navigation/style.css 2.25 kB
build/block-library/blocks/navigation/view.min.js 1.02 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 401 B
build/block-library/blocks/page-list/editor.css 401 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 235 B
build/block-library/blocks/paragraph/editor.css 235 B
build/block-library/blocks/paragraph/style-rtl.css 335 B
build/block-library/blocks/paragraph/style.css 335 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 508 B
build/block-library/blocks/post-comments-form/style.css 508 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 588 B
build/block-library/blocks/post-featured-image/editor.css 586 B
build/block-library/blocks/post-featured-image/style-rtl.css 345 B
build/block-library/blocks/post-featured-image/style.css 345 B
build/block-library/blocks/post-navigation-link/style-rtl.css 215 B
build/block-library/blocks/post-navigation-link/style.css 214 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 409 B
build/block-library/blocks/post-template/style.css 408 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 69 B
build/block-library/blocks/post-time-to-read/style.css 69 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 125 B
build/block-library/blocks/preformatted/style.css 125 B
build/block-library/blocks/pullquote/editor-rtl.css 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 335 B
build/block-library/blocks/pullquote/style.css 335 B
build/block-library/blocks/pullquote/theme-rtl.css 168 B
build/block-library/blocks/pullquote/theme.css 168 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 288 B
build/block-library/blocks/query-pagination/style.css 284 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 486 B
build/block-library/blocks/query/editor.css 486 B
build/block-library/blocks/query/style-rtl.css 375 B
build/block-library/blocks/query/style.css 372 B
build/block-library/blocks/query/view.min.js 609 B
build/block-library/blocks/quote/style-rtl.css 222 B
build/block-library/blocks/quote/style.css 222 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 149 B
build/block-library/blocks/rss/editor.css 149 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 184 B
build/block-library/blocks/search/editor.css 184 B
build/block-library/blocks/search/style-rtl.css 613 B
build/block-library/blocks/search/style.css 613 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/search/view.min.js 471 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 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 329 B
build/block-library/blocks/shortcode/editor.css 329 B
build/block-library/blocks/site-logo/editor-rtl.css 760 B
build/block-library/blocks/site-logo/editor.css 760 B
build/block-library/blocks/site-logo/style-rtl.css 204 B
build/block-library/blocks/site-logo/style.css 204 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 682 B
build/block-library/blocks/social-links/editor.css 681 B
build/block-library/blocks/social-links/style-rtl.css 1.45 kB
build/block-library/blocks/social-links/style.css 1.45 kB
build/block-library/blocks/spacer/editor-rtl.css 359 B
build/block-library/blocks/spacer/editor.css 359 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 432 B
build/block-library/blocks/table/editor.css 432 B
build/block-library/blocks/table/style-rtl.css 646 B
build/block-library/blocks/table/style.css 645 B
build/block-library/blocks/table/theme-rtl.css 157 B
build/block-library/blocks/table/theme.css 157 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 403 B
build/block-library/blocks/template-part/editor.css 403 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/term-description/style-rtl.css 111 B
build/block-library/blocks/term-description/style.css 111 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 191 B
build/block-library/blocks/video/style.css 191 B
build/block-library/blocks/video/theme-rtl.css 139 B
build/block-library/blocks/video/theme.css 139 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.11 kB
build/block-library/common.css 1.11 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 12.4 kB
build/block-library/editor.css 12.4 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 211 kB
build/block-library/reset-rtl.css 472 B
build/block-library/reset.css 472 B
build/block-library/style-rtl.css 14.4 kB
build/block-library/style.css 14.4 kB
build/block-library/theme-rtl.css 700 B
build/block-library/theme.css 705 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/blocks/index.min.js 51.5 kB
build/commands/index.min.js 15.5 kB
build/commands/style-rtl.css 947 B
build/commands/style.css 942 B
build/components/style-rtl.css 11.9 kB
build/components/style.css 11.9 kB
build/compose/index.min.js 12.7 kB
build/core-commands/index.min.js 2.72 kB
build/core-data/index.min.js 70.8 kB
build/customize-widgets/index.min.js 12 kB
build/data-controls/index.min.js 651 B
build/data/index.min.js 8.78 kB
build/date/index.min.js 17.9 kB
build/deprecated/index.min.js 462 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.68 kB
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/editor/index.min.js 45.9 kB
build/editor/style-rtl.css 3.58 kB
build/editor/style.css 3.58 kB
build/element/index.min.js 4.87 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 7.8 kB
build/format-library/style-rtl.css 577 B
build/format-library/style.css 577 B
build/hooks/index.min.js 1.57 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.61 kB
build/interactivity/index.min.js 11.4 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.76 kB
build/keycodes/index.min.js 1.9 kB
build/list-reusable-blocks/index.min.js 2.21 kB
build/list-reusable-blocks/style-rtl.css 865 B
build/list-reusable-blocks/style.css 865 B
build/media-utils/index.min.js 2.92 kB
build/notices/index.min.js 964 B
build/nux/index.min.js 2.01 kB
build/nux/style-rtl.css 775 B
build/nux/style.css 771 B
build/patterns/index.min.js 4.51 kB
build/patterns/style-rtl.css 518 B
build/patterns/style.css 517 B
build/plugins/index.min.js 1.81 kB
build/preferences-persistence/index.min.js 1.85 kB
build/preferences/index.min.js 1.26 kB
build/primitives/index.min.js 994 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 988 B
build/react-i18n/index.min.js 631 B
build/react-refresh-entry/index.min.js 9.46 kB
build/react-refresh-runtime/index.min.js 6.78 kB
build/redux-routine/index.min.js 2.71 kB
build/reusable-blocks/index.min.js 2.73 kB
build/reusable-blocks/style-rtl.css 265 B
build/reusable-blocks/style.css 265 B
build/rich-text/index.min.js 10.2 kB
build/router/index.min.js 1.79 kB
build/server-side-render/index.min.js 1.96 kB
build/shortcode/index.min.js 1.4 kB
build/style-engine/index.min.js 1.98 kB
build/token-list/index.min.js 587 B
build/url/index.min.js 3.83 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 967 B
build/warning/index.min.js 259 B
build/widgets/index.min.js 7.18 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.03 kB

compressed-size-action

Copy link
Contributor

@draganescu draganescu left a comment

Choose a reason for hiding this comment

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

Testing this with no assistive tech is flawless - same behavior as the current trunk.

I personally like the select toolbar shortcut and the fact that this PR "frees" the TAB key for text while in text editing modality.

isCollapsed,
isFullscreen,
blockType,
] );
Copy link
Contributor

Choose a reason for hiding this comment

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

beautiful red.

};
}

function EmptyBlockInserter( {
Copy link
Contributor

Choose a reason for hiding this comment

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

This needs documentation. What is it for?

{ ...popoverProps }
>
<div className="block-editor-block-list__empty-block-inserter">
<Inserter
Copy link
Contributor

Choose a reason for hiding this comment

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

Oh, this is the [+] in an empty block?

This is a tricky one. To hide the popover behind the header when it's within the header DOM means we need to have something within the header with a higher z-index for the popover to hide behind. Everything else in the header needs a high z index to be be on top of the header.
Adding position absolute to all instances of __background-style lets it be excluded from all flexbox calculations, which is what we want. If the div is empty, it still gets calculated and pushes elements around.
This test was already covered well by 'ensures base block toolbars use roving tabindex'
This method requires forwarding a ref from the editor level down to the navigable toolbar so that the escape unselect shortcut can be blocked and the navigable toolbar event listener will still fire.

Blocking the global escape event shouldn't be necessary, but we have a combination of a few things all combining to create a situation where:
- Because the block toolbar uses createPortal to populate the block toolbar fills, we can't rely on the React event bubbling to hit the onKeyDown listener for the block toolbar
- Since we can't use the React tree, we use the DOM tree which _should_ handle the event bubbling correctly from a `createPortal` element.
- This bubbles via the React tree, which hits this `unselect` escape keypress before the block toolbar DOM event listener has access to it.

Also, this is better than attaching it to all of the children in the block toolbar because when new items are attached to the toolbar (such as via the bubblesVirtually slots or the apply/cancel buttons when cropping an image) we can still catch the events. Otherwise, those buttons are added after the mount, and the children don't receive the listener.
@jeryj
Copy link
Contributor Author

jeryj commented Oct 16, 2023

My thoughts on getting this to a mergeable state:

  • Pick up Improve Block Toolbar Semantics: Divergent Block Tool DOM #55223, as a "Top Toolbar Refactor," so the PR is more isolated on improving the top toolbar DOM experience. This would leave the trunk interaction for the popover the same. In fact, the only differences between that PR and trunk would be:

  • Top Toolbar rendered within the header DOM

  • Removes shift+tab and tab interaction from the top toolbar so focus order matches visual order

  • add escape keypress to return from the selected block toolbar (popover or top toolbar)

Follow-up PRs:

  • Wrap headers in role=menubar.
  • Add escape keypress for entire header to return focus to the block editor
  • Add shortcut for moving focus to the last focus from anywhere in the block editor chrome
  • Discuss/address shift + tab from the popover. I'm still not sure how to best resolve this part, but don't want this to hold up all the other, real and relevant improvements.

The work for the follow-up PRs is basically done as well, so there aren't technical hold-ups to any of them. The only hold-up is agreeing on a route. I think going this route will help us reach mergeable states faster and allow us to have more productive conversations about each topic.

@alexstine
Copy link
Contributor

Agreed. 👍

shouldUseKeyboardFocusShortcut = true,
__experimentalInitialIndex: initialIndex,
__experimentalOnIndexChange: onIndexChange,
handleOnKeyDown,
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Remove this prop -- looks unused.

@jeryj
Copy link
Contributor Author

jeryj commented Nov 7, 2023

Closing in favor of #55787

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes).
Projects
Development

Successfully merging this pull request may close these issues.

Top toolbar improvements follow up
5 participants