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

List View: Update with scrolling and custom scrollbar. #49793

Merged
merged 6 commits into from
Apr 24, 2023

Conversation

jasmussen
Copy link
Contributor

What?

Alternative to #49508, followup to #49611.

Keeps the recently enabled horizontal scrolling in the list view, but updates it with an on-hover scrollbar. It also refactors the same scrollbar mixin to support colors.

Why?

By leveraging on-hover/focus scrollbars, scrolling is available when it needs to be but doesn't weigh the interface when you're not interacting with it.

How?

Uses standard CSS and scrollbar properties.

Testing Instructions

Please test post editor, site editor, and the site editor template view to verify that the onhover scrollbars work as intended.

Screenshots or screencast

Site editor:
scrollbars site editor

Post editor:

post editor

Templates list:

templates list

@jasmussen jasmussen added the [Type] Enhancement A suggestion for improvement. label Apr 13, 2023
@jasmussen jasmussen self-assigned this Apr 13, 2023
@github-actions
Copy link

github-actions bot commented Apr 13, 2023

Size Change: +727 B (0%)

Total Size: 1.37 MB

Filename Size Change
build/edit-post/style-rtl.css 7.83 kB +239 B (+3%)
build/edit-post/style.css 7.83 kB +236 B (+3%)
build/edit-site/style-rtl.css 10.2 kB +127 B (+1%)
build/edit-site/style.css 10.2 kB +125 B (+1%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.78 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 483 B
build/block-directory/index.min.js 7.2 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.17 kB
build/block-editor/content.css 4.17 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 201 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 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 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 587 B
build/block-library/blocks/button/editor.css 587 B
build/block-library/blocks/button/style-rtl.css 628 B
build/block-library/blocks/button/style.css 627 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.6 kB
build/block-library/blocks/cover/style.css 1.59 kB
build/block-library/blocks/details-summary/editor-rtl.css 65 B
build/block-library/blocks/details-summary/editor.css 65 B
build/block-library/blocks/details-summary/style-rtl.css 61 B
build/block-library/blocks/details-summary/style.css 61 B
build/block-library/blocks/details/style-rtl.css 54 B
build/block-library/blocks/details/style.css 54 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 300 B
build/block-library/blocks/file/editor.css 300 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 353 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 984 B
build/block-library/blocks/gallery/editor.css 988 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 76 B
build/block-library/blocks/heading/style.css 76 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 652 B
build/block-library/blocks/image/style.css 652 B
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/latest-comments/style-rtl.css 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 716 B
build/block-library/blocks/navigation-link/editor.css 715 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.13 kB
build/block-library/blocks/navigation/editor.css 2.14 kB
build/block-library/blocks/navigation/style-rtl.css 2.22 kB
build/block-library/blocks/navigation/style.css 2.21 kB
build/block-library/blocks/navigation/view-modal.min.js 2.81 kB
build/block-library/blocks/navigation/view.min.js 447 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 501 B
build/block-library/blocks/post-comments-form/style.css 501 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 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 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 408 B
build/block-library/blocks/search/style.css 406 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 329 B
build/block-library/blocks/shortcode/editor.css 329 B
build/block-library/blocks/site-logo/editor-rtl.css 489 B
build/block-library/blocks/site-logo/editor.css 489 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 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 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 651 B
build/block-library/blocks/table/style.css 650 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/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 179 B
build/block-library/blocks/video/style.css 179 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.12 kB
build/block-library/common.css 1.12 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 11.6 kB
build/block-library/editor.css 11.6 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 204 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 12.8 kB
build/block-library/style.css 12.8 kB
build/block-library/theme-rtl.css 698 B
build/block-library/theme.css 703 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 51.1 kB
build/commands/index.min.js 14.8 kB
build/commands/style-rtl.css 789 B
build/commands/style.css 786 B
build/components/index.min.js 209 kB
build/components/style-rtl.css 11.7 kB
build/components/style.css 11.8 kB
build/compose/index.min.js 12.4 kB
build/core-data/index.min.js 16.3 kB
build/customize-widgets/index.min.js 12.2 kB
build/customize-widgets/style-rtl.css 1.41 kB
build/customize-widgets/style.css 1.41 kB
build/data-controls/index.min.js 718 B
build/data/index.min.js 8.68 kB
build/date/index.min.js 40.4 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.76 kB
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/edit-post/index.min.js 35.2 kB
build/edit-site/index.min.js 64.6 kB
build/edit-widgets/index.min.js 17.3 kB
build/edit-widgets/style-rtl.css 4.56 kB
build/edit-widgets/style.css 4.56 kB
build/editor/index.min.js 45.9 kB
build/editor/style-rtl.css 3.49 kB
build/editor/style.css 3.48 kB
build/element/index.min.js 4.95 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 7.26 kB
build/format-library/style-rtl.css 557 B
build/format-library/style.css 556 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.79 kB
build/keycodes/index.min.js 1.94 kB
build/list-reusable-blocks/index.min.js 2.14 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.99 kB
build/notices/index.min.js 977 B
build/plugins/index.min.js 1.94 kB
build/preferences-persistence/index.min.js 2.23 kB
build/preferences/index.min.js 1.35 kB
build/primitives/index.min.js 960 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 942 B
build/react-i18n/index.min.js 702 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.75 kB
build/reusable-blocks/index.min.js 2.26 kB
build/reusable-blocks/style-rtl.css 265 B
build/reusable-blocks/style.css 265 B
build/rich-text/index.min.js 11.1 kB
build/server-side-render/index.min.js 2.09 kB
build/shortcode/index.min.js 1.52 kB
build/style-engine/index.min.js 1.55 kB
build/token-list/index.min.js 650 B
build/url/index.min.js 3.74 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.09 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.3 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.06 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.

Thanks for opening this alternate PR @jasmussen!

Unfortunately I ran into a few issues while testing. The most concerning one was what appears to be buggy behaviour in Safari, that I couldn't replicate on Chrome or other browsers. The custom scrollbars seem to result in odd rendering issues for me while interacting with it, and sometimes the scrollbars don't appear to work at all. Here's a screengrab:

2023-04-14.09.42.19.mp4

Can anyone else replicate that happening, or it just on my machine? I'm wondering if the custom scrollbars are affecting the windowing logic or rendering of the list view 🤔

Less severe in Chrome where it was working correctly, I noticed a couple of other smaller issues:

  • There's now a gutter at the right hand edge of the list items. It's most visible when a block is selected. Is that intentional?

image

image

Should we add back in the following to the site edit list view panel content?

	@include break-medium() {
		// Same width as the Inserter.
		// @see packages/block-editor/src/components/inserter/style.scss
		width: 350px;
	}

Aside from the weird behaviour in Safari, I otherwise really like the look of the custom scrollbars now that they're styled for light mode.

@jasmussen
Copy link
Contributor Author

Oh good feedback, thank you. I personally don't mind the reserved space for the scrollbar as it avoids a layout shift, but let me see if there are a couple of tricks I can do.

Same with the Safari windowing issue.

@jasmussen
Copy link
Contributor Author

I think I may have threaded the needle. I was able to reproduce the Safari issue, but will-change: transform; seems to fix it:

safari

Note the slight jump if you scroll to the rightmost edge, or the bottom of the list view, and then mouse-out. With the removal of the stable scrollbar gutter, that jump happens. But I find it to be acceptable, because I think separately we should probably follow up with a PR to automatically scroll to the left side of the list view when you mouse out. This will need to be done programmatically and is probably not that urgent, what do you think?

Note that I updated the mixin still a bit more, so it needs good testing if we want to land this, both in post and site editor, speaking of which here it feels pretty good:

site editor

Note I restored the stable scrollbar gutter in the case of the templates list in the stie view. Without it:

plus scrolling

With it:

stable gutter

@jameskoster
Copy link
Contributor

Nice this seems to work well.

I don't think it's a blocker, but it's a shame how the ellipsis button feels out-of-reach when there's horizontal scrolling.

A right-click affordance would probably solve this, but that might be a while away. Alternatively, we could try something with position: sticky; on block-editor-list-view-block__menu-cell. A very quick Inspector mockup:

sticky.mp4

What do you think?

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! This feels a little more stable in testing, but I'm still running into issues with the windowing logic. For example, with a very long post, the list view isn't updating between placeholder vs real list view items when scrolling down the list.

To reproduce

  1. Create a post with a very large number of blocks
  2. Save and/or update the post
  3. Reload the editor, and scroll to the bottom of the editor canvas and select the bottom-most block
  4. Scroll the list view to the bottom.
  5. Note that there's empty space in the list view (the invisible placeholder rows have not been swapped out for real list view items):

image

Note the slight jump if you scroll to the rightmost edge, or the bottom of the list view, and then mouse-out. With the removal of the stable scrollbar gutter, that jump happens.

This feels like a bit of a blocker to me, personally, as it results in a few issues:

  • It's hard to use the settings menu on selected blocks as the click position jumps
  • In longer block titles the bump is a bit distracting
  • It bumps the popover for the settings menu

Here's how it's looking in my testing environment:

Hard to click on the settings icon Popover position jumps
2023-04-17 12 07 56 2023-04-17 12 09 14

because I think separately we should probably follow up with a PR to automatically scroll to the left side of the list view when you mouse out

I'm not sure if that would be desirable, as it'd make it harder for folks to work with switching between the editor canvas and the list view when working on adjacent deeply nested blocks. E.g. you open the list view deeply to look at a couple of headings and a paragraph, and you click through each to make adjustments to colors. With this behaviour, each time you go back to the list view, you'd have to scroll to the right again. I think it'd probably be better to keep the list view position static / not changing it based on hover.

Alternatively, we could try something with position: sticky; on block-editor-list-view-block__menu-cell. A very quick Inspector mockup

This idea looks pretty cool, though — perhaps with that, we wouldn't need to automatically scroll the list view?


Overall, I'm liking the direction, but it's a bit concerning that the on-hover behaviour results in issues for the windowing logic, and the introducing of some jumpiness. I was wondering if at this stage, would it be easier to split these changes out into two separate PRs — one for the width changes + use normal scrollbars, then look at the custom scrollbars / on hover behaviour in a separate PR if it looks like it's going to be challenging to get it to behave smoothly in the list view?

@andrewserong
Copy link
Contributor

Update: I just noticed there's another bug introduced by hiding the scrollbars when the list view is not hovered. It then appears to break the behaviour in trunk where clicking on an item in the canvas scrolls the list view into position so that the list item is visible (introduced in #46895).

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.

Second update: I think I see why this PR results in a fair few confusing bugs. We use getScrollContainer in a number of places for windowing logic, scroll logic, and soon to calculate the width of the drop indicator (#49786). This works by walking up the DOM tree to find the scrollable container, to then do various calculations that we might need for these features.

On balance, how important is it that we restrict the scrollbars to only appear on hover for the list view via updating the overflow setting? At first glance, it might not be simple to update the affected features to still work when overflow: hidden is in use, so it could be good to explore alternatives or weigh up the options 🤔

&:hover,
&:focus,
& > * {
visibility: visible;
}

// Scrolling behavior.
overflow: hidden;
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 this line could be causing a few issues with windowing and other logic in the list view.

@jasmussen
Copy link
Contributor Author

Thanks for all the reviews. I need to pause work on it for a bit to focus on other things, so folks should feel welcome to either fork the PR or push directly to it.

The main motivation remains: make the scrollbars feel out of sight, out of mind, but still be there when you need them. The auto-hiding helps with that as they don't add visual weight until you interact with it, the collapsing scroll gutter furthermore makes it so things like up when no scrollbars are needed.

On balance, how important is it that we restrict the scrollbars to only appear on hover for the list view via updating the overflow setting? At first glance, it might not be simple to update the affected features to still work when overflow: hidden is in use, so it could be good to explore alternatives or weigh up the options 🤔

For the site editor in the dark material on the left, I consider it somewhat important. But in general, and perhaps moreso for the list view, if it continues to cause trouble there are probably other ways we can address this, like changing the appearance of the scrollbar to be more opaque when hovering/focusing, less opaque when not. But I'd still consider that plan B territory, as the auto-hiding scrollbars does allow us to have things line up, when a scrollbar is needed, but the list view is not hovered. Worth pushing this a bit more for, IMO, but not be all, end-all.

That said, I actually moved the overflow definition to the mixin assuming it to be useful there, but it doesn't have to be there. I believe that we can actually refactor out the hidden if need be, I don't recall why it was needed in the moment, probably something to do with the scroll gutter. In any case, this codepen has only overflow: auto;: https://codepen.io/joen/pen/rNKRWdx?editors=1100

@jasmussen
Copy link
Contributor Author

Also, thanks so much for looking and reviewing 🙏

@@ -489,12 +489,9 @@
/* stylelint-enable function-comma-space-after */
}

@mixin custom-scrollbars-on-hover() {
@mixin custom-scrollbars-on-hover($handle-color, $track-color) {
Copy link
Contributor

Choose a reason for hiding this comment

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

I moved this change to a separate PR as it will enable us to share this mixin elsewhere: #49892

@jasmussen
Copy link
Contributor Author

@scruffian thank you for the rebase. Were you going to take a look at this one? Otherwise I'm happy to try and pick it up and see if I can move the overflow values around a bit.

@scruffian
Copy link
Contributor

I don't think I'll have time in the next couple of weeks, sorry.

@jasmussen
Copy link
Contributor Author

No worries, I'll see if I can't pick this up again, just wanted to make sure I didn't push over code you had somewhere locally.

@jasmussen
Copy link
Contributor Author

Okay, I think I've actually threaded the needle with a refactor.

What seems most likely to have caused flickering in Safari was the visibility hiding and unhiding. The primary purpose of this was to ensure the scrollbars were visible only when needed, and also to have those scrollbars not take up space until hovering. In the latter case, this was effectively cancelled out by scrollbar-gutter: stable, so it had limited value, and in the former I had an idea to chagne the handle on hover, and make it visible/invisible that way.

This seems to be working well. Shown here, Chrome:

testing chrome

Safari:
testing safari

Both of those use webkit specific properties to style the scrollbar, which makes it always be present despite your OS setting on whether to show or auto-hide scrollbars or not. Firefox on the other hand leverages a new web standard that changes depending on always show or onscroll-only scrollbars. So testing twice here, with scrollbars always on:

testing firefox always on scrollbars

Auto hide:

testing firefox auto hiding

We discussed briefly whether to reserve space for the scrollbars or not, and how I liked the idea of not reserving space so that focused items in the list view could have equidistant padding all around, like this:

Screenshot 2023-04-21 at 11 32 42

In part, this is still present in this branch as is, when there is not enough content to scroll. So the space for the scrollbar appears with the scrollbar. I think this is acceptable as a starting point.

If we want to revisit this, the following CSS appended in context of where the mixin is used, appears to allow the previous behavior I was exploring:

	overflow: hidden;

	&:hover,
	&:focus {
		overflow: auto;
	}

What do you think?

@jasmussen
Copy link
Contributor Author

For posterity, I also validated that scrolling still works as intended on a mobile device:

simulator

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.

This is terrific work @jasmussen, thank you for figuring out how to advance the design while preserving all the current technical details!

In part, this is still present in this branch as is, when there is not enough content to scroll. So the space for the scrollbar appears with the scrollbar. I think this is acceptable as a starting point.

I think that gives us the best balance of behaviour for now as it gets us closer to the ideal design, while not introducing the overflow: hidden rule, which appears to be what caused other aspects of the list view to stop working, as well as the jump when hovering over list view items.

In the current state of the PR, the jump is only really visible when resizing the window vertically, so I imagine it won't be noticed by anyone (and in this context it isn't at all intrusive):

2023-04-24 12 00 17

This is testing great for me, here's an overview of what I tested:

✅ Scroll list view to selected block behaviour is preserved
✅ Windowing logic works correctly
✅ Width of drop indicator logic still works correctly
✅ Safari bug is resolved
height: 100% for the list view content means you can hover over the space at the bottom to show scrollbars
✅ Scrollbar gutter is only introduced when there are enough list items to require it
✅ Scrollbar gutter when present looks good to me
✅ Tests well in Chrome, FF, Safari, and Edge on Mac
✅ Tested post, site, and template editors
✅ Mobile breakpoints look consistent between editors, and allows full-width list view on mobile

This LGTM! ✨

@jasmussen
Copy link
Contributor Author

Thanks for the thorough testing.

Given that we have styled scrollbars shipping in both the site view of the site editor, as well as unstyled horizontally in the list view, I'm going to land this one as I think it's a solid step forward for those scrollbars. Let's generally keep an eye on any scrollbar related issues that may emerge from this.

@jasmussen jasmussen merged commit 30e1054 into trunk Apr 24, 2023
@jasmussen jasmussen deleted the try/list-view-scrolling branch April 24, 2023 07:53
@github-actions github-actions bot added this to the Gutenberg 15.7 milestone Apr 24, 2023
@bph bph added [Feature] List View Menu item in the top toolbar to select blocks from a list of links. [Type] Bug An existing feature does not function as intended and removed [Type] Enhancement A suggestion for improvement. labels Apr 26, 2023
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. [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants