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

Block Editor List View: use anchor elements instead of buttons #35655

Merged
merged 8 commits into from
Nov 25, 2021

Conversation

ramonjd
Copy link
Member

@ramonjd ramonjd commented Oct 15, 2021

Description

Resolves #11711

Related to #29733 (tracking issue) and has origins in #7142

This PR swaps out the <Button /> element with an <a />. The List View tree items are used to navigate to targets on the same page.

For more reading on Links vs Buttons see:

If you want a user to navigate to a new page or to a different target on the same page, use an anchor element .

Oct-22-2021.11-25-50.mp4

One point to consider, suggested in #7142, would be:

If the markup is changed to a hyperlink then we may need to reconsider text in the hyperlink for it to make more sense as a hyperlink.

How has this been tested?

Check that:

  • There are no glaring regressions in the UI
  • There are no regressions in keyboard navigation (Arrow/Tab keys, hitting Enter and Space). Note, seeing as we're changing the element to <a /> , focus actions are expected to be triggered using the Enter key.
  • Clicking on an item takes you to that item using the clientId anchor.

Types of changes

Markup changes to the Block List items for accessibility.

Checklist:

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

@ramonjd ramonjd added the [Status] In Progress Tracking issues with work in progress label Oct 15, 2021
@ramonjd ramonjd self-assigned this Oct 15, 2021
@github-actions
Copy link

github-actions bot commented Oct 15, 2021

Size Change: +54 B (0%)

Total Size: 1.1 MB

Filename Size Change
build/block-editor/index.min.js 139 kB +54 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 960 B
build/admin-manifest/index.min.js 1.1 kB
build/annotations/index.min.js 2.75 kB
build/api-fetch/index.min.js 2.21 kB
build/autop/index.min.js 2.12 kB
build/blob/index.min.js 459 B
build/block-directory/index.min.js 6.28 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-editor/style-rtl.css 14.4 kB
build/block-editor/style.css 14.4 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 58 B
build/block-library/blocks/audio/editor.css 58 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 470 B
build/block-library/blocks/button/editor.css 470 B
build/block-library/blocks/button/style-rtl.css 560 B
build/block-library/blocks/button/style.css 560 B
build/block-library/blocks/buttons/editor-rtl.css 291 B
build/block-library/blocks/buttons/editor.css 291 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 90 B
build/block-library/blocks/code/style.css 90 B
build/block-library/blocks/code/theme-rtl.css 134 B
build/block-library/blocks/code/theme.css 134 B
build/block-library/blocks/columns/editor-rtl.css 206 B
build/block-library/blocks/columns/editor.css 205 B
build/block-library/blocks/columns/style-rtl.css 503 B
build/block-library/blocks/columns/style.css 502 B
build/block-library/blocks/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/cover/style-rtl.css 1.19 kB
build/block-library/blocks/cover/style.css 1.19 kB
build/block-library/blocks/embed/editor-rtl.css 488 B
build/block-library/blocks/embed/editor.css 488 B
build/block-library/blocks/embed/style-rtl.css 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 322 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 977 B
build/block-library/blocks/gallery/editor.css 982 B
build/block-library/blocks/gallery/style-rtl.css 1.62 kB
build/block-library/blocks/gallery/style.css 1.62 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 159 B
build/block-library/blocks/group/editor.css 159 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 114 B
build/block-library/blocks/heading/style.css 114 B
build/block-library/blocks/home-link/style-rtl.css 247 B
build/block-library/blocks/home-link/style.css 247 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 731 B
build/block-library/blocks/image/editor.css 730 B
build/block-library/blocks/image/style-rtl.css 507 B
build/block-library/blocks/image/style.css 511 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B
build/block-library/blocks/latest-posts/editor.css 137 B
build/block-library/blocks/latest-posts/style-rtl.css 528 B
build/block-library/blocks/latest-posts/style.css 527 B
build/block-library/blocks/list/style-rtl.css 94 B
build/block-library/blocks/list/style.css 94 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 493 B
build/block-library/blocks/media-text/style.css 490 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 649 B
build/block-library/blocks/navigation-link/editor.css 650 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B
build/block-library/blocks/navigation-link/style.css 94 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/style-rtl.css 213 B
build/block-library/blocks/navigation-submenu/style.css 213 B
build/block-library/blocks/navigation-submenu/view.min.js 343 B
build/block-library/blocks/navigation/editor-rtl.css 1.89 kB
build/block-library/blocks/navigation/editor.css 1.89 kB
build/block-library/blocks/navigation/style-rtl.css 1.56 kB
build/block-library/blocks/navigation/style.css 1.55 kB
build/block-library/blocks/navigation/view.min.js 2.74 kB
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 377 B
build/block-library/blocks/page-list/editor.css 377 B
build/block-library/blocks/page-list/style-rtl.css 172 B
build/block-library/blocks/page-list/style.css 172 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 273 B
build/block-library/blocks/paragraph/style.css 273 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/style-rtl.css 444 B
build/block-library/blocks/post-comments-form/style.css 444 B
build/block-library/blocks/post-comments/style-rtl.css 492 B
build/block-library/blocks/post-comments/style.css 493 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 396 B
build/block-library/blocks/post-featured-image/editor.css 397 B
build/block-library/blocks/post-featured-image/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 391 B
build/block-library/blocks/post-template/style.css 392 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 80 B
build/block-library/blocks/post-title/style.css 80 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 378 B
build/block-library/blocks/pullquote/style.css 378 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 262 B
build/block-library/blocks/query-pagination/editor.css 255 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 131 B
build/block-library/blocks/query/editor.css 132 B
build/block-library/blocks/quote/style-rtl.css 187 B
build/block-library/blocks/quote/style.css 187 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 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 397 B
build/block-library/blocks/search/style.css 398 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 99 B
build/block-library/blocks/separator/editor.css 99 B
build/block-library/blocks/separator/style-rtl.css 245 B
build/block-library/blocks/separator/style.css 245 B
build/block-library/blocks/separator/theme-rtl.css 172 B
build/block-library/blocks/separator/theme.css 172 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 770 B
build/block-library/blocks/site-logo/editor.css 770 B
build/block-library/blocks/site-logo/style-rtl.css 165 B
build/block-library/blocks/site-logo/style.css 165 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 177 B
build/block-library/blocks/social-link/editor.css 177 B
build/block-library/blocks/social-links/editor-rtl.css 824 B
build/block-library/blocks/social-links/editor.css 823 B
build/block-library/blocks/social-links/style-rtl.css 1.32 kB
build/block-library/blocks/social-links/style.css 1.32 kB
build/block-library/blocks/spacer/editor-rtl.css 307 B
build/block-library/blocks/spacer/editor.css 307 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 471 B
build/block-library/blocks/table/editor.css 472 B
build/block-library/blocks/table/style-rtl.css 481 B
build/block-library/blocks/table/style.css 481 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 146 B
build/block-library/blocks/tag-cloud/style.css 146 B
build/block-library/blocks/template-part/editor-rtl.css 560 B
build/block-library/blocks/template-part/editor.css 559 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 569 B
build/block-library/blocks/video/editor.css 570 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 815 B
build/block-library/common.css 812 B
build/block-library/editor-rtl.css 9.84 kB
build/block-library/editor.css 9.85 kB
build/block-library/index.min.js 162 kB
build/block-library/reset-rtl.css 474 B
build/block-library/reset.css 474 B
build/block-library/style-rtl.css 10.5 kB
build/block-library/style.css 10.5 kB
build/block-library/theme-rtl.css 672 B
build/block-library/theme.css 677 B
build/block-serialization-default-parser/index.min.js 1.09 kB
build/block-serialization-spec-parser/index.min.js 2.79 kB
build/blocks/index.min.js 46.3 kB
build/components/index.min.js 214 kB
build/components/style-rtl.css 15.3 kB
build/components/style.css 15.3 kB
build/compose/index.min.js 10.9 kB
build/core-data/index.min.js 13.2 kB
build/customize-widgets/index.min.js 11.4 kB
build/customize-widgets/style-rtl.css 1.5 kB
build/customize-widgets/style.css 1.49 kB
build/data-controls/index.min.js 631 B
build/data/index.min.js 7.42 kB
build/date/index.min.js 31.5 kB
build/deprecated/index.min.js 485 B
build/dom-ready/index.min.js 304 B
build/dom/index.min.js 4.5 kB
build/edit-navigation/index.min.js 16 kB
build/edit-navigation/style-rtl.css 3.76 kB
build/edit-navigation/style.css 3.76 kB
build/edit-post/classic-rtl.css 492 B
build/edit-post/classic.css 494 B
build/edit-post/index.min.js 29.6 kB
build/edit-post/style-rtl.css 7.1 kB
build/edit-post/style.css 7.09 kB
build/edit-site/index.min.js 33.2 kB
build/edit-site/style-rtl.css 6.1 kB
build/edit-site/style.css 6.1 kB
build/edit-widgets/index.min.js 16.5 kB
build/edit-widgets/style-rtl.css 4.18 kB
build/edit-widgets/style.css 4.18 kB
build/editor/index.min.js 37.8 kB
build/editor/style-rtl.css 3.78 kB
build/editor/style.css 3.77 kB
build/element/index.min.js 3.29 kB
build/escape-html/index.min.js 517 B
build/format-library/index.min.js 6.57 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.63 kB
build/html-entities/index.min.js 424 B
build/i18n/index.min.js 3.71 kB
build/is-shallow-equal/index.min.js 501 B
build/keyboard-shortcuts/index.min.js 1.8 kB
build/keycodes/index.min.js 1.39 kB
build/list-reusable-blocks/index.min.js 1.86 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.92 kB
build/notices/index.min.js 925 B
build/nux/index.min.js 2.08 kB
build/nux/style-rtl.css 747 B
build/nux/style.css 743 B
build/plugins/index.min.js 1.84 kB
build/primitives/index.min.js 924 B
build/priority-queue/index.min.js 582 B
build/react-i18n/index.min.js 671 B
build/redux-routine/index.min.js 2.65 kB
build/reusable-blocks/index.min.js 2.22 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11 kB
build/server-side-render/index.min.js 1.57 kB
build/shortcode/index.min.js 1.49 kB
build/token-list/index.min.js 639 B
build/url/index.min.js 1.9 kB
build/viewport/index.min.js 1.05 kB
build/warning/index.min.js 248 B
build/widgets/index.min.js 7.15 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.04 kB

compressed-size-action

@ramonjd ramonjd added [Package] Block editor /packages/block-editor [Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). labels Oct 15, 2021
@ramonjd
Copy link
Member Author

ramonjd commented Oct 15, 2021

Need to eventually update selectors for the E2E tests to pass.

@ramonjd ramonjd changed the title Block Editor List View: use anchor elements instead of buttons [WIP] Block Editor List View: use anchor elements instead of buttons Oct 15, 2021
// We need to clear any HTML drag data to prevent `pasteHandler` from firing
// inside the `useOnBlockDrop` hook.
const onDragStartHandler = ( event ) => {
event.dataTransfer.clearData();
Copy link
Member Author

Choose a reason for hiding this comment

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

The href attribute is triggering the browser's native drag + copy link. (More information on the browser's drag operations)

Oct-18-2021 12-21-19

It's populating the DataTransfer object with text/html, which is triggering a paste command in onHTMLDrop used by useBlockDrop

This effect is causing the e2e failure.

Clearing the data using event.dataTransfer.clearData(); seems to address this.

Are there better ways to handle this event?

Maybe useOnBlockDrop could take a prop that explicitly defines/overwrites the onDrop functionality so we wouldn't have to create extra functions in our components.

@ramonjd ramonjd force-pushed the try/block-editor-use-anchor-links-in-list-view branch from f69afaf to 23f812f Compare October 18, 2021 03:41
@@ -155,7 +155,7 @@ describe( 'Navigating the block hierarchy', () => {
// Return to first block.
await openListViewSidebar();
await page.keyboard.press( 'ArrowUp' );
await page.keyboard.press( 'Space' );
await page.keyboard.press( 'Enter' );
Copy link
Member Author

@ramonjd ramonjd Oct 18, 2021

Choose a reason for hiding this comment

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

We need to change the key here because:

Buttons are expected to be triggered using the Space or Enter key, while links are expected to be triggered using the Enter key.

Source: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/button_role#accessibility_concerns

See also: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a

@ramonjd ramonjd changed the title [WIP] Block Editor List View: use anchor elements instead of buttons Block Editor List View: use anchor elements instead of buttons Oct 18, 2021
@ramonjd ramonjd removed the [Status] In Progress Tracking issues with work in progress label Oct 18, 2021
@ramonjd ramonjd requested a review from afercia October 20, 2021 22:47
@ramonjd ramonjd removed the request for review from afercia October 21, 2021 23:55
@ramonjd ramonjd force-pushed the try/block-editor-use-anchor-links-in-list-view branch from 23f812f to 9918ef3 Compare October 22, 2021 00:27
Copy link
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

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

Thanks for exploring this @ramonjd! I noticed a couple of differences with the switch to using an anchor tag, that I wondered might be potentially confusing for users who are used to the current behaviour via the keyboard. Now that space no longer activates the item in the list, it will scroll the list view down a page (and the currently active item is then scrolled out of view within the list):

Kapture 2021-10-22 at 16 17 02

Also, by default on Mac, Firefox doesn't tab to a tags (unless we update system preferences) so I noticed that the highlighted list item is no longer in the tab sequence.

I'm not sure how frequently either of these actions are used, but if it does introduce an unexpected change, would it be worth us looking into the following?

  • Add tabindex="0" to the currently highlighted list item so that it's ensured to be in the tabbing sequence (in case users currently expect it to behave like a button) — it looks like there are a few cases of this throughout the codebase, so it might not be all that strange to add it in?
  • Add a space keyboard event handler to ensure that pressing space on a list item behaves like it would if it were a button?

Of course, I also understand if part of the switch to the different HTML tag is that we will have different behaviour. I suppose for my own personal preferences, I like the feeling of a button, even though semantically it's more of a link 😃

@ramonjd
Copy link
Member Author

ramonjd commented Oct 22, 2021

Thanks for taking the time to review @andrewserong

Definitely some things we need to address.

Also, by default on Mac, Firefox doesn't tab to a tags (unless we update system preferences) so I noticed that the highlighted list item is no longer in the tab sequence.

Huh, for me it's the opposite. Tabbing works as expected on Firefox (I have Keyboard navigation control focus switched off in MacOS) but in Chrome I can only use the arrow keys 🤷

firefox-tab

I think it should be consistent either way, as you hightlight.

It doesn't seem acceptable to mark up anchor tags as buttons, when semantically, we want an anchor tag here, so maybe we'll need to look at the tabIndex and events or a combination of both.

Anchor tags with href attributes should be tabbable anyway in theory. It's a shame that we have to build to satisfy an operating system as opposed to supporting a browser. That's just my two cents.

Add tabindex="0" to the currently highlighted list item so that it's ensured to be in the tabbing sequence (in case users currently expect it to behave like a button) — it looks like there are a few cases of this throughout the codebase, so it might not be all that strange to add it in?

TreeGridCell employs a roving tabIndex, which I haven't looked into yet, but it seems to be assigning our <a /> a tab index of -1, which doesn't seem right.

I'll investigate this further. Hardcoding 0 works. Maybe it's all we need to do?

Add a space keyboard event handler to ensure that pressing space on a list item behaves like it would if it were a button?

I did consider this, but hesitated after learning that selecting anchor tags with the space key isn't default behaviour, so I didn't want to confuse things further for folks expecting certain behaviour. 😆

But I was probably overthinking things. There's a line on which to balance somewhere - we just need to find it. cc @diegohaz who will know better than I where that line is 😄

I think there's a sound case to keep default behaviour, especially if removing it causes a negative user experience.

It's probably worth experimenting with an onKeyDown event handler.

@ramonjd ramonjd force-pushed the try/block-editor-use-anchor-links-in-list-view branch 2 times, most recently from 9f1d68a to 1e91c55 Compare October 23, 2021 09:21
@ramonjd
Copy link
Member Author

ramonjd commented Oct 23, 2021

I've rebased to get the latest changes from #35706.

Also trying out adding a key event handler for space/enter keys, and hardcoding tabIndex="0" on the anchor element. Will continue testing next week.

cc @talldan who appears famously in the history, just in case there are some historical requirements that I've missed.

…n href.

This allows us to remove the custom CSS for the native anchor element.
…ton element behaviour, even though we're switching to an anchor element.

Forcing a tabIndex of `0` so the anchor elements are tabbable.
@ramonjd ramonjd force-pushed the try/block-editor-use-anchor-links-in-list-view branch from 6beaeb3 to 48e288c Compare November 17, 2021 10:17
Copy link
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

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

@ramonjd thanks for re-instating the tabIndex. This is testing well for me in Chrome and Edge (on Mac), but I noticed in Firefox and Safari, the button (anchor tag) doesn't appear to be accessible via the tab sequence, even though in the markup tabindex="0" is set for it. Also in those browsers (FF and Safari) there appears to be an error thrown in tabbable.js at some point in the tabbing sequence (in findPrevious). Not sure if that's related?

image

Here's the inspector view where we can see tabIndex is correctly set to 0 for the first element, and a tiny gif with the error message:

tabIndex is set correctly error while tabbing in FF
image Kapture 2021-11-18 at 12 34 54

Also, this change adds the block id to the URL after clicking on it in the list. Is that intentional, or an issue at all?

image

I think this is due to the selectEditorBlock callback that's passed to onClick using event.stopPropagation() on this line, so the default anchor tag behaviour is taking effect. But, it looks like switching to event.preventDefault() might fix it? (Though I'm not sure if that would have other side-effects, too 🤔)

@ramonjd
Copy link
Member Author

ramonjd commented Nov 18, 2021

I appreciate the 🦅 👀 again @andrewserong !

I noticed in Firefox and Safari, the button (anchor tag) doesn't appear to be accessible via the tab sequence

I'm aware that Safari has, in the past, required a little nudge to enable tabbing. For me, tabbing to the list works when I enable:

Screen Shot 2021-11-18 at 8 26 34 pm

This is what I'm seeing in Firefox. I seem to be able to use it according to the parameters in #35655 (comment)

Nov-18-2021 20-28-37

Also in those browsers (FF and Safari) there appears to be an error thrown in tabbable.js at some point in the tabbing sequence (in findPrevious). Not sure if that's related?

True. Hmm. I'm not sure about that one. It's the writing flow component, with which I'm not terribly familiar.

I'll take a closer look.

Also, this change adds the block id to the URL after clicking on it in the list. Is that intentional, or an issue at all?

I saw this as an intentional consequence of using internal anchor tags, and an effect that is consistent with the Document Outline links.

Screen Shot 2021-11-18 at 8 10 43 pm

I feel that there is a desire to have the anchor tag to achieve semantic nirvana, but we also want to preserve all the built-in x-browser behaviour of a button. That might be trickier than we thought, especially given that some users have to enable keyboard navigation in OSX for things to work as they should in Safari and Firefox.

@ramonjd
Copy link
Member Author

ramonjd commented Nov 18, 2021

That might be trickier than we thought, especially given that some users have to enable keyboard navigation in OSX for things to work as they should in Safari and Firefox.

Having said that, there is the option of accepting the limitation as one set by the operating system and trust that users who rely on tabbing would know how to enable it fully in their settings 🤷‍♂️

@andrewserong
Copy link
Contributor

I saw this as an intentional consequence of using internal anchor tags, and an effect that is consistent with the Document Outline links.

Ah, nice, given the consistency there, that sounds good to me 👍

I feel that there is a desire to have the anchor tag to achieve semantic nirvana, but we also want to preserve all the built-in x-browser behaviour of a button.

This does appear to be the crux of the issue! I think my only real hesitancy with the change is that semantically it makes better sense as a link, but because it's already been a button, for users in FF on Mac that are used to being able to tab to it, will it feel like a regression given that the OS settings are a little buried?

there is the option of accepting the limitation as one set by the operating system and trust that users who rely on tabbing would know how to enable it fully in their settings

I wonder if we can gather more feedback from some folks with more specialisation in a11y, to see whether this is an expected issue, or if it'll be a frustration?

For the error with tabbable, given that FF and Safari don't appear to treat the anchor link as tabbable unless the OS setting is enabled, could it be failing because it can't find tabbable elements in those browsers? I wonder if the logic there needs to handle the case of there being no tabbable elements because they're not enabled in the OS... (I haven't had a close look, just a thought! 🙂)

@ramonjd ramonjd added [a11y] Keyboard & Focus Needs Design Feedback Needs general design feedback. labels Nov 18, 2021
@ramonjd
Copy link
Member Author

ramonjd commented Nov 18, 2021

Because it's already been a button, for users in FF on Mac that are used to being able to tab to it, will it feel like a regression given that the OS settings are a little buried?

I'm with you on this one.

I wonder if we can gather more feedback from some folks with more specialisation in a11y, to see whether this is an expected issue, or if it'll be a frustration?

Good call. It would be helpful to get some insight on whether this change would benefit accessibility, and, if so, by how much. I'll try to find the right folks to ping.

@alexstine
Copy link
Contributor

@ramonjd What is changing here? E.g. where can I go to see this in action? Can you list for me specific steps I should perform to see the change?

Happy to provide feedback once I have additional needed context.

Thanks.

@ramonjd
Copy link
Member Author

ramonjd commented Nov 19, 2021

Thanks a lot for swinging by, @alexstine ! We'd really love some opinions on this one.

What is changing here? E.g. where can I go to see this in action? Can you list for me specific steps I should perform to see the change?

In the Block Editor, we can open the Block List by clicking on the List View button in the top toolbar.

Screen Shot 2021-11-19 at 1 55 50 pm

This opens a "tree" that represents all blocks currently in the editor.

Clicking on an item in that tree will highlight, and select, the corresponding block in the editor.

The primary change this PR tries to introduce is turning that block list tree item from a button element into an anchor element.

Before:

Block list items with button elements

After:

Block list items with anchor tags

The reason why we're trying this is to satisfy the requirements laid out in #11711

Right now, the Blocks navigation buttons are used fot [sic] content navigation. They're emulating the hyperlinks behaviour "by moving keyboard (and viewport) focus to the relevant area, but the behaviour may be unpredictable to blind users".

Buttons have some default behaviour in browsers, e.g,. they're tabbable, and triggered by Space and Enter. Switching to an anchor tag means that we'd have to either emulate or abandon this behaviour.

So we're trying to weigh up the pros and cons in terms of accessibility, semantics and existing behaviour.

What do you think?

Let me know if you need more context. 🙇

@alexstine
Copy link
Contributor

@ramonjd I am a blind screen reader user and I could not find any obvious regressions or negative impacts from this change. Other members of the Accessibility team might have thoughts about any possible visual changes, but it seems to work no different with NVDA on Windows with Google Chrome. Is there a platform I should be testing on? I am running Windows 10 but also have Mac OSX.

@ramonjd
Copy link
Member Author

ramonjd commented Nov 19, 2021

I am a blind screen reader user and I could not find any obvious regressions or negative impacts from this change. Other members of the Accessibility team might have thoughts about any possible visual changes, but it seems to work no different with NVDA on Windows with Google Chrome. Is there a platform I should be testing on? I am running Windows 10 but also have Mac OSX.

I appreciate you going through this @alexstine, it's very helpful, thank you!

If you have time to spare and could test these changes on Mac OSX, it would be great. Mac OSX is the operating system we're most concerned about given that tabbing of anchor elements has to be enabled in the System settings. The following link explains how to turn that on: https://support.apple.com/en-us/HT204434#fullkeyboard

I tried turning on the screen reader in Mac OSX and could navigate around, but I'm not used to using them so my experience might not be the best guide 😄

@joedolson
Copy link
Contributor

Regarding MacOS, I'd observe that people who depend on keyboard navigation are likely to also be people who have already turned on the relevant options in their operating system. This is less likely to impact people who depend on keyboard navigation significantly; mostly people who use it as an optional navigation method.

@ramonjd
Copy link
Member Author

ramonjd commented Nov 21, 2021

Regarding MacOS, I'd observe that people who depend on keyboard navigation are likely to also be people who have already turned on the relevant options in their operating system. This is less likely to impact people who depend on keyboard navigation significantly; mostly people who use it as an optional navigation method.

Thanks for the thought @joedolson

I'd tend to agree. Citing my own experience, the frustration and annoyance at not being able to use keyboard navigation by default fuelled my search after where to adjust my settings on my MacOS machine. 😄

Taking on the OS from the browser doesn't seem like a fair fight to me.

@alexstine
Copy link
Contributor

@ramonjd I just tested this on Mac and did not notice any different behavior between trunk and your branch. The only difference was links instead of buttons. I can't say that this PR negatively impacts any of my accessibility testing, so it's a pass from me.

Thanks.

@ramonjd
Copy link
Member Author

ramonjd commented Nov 23, 2021

I just tested this on Mac and did not notice any different behavior between trunk and your branch. The only difference was links instead of buttons. I can't say that this PR negatively impacts any of my accessibility testing, so it's a pass from me.

This is a colossal help. Thank you! 🙇‍♂️

@ramonjd
Copy link
Member Author

ramonjd commented Nov 24, 2021

Also in those browsers (FF and Safari) there appears to be an error thrown in tabbable.js at some point in the tabbing sequence (in findPrevious). Not sure if that's related?

@andrewserong I was looking at this and I can reproduce in Chrome and other browsers.

As far as I can see, the error is thrown in tabbable.js because the focussed element doesn't appear in the collection of focusable elements.

The index therefore is -1.

So when I logged things out like

	if ( index > -1 ) {
		focusables.length = index;
	} else {
		console.log( 'element index', element, index );
	}

The element is, more often than not, .block-selection-button_select-button, and this only happens when I enable select mode (hitting Esc in the editor). I can replicate this on trunk too.

@alexstine
Copy link
Contributor

@ramonjd That is the accessible navigation for screen readers I believe. Every time you press Tab, the button dynamically updates to the next block with useEffect.

I think that's how it works, I've only played with that a little bit.

Copy link
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

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

Thanks for your patience, and for investigating the tabbable.js issue @ramonjd! I can replicate it on trunk, too — I think I mustn't have been tabbing far enough forwards and back when I last tested it there, so apologies for missing it!

I've just re-tested this PR in Safari, Chrome, FF, and Edge on Mac, and it's all working well for me when I enable Use keyboard navigation to move focus between controls, and it sounds like it isn't a deal breaker requiring this for Safari and FF as it matches OS behaviour like you've mentioned. I haven't been able to break it in any other ways, either 😀

This LGTM, and we can always follow up on the tabbable.js error if we need to separately, particularly given that it's in a separate package and doesn't affect any user behaviour.

Thanks again for working on this!

@ramonjd
Copy link
Member Author

ramonjd commented Nov 25, 2021

we can always follow up on the tabbable.js error if we need to separately

Thanks for retesting! 🍺

I'll write up an issue while the memory is still fresh.

@ramonjd ramonjd merged commit a53c5c2 into trunk Nov 25, 2021
@ramonjd ramonjd deleted the try/block-editor-use-anchor-links-in-list-view branch November 25, 2021 03:35
@github-actions github-actions bot added this to the Gutenberg 12.1 milestone Nov 25, 2021
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). Needs Design Feedback Needs general design feedback. [Package] Block editor /packages/block-editor
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Blocks Navigation menu: use links not buttons
5 participants