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

Implement roving tabindex on the header toolbar #22354

Merged
merged 9 commits into from
Jun 8, 2020

Conversation

diegohaz
Copy link
Member

@diegohaz diegohaz commented May 14, 2020

This PR is part of #18619, whose main goal is to implement roving tabindex on the @wordpress/components' Toolbar component and to use it on the header and block toolbars so they become a single tab stop as recommended by the WAI-ARIA Toolbar Pattern. Related issues are #15331 and #3383.

This PR continues the work done in #20008, but now for the header toolbar.

The GIF below demonstrates the navigation through the header toolbar with arrow keys and Tab. When using Tab, instead of navigating to the next toolbar button, it moves focus out of the toolbar. And, when pressing Shift+Tab, it moves focus back to the toolbar on the button that had focus previously:

Description above

This also works when the "Top toolbar" option is enabled and the block toolbar is appended to the header toolbar:

Description above

When the block toolbar doesn't use ToolbarButton or ToolbarItem as their buttons, which may be the case of some of our blocks and especially third party blocks, the header toolbar will fallback to the old behavior, where pressing Tab moves focus through the toolbar buttons. This is better explained on #20008.

Description above

@diegohaz diegohaz added [Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). [Status] In Progress Tracking issues with work in progress [Package] Editor /packages/editor [Package] Block editor /packages/block-editor labels May 14, 2020
@diegohaz diegohaz self-assigned this May 14, 2020
@github-actions
Copy link

github-actions bot commented May 14, 2020

Size Change: +567 B (0%)

Total Size: 1.12 MB

Filename Size Change
build/block-editor/index.js 106 kB +60 B (0%)
build/block-library/index.js 126 kB +1 B
build/components/index.js 193 kB +27 B (0%)
build/edit-navigation/index.js 8.25 kB +1 B
build/edit-post/index.js 302 kB +27 B (0%)
build/edit-post/style-rtl.css 5.6 kB +168 B (3%)
build/edit-post/style.css 5.6 kB +168 B (3%)
build/edit-site/index.js 15 kB -2 B (0%)
build/edit-widgets/index.js 8.83 kB -1 B
build/editor/index.js 44.8 kB +122 B (0%)
build/rich-text/index.js 14.8 kB -3 B (0%)
build/server-side-render/index.js 2.68 kB -1 B
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.14 kB 0 B
build/annotations/index.js 3.62 kB 0 B
build/api-fetch/index.js 3.4 kB 0 B
build/autop/index.js 2.83 kB 0 B
build/blob/index.js 620 B 0 B
build/block-directory/index.js 6.75 kB 0 B
build/block-directory/style-rtl.css 892 B 0 B
build/block-directory/style.css 892 B 0 B
build/block-editor/style-rtl.css 11.4 kB 0 B
build/block-editor/style.css 11.4 kB 0 B
build/block-library/editor-rtl.css 7.87 kB 0 B
build/block-library/editor.css 7.88 kB 0 B
build/block-library/style-rtl.css 7.69 kB 0 B
build/block-library/style.css 7.68 kB 0 B
build/block-library/theme-rtl.css 684 B 0 B
build/block-library/theme.css 686 B 0 B
build/block-serialization-default-parser/index.js 1.88 kB 0 B
build/block-serialization-spec-parser/index.js 3.1 kB 0 B
build/blocks/index.js 48.2 kB 0 B
build/components/style-rtl.css 19.5 kB 0 B
build/components/style.css 19.5 kB 0 B
build/compose/index.js 9.31 kB 0 B
build/core-data/index.js 11.4 kB 0 B
build/data-controls/index.js 1.29 kB 0 B
build/data/index.js 8.46 kB 0 B
build/date/index.js 5.47 kB 0 B
build/deprecated/index.js 771 B 0 B
build/dom-ready/index.js 568 B 0 B
build/dom/index.js 3.17 kB 0 B
build/edit-navigation/style-rtl.css 918 B 0 B
build/edit-navigation/style.css 919 B 0 B
build/edit-site/style-rtl.css 2.96 kB 0 B
build/edit-site/style.css 2.96 kB 0 B
build/edit-widgets/style-rtl.css 2.4 kB 0 B
build/edit-widgets/style.css 2.4 kB 0 B
build/editor/editor-styles-rtl.css 425 B 0 B
build/editor/editor-styles.css 428 B 0 B
build/editor/style-rtl.css 4.26 kB 0 B
build/editor/style.css 4.27 kB 0 B
build/element/index.js 4.65 kB 0 B
build/escape-html/index.js 733 B 0 B
build/format-library/index.js 7.72 kB 0 B
build/format-library/style-rtl.css 502 B 0 B
build/format-library/style.css 502 B 0 B
build/hooks/index.js 2.13 kB 0 B
build/html-entities/index.js 621 B 0 B
build/i18n/index.js 3.56 kB 0 B
build/is-shallow-equal/index.js 711 B 0 B
build/keyboard-shortcuts/index.js 2.52 kB 0 B
build/keycodes/index.js 1.94 kB 0 B
build/list-reusable-blocks/index.js 3.12 kB 0 B
build/list-reusable-blocks/style-rtl.css 226 B 0 B
build/list-reusable-blocks/style.css 226 B 0 B
build/media-utils/index.js 5.3 kB 0 B
build/notices/index.js 1.79 kB 0 B
build/nux/index.js 3.4 kB 0 B
build/nux/style-rtl.css 616 B 0 B
build/nux/style.css 613 B 0 B
build/plugins/index.js 2.56 kB 0 B
build/primitives/index.js 1.5 kB 0 B
build/priority-queue/index.js 789 B 0 B
build/redux-routine/index.js 2.85 kB 0 B
build/shortcode/index.js 1.7 kB 0 B
build/token-list/index.js 1.28 kB 0 B
build/url/index.js 4.06 kB 0 B
build/viewport/index.js 1.85 kB 0 B
build/warning/index.js 1.14 kB 0 B
build/wordcount/index.js 1.17 kB 0 B

compressed-size-action

@diegohaz diegohaz changed the title Implement roving tabindex on the top toolbar Implement roving tabindex on the header toolbar May 26, 2020
@gziolo gziolo self-requested a review May 26, 2020 14:06
@diegohaz diegohaz mentioned this pull request May 26, 2020
7 tasks
@diegohaz diegohaz marked this pull request as ready for review May 26, 2020 14:16
@diegohaz diegohaz removed the [Status] In Progress Tracking issues with work in progress label May 26, 2020
Copy link
Member

@gziolo gziolo left a comment

Choose a reason for hiding this comment

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

I need to test but it looks very good code wise. I'm surprised that it didn't require too much work to convert the header toolbar. I left some notes related to the implementation where we could consider changes to make code more concise but those aren't blockers.

@@ -24,11 +27,15 @@ function EditorHistoryRedo( { hasRedo, redo } ) {
);
}

export default compose( [
const EnhancedEditorHistoryRedo = compose( [
Copy link
Member

Choose a reason for hiding this comment

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

Have you considered refactoring this and other similar components (EditorHistoryUndo or TableOfContents) to use hooks? I think it would remove the need to use innerRef and you could apply ref directly on the component.

Copy link
Member Author

Choose a reason for hiding this comment

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

I haven't played with @wordpress/data hooks yet, but that's a good idea! Will take a note on that for a follow up PR.

Copy link
Member

Choose a reason for hiding this comment

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

Sure thing👍

/>
) }
</ToolbarItem>
{ isLargeViewport && (
Copy link
Member

Choose a reason for hiding this comment

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

I'm flagging this for myself to test what happens with focus when you change viewport of your browser and this button disappears when focused. I know it's an edge case and it might be an issue before but I'm simply curious :)

Copy link
Member

Choose a reason for hiding this comment

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

I tested it. When one of the blocks were selected before, then focus moves to the selected block 🙃

Copy link
Member

Choose a reason for hiding this comment

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

I was wrong, the blinking cursor tricked me, so the focus gets removed, and when you tab it gets restored to one of the items in the toolbar, not that bad I guess. Could Reakit move focus automatically to the next/previous item in such case or would be too far in what it should do? :)

Copy link
Member Author

Choose a reason for hiding this comment

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

In the first iterations, Reakit's Composite (and therefore Toolbar) automatically moved focus to the next/previous item when the current focused item got unmounted. Later it was changed so the previously focused item would get focus, like when you open and close a new tab on Chrome. But I haven't found enough material to support any of those approaches, and this was making the code even more complex for little gain, so I reverted it.

For now, toolbar.currentId is still set to the previously focused item, but it doesn't automatically move focus. It's up to the user to decide what to do, but I do plan to revisit it in the future.

Copy link
Member

Choose a reason for hiding this comment

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

I would expect it’s going to be tricky to handle 😅 A similar challenge is when you click a button and it should become disabled, like when triggering undo until there is nothing to undo.

In this particular case, I assume it’s fine to clean up internally Reakit’s state - that is the current value and leave the rest (focus) of handling to the implementer.

Copy link
Member

@gziolo gziolo left a comment

Choose a reason for hiding this comment

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

Everything works as expected 🎉 I tested with both the floating toolbar and the top toolbar and the header toolbar works as expected.

There are a few issues that start to become very annoying that existed before and they are now more prominent. We need to discuss which deserve their own issues to be tackled separately. Some examples:

  1. You can't use arrow down to open Tools dropdown:
    Screen Shot 2020-06-04 at 08 31 51
  2. Sometimes using the arrow up/down moves the focus to the editor and it isn't that hard to be tricked that you should use those arrows when you see movers stacker vertically:
    Screen Shot 2020-06-04 at 08 33 03
  • It feels like the editor intercepts arrow up/down when the block is selected. Actually, I can consistently reproduce it in my testing.
  1. When you open the inserter, there is no easy way to go back esc doesn't work and focus is moved to the search by default, cc @youknowriad:
    Screen Shot 2020-06-04 at 08 35 20
  • should this button have aria-pressed set in that case, or maybe aria-expand, it's tricky
  1. It's time to remove tabbing from dropdown menus and promote using arrow keys consistently :)

Copy link
Member

@gziolo gziolo left a comment

Choose a reason for hiding this comment

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

Nice improvement for those reading code with using as 👍

@@ -14,24 +14,31 @@ import warning from '@wordpress/warning';
*/
import ToolbarContext from '../toolbar-context';

function ToolbarItem( { children, ...props }, ref ) {
function ToolbarItem( { children, as: Component, ...props }, ref ) {
Copy link
Contributor

Choose a reason for hiding this comment

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

I think at some point we need to introduce consistency to our components. Some of them use "tagName", others "as". We kind maybe move to "as" as a bit nicer while maintaining fallbacks for BC.

@diegohaz diegohaz merged commit 05509fe into master Jun 8, 2020
@diegohaz diegohaz deleted the add/top-toolbar-roving-tabindex branch June 8, 2020 14:45
@github-actions github-actions bot added this to the Gutenberg 8.4 milestone Jun 8, 2020
This was referenced Jun 24, 2020
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). [Package] Block editor /packages/block-editor [Package] Editor /packages/editor
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants