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

Add TabPanel to document overview replacing fake tabs #50199

Merged
merged 17 commits into from
May 30, 2023

Conversation

alexstine
Copy link
Contributor

What?

Adds the TabPanel to the document overview and removes the fake tab buttons. Makes some adjustments to the TabPanel necessary for this to work.

Why?

Better accessibility/UX.

How?

See above.

Testing Instructions

  1. Open a post or page.
  2. Open the document overview.
  3. Notice how there is now a TabPanel instead of buttons.

Testing Instructions for Keyboard

The TabPanel is perfectly accessible via the keyboard. Access it by pressing tab, left/right arrow keys will cycle options, and enter to activate.

Screenshots or screencast

@alexstine alexstine added [Type] Enhancement A suggestion for improvement. [Package] Components /packages/components Needs Accessibility Feedback Need input from accessibility [Feature] List View Menu item in the top toolbar to select blocks from a list of links. [Package] Edit Post /packages/edit-post labels Apr 29, 2023
@alexstine alexstine self-assigned this Apr 29, 2023
Copy link
Contributor Author

@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.

I am going to need some help with styling I am sure. Probably do not need all these divs since the TabPanel adds some of them as well. I am also expecting failing E2Es from the long set of tests I wrote around this. I will try to fix them up once reported back.

orientation = 'horizontal',
activeClass = 'is-active',
onSelect,
itemRef,
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Not sure why TS is not forcing me to type this. also not sure how to type it. I would expect this value to take either a single ref or merged refs from useMergedRefs hook.

@@ -190,12 +196,14 @@ export function TabPanel( {
role="tabpanel"
id={ `${ selectedId }-view` }
className="components-tab-panel__tab-content"
ref={ itemRef || undefined }
Copy link
Contributor Author

Choose a reason for hiding this comment

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

This should never be required, only complementary. Useful for managing focus in rendered children.

Copy link
Member

Choose a reason for hiding this comment

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

As context, the components crew is working on a new version of the TabPanel component that would support these kinds of features in a more ergonomic API. So ideally, I'd like to make this fix to the Document Overview without adding new APIs to the current TabPanel component (i.e. the itemRef prop).

Would it be possible to handle the item ref concerns directly in the consumer (.edit-post-editor__list-view-container) without sending it through the TabPanel component?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I do not think so, not for this case specifically. I need a way to always make sure I know where my ref is attached for focus reasons. I hate to do it but trying to guess focus is not going to work for this. I could try to refactor it but it will likely not be pretty.

Copy link
Member

Choose a reason for hiding this comment

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

Just to be clear, I mean something like this. It seems to work but I may not be picking up on all the focus management concerns — are there any requirements that this doesn't cover?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Let me give it a test later and see. Thanks for the quick commit @mirka. If it works, it will indeed be simpler than what I was trying to do. I kept getting a rules of hooks violation but I didn't think about using useMergeRefs() earlier.

ref={ useMergeRefs( [
<TabPanel
ref={ tabPanelRef }
selectOnMove={ false }
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Manual activation due to focus handling with the list view.

@github-actions
Copy link

github-actions bot commented Apr 29, 2023

Size Change: -63 B (0%)

Total Size: 1.39 MB

Filename Size Change
build/components/index.min.js 230 kB -3 B (0%)
build/edit-post/index.min.js 34.6 kB -15 B (0%)
build/edit-post/style-rtl.css 7.73 kB -23 B (0%)
build/edit-post/style.css 7.72 kB -22 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 7.05 kB
build/block-directory/style-rtl.css 1.02 kB
build/block-directory/style.css 1.02 kB
build/block-editor/content-rtl.css 4.23 kB
build/block-editor/content.css 4.23 kB
build/block-editor/default-editor-styles-rtl.css 381 B
build/block-editor/default-editor-styles.css 381 B
build/block-editor/index.min.js 193 kB
build/block-editor/style-rtl.css 15.1 kB
build/block-editor/style.css 15.1 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 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 91 B
build/block-library/blocks/avatar/style.css 91 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/details/style-rtl.css 159 B
build/block-library/blocks/details/style.css 159 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/interactivity.min.js 395 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.min.js 375 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/interactivity.min.js 783 B
build/block-library/blocks/image/style-rtl.css 1.07 kB
build/block-library/blocks/image/style.css 1.07 kB
build/block-library/blocks/image/theme-rtl.css 126 B
build/block-library/blocks/image/theme.css 126 B
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.33 kB
build/block-library/blocks/navigation/editor.css 2.33 kB
build/block-library/blocks/navigation/interactivity.min.js 896 B
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-modal.min.js 2.78 kB
build/block-library/blocks/navigation/view.min.js 438 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 401 B
build/block-library/blocks/page-list/editor.css 401 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 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 281 B
build/block-library/blocks/post-template/style.css 281 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-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 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 434 B
build/block-library/blocks/search/style.css 432 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 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.4 kB
build/block-library/blocks/social-links/style.css 1.39 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/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/index.min.js 200 kB
build/block-library/interactivity/runtime.min.js 2.69 kB
build/block-library/interactivity/vendors.min.js 8.2 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 13.1 kB
build/block-library/style.css 13.1 kB
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 50.3 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.1 kB
build/core-commands/index.min.js 1.74 kB
build/core-data/index.min.js 15.4 kB
build/customize-widgets/index.min.js 12 kB
build/customize-widgets/style-rtl.css 1.38 kB
build/customize-widgets/style.css 1.38 kB
build/data-controls/index.min.js 640 B
build/data/index.min.js 8.28 kB
build/date/index.min.js 40.4 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-site/index.min.js 64.5 kB
build/edit-site/style-rtl.css 10.9 kB
build/edit-site/style.css 10.9 kB
build/edit-widgets/index.min.js 17 kB
build/edit-widgets/style-rtl.css 4.53 kB
build/edit-widgets/style.css 4.53 kB
build/editor/index.min.js 44.6 kB
build/editor/style-rtl.css 3.54 kB
build/editor/style.css 3.53 kB
build/element/index.min.js 4.8 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 7.57 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/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.71 kB
build/keycodes/index.min.js 1.84 kB
build/list-reusable-blocks/index.min.js 2.13 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 875 B
build/plugins/index.min.js 1.84 kB
build/preferences-persistence/index.min.js 1.84 kB
build/preferences/index.min.js 1.24 kB
build/primitives/index.min.js 941 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 939 B
build/react-i18n/index.min.js 696 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.7 kB
build/reusable-blocks/index.min.js 2.21 kB
build/reusable-blocks/style-rtl.css 243 B
build/reusable-blocks/style.css 243 B
build/rich-text/index.min.js 10.7 kB
build/router/index.min.js 1.77 kB
build/server-side-render/index.min.js 2.02 kB
build/shortcode/index.min.js 1.39 kB
build/style-engine/index.min.js 1.42 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 1.04 kB
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

Copy link
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

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

Nice work @alexstine, the keyboard navigation is testing really well for me with this PR 👍

The change introduces some visual issues that will need to be addressed, as you mention. I think most of them should be do-able via making adjustments to the components-tab-panel__tabs class. I've hacked around locally, and managed to get the header looking pretty similar to trunk via something like the following (except for the close button):

.components-tab-panel__tabs {
	border-bottom: $border-width solid $gray-300;
	box-sizing: border-box;
	display: flex;
	width: 100%;
	padding-right: $grid-unit-70;

	.components-button {
		width: 50%;
	}
}

We'd then need to get the close button to be positioned absolutely over that header, a little bit like how the Style Book does it here and here.

In the above snippet, we should hopefully be able to replace .components-button with the classnames for each of the tabs. But I'm wondering if it means if we'll also want to pass down a custom classname for the NavigableMenu so that we don't depend on .components-tab-panel__tabs. At the moment TabPanel allows us to provide a classname either at the wrapper level or for the individual tabs, so we might need an extra prop for this additional classname, so that we can avoid depending on the internal tabs classname, if it's necessary. But overall, this seems quite do-able to me!

I've got a few other tasks I'm working on at the moment, but I'm happy to help out with this PR in the next week or two if no-one else beats me to it.

I'll just CC @mirka and @ciampo in case they have feedback about how to override styles for the header / tablist of the TabPanel.

@ciampo ciampo requested a review from mirka May 9, 2023 08:05
@alexstine
Copy link
Contributor Author

Thanks for the quick review @andrewserong . Just like the other PR we worked on, feel free to push styling fixes. Hopefully, this week, I can dedicate some time to working on the failing E2E tests.

@andrewserong
Copy link
Contributor

Thanks for confirming, Alex! I should have a bit of time to jump in to try pushing styling fixes next week.

@alexstine alexstine added the [Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). label May 19, 2023
Copy link
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

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

I've just been exploring some styling fixes to get this to more closely match trunk visually. In the process, I believe we can remove the edit-post-editor__document-overview-panel-header wrapper div for the button, and instead position the button using position: absolute.

One thing I wasn't sure of, though, is that removing that wrapper div for the button will also remove the headerFocusReturnRef. Do you know if that's still needed @alexstine? If it isn't needed, then I think getting the button to play nicely should be fairly straightforward, and I can push a commit on Monday to get the styling most of the way there.

The other thing I'm looking into is that switching to the TabPanel appears to cause the vertical scrollbar not to appear for the list view, and instead the content overflows, creating a bigger scrollbar for the whole page. I'll dig into that a little more next week, too.

@alexstine
Copy link
Contributor Author

@andrewserong Unfortunately, that ref is still required due to some type of bug that causes focus loss on list view close. All this needs to be refactored at some point.

@andrewserong
Copy link
Contributor

Unfortunately, that ref is still required due to some type of bug that causes focus loss on list view close. All this needs to be refactored at some point.

Thanks for confirming @alexstine! I think I've managed to get the styles to mostly look the same for the TabPanel as on trunk, while retaining the headerFocusReturnRef, and from manually testing, it seems that the focus return when closing via the the close button is preserved. I've pushed a commit, but do feel free to revert if you run into any issues with it.

There's still an outstanding issue with the vertical scrollbar for the list view. I should hopefully have a bit of time this week to continue digging into that.

@github-actions
Copy link

github-actions bot commented May 22, 2023

Flaky tests detected in 362e0e9.
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/5096587535
📝 Reported issues:

@kevin940726
Copy link
Member

I'm not familiar with the code nor the test, I can take a look but @Mamaduka might be able to spot the error faster than me 😉.

@Mamaduka
Copy link
Member

I think there're regressions in Document Overview behavior that causes e2e test failure. I spotted two.

  1. When you open the list view currently selected block doesn't receive a focus. Instead, the first item in the list gets the focus. This isn't the cause of the failure, but we should fix it.

  2. Previously, you needed to press the tab four times to select the first block in the list view after navigating to the Document Overview region; now, you just need three. The "Outline" tabs get skipped during the navigation. This is the cause of test failure. I this the new correct behavior?

@alexstine
Copy link
Contributor Author

@Mamaduka Which file is number 2 occuring in? E2E logs can be very hard for me to read. :(

For number 1, I do not know how to fix it. I think it's the same bug that @andrewserong and I discovered at the beginning of this project. The list view and canvas are not in sync completely.

@Mamaduka
Copy link
Member

@alexstine, the file is block-hierarchy-navigation.test.js and "should navigate block hierarchy using only the keyboard" is the test name.

Copy link
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

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

Thanks for the updates @alexstine and for fixing up the e2e tests! 👍

I've just given this a re-test, and this is still testing well for me across browsers, and the code change LGTM.

When you open the list view currently selected block doesn't receive a focus. Instead, the first item in the list gets the focus. This isn't the cause of the failure, but we should fix it.

Good catch! This behaviour appears to be the same as an on trunk as far as I can tell. In my testing, the selected block receives focus if it is at the root of the document. For nested blocks, I think what's happening is that if you select a nested block, when you open the list view, the list isn't yet expanded, and so focus is directed to the first item in the list. Then, very soon after the list view is opened, the useEffect in useListViewExpandSelectedItem fires, which expands the parent nodes in the tree, so the selected block becomes visible. However, it seems that happens after the focus logic. A fix could potentially be for the expand selected item logic to including focusing behaviour, too — however, if a user is navigating the editor canvas with the list view sidebar open, then they likely won't be wanting focus to shift over to the list view unexpectedly, so there might be some nuance to getting the logic right.

It'd be a good thing to fix up, but from the sounds of it, I think that's probably outside the scope of this PR as the switch to the TabPanel appears to be unrelated as far as I can tell. Could be a good follow-up to dig into.

This PR is in a good shape to land to me! Nice work @alexstine 🎉

@alexstine
Copy link
Contributor Author

Yeah, based on that description, I think there is not an easy fix. The focus management has to be contained to the sidebar based on how the tab rendering works and how I am detecting focus in the sidebar. The focus code checks for the first tabbable and that attribute changes in the ListView component based on the selected block. What we might have gotten wrong though when the collapse implementation was added, doing things in the wrong order. We need a conditional to say this.

If focus is on inner block and parent is collapsed, expand and then render the proper tabindex="0" value.

The other less complicated option might be using the useImperativeHandle() hook for managing focus specifically within the ListView. That way the sidebar can still control focus via the ref calling the function in the ListView component. @kevin940726 suggested this to me when we were trying to figure out how to handle search form focus in the block inserter. Since the close button became the first item in the DOM, we needed a way to focus search and useFocusFirstElement() hook was no longer an option since it too, worked off tabindex="0" which a close button would have by default as all buttons have an automatically implied tabindex="0"`.

I guess this is all to say, I'd be happy to work on a follow-up but I do not see an easy way forward. This bug I bet was introduced when collapse by default went into trunk and the lack of E2E tests meant we never caught it. Now it comes up from time to time when I make these PRs. :)

If no further feedback, I'll merge this one by end of day tomorrow.

Thanks.

@Mamaduka
Copy link
Member

Mamaduka commented May 30, 2023

Addressing the selected block focus issue in a separate PR makes sense.

I've one more piece of feedback that might be outside this change. I wanted to highlight the difference between navigating the "Editor settings" and "Document Overview" region tabs.

I'm using CTRL + ` to switch between regions, and then each step represents Tab navigation.

Editor settings

  1. "Post" tab receives the focus.
  2. "Block" tab receives the focus.
  3. "Close" button receives the focus.
  4. Focus is moved to sidebar contents.

Document Overview

  1. "Close" button receives the focus.
  2. "List View" tab receives the focus.
  3. The "Outline" tab is skipped, and the focus is moved to the sidebar contents.

I know that "Editor settings" currently don't use the TabPanel component, but its navigation is something I would usually expect.

@mirka
Copy link
Member

mirka commented May 30, 2023

I know that "Editor settings" currently don't use the TabPanel component, but its navigation is something I would usually expect.

Exactly, the Editor Settings tabs are implemented incorrectly at the moment, including semantics and keyboard navigation. Tracked in #43414.

@Mamaduka
Copy link
Member

I expected as much, but thanks for the clarification, @mirka!

@alexstine
Copy link
Contributor Author

Yep, my hope is to see that changed soon. I might even attempt a PR if someone wants to come behind me and cleanup styles. What blocked us for a while is the fact that the TabPanel component did not support manual activation where it was required to press enter to confirm tab selection. In this case, you cannot switch focus with automatic tab activation as it would disorientate users. Now that this is fixed, I would also like to see this get applied to the block inserter patterns categories.

@alexstine alexstine merged commit 43f6e60 into trunk May 30, 2023
@alexstine alexstine deleted the add/tabpanel-listview branch May 30, 2023 23:29
@github-actions github-actions bot added this to the Gutenberg 16.0 milestone May 30, 2023
sethrubenstein pushed a commit to pewresearch/gutenberg that referenced this pull request Jul 13, 2023
* Add TabPanel to document overview sidebar.

* TabPanel: Changed to support ref forwarding. Added prop for attaching parent refs to wrapping content div.

* Reviewer feedback addressed.

* Fix E2E tests.

* Update styles to more closely reflect the look of the tabs in trunk

* Restore scrollbar behaviour

* Add changelog entry for components package

* Better comments.

* Fix E2E.

* Add back useState for cleaner code.

* Fix list view prop. Changelog update.

* Fix tab panel focus. Still need to use focus.tabbable.find().

* Fix changelog format.

---------

Co-authored-by: Andrew Serong <14988353+andrewserong@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] List View Menu item in the top toolbar to select blocks from a list of links. [Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). Needs Accessibility Feedback Need input from accessibility [Package] Components /packages/components [Package] Edit Post /packages/edit-post [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants