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

ResizableFrame: Make keyboard accessible #52443

Merged
merged 14 commits into from Jul 13, 2023
Merged

Conversation

mirka
Copy link
Member

@mirka mirka commented Jul 8, 2023

Fixes #51267

What?

Adds back keyboard operability to the Editor Canvas frame resizing handle.

In addition, the "Drag to resize" title attribute is now moved to a proper Tooltip and is translatable.

Why?

The changes in #49910 introduced a major accessibility regression.

How?

Make the resize handle focusable, and add keydown handlers for resizing.

Testing Instructions

  1. Open the Site Editor.
  2. Hit the Tab key until you focus on the resize handle.
  3. Hit the Left/Right arrow keys to resize the frame. The Shift key works as a modifier.
  4. Normal mouse drag resizing should also work as before.

Screenshots or screencast

CleanShot.2023-07-08.at.10.48.14-converted.mp4

@mirka mirka added [Type] Bug An existing feature does not function as intended [Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). [Package] Edit Site /packages/edit-site labels Jul 8, 2023
@mirka mirka self-assigned this Jul 8, 2023
@github-actions
Copy link

github-actions bot commented Jul 8, 2023

Size Change: +2.58 kB (0%)

Total Size: 1.43 MB

Filename Size Change
build/block-editor/content-rtl.css 4.26 kB +12 B (0%)
build/block-editor/content.css 4.25 kB +12 B (0%)
build/block-editor/index.min.js 209 kB +24 B (0%)
build/block-editor/style-rtl.css 14.8 kB +6 B (0%)
build/block-editor/style.css 14.8 kB +7 B (0%)
build/block-library/blocks/details/style-rtl.css 178 B +19 B (+12%) ⚠️
build/block-library/blocks/details/style.css 178 B +19 B (+12%) ⚠️
build/block-library/blocks/file/view.min.js 375 B +63 B (+20%) 🚨
build/block-library/blocks/footnotes/style-rtl.css 201 B +1 B (+1%)
build/block-library/blocks/navigation/view.min.js 438 B -546 B (-55%) 🏆
build/block-library/blocks/query-pagination/style-rtl.css 302 B +14 B (+5%) 🔍
build/block-library/blocks/query-pagination/style.css 299 B +15 B (+5%) 🔍
build/block-library/index.min.js 202 kB +358 B (0%)
build/block-library/style-rtl.css 13.7 kB +24 B (0%)
build/block-library/style.css 13.7 kB +23 B (0%)
build/components/index.min.js 240 kB +30 B (0%)
build/core-data/index.min.js 16.4 kB +253 B (+2%)
build/edit-post/index.min.js 35.3 kB -173 B (0%)
build/edit-site/index.min.js 87.9 kB +725 B (+1%)
build/edit-site/style-rtl.css 13.1 kB +263 B (+2%)
build/edit-site/style.css 13.1 kB +258 B (+2%)
build/editor/index.min.js 45.5 kB +119 B (0%)
build/react-refresh-entry/index.min.js 9.47 kB +1.03 kB (+12%) ⚠️
build/rich-text/index.min.js 11 kB +26 B (0%)
ℹ️ 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 6.99 kB
build/block-directory/style-rtl.css 1.02 kB
build/block-directory/style.css 1.02 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 624 B
build/block-library/blocks/button/style.css 623 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 409 B
build/block-library/blocks/columns/style.css 409 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.61 kB
build/block-library/blocks/cover/style.css 1.6 kB
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 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 269 B
build/block-library/blocks/file/style.css 270 B
build/block-library/blocks/file/view-interactivity.min.js 317 B
build/block-library/blocks/footnotes/style.css 199 B
build/block-library/blocks/freeform/editor-rtl.css 2.58 kB
build/block-library/blocks/freeform/editor.css 2.58 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.42 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.46 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 507 B
build/block-library/blocks/media-text/style.css 505 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.21 kB
build/block-library/blocks/navigation/style.css 2.2 kB
build/block-library/blocks/navigation/view-interactivity.min.js 988 B
build/block-library/blocks/navigation/view-modal.min.js 2.78 kB
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 401 B
build/block-library/blocks/page-list/editor.css 401 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 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 153 B
build/block-library/blocks/post-navigation-link/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 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 103 B
build/block-library/blocks/preformatted/style.css 103 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 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 221 B
build/block-library/blocks/query-pagination/editor.css 211 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/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 587 B
build/block-library/blocks/search/style.css 584 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 531 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 203 B
build/block-library/blocks/site-logo/style.css 203 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 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.43 kB
build/block-library/blocks/social-links/style.css 1.42 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 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 645 B
build/block-library/blocks/table/style.css 644 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 174 B
build/block-library/blocks/video/style.css 174 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.1 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/theme-rtl.css 686 B
build/block-library/theme.css 691 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 kB
build/commands/index.min.js 14.9 kB
build/commands/style-rtl.css 827 B
build/commands/style.css 827 B
build/components/style-rtl.css 11.7 kB
build/components/style.css 11.7 kB
build/compose/index.min.js 12 kB
build/core-commands/index.min.js 2.26 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.28 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.63 kB
build/edit-post/classic-rtl.css 544 B
build/edit-post/classic.css 545 B
build/edit-post/style-rtl.css 7.58 kB
build/edit-post/style.css 7.57 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/style-rtl.css 3.58 kB
build/editor/style.css 3.58 kB
build/element/index.min.js 4.8 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 7.62 kB
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 10.2 kB
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.64 kB
build/keycodes/index.min.js 1.84 kB
build/list-reusable-blocks/index.min.js 2.18 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/plugins/index.min.js 1.77 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 943 B
build/react-i18n/index.min.js 615 B
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.54 kB
build/reusable-blocks/style-rtl.css 243 B
build/reusable-blocks/style.css 243 B
build/router/index.min.js 1.77 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.83 kB
build/token-list/index.min.js 582 B
build/url/index.min.js 3.57 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 268 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

Comment on lines -64 to -69
.edit-site-resizable-frame__handle-label {
background: var(--wp-admin-theme-color);
border-radius: 2px;
color: #fff;
margin-right: $grid-unit-10;
padding: 4px 8px;
Copy link
Member Author

Choose a reason for hiding this comment

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

Unused styles 🧹

Comment on lines +33 to +39
border: 0;
border-radius: $grid-unit-05;
cursor: col-resize;
display: flex;
height: $grid-unit-80;
justify-content: flex-end;
padding: 0;
Copy link
Member Author

Choose a reason for hiding this comment

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

Resets user agent button styles.

Comment on lines 190 to 191
// TODO: Confirm if this is the focus behavior we want
document.querySelector( 'iframe[name=editor-canvas]' ).focus();
Copy link
Member Author

@mirka mirka Jul 8, 2023

Choose a reason for hiding this comment

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

Needs accessibility feedback: Do we want some kind of focus manipulation after the frame is resized to full width? (cc @afercia @andrewhayward)

To test

  1. Focus on the resize handle.
  2. Hit the left arrow key until the editor canvas is in full width (edit mode).
  3. Hit the tab key to see where the focus is.

Comment out line 197 to see the default behavior.

Copy link
Contributor

Choose a reason for hiding this comment

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

I think it would be good if focus behaved the same in this case as it does when moving to edit mode by pressing Enter after focusing the frame, where we land at the top of the editing canvas and Tab focuses the first block in Select mode.

One thing I'm noticing is that focusing on resize handle and pressing left arrow once sometimes takes me into edit mode straightaway. I'm not sure if that's desirable, as currently the drag handle, when dragged with a mouse, allows us to expand the canvas until the sidebar is about 100px wide, and only if we try expanding further than that does it switch to edit mode. Dragging with a mouse is also behaving a bit weirdly in this branch:

draghandle.mov

(I can't reproduce this 100% of the time, but it's happening consistently on Firefox and about half the time on Chrome)

Copy link
Contributor

Choose a reason for hiding this comment

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

Hello @mirka @tellthemachines I'd agree focus management should work in the same way it works when switching to the Edit view when pressing Enter on the iframe. However, I'm not sure it should land on the first block... I created #51570 a few days ago to reconsider initial focus on the Site editor > Edit view.

className="edit-site-resizable-frame__handle"
className={ classnames(
'edit-site-resizable-frame__handle',
{ 'is-resizing': isResizing }
Copy link
Member Author

Choose a reason for hiding this comment

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

Makes is-resizing a proper CSS modifier for this element, instead of relying on the modifier on the parent element.

@mirka mirka marked this pull request as ready for review July 8, 2023 14:41
@mirka mirka requested review from SaxonF, afercia and ramonjd July 8, 2023 14:42
@tellthemachines tellthemachines added the Backport to WP Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Jul 10, 2023
Copy link
Contributor

@tellthemachines tellthemachines 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 fixing this! It's generally working well, apart from what I mentioned below.

One thing (unrelated to this PR) I noticed when testing is that there's no way to skip directly into edit mode with the keyboard; we have to tab through the whole sidebar to get to the canvas frame. Would be nice to have a skip link or something at the start.

Comment on lines 190 to 191
// TODO: Confirm if this is the focus behavior we want
document.querySelector( 'iframe[name=editor-canvas]' ).focus();
Copy link
Contributor

Choose a reason for hiding this comment

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

I think it would be good if focus behaved the same in this case as it does when moving to edit mode by pressing Enter after focusing the frame, where we land at the top of the editing canvas and Tab focuses the first block in Select mode.

One thing I'm noticing is that focusing on resize handle and pressing left arrow once sometimes takes me into edit mode straightaway. I'm not sure if that's desirable, as currently the drag handle, when dragged with a mouse, allows us to expand the canvas until the sidebar is about 100px wide, and only if we try expanding further than that does it switch to edit mode. Dragging with a mouse is also behaving a bit weirdly in this branch:

draghandle.mov

(I can't reproduce this 100% of the time, but it's happening consistently on Firefox and about half the time on Chrome)

@andrewhayward
Copy link
Contributor

Couple of thoughts...

Edit mode

First, it's really jarring and unexpected to jump into edit mode by hitting left one too many times, and I'd fail it under WCAG 3.2.2:

Changes in context can confuse users who do not easily perceive the change or are easily distracted by changes. Changes of context are appropriate only when it is clear that such a change will happen in response to the user's action.
Understanding SC 3.2.2: On Input (Level A)

I'd suggest instead that we clamp the resizing to the maximum and minimum sizes available, and leave it as a simple resize control.

Diff
diff --git a/packages/edit-site/src/components/resizable-frame/index.js b/packages/edit-site/src/components/resizable-frame/index.js
index 22567dbe96..cb5f5120ee 100644
--- a/packages/edit-site/src/components/resizable-frame/index.js
+++ b/packages/edit-site/src/components/resizable-frame/index.js
@@ -176,9 +176,12 @@ function ResizableFrame( {
 
 		const step = 20 * ( event.shiftKey ? 5 : 1 );
 		const delta = step * ( event.key === 'ArrowLeft' ? 1 : -1 );
-		const newWidth = Math.max(
-			FRAME_MIN_WIDTH,
-			frameRef.current.resizable.offsetWidth + delta
+		const newWidth = Math.min(
+			Math.max(
+				FRAME_MIN_WIDTH,
+				frameRef.current.resizable.offsetWidth + delta
+			),
+			initialComputedWidthRef.current
 		);
 
 		setFrameSize( {
@@ -188,14 +191,6 @@ function ResizableFrame( {
 				initialAspectRatioRef.current
 			),
 		} );
-
-		// If oversized, immediately switch to edit mode
-		if ( newWidth > initialComputedWidthRef.current ) {
-			setFrameSize( INITIAL_FRAME_SIZE );
-			setCanvasMode( 'edit' );
-			// TODO: Confirm if this is the focus behavior we want
-			document.querySelector( 'iframe[name=editor-canvas]' ).focus();
-		}
 	};
 
 	const frameAnimationVariants = {

Component role

Secondly, we should ideally mark the resize handle as a separator, and (because it's interactive) provide appropriate aria-value* attributes.

<el role="separator" aria-valuemin="..." aria-valuemax="..." aria-valuenow="..." />
Diff
diff --git a/packages/edit-site/src/components/resizable-frame/index.js b/packages/edit-site/src/components/resizable-frame/index.js
index 22567dbe96..e500723c31 100644
--- a/packages/edit-site/src/components/resizable-frame/index.js
+++ b/packages/edit-site/src/components/resizable-frame/index.js
@@ -231,6 +231,10 @@ function ResizableFrame( {
 		return shouldShowHandle ? 'visible' : 'hidden';
 	} )();
 
+	const maxSize = initialComputedWidthRef.current;
+	const minSize = FRAME_MIN_WIDTH;
+	const currentSize = frameRef?.current?.resizable?.offsetWidth || maxSize;
+
 	return (
 		<ResizableBox
 			as={ motion.div }
@@ -281,8 +285,13 @@ function ResizableFrame( {
 								) }
 								variants={ resizeHandleVariants }
 								animate={ currentResizeHandleVariant }
+								role="separator"
+								aria-orientation="vertical"
 								aria-label={ __( 'Drag to resize' ) }
 								aria-describedby={ resizableHandleHelpId }
+								aria-valuenow={ currentSize }
+								aria-valuemin={ minSize }
+								aria-valuemax={ maxSize }
 								onKeyDown={ handleResizableHandleKeyDown }
 								initial="hidden"
 								exit="hidden"

@tellthemachines tellthemachines added [Priority] High Used to indicate top priority items that need quick attention [Type] Regression Related to a regression in the latest release labels Jul 11, 2023
@tellthemachines
Copy link
Contributor

We should aim to have this wrapped up before the end of the week so it can make 6.3 RC1. Do you think that's possible @mirka?

@mirka
Copy link
Member Author

mirka commented Jul 11, 2023

We should aim to have this wrapped up before the end of the week so it can make 6.3 RC1. Do you think that's possible @mirka?

Yes, I'll try to land this ASAP 🙏

@afercia
Copy link
Contributor

afercia commented Jul 11, 2023

Quickly tested and seems to me it works pretty well, thank you!

One thing I found a bit confusing is that the 'Drag to resize' handle is placed in the tab sequence after the iframe. I would expect to find it between the navigation and the iframe so that it also matches the visual order.

A few more things:

@afercia
Copy link
Contributor

afercia commented Jul 11, 2023

I forgot the separator should also have an aria-orientation="vertical" attribute ❤️

@github-actions
Copy link

github-actions bot commented Jul 11, 2023

Flaky tests detected in 5acbbfd.
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/5536279309
📝 Reported issues:

@afercia
Copy link
Contributor

afercia commented Jul 12, 2023

@tellthemachines regarding the last two points you reported (good catch), I alraedy created two issues ~ one month ago. It would be great it they could be triaged.

when focus lands on the resizer, screen readers announce the "you are currently in navigation mode..

See #51578

when tabbing through from the sidebar, there's an invisible tab stop between the "Saved" button and the canvas frame

See #51540

}
aria-valuemin={ FRAME_MIN_WIDTH }
aria-valuemax={
initialComputedWidthRef.current
Copy link
Contributor

Choose a reason for hiding this comment

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

I'm thinking aria-valuemax should always be the main document offsetWidth. Otherwise this value will be different depending on the editor mode. For example: My screen is a 16-inch retina display. The default scaled resolution is 1792 x 1120 so the actual viewport width is 1792. WHen the editor is in vide mode, this will be aria-valuemax="1408". When the editor is in edit mode, this will be aria-valuemax="1792".
I think the value should always the actual maximum width the iframe can be set to, which is 1792.
Also, we should make sure this value updates when resizing the browser window (I thikn it does update when set to the main document offsetWidth).

Copy link
Member Author

Choose a reason for hiding this comment

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

This is a difficult one actually. The values are associated with the separator, and the separator is only functional in View mode. Especially in a keyboard operation context, where I believe the semantics are most relevant, the max value is in fact the initial computed width. I think it would be confusing if you couldn't keyboard resize the frame up to the purported max value.

(In testing this, I noticed that the resize handle is still in the tab sequence when in Edit mode, so I fixed that. 5acbbfd)

@afercia
Copy link
Contributor

afercia commented Jul 12, 2023

The tab sequence order of the resize handle, as raised by @afercia. This is not a quick fix so we should address it separately.

Is there a follow-up issue for this already? I don't want to block this PR so yes it can be addressed separately. But I'd be a bit uncomfortable with releasing this feature in WP 6.3 with a confusing tab sequence.

@afercia
Copy link
Contributor

afercia commented Jul 12, 2023

On a side note:
Why the minimum width is 340? It appears to be a magic number. Is there any reason for this value? I'm not sure 340 pixels is a common device viewport width. If the goal is to allow users to emulate the most common mobile viewport widths, then maybe a more useful value would be 320?

Edit:
Worth also noting that when clicking Styles > Styles Book, the editor switches in 'focus mode' and it'r resizable. In this mode, the minimum width is 300. Not sure why it must be 300 in focus mode and 340 for the iframe. I'd consider to standardize to the same minimum width.

@mirka
Copy link
Member Author

mirka commented Jul 12, 2023

@afercia

Is there a follow-up issue for this already? I don't want to block this PR so yes it can be addressed separately. But I'd be a bit uncomfortable with releasing this feature in WP 6.3 with a confusing tab sequence.

I will post an issue after this PR is merged. However, this is a tricky one, because in the general case, resize handles can be on any edge or corner. It's only in this specific case where the handle is only on the left edge. So I do see an argument to optimize for consistency in the general case (for example the one in Style Book with two handles), and have all handles come after the frame.

If the goal is to allow users to emulate the most common mobile viewport widths, then maybe a more useful value would be 320?

That makes sense. I changed it to 320px (5fa0e8d), and I think we can change the Style Book one as well.

@mirka
Copy link
Member Author

mirka commented Jul 12, 2023

@tellthemachines I just realized that the dragging glitch you were seeing is likely #52582. I'll try to get that patched ASAP as well.

Copy link
Contributor

@tellthemachines tellthemachines 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 the follow-ups @mirka ! I think this is in a good place to be merged now, to fix the major regression from 6.2. Then we can address the rest of the issues.

One small thing that could be improved: screen readers announce the resizing in percentages but I'm not sure that makes much sense for the purpose. Wouldn't it be more useful to know the current canvas size in px? In any case, given the 6.2 resize handle doesn't announce anything, that's fine to iterate on for 6.4.

@mirka
Copy link
Member Author

mirka commented Jul 13, 2023

Wouldn't it be more useful to know the current canvas size in px?

Yes, we can do that 👍

@mirka mirka merged commit 9ea90f0 into trunk Jul 13, 2023
49 checks passed
@mirka mirka deleted the fix/resizable-frame-keyboard branch July 13, 2023 12:18
@github-actions github-actions bot added this to the Gutenberg 16.3 milestone Jul 13, 2023
westonruter added a commit that referenced this pull request Jul 13, 2023
…dd/defer-script-loading-strategy

* 'trunk' of https://github.com/WordPress/gutenberg: (24 commits)
  Add filter to turn off Interactivity API for a block (#52579)
  Search: Remove unnecessary useEffect (#52604)
  Navigation: Simplify the useSelect for useNavigationMenus (#51977)
  Item: Unify focus style and add default font styles (#52495)
  Update Changelog for 16.2.1
  Bump plugin version to 16.2.1
  Avoid passing undefined `selectedBlockClientId` in `BlockActionsMenu` (#52595)
  Cover Block: Fix block deprecation when fixed background is enabled (#51612)
  Nav block: link text color inheritance fixes and tests (#51710)
  Stabilize defaultBlock, directInsert API's and getDirectInsertBlock selector (#52083)
  Fix console warning by improving error handling in Nav block classic menu conversion (#52591)
  Fix: Remove link action of Link UI for draft pages created from Nav block does not correctly remove link. (#52415)
  Lodash: Remove remaining `_.get()` from block editor and deprecate (#52561)
  Fix importing classic menus (#52573)
  ResizableFrame: Make keyboard accessible (#52443)
  Site Editor: Fix navigation menu sidebar actions order and label (#52592)
  correct a typo: sapce -> space (#52578)
  Avoid errors in Dimension visualizers when switching between iframed and non-iframed editors (#52588)
  Patterns: Add client side pagination to patterns list (#52538)
  Site Editor: Make sidebar back button go *back* instead of *up* if possible (#52456)
  ...
tellthemachines pushed a commit that referenced this pull request Jul 14, 2023
* ResizableFrame: Make keyboard accessible

* Fix outline in Safari

* Use proper CSS modifier

* Add aria-label to button

* Keep handle enlarged when resizing (Safari)

* Add back visually hidden help text

* Don't switch to edit mode

* Make the handle a role="separator"

* Revert to `button`

* Switch description text to `div hidden`

* Prevent keydown event default when right/left arrow

* Change minimum frame width to 320px

* Mention shift key in description text

* Only render resize handle when in View mode
@tellthemachines
Copy link
Contributor

I just cherry-picked this PR to the update/first-batch-pre-RC1 branch to get it included in the next release: 4df1030

@tellthemachines tellthemachines removed the Backport to WP Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Jul 14, 2023
tellthemachines added a commit that referenced this pull request Jul 14, 2023
* Site Editor: Restore quick inserter 'Browse all' button (#52529)

* Site Editor: Restore quick inserter 'Browse all' button

* Remove leftover comment

* Patterns: update the title of Pattern block in the block inspector card  (#52010)

* Site Editor Pages: load the appropriate template if posts page set (#52266)

* This commit:
- links the posts page to the homepage template when a post page is set
- abstracts logic to get page item props

* The Posts Page resolves to display the Home or Index template only. Adding a check to skip the Front Page

* Showing homepage settings for posts pages that are set as the post page in reading settings

* Post pages that have been set to display posts will redirect to first the home template, then the index template. The fallback is the post id of the page.

* Reverted refactor of packages/edit-site/src/components/sidebar-navigation-screen-page/index.js
Will do it in a follow up

* Allow editing existing footnote from formats toolbar (#52506)

* Block Editor: Display variation icon in the 'BlockDraggable' component (#52502)

* Patterns: add option to set sync status when adding from wp-admin patterns list (#52352)

* Show a modal to set sync status if adding pattern from pattern list page

* Make sure the modal loads if post settings panel not open

* don't load modal component at all if not new post

* Simplify the sync status so undefined always = synced

* Update packages/editor/src/components/post-sync-status/index.js

---------

Co-authored-by: Ramon <ramonjd@users.noreply.github.com>

* Revise LinkControl suggestions UI to use MenuItem (#50978)

* Use "link" instead of "URL" for URL_TYPE

* Use MenuItem for search create button

* Use sentence case for "Create page"

* Use a MenuGroup for search results

* Use MenuItem for search item

* Refactoring styles (WIP)

* Preserve whitespace in results text

* Reinstate result item information including permalink

* Remove debugging CSS code

* Reinstate CSS to control size of rich previews favicon

* Remove other commented out CSS code

* Reinstate selected styles

* Remove more redundant CSS

* Add some basic results hover/focus styling.

Needs improving

* Improve icon alignment

* Update tests to handle wording changes

* Remove inconsistent hover/focus style

MenuItem already has hover/focus styles

* Reinstate is-selected visual state

* Update test to make sense in context of #51011

See #51011

* Fix locator for result text

---------

Co-authored-by: Dave Smith <getdavemail@gmail.com>

* Fix LinkControl mark highlight to bold (#52517)

* Add 'reusable' keyword to Pattern blocks (#52543)

* Fix missing Add Template Part button in Template Parts page (#52542)

* Tweak copy for the reusable block rename hint (#52581)

* Trim footnote anchors from excerpts (#52518)

* Trim footnote anchors from excerpts

* Add comments, fix spacing, appease linter

* Site Editor: Reset device preview type when exiting the editing mode (#52566)

* Make "My patterns" permanently visible (#52531)

* Hide site hub when resizing frame upwards to avoid overlap (#52180)

* Fix "Manage all patterns" link appearance (#52532)

* Fix "Manage all patterns" link

* Update focus style

* Update navigation menu title size & weight in detail panels (#52477)

* Update menu title size

* Adjust font weight

* Site Editor Patterns: Ensure sidebar does not shrink when long pattern titles are used (#52547)

* Edit Site: Select templateType from the store inside the useSiteEditorSettings hook (#52503)

* Add width to ensure ellipsis is applied (#52575)

* Cover Block: Fix block deprecation when fixed background is enabled (#51612)

* ResizableFrame: Make keyboard accessible (#52443)

* ResizableFrame: Make keyboard accessible

* Fix outline in Safari

* Use proper CSS modifier

* Add aria-label to button

* Keep handle enlarged when resizing (Safari)

* Add back visually hidden help text

* Don't switch to edit mode

* Make the handle a role="separator"

* Revert to `button`

* Switch description text to `div hidden`

* Prevent keydown event default when right/left arrow

* Change minimum frame width to 320px

* Mention shift key in description text

* Only render resize handle when in View mode

* Fix importing classic menus (#52573)

* use the same create hook for classic import

* Remove redundant arg to hook

---------

Co-authored-by: Dave Smith <getdavemail@gmail.com>

* Site Editor: Fix navigation menu sidebar actions order and label (#52592)

* Avoid errors in Dimension visualizers when switching between iframed and non-iframed editors (#52588)

* Patterns: Add client side pagination to patterns list (#52538)

Co-authored-by: Saxon Fletcher <saxonafletcher@gmail.com>

* Site Editor: Make sidebar back button go *back* instead of *up* if possible (#52456)

* Navigator: Add replace option to goTo() and goToParent()

* Site Editor: Make sidebar back button go back instead of up if possible

* Adapt template part hint copy (#52527)

* Try "panel" instead of "page"

* Update template-part-hint.js

---------

Co-authored-by: George Mamadashvili <georgemamadashvili@gmail.com>
Co-authored-by: Glen Davies <glendaviesnz@users.noreply.github.com>
Co-authored-by: Ramon <ramonjd@users.noreply.github.com>
Co-authored-by: Miguel Fonseca <150562+mcsf@users.noreply.github.com>
Co-authored-by: Rich Tabor <hi@richtabor.com>
Co-authored-by: Dave Smith <getdavemail@gmail.com>
Co-authored-by: Robert Anderson <robert@noisysocks.com>
Co-authored-by: James Koster <james@jameskoster.co.uk>
Co-authored-by: Andrew Serong <14988353+andrewserong@users.noreply.github.com>
Co-authored-by: arthur791004 <arthur.chu@automattic.com>
Co-authored-by: Aki Hamano <54422211+t-hamano@users.noreply.github.com>
Co-authored-by: Lena Morita <lena@jaguchi.com>
Co-authored-by: Andrei Draganescu <me@andreidraganescu.info>
Co-authored-by: Saxon Fletcher <saxonafletcher@gmail.com>
@afercia
Copy link
Contributor

afercia commented Jul 18, 2023

Thanks for working on this ❤️

Wouldn't it be more useful to know the current canvas size in px?

I'm not sure that would be what screen readers expect. The value of aria-valuenow is expected to be a decimal number. No pixels please. Once screen readers are provided with correct values for aria-valuenow, aria-valuemin, and aria-valuemax, then they are able to do their own calculations and provide users with some meaningful announcement. I don't think the ARIA specification tells anything about the 'format' of the announcement, this is left to each vendo implementation. We should just provide the values and let screen readers do their job.

Theoretically, aria-valuetext could be used to override the screen reader behavior and provide a human readable text alternative of aria-valuenow, Seems a bit overkill to me though.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). [Package] Edit Site /packages/edit-site [Priority] High Used to indicate top priority items that need quick attention [Type] Bug An existing feature does not function as intended [Type] Regression Related to a regression in the latest release
Projects
Development

Successfully merging this pull request may close these issues.

Site editor: frame resizing is not keyboard accessible
6 participants