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

Editor: Always render the 'Switch to Draft' button to avoid focus loss #54722

Merged
merged 1 commit into from
Sep 26, 2023

Conversation

Mamaduka
Copy link
Member

What?

Fixes #51901.

PR updates the PostSwitchToDraftButton component always to render to button, but using a disabled state when switching to draft isn't possible.

Why?

See #51901.

Instead, with the new placement of the Switch to Draft button in the settings panel, users are now forced to navigate almost the entire editor UI to go back where they were.

The expected behavior is that focus is returned to the UI control that opened the modal dialog. As such, the 'Switch to Draft' button should not be removed from the DOM. Ideally, it shoul dstay in the DOM, be still focusable, use an aria-disabled attribute and 'noop'. See: ARIA Authoring Practices: Focusability of disabled controls.

How?

  • Updates button to use aria-disabled instead of disabled prop.
  • Noops the onClick callback when the button is disabled.

Testing Instructions

  1. Open a published or scheduled post.
  2. Navigate to the "Switch to Draft" button in document settings.
  3. Switch the post to draft.
  4. Verify that the button is visible, but has a disabled state.

Testing Instructions for Keyboard

Same

Screenshots or screencast

CleanShot.2023-09-22.at.13.48.20.mp4

@Mamaduka Mamaduka added [Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). Needs Design Feedback Needs general design feedback. [Package] Editor /packages/editor labels Sep 22, 2023
@Mamaduka Mamaduka requested review from mtias, afercia and a team September 22, 2023 09:55
@Mamaduka Mamaduka self-assigned this Sep 22, 2023
@jasmussen
Copy link
Contributor

Tricky one, obviously needs to be solved so thank you for the PR. It surfaces a shortcoming in this design, definitely — because it isn't ideal that "switch to draft" as a big honking always present button is visible on draft posts when it's entirely non functional.

I suspect we need to revisit this entire panel and keeping this focus loss in mind so we can find a new design that covers all those bases.

In the mean time, this does seem like the simplest path forward. The bigger issue here is the lack of a border on the disabled state of the secondary button style. Can we/should we update that to include the border, can even be lighter if need be. This is mainly to maintain the box grid.

@github-actions
Copy link

Size Change: -5 B (0%)

Total Size: 1.62 MB

Filename Size Change
build/editor/index.min.js 45.9 kB -5 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 964 B
build/annotations/index.min.js 2.7 kB
build/api-fetch/index.min.js 2.29 kB
build/autop/index.min.js 2.11 kB
build/blob/index.min.js 461 B
build/block-directory/index.min.js 7.05 kB
build/block-directory/style-rtl.css 1.04 kB
build/block-directory/style.css 1.04 kB
build/block-editor/content-rtl.css 4.28 kB
build/block-editor/content.css 4.27 kB
build/block-editor/default-editor-styles-rtl.css 403 B
build/block-editor/default-editor-styles.css 403 B
build/block-editor/index.min.js 218 kB
build/block-editor/style-rtl.css 15.6 kB
build/block-editor/style.css 15.6 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 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 138 B
build/block-library/blocks/audio/theme.css 138 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 587 B
build/block-library/blocks/button/editor.css 587 B
build/block-library/blocks/button/style-rtl.css 633 B
build/block-library/blocks/button/style.css 632 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.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 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 138 B
build/block-library/blocks/embed/theme.css 138 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 311 B
build/block-library/blocks/file/style.css 312 B
build/block-library/blocks/file/view.min.js 321 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 957 B
build/block-library/blocks/gallery/editor.css 962 B
build/block-library/blocks/gallery/style-rtl.css 1.55 kB
build/block-library/blocks/gallery/style.css 1.55 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 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 189 B
build/block-library/blocks/heading/style.css 189 B
build/block-library/blocks/html/editor-rtl.css 340 B
build/block-library/blocks/html/editor.css 341 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 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/image/view.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 671 B
build/block-library/blocks/navigation-link/editor.css 672 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 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 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.25 kB
build/block-library/blocks/navigation/style.css 2.23 kB
build/block-library/blocks/navigation/view.min.js 1.01 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 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 322 B
build/block-library/blocks/post-featured-image/style.css 322 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 288 B
build/block-library/blocks/query-pagination/style.css 284 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 486 B
build/block-library/blocks/query/editor.css 486 B
build/block-library/blocks/query/style-rtl.css 375 B
build/block-library/blocks/query/style.css 372 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 594 B
build/block-library/blocks/search/style.css 594 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 471 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 329 B
build/block-library/blocks/shortcode/editor.css 329 B
build/block-library/blocks/site-logo/editor-rtl.css 760 B
build/block-library/blocks/site-logo/editor.css 760 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 359 B
build/block-library/blocks/spacer/editor.css 359 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 646 B
build/block-library/blocks/table/style.css 645 B
build/block-library/blocks/table/theme-rtl.css 157 B
build/block-library/blocks/table/theme.css 157 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 191 B
build/block-library/blocks/video/style.css 191 B
build/block-library/blocks/video/theme-rtl.css 139 B
build/block-library/blocks/video/theme.css 139 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.11 kB
build/block-library/common.css 1.11 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.2 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 206 kB
build/block-library/reset-rtl.css 472 B
build/block-library/reset.css 472 B
build/block-library/style-rtl.css 14 kB
build/block-library/style.css 14 kB
build/block-library/theme-rtl.css 700 B
build/block-library/theme.css 705 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/blocks/index.min.js 51.5 kB
build/commands/index.min.js 15.5 kB
build/commands/style-rtl.css 947 B
build/commands/style.css 942 B
build/components/index.min.js 246 kB
build/components/style-rtl.css 11.8 kB
build/components/style.css 11.8 kB
build/compose/index.min.js 12.7 kB
build/core-commands/index.min.js 2.62 kB
build/core-data/index.min.js 17.1 kB
build/customize-widgets/index.min.js 12 kB
build/customize-widgets/style-rtl.css 1.51 kB
build/customize-widgets/style.css 1.5 kB
build/data-controls/index.min.js 651 B
build/data/index.min.js 8.87 kB
build/date/index.min.js 17.9 kB
build/deprecated/index.min.js 462 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.68 kB
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/edit-post/index.min.js 35.6 kB
build/edit-post/style-rtl.css 7.92 kB
build/edit-post/style.css 7.91 kB
build/edit-site/index.min.js 185 kB
build/edit-site/style-rtl.css 14 kB
build/edit-site/style.css 14 kB
build/edit-widgets/index.min.js 17 kB
build/edit-widgets/style-rtl.css 4.84 kB
build/edit-widgets/style.css 4.84 kB
build/editor/style-rtl.css 3.58 kB
build/editor/style.css 3.58 kB
build/element/index.min.js 4.87 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 7.75 kB
build/format-library/style-rtl.css 577 B
build/format-library/style.css 577 B
build/hooks/index.min.js 1.57 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.61 kB
build/interactivity/index.min.js 11.4 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.74 kB
build/keycodes/index.min.js 1.9 kB
build/list-reusable-blocks/index.min.js 2.2 kB
build/list-reusable-blocks/style-rtl.css 865 B
build/list-reusable-blocks/style.css 865 B
build/media-utils/index.min.js 2.92 kB
build/notices/index.min.js 964 B
build/nux/index.min.js 2 kB
build/nux/style-rtl.css 775 B
build/nux/style.css 771 B
build/patterns/index.min.js 3.54 kB
build/patterns/style-rtl.css 325 B
build/patterns/style.css 325 B
build/plugins/index.min.js 1.8 kB
build/preferences-persistence/index.min.js 1.85 kB
build/preferences/index.min.js 1.25 kB
build/primitives/index.min.js 994 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 972 B
build/react-i18n/index.min.js 624 B
build/react-refresh-entry/index.min.js 9.46 kB
build/react-refresh-runtime/index.min.js 6.78 kB
build/redux-routine/index.min.js 2.71 kB
build/reusable-blocks/index.min.js 2.72 kB
build/reusable-blocks/style-rtl.css 265 B
build/reusable-blocks/style.css 265 B
build/rich-text/index.min.js 10.2 kB
build/router/index.min.js 1.78 kB
build/server-side-render/index.min.js 1.95 kB
build/shortcode/index.min.js 1.4 kB
build/style-engine/index.min.js 1.98 kB
build/sync/index.min.js 53.8 kB
build/token-list/index.min.js 587 B
build/url/index.min.js 3.84 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 968 B
build/warning/index.min.js 259 B
build/widgets/index.min.js 7.17 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.03 kB

compressed-size-action

@Mamaduka
Copy link
Member Author

100% - It's not the prettiest solution, but it's a good intermediate one while working out the new design.

The editor has other actions with the same issues, e.g., the "block toolbar" unlock button. It would be great to have a general design guide on handling this tricky a11y and design challenges.

I also noticed a lack of focus styles. Do we have CSS/styles that I can reuse for this?

@jasmussen
Copy link
Contributor

The block toolbar is a difficult challenge I'd keep separate, there's a lot of nuance there.

I also noticed a lack of focus styles. Do we have CSS/styles that I can reuse for this?

There are a couple of mixins, but I'm curious why the focus style doesn't work on its own? Ideally it should be built into the button component itself.

@Mamaduka
Copy link
Member Author

The primary button has a focus style when it's disabled. But not secondary or tertiary.

Screenshot

CleanShot 2023-09-22 at 14 27 42

@jasmussen
Copy link
Contributor

That seems a bug in the core component, one to fix there, no?

@Mamaduka
Copy link
Member Author

Yes, it's unrelated to the changes in this PR, so we can fix it separately and add a changelog entry to the components package.

@alexstine
Copy link
Contributor

Its a design challenge to solve Gutenberg-wide. There are 2 basic rules.

  1. Avoid removing/re-rendering DOM elements.
  2. Avoid changing the labels/accessible names of buttons to communicate state.

The second is less obvious but still a WCAG failure. The first can lead to focus loss as this PR shows.

What someone should figure out how to do is code some type of focus loss handler that always returns focus back to a constant point. Tricky part would be figuring out if its a true focus loss vs. the user moving away. At least until design and functionality learn to work together a little better in the UI. I tried it once but could never figure out how to tell if focus was totally lost or not. I have an active PR where I try to implement this for writing flow and I almost get a headache from how messy the code is.

Real solution, do whatever you've got to do visually but never change the DOM to the point where React can't reconcile.

@jameskoster
Copy link
Contributor

Would it be feasible to use the status selection UI from the site editor here?

@Mamaduka
Copy link
Member Author

@jameskoster, can you share the screenshot?

@jameskoster
Copy link
Contributor

This one:

Screenshot 2023-09-25 at 13 51 21

To be clear, I'm not suggesting we do that in this PR. Just noting that the site editor UI effectively solves this issue by omitting the "Switch to draft" button altogether. And since that UI already exists, perhaps it can be reused?

@Mamaduka
Copy link
Member Author

Thanks, @jameskoster!

The post editor already has a similar UI, so we should consolidate Status control.

Does anyone remember the historical reasons why we had a separate button for the "Switch to Draft" action?

Screenshot

CleanShot 2023-09-25 at 16 59 10

@afercia
Copy link
Contributor

afercia commented Sep 25, 2023

Would it be feasible to use the status selection UI from the site editor here?

The site editor 'status selection' UI actually mixes together Status and Visibility, which historically are two separate logical concepts. I'm not sure why they were grouped together to start with. Seems to me that's less than ideal and i'd recommend to keep those concepts logically and visually separated.

Also, the status selection UI introduced a pretty visible inconsistency with the post editor, see #52643. I'm not sure how this kind of UI onconsistencies can be of any help for users.

There is a proposal to better align some edit features in the Site and Post editors, see #52632 but still I'm not sure that mixing together status and visibility is the right way to go.

@jameskoster
Copy link
Contributor

Whether status and visibility are separate or not, the point was to use the same UI in both locations. But clearly that is distracting from this PR, apologies @Mamaduka!

Does anyone remember the historical reasons why we had a separate button for the "Switch to Draft" action?

I do not, but I remember it used to live in the main top bar, and was moved to reduce prominence: #50217.

Perhaps we pursue this PR as-is, then follow-up to try and better align post & site editor document inspectors. I'd be happy to work on designs for that.

@Mamaduka
Copy link
Member Author

Perhaps we pursue this PR as-is, then follow-up to try and better align post & site editor document inspectors. I'd be happy to work on designs for that.

Sounds good to me! Let's solve the immediate a11y issue; ensure the new design pattern we implement has a11y reviews before merging.

If there are no other blockers for this PR, I would appreciate approval 🙇

@jameskoster
Copy link
Contributor

jameskoster commented Sep 25, 2023

The blue outline on hover looks strange.

Screenshot 2023-09-25 at 15 51 31

Should we fix that here or in a follow-up that targets the button component? It doesn't appear if the button is disabled rather than aria-disabled.

@Mamaduka
Copy link
Member Author

@jameskoster, the secondary button also lacks a focus outline when disabled. It would be nice to fix button-related issues in a single follow-up. See also #54722 (comment)

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.

@Mamaduka Thanks, works as described!

Copy link
Contributor

@jameskoster jameskoster left a comment

Choose a reason for hiding this comment

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

In that case let's land this then follow up to fix the Button issues :)

@Mamaduka Mamaduka merged commit cfbf45c into trunk Sep 26, 2023
57 checks passed
@Mamaduka Mamaduka deleted the fix/switch-to-draft-focus-loss branch September 26, 2023 09:33
@github-actions github-actions bot added this to the Gutenberg 16.8 milestone Sep 26, 2023
@Mamaduka
Copy link
Member Author

Mamaduka commented Oct 2, 2023

@jameskoster, @jasmussen, do you have a mockup of how the disabled secondary button's focus/hover styles should look like? I can create a follow-up PR this week.

@jameskoster
Copy link
Contributor

Thanks @Mamaduka :)

Looking at Storybook everything seems to work as expected, IE there are no hover or focus styles on disabled buttons. I'm not sure why that was creeping in here 🤔

@Mamaduka
Copy link
Member Author

Mamaduka commented Oct 2, 2023

Try settings __experimentalIsFocusable and disabled simultaneously for the button in Storybook. I'll push PR shortly to fix the hover style.

I think @jasmussen said that the disabled button still should have a border - #54722 (comment).

Screenshot

CleanShot 2023-10-02 at 19 43 57

@jameskoster
Copy link
Contributor

I think @jasmussen said that the disabled button still should have a border

I don't have a strong feeling about that, but I will say that with a gray border / text the button begins to resemble an input field which isn't ideal:

Screenshot 2023-10-02 at 17 14 18

If we want to maintain the boxed shape then a background might work better. This more closely resembles the default browser style for disabled buttons too.

Screenshot 2023-10-02 at 17 16 12

Is __experimentalIsFocusable applied here so that the button remains focussed (and becomes disabled) after converting to draft?

If that's required then I expect the standard outline makes sense:

Screenshot 2023-10-02 at 17 19 21

@Mamaduka
Copy link
Member Author

Mamaduka commented Oct 2, 2023

Is __experimentalIsFocusable applied here so that the button remains focussed (and becomes disabled) after converting to draft?

Not via this prop. The component uses aria-disabled directly, which is emulated by the Button component when both __experimentalIsFocusable and disabled are set to true.

I've created #54978, which matches the rules for other buttons.

@jasmussen
Copy link
Contributor

If the button is disabled, the border does not need to meet any contrast ratios, it just needs to be focusable. So this is what I was thinking:
Sketch

The gray background lends prominence in this context which, wouldn't you agree, is unintentional for a disabled button?

Sketch

@Mamaduka
Copy link
Member Author

Mamaduka commented Oct 3, 2023

If the button is disabled, the border does not need to meet any contrast ratios, it just needs to be focusable. So this is what I was thinking:

@jameskoster, basically use the same grey border when a disabled button is focused, right?

@jameskoster
Copy link
Contributor

The light border could work. Worth double-checking about the text colour though. Do disabled button labels still need to meet contrast guidelines?

@Mamaduka
Copy link
Member Author

Mamaduka commented Oct 3, 2023

Do disabled button labels still need to meet contrast guidelines?

If I had to guess, I would say yes 😅 But I would defer to @afercia, @alexstine, and @joedolson on this one.

@jasmussen
Copy link
Contributor

No, disabled buttons do not need to meet contrast ratios. I'm happy to be educated if I'm wrong:

Incidental: Text or images of text that are part of an inactive user interface component, that are pure decoration, that are not visible to anyone, or that are part of a picture that contains significant other visual content, have no contrast requirement.

Emphasis mine.

@alexstine
Copy link
Contributor

Looks like not.

Inactive User Interface Components

https://www.w3.org/WAI/WCAG21/Understanding/non-text-contrast.html

@Mamaduka
Copy link
Member Author

Mamaduka commented Oct 3, 2023

Thanks, everyone!

@jameskoster, which light border/box shadow can I use here? Any existing example would be helpful.

@jasmussen
Copy link
Contributor

You can use the one I used, which is $gray-500 text and $gray-200 border. It would be good to do that too, this currently feels like it's floating a bit:

Screenshot 2023-10-05 at 10 06 10

@richtabor
Copy link
Member

You can use the one I used, which is $gray-500 text and $gray-200 border. It would be good to do that too, this currently feels like it's floating a bit:

Was coming to report the same; looks a bit broken.

@Mamaduka
Copy link
Member Author

Mamaduka commented Oct 6, 2023

I will push fix for this today. Just want to clarify one thing. We want secondary disable button to always have a border not only when it’s focused. Is this correct assumption?

@jasmussen
Copy link
Contributor

Secondary buttons should always have borders, whether focused or not, disabled or not.

@Mamaduka
Copy link
Member Author

Mamaduka commented Oct 6, 2023

I'm a bit more confused now 😅 Do you mind if I leave this follow-up to you folks?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). Needs Design Feedback Needs general design feedback. [Package] Editor /packages/editor
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Focus loss when switching to draft
6 participants