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

Make social icon navigation one arrow keypress #64883

Merged
merged 5 commits into from
Nov 18, 2024

Conversation

jeryj
Copy link
Contributor

@jeryj jeryj commented Aug 28, 2024

Fixes #64937

What?

Moves the blockProps for the social icon from the <li> to the <button>.

Why?

  1. Moving between each social icon was two keypresses (one to get to the <li> and one to the nested <button>.
  2. The <li> did not have an onClick to open the popover but the <button> did, meaning you can only press enter to open the popover when on the ` but you can't tell which one you're focused on.

How?

By moving the blockProps for the social icon from the <li> to the <button>, we get the appropriate behavior of being able to select and create social icons with a clean keyboard behavior. The caveat is to preserve the CSS, we needed to add the .wp-block-social-link to both the li and the button. This allows us the least amount of changes to the CSS, preventing a lot of potential CSS conflicts and styling issues for sites.

Testing Instructions

Check for visual regressions on both the frontend and editor

Testing Instructions for Keyboard

  • Add a social icons block
  • Using the keyboard, move focus to the social icons
  • When on a social icon, moving left/right between them should only be one keypress
  • Press Enter on a social icon
  • Focus should be within the popover
  • Submit a value
  • It should be saved and focus moved to the social icon button
  • Press Enter
  • Focus should be within the popover
  • Press Escape
  • The popover should close and focus moved to the social icon button

Screenshots or screencast

Screen.Recording.2024-08-30.at.10.27.19.AM.mov

@jeryj jeryj requested a review from ajitbohra as a code owner August 28, 2024 16:57
@jeryj jeryj added the [Type] Bug An existing feature does not function as intended label Aug 28, 2024
@jeryj jeryj self-assigned this Aug 28, 2024
Copy link

github-actions bot commented Aug 28, 2024

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message.

Co-authored-by: jeryj <[email protected]>
Co-authored-by: afercia <[email protected]>
Co-authored-by: getdave <[email protected]>
Co-authored-by: alexstine <[email protected]>

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.

@jeryj jeryj added the [Block] Social Affects the Social Block - used to display Social Media accounts label Aug 28, 2024
Copy link

github-actions bot commented Aug 28, 2024

Size Change: -99 B (-0.01%)

Total Size: 1.82 MB

Filename Size Change
build/block-library/blocks/social-link/editor-rtl.css 273 B -65 B (-19.23%) 👏
build/block-library/blocks/social-link/editor.css 273 B -65 B (-19.23%) 👏
build/block-library/editor-rtl.css 11.6 kB -21 B (-0.18%)
build/block-library/editor.css 11.6 kB -21 B (-0.18%)
build/block-library/index.min.js 221 kB +73 B (+0.03%)
ℹ️ View Unchanged
Filename Size
build-module/a11y/index.min.js 482 B
build-module/block-library/file/view.min.js 447 B
build-module/block-library/image/view.min.js 1.78 kB
build-module/block-library/navigation/view.min.js 1.16 kB
build-module/block-library/query/view.min.js 742 B
build-module/block-library/search/view.min.js 616 B
build-module/interactivity-router/index.min.js 3.03 kB
build-module/interactivity/debug.min.js 17.2 kB
build-module/interactivity/index.min.js 13.6 kB
build/a11y/index.min.js 952 B
build/annotations/index.min.js 2.26 kB
build/api-fetch/index.min.js 2.32 kB
build/autop/index.min.js 2.12 kB
build/blob/index.min.js 579 B
build/block-directory/index.min.js 7.26 kB
build/block-directory/style-rtl.css 1 kB
build/block-directory/style.css 1 kB
build/block-editor/content-rtl.css 4.42 kB
build/block-editor/content.css 4.41 kB
build/block-editor/default-editor-styles-rtl.css 394 B
build/block-editor/default-editor-styles.css 394 B
build/block-editor/index.min.js 255 kB
build/block-editor/style-rtl.css 15.4 kB
build/block-editor/style.css 15.4 kB
build/block-library/blocks/archives/editor-rtl.css 84 B
build/block-library/blocks/archives/editor.css 83 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 149 B
build/block-library/blocks/audio/editor.css 151 B
build/block-library/blocks/audio/style-rtl.css 132 B
build/block-library/blocks/audio/style.css 132 B
build/block-library/blocks/audio/theme-rtl.css 134 B
build/block-library/blocks/audio/theme.css 134 B
build/block-library/blocks/avatar/editor-rtl.css 115 B
build/block-library/blocks/avatar/editor.css 115 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/button/editor-rtl.css 265 B
build/block-library/blocks/button/editor.css 265 B
build/block-library/blocks/button/style-rtl.css 555 B
build/block-library/blocks/button/style.css 555 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 345 B
build/block-library/blocks/buttons/style.css 345 B
build/block-library/blocks/calendar/style-rtl.css 240 B
build/block-library/blocks/calendar/style.css 240 B
build/block-library/blocks/categories/editor-rtl.css 132 B
build/block-library/blocks/categories/editor.css 131 B
build/block-library/blocks/categories/style-rtl.css 152 B
build/block-library/blocks/categories/style.css 152 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 139 B
build/block-library/blocks/code/style.css 139 B
build/block-library/blocks/code/theme-rtl.css 122 B
build/block-library/blocks/code/theme.css 122 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 420 B
build/block-library/blocks/columns/style.css 420 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 124 B
build/block-library/blocks/comment-author-avatar/editor.css 124 B
build/block-library/blocks/comment-author-name/style-rtl.css 72 B
build/block-library/blocks/comment-author-name/style.css 72 B
build/block-library/blocks/comment-content/style-rtl.css 120 B
build/block-library/blocks/comment-content/style.css 120 B
build/block-library/blocks/comment-date/style-rtl.css 65 B
build/block-library/blocks/comment-date/style.css 65 B
build/block-library/blocks/comment-edit-link/style-rtl.css 70 B
build/block-library/blocks/comment-edit-link/style.css 70 B
build/block-library/blocks/comment-reply-link/style-rtl.css 71 B
build/block-library/blocks/comment-reply-link/style.css 71 B
build/block-library/blocks/comment-template/style-rtl.css 200 B
build/block-library/blocks/comment-template/style.css 199 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 228 B
build/block-library/blocks/comments-pagination/editor.css 217 B
build/block-library/blocks/comments-pagination/style-rtl.css 234 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 837 B
build/block-library/blocks/comments/editor.css 836 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 637 B
build/block-library/blocks/cover/editor-rtl.css 631 B
build/block-library/blocks/cover/editor.css 631 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 86 B
build/block-library/blocks/details/style.css 86 B
build/block-library/blocks/embed/editor-rtl.css 331 B
build/block-library/blocks/embed/editor.css 331 B
build/block-library/blocks/embed/style-rtl.css 419 B
build/block-library/blocks/embed/style.css 419 B
build/block-library/blocks/embed/theme-rtl.css 133 B
build/block-library/blocks/embed/theme.css 133 B
build/block-library/blocks/file/editor-rtl.css 326 B
build/block-library/blocks/file/editor.css 326 B
build/block-library/blocks/file/style-rtl.css 278 B
build/block-library/blocks/file/style.css 279 B
build/block-library/blocks/footnotes/style-rtl.css 198 B
build/block-library/blocks/footnotes/style.css 197 B
build/block-library/blocks/form-input/editor-rtl.css 229 B
build/block-library/blocks/form-input/editor.css 229 B
build/block-library/blocks/form-input/style-rtl.css 357 B
build/block-library/blocks/form-input/style.css 357 B
build/block-library/blocks/form-submission-notification/editor-rtl.css 344 B
build/block-library/blocks/form-submission-notification/editor.css 341 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 470 B
build/block-library/blocks/freeform/editor-rtl.css 2.6 kB
build/block-library/blocks/freeform/editor.css 2.6 kB
build/block-library/blocks/gallery/editor-rtl.css 946 B
build/block-library/blocks/gallery/editor.css 951 B
build/block-library/blocks/gallery/style-rtl.css 1.83 kB
build/block-library/blocks/gallery/style.css 1.82 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 334 B
build/block-library/blocks/group/editor.css 334 B
build/block-library/blocks/group/style-rtl.css 103 B
build/block-library/blocks/group/style.css 103 B
build/block-library/blocks/group/theme-rtl.css 79 B
build/block-library/blocks/group/theme.css 79 B
build/block-library/blocks/heading/style-rtl.css 188 B
build/block-library/blocks/heading/style.css 188 B
build/block-library/blocks/html/editor-rtl.css 346 B
build/block-library/blocks/html/editor.css 347 B
build/block-library/blocks/image/editor-rtl.css 799 B
build/block-library/blocks/image/editor.css 799 B
build/block-library/blocks/image/style-rtl.css 1.59 kB
build/block-library/blocks/image/style.css 1.59 kB
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/latest-comments/style-rtl.css 355 B
build/block-library/blocks/latest-comments/style.css 354 B
build/block-library/blocks/latest-posts/editor-rtl.css 139 B
build/block-library/blocks/latest-posts/editor.css 138 B
build/block-library/blocks/latest-posts/style-rtl.css 509 B
build/block-library/blocks/latest-posts/style.css 510 B
build/block-library/blocks/list/style-rtl.css 107 B
build/block-library/blocks/list/style.css 107 B
build/block-library/blocks/loginout/style-rtl.css 61 B
build/block-library/blocks/loginout/style.css 61 B
build/block-library/blocks/media-text/editor-rtl.css 321 B
build/block-library/blocks/media-text/editor.css 320 B
build/block-library/blocks/media-text/style-rtl.css 552 B
build/block-library/blocks/media-text/style.css 550 B
build/block-library/blocks/more/editor-rtl.css 427 B
build/block-library/blocks/more/editor.css 427 B
build/block-library/blocks/navigation-link/editor-rtl.css 644 B
build/block-library/blocks/navigation-link/editor.css 645 B
build/block-library/blocks/navigation-link/style-rtl.css 192 B
build/block-library/blocks/navigation-link/style.css 191 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 295 B
build/block-library/blocks/navigation-submenu/editor.css 294 B
build/block-library/blocks/navigation/editor-rtl.css 2.2 kB
build/block-library/blocks/navigation/editor.css 2.2 kB
build/block-library/blocks/navigation/style-rtl.css 2.25 kB
build/block-library/blocks/navigation/style.css 2.23 kB
build/block-library/blocks/nextpage/editor-rtl.css 392 B
build/block-library/blocks/nextpage/editor.css 392 B
build/block-library/blocks/page-list/editor-rtl.css 378 B
build/block-library/blocks/page-list/editor.css 378 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 236 B
build/block-library/blocks/paragraph/editor.css 236 B
build/block-library/blocks/paragraph/style-rtl.css 341 B
build/block-library/blocks/paragraph/style.css 340 B
build/block-library/blocks/post-author-biography/style-rtl.css 74 B
build/block-library/blocks/post-author-biography/style.css 74 B
build/block-library/blocks/post-author-name/style-rtl.css 69 B
build/block-library/blocks/post-author-name/style.css 69 B
build/block-library/blocks/post-author/editor-rtl.css 107 B
build/block-library/blocks/post-author/editor.css 107 B
build/block-library/blocks/post-author/style-rtl.css 188 B
build/block-library/blocks/post-author/style.css 189 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 527 B
build/block-library/blocks/post-comments-form/style.css 528 B
build/block-library/blocks/post-content/style-rtl.css 61 B
build/block-library/blocks/post-content/style.css 61 B
build/block-library/blocks/post-date/style-rtl.css 62 B
build/block-library/blocks/post-date/style.css 62 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 155 B
build/block-library/blocks/post-excerpt/style.css 155 B
build/block-library/blocks/post-featured-image/editor-rtl.css 729 B
build/block-library/blocks/post-featured-image/editor.css 726 B
build/block-library/blocks/post-featured-image/style-rtl.css 347 B
build/block-library/blocks/post-featured-image/style.css 347 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 399 B
build/block-library/blocks/post-template/style.css 398 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 70 B
build/block-library/blocks/post-time-to-read/style.css 70 B
build/block-library/blocks/post-title/style-rtl.css 162 B
build/block-library/blocks/post-title/style.css 162 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 134 B
build/block-library/blocks/pullquote/editor.css 134 B
build/block-library/blocks/pullquote/style-rtl.css 342 B
build/block-library/blocks/pullquote/style.css 342 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 121 B
build/block-library/blocks/query-pagination-numbers/editor.css 118 B
build/block-library/blocks/query-pagination/editor-rtl.css 154 B
build/block-library/blocks/query-pagination/editor.css 154 B
build/block-library/blocks/query-pagination/style-rtl.css 237 B
build/block-library/blocks/query-pagination/style.css 237 B
build/block-library/blocks/query-title/style-rtl.css 64 B
build/block-library/blocks/query-title/style.css 64 B
build/block-library/blocks/query/editor-rtl.css 452 B
build/block-library/blocks/query/editor.css 451 B
build/block-library/blocks/quote/style-rtl.css 238 B
build/block-library/blocks/quote/style.css 238 B
build/block-library/blocks/quote/theme-rtl.css 233 B
build/block-library/blocks/quote/theme.css 236 B
build/block-library/blocks/read-more/style-rtl.css 138 B
build/block-library/blocks/read-more/style.css 138 B
build/block-library/blocks/rss/editor-rtl.css 101 B
build/block-library/blocks/rss/editor.css 101 B
build/block-library/blocks/rss/style-rtl.css 288 B
build/block-library/blocks/rss/style.css 287 B
build/block-library/blocks/search/editor-rtl.css 199 B
build/block-library/blocks/search/editor.css 199 B
build/block-library/blocks/search/style-rtl.css 672 B
build/block-library/blocks/search/style.css 671 B
build/block-library/blocks/search/theme-rtl.css 113 B
build/block-library/blocks/search/theme.css 113 B
build/block-library/blocks/separator/editor-rtl.css 100 B
build/block-library/blocks/separator/editor.css 100 B
build/block-library/blocks/separator/style-rtl.css 248 B
build/block-library/blocks/separator/style.css 248 B
build/block-library/blocks/separator/theme-rtl.css 195 B
build/block-library/blocks/separator/theme.css 195 B
build/block-library/blocks/shortcode/editor-rtl.css 286 B
build/block-library/blocks/shortcode/editor.css 286 B
build/block-library/blocks/site-logo/editor-rtl.css 806 B
build/block-library/blocks/site-logo/editor.css 803 B
build/block-library/blocks/site-logo/style-rtl.css 218 B
build/block-library/blocks/site-logo/style.css 218 B
build/block-library/blocks/site-tagline/editor-rtl.css 87 B
build/block-library/blocks/site-tagline/editor.css 87 B
build/block-library/blocks/site-tagline/style-rtl.css 65 B
build/block-library/blocks/site-tagline/style.css 65 B
build/block-library/blocks/site-title/editor-rtl.css 85 B
build/block-library/blocks/site-title/editor.css 85 B
build/block-library/blocks/site-title/style-rtl.css 143 B
build/block-library/blocks/site-title/style.css 143 B
build/block-library/blocks/social-links/editor-rtl.css 729 B
build/block-library/blocks/social-links/editor.css 727 B
build/block-library/blocks/social-links/style-rtl.css 1.51 kB
build/block-library/blocks/social-links/style.css 1.5 kB
build/block-library/blocks/spacer/editor-rtl.css 346 B
build/block-library/blocks/spacer/editor.css 346 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-of-contents/style-rtl.css 83 B
build/block-library/blocks/table-of-contents/style.css 83 B
build/block-library/blocks/table/editor-rtl.css 394 B
build/block-library/blocks/table/editor.css 394 B
build/block-library/blocks/table/style-rtl.css 640 B
build/block-library/blocks/table/style.css 639 B
build/block-library/blocks/table/theme-rtl.css 152 B
build/block-library/blocks/table/theme.css 152 B
build/block-library/blocks/tag-cloud/editor-rtl.css 144 B
build/block-library/blocks/tag-cloud/editor.css 144 B
build/block-library/blocks/tag-cloud/style-rtl.css 266 B
build/block-library/blocks/tag-cloud/style.css 265 B
build/block-library/blocks/template-part/editor-rtl.css 368 B
build/block-library/blocks/template-part/editor.css 368 B
build/block-library/blocks/template-part/theme-rtl.css 113 B
build/block-library/blocks/template-part/theme.css 113 B
build/block-library/blocks/term-description/style-rtl.css 126 B
build/block-library/blocks/term-description/style.css 126 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 165 B
build/block-library/blocks/text-columns/style.css 165 B
build/block-library/blocks/verse/style-rtl.css 98 B
build/block-library/blocks/verse/style.css 98 B
build/block-library/blocks/video/editor-rtl.css 396 B
build/block-library/blocks/video/editor.css 397 B
build/block-library/blocks/video/style-rtl.css 192 B
build/block-library/blocks/video/style.css 192 B
build/block-library/blocks/video/theme-rtl.css 134 B
build/block-library/blocks/video/theme.css 134 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.08 kB
build/block-library/common.css 1.08 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 472 B
build/block-library/reset.css 472 B
build/block-library/style-rtl.css 15 kB
build/block-library/style.css 15 kB
build/block-library/theme-rtl.css 708 B
build/block-library/theme.css 712 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 52.6 kB
build/commands/index.min.js 16.1 kB
build/commands/style-rtl.css 955 B
build/commands/style.css 952 B
build/components/index.min.js 227 kB
build/components/style-rtl.css 12.4 kB
build/components/style.css 12.4 kB
build/compose/index.min.js 12.7 kB
build/core-commands/index.min.js 3.08 kB
build/core-data/index.min.js 74.3 kB
build/customize-widgets/index.min.js 11 kB
build/customize-widgets/style-rtl.css 1.35 kB
build/customize-widgets/style.css 1.35 kB
build/data-controls/index.min.js 641 B
build/data/index.min.js 8.69 kB
build/date/index.min.js 18 kB
build/deprecated/index.min.js 458 B
build/dom-ready/index.min.js 325 B
build/dom/index.min.js 4.66 kB
build/edit-post/classic-rtl.css 578 B
build/edit-post/classic.css 580 B
build/edit-post/index.min.js 13.5 kB
build/edit-post/style-rtl.css 2.76 kB
build/edit-post/style.css 2.75 kB
build/edit-site/index.min.js 219 kB
build/edit-site/posts-rtl.css 7.51 kB
build/edit-site/posts.css 7.51 kB
build/edit-site/style-rtl.css 13.3 kB
build/edit-site/style.css 13.4 kB
build/edit-widgets/index.min.js 17.7 kB
build/edit-widgets/style-rtl.css 4.09 kB
build/edit-widgets/style.css 4.09 kB
build/editor/index.min.js 112 kB
build/editor/style-rtl.css 9.65 kB
build/editor/style.css 9.67 kB
build/element/index.min.js 4.82 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 8.05 kB
build/format-library/style-rtl.css 476 B
build/format-library/style.css 476 B
build/hooks/index.min.js 1.65 kB
build/html-entities/index.min.js 445 B
build/i18n/index.min.js 3.58 kB
build/is-shallow-equal/index.min.js 526 B
build/keyboard-shortcuts/index.min.js 1.31 kB
build/keycodes/index.min.js 1.46 kB
build/list-reusable-blocks/index.min.js 2.13 kB
build/list-reusable-blocks/style-rtl.css 852 B
build/list-reusable-blocks/style.css 852 B
build/media-utils/index.min.js 3.58 kB
build/notices/index.min.js 946 B
build/nux/index.min.js 1.62 kB
build/nux/style-rtl.css 749 B
build/nux/style.css 745 B
build/patterns/index.min.js 7.35 kB
build/patterns/style-rtl.css 687 B
build/patterns/style.css 685 B
build/plugins/index.min.js 1.86 kB
build/preferences-persistence/index.min.js 2.06 kB
build/preferences/index.min.js 2.9 kB
build/preferences/style-rtl.css 554 B
build/preferences/style.css 554 B
build/primitives/index.min.js 829 B
build/priority-queue/index.min.js 1.54 kB
build/private-apis/index.min.js 961 B
build/react-i18n/index.min.js 630 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 6.76 kB
build/redux-routine/index.min.js 2.7 kB
build/reusable-blocks/index.min.js 2.55 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.2 kB
build/router/index.min.js 2.11 kB
build/server-side-render/index.min.js 1.94 kB
build/shortcode/index.min.js 1.4 kB
build/style-engine/index.min.js 2.04 kB
build/token-list/index.min.js 581 B
build/url/index.min.js 3.9 kB
build/vendors/react-dom.min.js 41.7 kB
build/vendors/react-jsx-runtime.min.js 556 B
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 965 B
build/vips/index.min.js 36.2 kB
build/warning/index.min.js 250 B
build/widgets/index.min.js 7.16 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.03 kB

compressed-size-action

Copy link

github-actions bot commented Aug 28, 2024

Flaky tests detected in 8076181.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/10703879170
📝 Reported issues:

@Mamaduka Mamaduka requested a review from afercia August 28, 2024 19:44
@alexstine
Copy link
Contributor

@jeryj Make sure this doesn't break other interactions such as multiselect. I tried to globally remove this tabindex from useBlockProps and ended up breaking a bunch of different focus scenarios. One such example is the ability to focus the block wrapper to delete or insert a block via backspace or enter. I do not have bandwidth to help further but thought you should know I've already been down this path.

@afercia
Copy link
Contributor

afercia commented Aug 29, 2024

@jeryj Thanks for this PR. Quickly tested and it looks like a good first step. Some considerations:

The most important point is that arrows navigation wouldn't work well for Windows screen readers unless we make sure the screen readere switches to 'focus mode'. Otherwise, arrows are reserved for internal usage in screen readers 'browse more'. IN other cases, the editor uses an ARIA role to do this for example the application role in the list view. In this case, I wouldn't know what the best option is. @alexstine any thoughts?

Secondly: while it makes totally sense to use a list on the front end, why we're using a list in the editor? It doesn't make much sense to use a list and then override its semantics by using role="document". The markup in the editor is soemthign liek the following:

ul 
    role="document"

li
    role="document"
    aria-label="Block: GitHub"
    tabindex="0" becomes tabindex="-1" in this PR

button 
    labeled by its content e.g. 'GitHub'

The li element role is actuall document. Still, it's labeled, which is incorrect.
Why the li element needs a tabindex attribute in the first place?
Should we consider to entirely remove the list in the editor and only use buttons?

Copy link
Contributor

@afercia afercia left a comment

Choose a reason for hiding this comment

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

Please see my last comment

Copy link
Contributor

@getdave getdave left a comment

Choose a reason for hiding this comment

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

To me this feels like an improvement over what we have currently (i.e. two key presses to navigate between link items).

The only caveat is if this breaks multi-select like @alexstine suggested. I wasn't sure how best to verify that one. I was trying SHIFT + ARROWs to select...

@alexstine
Copy link
Contributor

@afercia The only solution here is using role application for the editor canvas but it's a huge lift and requires tons of testing. As I've stated in the passed, role document is my fault because I attempted to fix a legacy JAWS bug. That was a lesson learned on my part. We used role group before but even that was bad and would not fix this issue. Removing the role all together from useBlockProps is an interesting experience because it restores the semantics of all blocks. For example, inserting a table block with no role document or group will now make the block discoverable as a table.

Someone will have to take this on one of these days and then fix the endless E2E tests. Furthermore, we'd need real user testing of every block and situation to ensure we're not making the editor worse than it currently is.

I do not think we can remove the ability for the block wrapper to gain focus though, this totally removes the ability to easily delete or insert a block after the current position. Admittedly, it is a little known feature to keyboard users.

@jeryj
Copy link
Contributor Author

jeryj commented Aug 29, 2024

Thanks for the catch, @alexstine! I was assuming this fix was too good to be true :)

I do not think we can remove the ability for the block wrapper to gain focus though

Yeah, you're right. Thanks for catching this before I went too far down the path!

while it makes totally sense to use a list on the front end, why we're using a list in the editor?

@afercia I believe to make sure CSS styles match so that the editor is an accurate representation of the frontend site.

Some potential solutions:

  • Make the <button> the block wrapper instead of the <li>. This means passing the blockProps to the button, which I did try at first but it messed up all the styling since the <li> has some classNames on it. That's going to take some interesting reworking.
  • Another hackier but potential solution might be to make the <li> a role="button" and the button a role="none". Is this an especially bad idea or could it work here?

I'll play around with them and see if there's something we can do to make this better.

@alexstine
Copy link
Contributor

@jeryj What if you just add the block props to button and adjust the CSS styling? Although, I am wondering why useBlockProps I think use-first-focus-element is not working? When a block is selected, it should focus the button inside the li because the li is not a form element.

@afercia
Copy link
Contributor

afercia commented Aug 30, 2024

Another hackier but potential solution might be to make the

  • a role="button" and the button a role="none". Is this an especially bad idea or could it work here?

  • Technically, it's possible to make any element behave like a button but that would mean replicating all the semantics and interaction of a native button, including making sure the button can be acitvated on spacebar keyup. It's so overkill that I wouldn't recommend it.

    @jeryj jeryj force-pushed the fix/double-arrow-social-icons branch 2 times, most recently from bb6c8be to c8cf43f Compare August 30, 2024 15:21
    @jeryj
    Copy link
    Contributor Author

    jeryj commented Aug 30, 2024

    I ended up moving the ..blockProps to the <button />. Seems to be working well! Ready for testing 👍🏻

    @afercia
    Copy link
    Contributor

    afercia commented Sep 2, 2024

    To my understanding, by moving the props from the li to the button, also some of the styles are moved. This impacts the border radius of the button and the focus style, which is now different. See screenshot below, before and after.

    before

    @jeryj
    Copy link
    Contributor Author

    jeryj commented Sep 3, 2024

    This impacts the border radius of the button and the focus style, which is now different.

    @afercia My suspicion from the code is that the <li> with blockProps had the default block focus style, then because the button also had focus it was given a distinct focus style to distinguish it from the <li>. Now that the blockProps are on the button, I think it's best that the focus style matches the default block selection focus style (thinner border, no border radius). So, I think the focus style changing to the default block focus style is the right decision.

    @afercia
    Copy link
    Contributor

    afercia commented Sep 4, 2024

    @jeryj thanks for your feedback. I have no strong opinions on whether to consider the social icons in the editor 'blocks' or 'buttons', the most important thing is that there is a focus style whatever its shape is 🙂

    @getdave getdave force-pushed the fix/double-arrow-social-icons branch from f49c692 to 49c47e2 Compare September 4, 2024 08:27
    @getdave
    Copy link
    Contributor

    getdave commented Sep 4, 2024

    I rebased here because my recent changes to the UX in Core weren't reflected but it seems I made a mistake and reverted @jeryj's progress. He will have his local copy which he can use to update this when he's back. My apologies - it was early in the morning 🤦

    @jeryj jeryj force-pushed the fix/double-arrow-social-icons branch 2 times, most recently from f49c692 to eb95d1b Compare September 4, 2024 14:32
    @jeryj
    Copy link
    Contributor Author

    jeryj commented Sep 4, 2024

    It happens! Rebased and force pushed :)

    @getdave
    Copy link
    Contributor

    getdave commented Sep 24, 2024

    What's left here to get this merged?

    More reviews and testing I believe.

    Copy link
    Contributor

    @getdave getdave left a comment

    Choose a reason for hiding this comment

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

    In my testing I was able to move to the block and use the arrow keys and ENTER to perform all the key interactions. I was even able to move to the + inserter using arrows to add new blocks.

    Overall this seems like an improvement.

    @getdave getdave added [Type] Enhancement A suggestion for improvement. and removed [Type] Bug An existing feature does not function as intended labels Sep 24, 2024
    @jeryj
    Copy link
    Contributor Author

    jeryj commented Sep 24, 2024

    Anyone willing to give it an approving review?

    @afercia
    Copy link
    Contributor

    afercia commented Sep 25, 2024

    To my understanding, the markup on the front end doesn't change and that's great.
    In the editor, it does change and testing with Safari and VoiceOver, there may be a problem. B moving the props to the button, the button gets also a role=document which is normally set to the block (the li element) and it's now moved to the button. Simplified markup in the editor:

    Before:

    <li tabindex="0" class="block-editor-block-list__block wp-block wp-social-link wp-social-link-github wp-block-social-link" id="block-39ba69a7-6f19-478e-9a29-ef99aeb041f0" role="document" aria-label="Block: GitHub" data-block="39ba69a7-6f19-478e-9a29-ef99aeb041f0" data-type="core/social-link" data-title="GitHub">
        <button class="wp-block-social-link-anchor" aria-haspopup="dialog"><span class="wp-block-social-link-label screen-reader-text">GitHub</span></button>
    </li>
    

    After:

    <li class="wp-social-link wp-block-social-link wp-social-link__list-item wp-social-link-github">
        <button aria-haspopup="dialog" tabindex="0" class="block-editor-block-list__block wp-block wp-block-social-link-anchor wp-block-social-link" id="block-320dc936-1769-4850-8a98-bb907a9a2ec3" role="document" aria-label="Block: GitHub" data-block="320dc936-1769-4850-8a98-bb907a9a2ec3" data-type="core/social-link" data-title="GitHub"><span class="wp-block-social-link-label screen-reader-text">GitHub</span></button>
    </li>
    

    Since the button native role is now overridden by role="document", the button is announced as 'document'. VoiceOver dosn't even announce aria-haspopup="dialog" because aria-haspopup is unexpected on a document.

    For screen reader users this makes ery difficult to understand how to interact with the social icons nested blocks and at this point I'm not sure moving all the props to the button is the best option. A few screenshots to better illustrate:

    Before:

    The LI element is the block and it's announced as such:

    Screenshot 2024-09-25 at 09 23 08

    Navigating with Control+Option+Right arrow to the button, the button is announced as a button with a dialog pop-up, which is what I would expect:

    Screenshot 2024-09-25 at 09 23 15

    After:

    The LI element is still announced as block, probably because it now contains the block:

    Screenshot 2024-09-25 at 09 25 50

    Navigating with Control+Option+Right arrow to the button, the button is not announced as button any longer. The only thin that is announced is the aria-label aria-label="Block: GitHub". No information that is'a an interactive button that opens a dialog.

    Screenshot 2024-09-25 at 09 27 00

    Basically, while moving the props to the button solves the keyboard interaction issue, it removes any information on how to interact with the button, which is a problem for screen reader users.

    The root problem is that each LI is actually treateed as a nested block. As such it's focusable and labeled. Would it make sense to keep the props on the LI and only remove the tabindex?

    @getdave
    Copy link
    Contributor

    getdave commented Sep 25, 2024

    I guess another option is to remove the ul > li markup entirely in the editor (only) and just use div > buttons. I know that we've established that markup between editor and front end doesn't have to match.

    @afercia
    Copy link
    Contributor

    afercia commented Sep 25, 2024

    Couple thoughts:

    1
    One option could be removing tabIndex from the blockProps. This way the LI, which is the actual inner block, wouldn't be focusable any longer and focus would go to the button. However, this would be an exception that is hard to justify as all blocks are supposed to be focusable.

    2
    What is the difference about focus management with similar blocks? For example the Buttons block:

    • The parent block is focusable, that's not an issue.
    • The inner Button block is a div element with tabindex=0 so it's focusable.
    • It contains a contenteditable element (RichText) that is focusable.

    However, when tabbing into the inner block, the Button block is skipped and focus goes directly to the contenteditable.
    Is there any focus management to skip the Button block? If so, I would consider to be consistent and manage focus to make it go directly to the social link button.

    buttons

    @getdave
    Copy link
    Contributor

    getdave commented Sep 25, 2024

    That's super helpful detail @afercia 👍

    @jeryj
    Copy link
    Contributor Author

    jeryj commented Sep 25, 2024

    One option could be removing tabIndex from the blockProps. This way the LI, which is the actual inner block, wouldn't be focusable any longer and focus would go to the button. However, this would be an exception that is hard to justify as all blocks are supposed to be focusable.

    That's what I tried initially, but it breaks using the delete button to delete a block.

    However, when tabbing into the inner block, the Button block is skipped and focus goes directly to the contenteditable.
    Is there any focus management to skip the Button block?

    I believe if there is a focusable element inside the block, focus is supposed to be transferred to it automatically. Maybe there's a bug there that's breaking this. I'll investigate.

    @jeryj
    Copy link
    Contributor Author

    jeryj commented Oct 2, 2024

    However, this would be an exception that is hard to justify as all blocks are supposed to be focusable.

    Looked into this more. The current trunk behavior is technically correct if the li has the blockProps. We shouldn't automatically send focus to the button, as that would also remove the ability to delete an individual item or multiselect unless we also add these event listeners into the block. I also don't like the idea of duplicating behaviors in one block, as it will be a point to maintain a divergence.

    However, when tabbing into the inner block, the Button block is skipped and focus goes directly to the contenteditable.

    I think this is due to the button being a contenteditable. Also, as a result of this behavior, you can't have a selection on a single button or navigate between buttons easily. For example, To delete it, you have to delete all the text and press delete again. You can't arrow between the button blocks. I would prefer to be able to use the arrow keys to navigate between the button blocks instead of it automatically focusing the contenteditable.

    Screen.Recording.2024-10-02.at.11.42.42.AM.mov

    Navigating with Control+Option+Right arrow to the button, the button is not announced as button any longer. The only thin that is announced is the aria-label aria-label="Block: GitHub". No information that is'a an interactive button that opens a dialog.

    If we preserve this route of moving the blockProps to the button, the main issue is that the social icon button block is not announced as a button so screen reader users don't have any idea that the element is interactive. If I can get the button to announce as a button instead of role=document, I think we could continue with the current route? Would that address the issue?

    @jeryj jeryj force-pushed the fix/double-arrow-social-icons branch from 8aeebee to 411c567 Compare October 2, 2024 17:02
    @jeryj
    Copy link
    Contributor Author

    jeryj commented Oct 2, 2024

    I added the role=button as an override, and the semantics seem much better.

    Screen.Recording.2024-10-02.at.11.56.34.AM.mov

    @alexstine
    Copy link
    Contributor

    The block itself still really isn't focusable though. You think users will figure out they can press delete on the button to remove? The whole concept of blocks in Gutenberg drives me up a wall if I'm being honest. Block and block content, I have no idea how we ended up in this world where some have wrappers, some do not.

    @jeryj
    Copy link
    Contributor Author

    jeryj commented Oct 2, 2024

    The block itself still really isn't focusable though.

    Can you explain this more? It seems focusable in my testing. It's announcing "Block: Bandcamp, dialog pop up, button" and seems to have all the keybindings of a block.

    Copy link
    Contributor

    @alexstine alexstine left a comment

    Choose a reason for hiding this comment

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

    Gave this another review and it tests fine. Sorry for the really late reply.

    @jeryj
    Copy link
    Contributor Author

    jeryj commented Nov 11, 2024

    @afercia - Do you want to give this another round of testing before merging? I know it's a lot to go over.

    Copy link
    Contributor

    @getdave getdave left a comment

    Choose a reason for hiding this comment

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

    I tested this and found the interactions to be much better. Combined with the changes to the inserter this whole block now feels a lot easier to use 🎉

    I tried to break this by changing colors, applying block styles and various things but I couldn't see any regressions.

    Not sure if you wanted to add a quick set of tests here to ensure there are no future regressions to the focus handling?

    Overall, great job 🙇

    @afercia
    Copy link
    Contributor

    afercia commented Nov 13, 2024

    @jeryj thanks for the ping. Keyboard interaction is way better now, thank you!

    I added the role=button as an override, and the semantics seem much better.

    Genuine question, I don't remember: why not 'omit' the role from blockProps instead of overriding it with an explicit role="button"? Something like: const { role, ...blockPropsNoRole } = blockProps;.

    Nitpick:
    at this point, the semantic structure would ne:

    focusable `<ul>` element with role=document, semantically it's not an unordered list
        `<li>` elements are still list elements
            `<button>` element with role=button 
    

    Basically the <li> elements are stray list items with no list parent. To be a little cleaner I'd suggest to add a role="presentation" to the list items.

    By moving the blockProps for the social icon from the <li> to the <button>, we get the appropriate behavior of being able to select and create social icons with a clean keyboard behavior.
    @jeryj
    Copy link
    Contributor Author

    jeryj commented Nov 18, 2024

    Genuine question, I don't remember: why not 'omit' the role from blockProps instead of overriding it with an explicit role="button"? Something like: const { role, ...blockPropsNoRole } = blockProps;.

    @afercia Thanks for reviewing this again! If we don't explicitly add the button role, useBlockProps adds a role=document to it, which removes the info about the popover attached to the button.

    Basically the <li> elements are stray list items with no list parent. To be a little cleaner I'd suggest to add a role="presentation" to the list items.

    Thank you for that catch! Updated 👍🏻

    @jeryj jeryj force-pushed the fix/double-arrow-social-icons branch from 411c567 to 64ca1c9 Compare November 18, 2024 17:25
    @jeryj jeryj enabled auto-merge (squash) November 18, 2024 17:25
    @jeryj jeryj merged commit 2027fdb into trunk Nov 18, 2024
    61 of 63 checks passed
    @jeryj jeryj deleted the fix/double-arrow-social-icons branch November 18, 2024 18:00
    @github-actions github-actions bot added this to the Gutenberg 19.8 milestone Nov 18, 2024
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Labels
    [Block] Social Affects the Social Block - used to display Social Media accounts [Type] Enhancement A suggestion for improvement.
    Projects
    Development

    Successfully merging this pull request may close these issues.

    Broken Keyboard Interaction for moving between and using social icons
    4 participants