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 Link Control accessibility #54063

Closed
wants to merge 9 commits into from
Closed

Conversation

getdave
Copy link
Contributor

@getdave getdave commented Aug 30, 2023

What?

An iteration to improve the accessibility of the Link Control component.

No visuals should change as a result of the PR.

Complimented by #54085

Requires #52620

Why?

Some issues were identified in #51060. This starts to look to address these a long with other issues.

It's currently very difficult to write e2e tests using Playwright's accessible selectors and so this further supports my theory that the a11y of this control is not what it could / should be.

How?

Please also see Questions section below.

I tested the following with Voiceover on MacOS:

  • Announce (via speak()) when user switches mode from "edit mode" to "preview mode".
  • Use aria-labelledby and aria-describedby attributes on component to improve labelling and (hopefully) comprehension of the control.
  • Use role=dialog on all instances that are within a Popover to indicate that they are overlaid on the content.
  • Use <dl> markup when in "preview" mode so that all fields have associated definitions.
  • Announce success when creating pages via the Link UI.

Questions

  • We are missing <form> tag when in edit mode. This was intentionally removed because there are instances where the component is used when it is already within a wrapping <form> element and this was causing problems. However, should we perhaps have an option to utilise a <form> tag in "edit" mode? Is this useful for users of assistive tech? If so why and what advantages does it convey?
  • If implementing role=dialog when the control is used within a Popover do we need to have a focus trap? Officially Dialog's do not have to trap focus but given that the UI can enter an "edit" mode where there is a form it seems like you shouldn't be able to tab out of the UI whilst in the middle of editing. If so we cannot use the existing <Modal> from @wordpress/components but I should be able to modify our usage of Popover.
  • Does the usage of definition list in the link preview mode markup provide any utility for screenreaders? The idea was to make it obvious which piece of text conveys is conveying what. For example, for a sighted user it's relatively easier to see which text is the URL and which is the title/label but I think it's much harder for users of assistive tech.
  • should the aria-labelledby and aria-describedby attributes be on the Popover or the LinkControl component markup?

Testing Instructions

  • New Post
  • Add some text in paragraph block
  • Select some text inside the block and then create a link (the shortcut is Cmd + K).
  • The Link Control will appear rendering inside a Popover.
  • Test the accessibility of the control

Testing Instructions for Keyboard

Screenshots or screencast

@getdave getdave added [Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). Needs Accessibility Feedback Need input from accessibility [Feature] Link Editing Link components (LinkControl, URLInput) and integrations (RichText link formatting) labels Aug 30, 2023
@getdave getdave self-assigned this Aug 30, 2023
@github-actions
Copy link

github-actions bot commented Aug 30, 2023

Size Change: +445 B (0%)

Total Size: 1.52 MB

Filename Size Change
build/block-editor/index.min.js 215 kB +247 B (0%)
build/block-editor/style-rtl.css 15.1 kB +52 B (0%)
build/block-editor/style.css 15.1 kB +52 B (0%)
build/block-library/index.min.js 204 kB +42 B (0%)
build/format-library/index.min.js 7.76 kB +52 B (+1%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 955 B
build/annotations/index.min.js 2.69 kB
build/api-fetch/index.min.js 2.28 kB
build/autop/index.min.js 2.1 kB
build/blob/index.min.js 451 B
build/block-directory/index.min.js 7.01 kB
build/block-directory/style-rtl.css 1.02 kB
build/block-directory/style.css 1.02 kB
build/block-editor/content-rtl.css 4.25 kB
build/block-editor/content.css 4.24 kB
build/block-editor/default-editor-styles-rtl.css 381 B
build/block-editor/default-editor-styles.css 381 B
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 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 126 B
build/block-library/blocks/audio/theme.css 126 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 584 B
build/block-library/blocks/button/editor.css 582 B
build/block-library/blocks/button/style-rtl.css 629 B
build/block-library/blocks/button/style.css 628 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.63 kB
build/block-library/blocks/cover/style.css 1.62 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 126 B
build/block-library/blocks/embed/theme.css 126 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 280 B
build/block-library/blocks/file/style.css 281 B
build/block-library/blocks/file/view-interactivity.min.js 317 B
build/block-library/blocks/file/view.min.js 375 B
build/block-library/blocks/footnotes/style-rtl.css 201 B
build/block-library/blocks/footnotes/style.css 199 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 947 B
build/block-library/blocks/gallery/editor.css 952 B
build/block-library/blocks/gallery/style-rtl.css 1.53 kB
build/block-library/blocks/gallery/style.css 1.53 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/editor-rtl.css 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 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 336 B
build/block-library/blocks/html/editor.css 337 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.42 kB
build/block-library/blocks/image/style.css 1.41 kB
build/block-library/blocks/image/theme-rtl.css 126 B
build/block-library/blocks/image/theme.css 126 B
build/block-library/blocks/image/view-interactivity.min.js 1.83 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 712 B
build/block-library/blocks/navigation-link/editor.css 711 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 B
build/block-library/blocks/navigation/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.23 kB
build/block-library/blocks/navigation/style.css 2.22 kB
build/block-library/blocks/navigation/view-interactivity.min.js 988 B
build/block-library/blocks/navigation/view-modal.min.js 2.85 kB
build/block-library/blocks/navigation/view.min.js 469 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 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 319 B
build/block-library/blocks/post-featured-image/style.css 319 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 314 B
build/block-library/blocks/post-template/style.css 314 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 302 B
build/block-library/blocks/query-pagination/style.css 299 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 450 B
build/block-library/blocks/query/editor.css 449 B
build/block-library/blocks/query/style-rtl.css 370 B
build/block-library/blocks/query/style.css 368 B
build/block-library/blocks/query/view.min.js 559 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 178 B
build/block-library/blocks/search/editor.css 178 B
build/block-library/blocks/search/style-rtl.css 607 B
build/block-library/blocks/search/style.css 607 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 631 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 323 B
build/block-library/blocks/shortcode/editor.css 323 B
build/block-library/blocks/site-logo/editor-rtl.css 754 B
build/block-library/blocks/site-logo/editor.css 754 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.44 kB
build/block-library/blocks/social-links/style.css 1.43 kB
build/block-library/blocks/spacer/editor-rtl.css 348 B
build/block-library/blocks/spacer/editor.css 348 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 639 B
build/block-library/blocks/table/style.css 639 B
build/block-library/blocks/table/theme-rtl.css 146 B
build/block-library/blocks/table/theme.css 146 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 185 B
build/block-library/blocks/video/style.css 185 B
build/block-library/blocks/video/theme-rtl.css 126 B
build/block-library/blocks/video/theme.css 126 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.1 kB
build/block-library/common.css 1.1 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.2 kB
build/block-library/editor.css 12.1 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 13.8 kB
build/block-library/style.css 13.8 kB
build/block-library/theme-rtl.css 688 B
build/block-library/theme.css 693 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/blocks/index.min.js 51.4 kB
build/commands/index.min.js 15.5 kB
build/commands/style-rtl.css 932 B
build/commands/style.css 929 B
build/components/index.min.js 247 kB
build/components/style-rtl.css 11.8 kB
build/components/style.css 11.8 kB
build/compose/index.min.js 12.1 kB
build/core-commands/index.min.js 2.6 kB
build/core-data/index.min.js 16.8 kB
build/customize-widgets/index.min.js 12 kB
build/customize-widgets/style-rtl.css 1.46 kB
build/customize-widgets/style.css 1.45 kB
build/data-controls/index.min.js 640 B
build/data/index.min.js 8.84 kB
build/date/index.min.js 17.8 kB
build/deprecated/index.min.js 451 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.64 kB
build/edit-post/classic-rtl.css 544 B
build/edit-post/classic.css 545 B
build/edit-post/index.min.js 35.3 kB
build/edit-post/style-rtl.css 7.6 kB
build/edit-post/style.css 7.59 kB
build/edit-site/index.min.js 90.9 kB
build/edit-site/style-rtl.css 13.2 kB
build/edit-site/style.css 13.2 kB
build/edit-widgets/index.min.js 16.9 kB
build/edit-widgets/style-rtl.css 4.52 kB
build/edit-widgets/style.css 4.52 kB
build/editor/index.min.js 45.5 kB
build/editor/style-rtl.css 3.53 kB
build/editor/style.css 3.52 kB
build/element/index.min.js 4.82 kB
build/escape-html/index.min.js 537 B
build/format-library/style-rtl.css 554 B
build/format-library/style.css 553 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.58 kB
build/interactivity/index.min.js 11.3 kB
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.72 kB
build/keycodes/index.min.js 1.87 kB
build/list-reusable-blocks/index.min.js 2.2 kB
build/list-reusable-blocks/style-rtl.css 836 B
build/list-reusable-blocks/style.css 836 B
build/media-utils/index.min.js 2.9 kB
build/notices/index.min.js 948 B
build/nux/index.min.js 1.99 kB
build/nux/style-rtl.css 735 B
build/nux/style.css 732 B
build/patterns/index.min.js 2.71 kB
build/patterns/style-rtl.css 240 B
build/patterns/style.css 240 B
build/plugins/index.min.js 1.79 kB
build/preferences-persistence/index.min.js 1.84 kB
build/preferences/index.min.js 1.24 kB
build/primitives/index.min.js 943 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 958 B
build/react-i18n/index.min.js 615 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.7 kB
build/reusable-blocks/index.min.js 2.7 kB
build/reusable-blocks/style-rtl.css 243 B
build/reusable-blocks/style.css 243 B
build/rich-text/index.min.js 11 kB
build/router/index.min.js 1.78 kB
build/server-side-render/index.min.js 1.94 kB
build/shortcode/index.min.js 1.39 kB
build/style-engine/index.min.js 1.85 kB
build/sync/index.min.js 53.8 kB
build/token-list/index.min.js 582 B
build/url/index.min.js 3.73 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 958 B
build/warning/index.min.js 249 B
build/widgets/index.min.js 7.16 kB
build/widgets/style-rtl.css 1.15 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.02 kB

compressed-size-action

@getdave getdave marked this pull request as ready for review August 30, 2023 15:08
@alexstine
Copy link
Contributor

@getdave Where can I find the link control that should be tested in this PR? Is it just the Link button in the block toolbar?

@getdave
Copy link
Contributor Author

getdave commented Aug 31, 2023

@alexstine Apologies my testing instructions didn't publish yesterday as I was writing them whilst on a train 😅 The control is the standard interface for creating links in the block editor. I have updated the testing instructions section in the PR description.

Also worth testing alongside #54085

@alexstine
Copy link
Contributor

@getdave I am testing this in Firefox and this control seems largely inaccessible.

  1. Insert a paragraph block.
  2. Type some text, select a portion to make a link.
  3. Use Control+K on Windows.
  4. Focus is placed inside the combo box field.
  5. Type a link URL.
  6. Pressing Enter inserts the link and closes the popover.

I am unable to Tab/Shift+Tab throughout the popover so unsure where I would find a preview mode or any other options.

Thanks.

@getdave
Copy link
Contributor Author

getdave commented Sep 5, 2023

Noting to myself that we need to land #52620 to improve a11y of the initial link creation step.

@getdave
Copy link
Contributor Author

getdave commented Sep 5, 2023

@alexstine I'm sorry this didn't work well for you. Honestly I think the control needs improvement which is party why I wanted to get your opinion.

I see the problem though. The Link creation phase (which is where you got to) is flawed because there is no submit button. We are restoring that in #52620 but it's currently blocked by some test failures which I'm working on.

Also allow me to outline the two "modes" as this is confusing terminology:

  1. "Edit mode" - this is when you are creating or editing a link. There are form fields.
  2. "Preview mode" - this is when you are viewing a link. The use case for this is that you enter a link format in rich text and the popup appears with information about the link, but there are no form fields. There is a debate about whether this view has any utility but that's a wider concern.

As the flow clearly doesn't work as things stand, I won't ask for any more testing here until #52620 is merged. I'll also ask @jeryj to give this a run through so I have objective input from someone other than myself.

Once we have the basic flow ironed out I'd be very grateful if you would consider re-testing. This control is used a lot throughout the interface and so I'm extremely keen to improve it's accessibility. Thank you.

@getdave getdave requested a review from jeryj September 5, 2023 08:44
@jeryj
Copy link
Contributor

jeryj commented Sep 6, 2023

Been playing around with this for a bit. The control is trying to be a popover and a dialog at once, while also not being dismissible. I get why, but it's making it hard to come up with interactions since there's no standard to follow. The link preview part is especially difficult, as I understand why it's visually helpful to get a quick confirmation that you've added the link you think you added. That same quick confirmation isn't communicated to a screen reader yet.

I think some semantic grouping/naming of the popover would be helpful for its various states, like "Add link/Edit link/Preview link". I don't rely on a screen reader, so it's possible I'm making incorrect assumptions about that.

Link Creation

This flow feels pretty good to me.

  • Select text
  • Press command + k to open the link control
  • Focuses the link input ✅
  • The label only says "Link". Is this clear enough? Would a name for the entire popover or an extended description be helpful to explain the context that you're creating a link?
  • Constrained tabbing works
  • Escape to return focus to editor
  • Enter to create link

Link Editing

Mostly OK. Would be improved by not switching to Preview once you move though all the tab stops on the edit field.

  • Cursor in created link
  • command + k opens the link control editing form
  • Not constrained tabbing. Instead of cycling the tab keypresses, the last one closes the edit mode and moves you to the link preview popover. I think this should be constrained tabbing, or at a minimum not switch context to the link preview afterwards, but it's also weird that you Tab into it instead of triggering it to open in some other way.
  • Adding an unlink button within the link editing form would be helpful.
  • Cancel and escape places focus on the link preview. I think it should return focus back to the link text.

Link Preview

  • Popover for the link preview isn't clear when using a screen reader. I think the HTML for the link title, image, and meta description could be grouped in a Link Preview title or label to explain what it is.
  • There's no way for someone to know the link preview popover is available if you press tab, and that it's only available while the cursor is within the linked text in the editor.
  • I'm not sure what the keyboard interaction for moving into the link preview should be (or if the link preview is relevant).

Also, found a bug while testing:

  • Select linked text
  • Tab 2x to reach the Edit button
  • Press Enter to show the link editing form
  • Press escape
  • Focus returns to the editor canvas with the link control form still in edit mode. Command + k is now broken, and doesn't move focus to the link control edit form.

Summary/Specific Recommendations

As always, my caveat of, "I'm trying my best here but I'm not an a11y expert." Here's a focused summary:

  • Add a descriptor, label, or visually hidden heading to each of the states of the link control flow, ie: Create Link, Edit Link, Preview Link (don't quote me on those titles, but you get the idea)
  • When tabbing through the link edit popover, don't switch to the link preview popover
  • When focus is in the editing or preview popover, Escape keypresses should return focus to the text editor. Pressing command + k to edit the field, then escape moving focus to the preview feels broken.
  • Figure out how to make the link preview popover feel relevant and useful on a screen reader too, combine it with the edit form somehow ( edit + preview side by side or beneath? ), or even get rid of the preview.
  • Intentionally decide on the best keyboard interaction to reach the link preview. Right now it's a Tab stop, which may end up being the best way to handle it, I'm not sure. Maybe it could even be a button appended after the link within the editor? Whatever it is, let's decide on what it should be, why, and how to communicate it.

Thanks for working on this, @getdave!

@alexstine
Copy link
Contributor

One more note and it has been discussed in previous issues but never fixed. When editing a link, you must use the shortcut. From what I can tell, there is only an unlink button in the formatting toolbar and there should also likely be an edit option there for best discovery. It makes little sense that by highlighting text, I would then tab to find a random edit button for my created link when tabbing under any other condition would land me in the sidebar.

Other than that comment, agree completely with @jeryj assessment.

@jeryj
Copy link
Contributor

jeryj commented Sep 6, 2023

there is only an unlink button in the formatting toolbar and there should also likely be an edit option there for best discovery.

I was wondering about that too. I tried looking in the toolbar and expecting that there'd be a way to reach the edit link form from the toolbar.

@getdave getdave force-pushed the try/improve-link-ui-a11y branch from 86a82b3 to 350d96e Compare September 7, 2023 09:05
@getdave
Copy link
Contributor Author

getdave commented Sep 7, 2023

We have a problem here with handling the focus trap. The LinkControl component manages whether it is in "edit mode" internally. Therefore when we're consuming the component within the rich text code we have no way to switch the constrained tabbing functionality on the Popover on/off based on changes to this mode.

I'm not sure we can simply force constrained tabbing on the Popover in all modes because that would mean that once you enter the Popover in "preview" mode there would be no way to exit it other than pressing Escape.

Either way to have fine grained control over the focus trap we're going to need to amend the useDialog hook and by extension the Popover component.

I wonder whether the real solution to all of this is to simply do-away with the preview mode entirely as suggested in #50892. That would allow us to avoid this mode switching entirely and greatly simplify the control itself.

What do we think? If we agree then adding comments to #50892 would be a good first step.

@getdave
Copy link
Contributor Author

getdave commented Sep 7, 2023

Thanks for looking into this @jeryj and for a great summary.

I think one of the things we should look at next is #50892 as the preview doesn't seem to offer much value relative to the confusion it causes UX-wise. Combining everything into a single edit mode could be a good move (cc @richtabor who originally proposed this).

Add a descriptor, label, or visually hidden heading to each of the states of the link control flow, ie: Create Link, Edit Link, Preview Link (don't quote me on those titles, but you get the idea)

✅ I've updated the existing visually hidden label and description attached to the control via aria-* roles so that they match up with your advice.

When tabbing through the link edit popover, don't switch to the link preview popover

I don't think we do switch to the preview popover. From what I can see the focus trap on the edit form is not in place and thus the focus moves out of the control entirely. This is a really complex problem because of the two modes. I suggested a potential solution here.

When focus is in the editing or preview popover, Escape keypresses should return focus to the text editor. Pressing command + k to edit the field, then escape moving focus to the preview feels broken.

I wasn't able to replicate this at first then I realised the flow is:

  1. Move into link format to activate preview.
  2. Hit Cmd + K to switch the UI to edit mode.
  3. Hit Escape - see preview mode again and focus on the preview mode.

This behaviour also supports the view that preview is superfluous as we'd need to have the exact same behaviour for sighted users.

@getdave
Copy link
Contributor Author

getdave commented Sep 8, 2023

@alexstine @jeryj Here is a PR to remove the preview step as previously suggested by @richtabor (and others).

That PR is not addressing the accessibility Issues I'm trying to fix in this PR, but perhaps once that one is merged we'll be in a better place to iterate here.

@scruffian
Copy link
Contributor

I think all of these changes are now in trunk so we can close this.

@scruffian scruffian closed this Feb 9, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Link Editing Link components (LinkControl, URLInput) and integrations (RichText link formatting) [Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). Needs Accessibility Feedback Need input from accessibility
Projects
Development

Successfully merging this pull request may close these issues.

4 participants