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

Improve Safari text-selection style. #43313

Merged
merged 7 commits into from
Aug 29, 2022
Merged

Conversation

jasmussen
Copy link
Contributor

What?

Currently a proof of concept, this PR means to improve the clarity of the partial selection style in Safari and other browsers, where it currently selects not just text, but divs and pseudo elements, resulting in a very broken looking experience:

before

By applying user-select: none; to elements that are not meant to be shown as selected, and by enabling it again using user-select: text;, we are able to ensure that the visible selection style matches what you have actually selected:

after

Why?

This is crucially important for the experience, because the current experience mis-represents what you have selected.

How?

This proof of concept simply places rules that makes this work for partial text selections in the Paragraph block CSS. This is not where I expect the code to live, but it shows how the issue can be fixed.

We'll want to find out how to best apply these properties so that the issue is fixed, but we don't disable text selection for other parts. At the moment (this appears to be a bug), major browsers treat the property as one to be inherited by default, which means we need to unset the property again for any child elements.

One idea as alluded to in the comments, is to apply the properties during the selection, and manage them that way.

Testing Instructions

  • Use Safari
  • In trunk, add two paragraphs to TwentyTwentyTwo, then make a partial selection between them.
  • Then try the same with this PR, and observe the difference in selection style.

@jasmussen jasmussen added [Type] Bug An existing feature does not function as intended [Package] Rich text /packages/rich-text labels Aug 17, 2022
@jasmussen jasmussen requested a review from ellatrix August 17, 2022 09:16
@jasmussen jasmussen self-assigned this Aug 17, 2022
}

// Re-enable it on Paragraphs.
.block-editor-rich-text__editable {
Copy link
Member

Choose a reason for hiding this comment

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

Could we generalise this to [contenteditable]?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Very probably! And feel free to push directly to this branch, or make an entirely new one.

Copy link
Member

Choose a reason for hiding this comment

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

No, you got this :) this branch is good


// Hide the select style pseudo element as it interferes with the style.
&.is-partially-selected::after {
display: none;
Copy link
Member

Choose a reason for hiding this comment

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

What is this hiding? Isn't it now always hidden with this rule?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

There's a pseudo element on every block present to fade in to the blue focus/select style. This:
Screenshot 2022-08-17 at 11 27 12

By hiding it entirely, we get a pure text selection, only the text inside the two paragraphs:
Screenshot 2022-08-17 at 11 26 33

If we don't hide it, you can see a small 1px selection style, that's the "after" element that gets selected:

Screenshot 2022-08-17 at 11 26 51

Copy link
Member

Choose a reason for hiding this comment

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

Ah yes, but doesn't this line remove it entirely? Or is there a rule somewhere that enables it under the right circumstances?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

It hides it while is-partially-selected is applied. I tried also to just add user-select: none; to the pseudo element, but I don't think that works because the pseudo element is technically a "child" of the paragraph. I'm not sure how to do this differently 🤔

@github-actions
Copy link

github-actions bot commented Aug 17, 2022

Size Change: +137 B (0%)

Total Size: 1.24 MB

Filename Size Change
build/block-editor/index.min.js 160 kB +21 B (0%)
build/block-editor/style-rtl.css 15.1 kB +57 B (0%)
build/block-editor/style.css 15.1 kB +59 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 982 B
build/annotations/index.min.js 2.76 kB
build/api-fetch/index.min.js 2.26 kB
build/autop/index.min.js 2.14 kB
build/blob/index.min.js 475 B
build/block-directory/index.min.js 7.06 kB
build/block-directory/style-rtl.css 990 B
build/block-directory/style.css 991 B
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 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 110 B
build/block-library/blocks/audio/theme.css 110 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 59 B
build/block-library/blocks/avatar/style.css 59 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 441 B
build/block-library/blocks/button/editor.css 441 B
build/block-library/blocks/button/style-rtl.css 505 B
build/block-library/blocks/button/style.css 505 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 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 103 B
build/block-library/blocks/code/style.css 103 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 406 B
build/block-library/blocks/columns/style.css 406 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 187 B
build/block-library/blocks/comment-template/style.css 185 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 834 B
build/block-library/blocks/comments/editor.css 832 B
build/block-library/blocks/comments/style-rtl.css 632 B
build/block-library/blocks/comments/style.css 630 B
build/block-library/blocks/cover/editor-rtl.css 605 B
build/block-library/blocks/cover/editor.css 607 B
build/block-library/blocks/cover/style-rtl.css 1.55 kB
build/block-library/blocks/cover/style.css 1.55 kB
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 110 B
build/block-library/blocks/embed/theme.css 110 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 253 B
build/block-library/blocks/file/style.css 254 B
build/block-library/blocks/file/view.min.js 346 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 948 B
build/block-library/blocks/gallery/editor.css 950 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 337 B
build/block-library/blocks/group/editor.css 337 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 327 B
build/block-library/blocks/html/editor.css 329 B
build/block-library/blocks/image/editor-rtl.css 876 B
build/block-library/blocks/image/editor.css 873 B
build/block-library/blocks/image/style-rtl.css 627 B
build/block-library/blocks/image/style.css 630 B
build/block-library/blocks/image/theme-rtl.css 110 B
build/block-library/blocks/image/theme.css 110 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 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 463 B
build/block-library/blocks/latest-posts/style.css 462 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 705 B
build/block-library/blocks/navigation-link/editor.css 703 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-submenu/view.min.js 423 B
build/block-library/blocks/navigation/editor-rtl.css 1.96 kB
build/block-library/blocks/navigation/editor.css 1.96 kB
build/block-library/blocks/navigation/style-rtl.css 2.04 kB
build/block-library/blocks/navigation/style.css 2.03 kB
build/block-library/blocks/navigation/view-modal.min.js 2.78 kB
build/block-library/blocks/navigation/view.min.js 443 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 363 B
build/block-library/blocks/page-list/editor.css 363 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 260 B
build/block-library/blocks/paragraph/style.css 260 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 493 B
build/block-library/blocks/post-comments-form/style.css 493 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 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 507 B
build/block-library/blocks/post-featured-image/editor.css 505 B
build/block-library/blocks/post-featured-image/style-rtl.css 166 B
build/block-library/blocks/post-featured-image/style.css 166 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 282 B
build/block-library/blocks/post-template/style.css 282 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 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 326 B
build/block-library/blocks/pullquote/style.css 325 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 282 B
build/block-library/blocks/query-pagination/style.css 278 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 439 B
build/block-library/blocks/query/editor.css 439 B
build/block-library/blocks/quote/style-rtl.css 213 B
build/block-library/blocks/quote/style.css 213 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 202 B
build/block-library/blocks/rss/editor.css 204 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 396 B
build/block-library/blocks/search/style.css 393 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 233 B
build/block-library/blocks/separator/style.css 233 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 464 B
build/block-library/blocks/shortcode/editor.css 464 B
build/block-library/blocks/site-logo/editor-rtl.css 455 B
build/block-library/blocks/site-logo/editor.css 455 B
build/block-library/blocks/site-logo/style-rtl.css 192 B
build/block-library/blocks/site-logo/style.css 192 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 84 B
build/block-library/blocks/site-title/editor.css 84 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.39 kB
build/block-library/blocks/social-links/style.css 1.38 kB
build/block-library/blocks/spacer/editor-rtl.css 322 B
build/block-library/blocks/spacer/editor.css 322 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 494 B
build/block-library/blocks/table/editor.css 494 B
build/block-library/blocks/table/style-rtl.css 611 B
build/block-library/blocks/table/style.css 609 B
build/block-library/blocks/table/theme-rtl.css 175 B
build/block-library/blocks/table/theme.css 175 B
build/block-library/blocks/tag-cloud/style-rtl.css 239 B
build/block-library/blocks/tag-cloud/style.css 239 B
build/block-library/blocks/template-part/editor-rtl.css 235 B
build/block-library/blocks/template-part/editor.css 235 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 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 561 B
build/block-library/blocks/video/editor.css 563 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 110 B
build/block-library/blocks/video/theme.css 110 B
build/block-library/common-rtl.css 1.01 kB
build/block-library/common.css 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 10.9 kB
build/block-library/editor.css 10.9 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 186 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 11.9 kB
build/block-library/style.css 11.9 kB
build/block-library/theme-rtl.css 695 B
build/block-library/theme.css 700 B
build/block-serialization-default-parser/index.min.js 1.11 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 49.6 kB
build/components/index.min.js 197 kB
build/components/style-rtl.css 11.5 kB
build/components/style.css 11.6 kB
build/compose/index.min.js 12 kB
build/core-data/index.min.js 15.4 kB
build/customize-widgets/index.min.js 11.3 kB
build/customize-widgets/style-rtl.css 1.38 kB
build/customize-widgets/style.css 1.38 kB
build/data-controls/index.min.js 653 B
build/data/index.min.js 8.05 kB
build/date/index.min.js 32 kB
build/deprecated/index.min.js 507 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.69 kB
build/edit-navigation/index.min.js 16 kB
build/edit-navigation/style-rtl.css 4 kB
build/edit-navigation/style.css 4.01 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/index.min.js 30.5 kB
build/edit-post/style-rtl.css 6.94 kB
build/edit-post/style.css 6.94 kB
build/edit-site/index.min.js 57.8 kB
build/edit-site/style-rtl.css 8.22 kB
build/edit-site/style.css 8.2 kB
build/edit-widgets/index.min.js 16.5 kB
build/edit-widgets/style-rtl.css 4.35 kB
build/edit-widgets/style.css 4.35 kB
build/editor/index.min.js 41.5 kB
build/editor/style-rtl.css 3.66 kB
build/editor/style.css 3.65 kB
build/element/index.min.js 4.68 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 6.75 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.64 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.77 kB
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.78 kB
build/keycodes/index.min.js 1.81 kB
build/list-reusable-blocks/index.min.js 1.74 kB
build/list-reusable-blocks/style-rtl.css 835 B
build/list-reusable-blocks/style.css 835 B
build/media-utils/index.min.js 2.93 kB
build/notices/index.min.js 953 B
build/nux/index.min.js 2.05 kB
build/nux/style-rtl.css 732 B
build/nux/style.css 728 B
build/plugins/index.min.js 1.94 kB
build/preferences-persistence/index.min.js 2.22 kB
build/preferences/index.min.js 1.3 kB
build/primitives/index.min.js 933 B
build/priority-queue/index.min.js 612 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.74 kB
build/reusable-blocks/index.min.js 2.21 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.4 kB
build/server-side-render/index.min.js 1.61 kB
build/shortcode/index.min.js 1.53 kB
build/token-list/index.min.js 644 B
build/url/index.min.js 3.61 kB
build/vendors/react-dom.min.js 38.5 kB
build/vendors/react.min.js 4.34 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 268 B
build/widgets/index.min.js 7.2 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.19 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action



// Precise partial text selections.
// @todo: For now, proof of concept. But code needs to be moved to the most appropriate place.
Copy link
Member

Choose a reason for hiding this comment

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

I think this belongs in block-editor/block-list/style.css

// Precise partial text selections.
// @todo: For now, proof of concept. But code needs to be moved to the most appropriate place.
// Furthermore, this code right now is likely going to affect numerous nested blocks, so
// it will be important to scope it right!
Copy link
Member

Choose a reason for hiding this comment

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

What blocks will be negatively affected? I can't think of any, so maybe no need to scope?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

It's important to test. This rule is the one we should be sure about:

.block-editor-block-list__layout {
	user-select: none;
}

Basically it says, anything that's inside .block-editor-block-list__layout, you can't select, unless we explicitly re-enable it using user-select: text;, or even user-select: auto;

@ellatrix
Copy link
Member

We should test this in all browsers, but it seems to work well also in Chrome and Firefox.

@jasmussen
Copy link
Contributor Author

I'll ping a bunch of folks for opinions. Essentially I'm pretty confident in that using user-select to unset and set text selection is the correct solution to use for this problem, but I'm still unsure how to best apply it. Also, anyone should feel free to push to this branch.

@jasmussen jasmussen marked this pull request as ready for review August 17, 2022 10:13
@jasmussen jasmussen requested a review from ajitbohra as a code owner August 17, 2022 10:13
@jasmussen jasmussen requested review from a team, jorgefilipecosta and ntsekouras and removed request for a team August 17, 2022 10:13
@jameskoster
Copy link
Contributor

It's better, but perhaps not perfect? Here's what I'm seeing in Safari:

Screenshot 2022-08-17 at 15 48 45

It seems to be related to line-height.

@jasmussen
Copy link
Contributor Author

I've addressed the feedback and moved the CSS around a bit. One of my concerns remains, and is showing up in a few places. Notably, text selection of contents inside placeholders was also disabled. I re-enabled that. But it's also disabled here:
Screenshot 2022-08-18 at 10 22 47

That's a post-list, and the excerpts aren't selectable. But wouldn't we still want a user to select text there even if it isn't editable? Or is the fact that it isn't editable and therefore unselectable a good thing? 🤔

@jasmussen jasmussen force-pushed the try/better-safari-text-selection branch from a4fe161 to 1ea63d4 Compare August 18, 2022 08:30
@jasmussen
Copy link
Contributor Author

The test failure looks real. I'd appreciate help here 🤔

@jameskoster
Copy link
Contributor

I'd be inclined to say that un-editable text being un-selectable is probably a good heuristic.

@jasmussen
Copy link
Contributor Author

@ntsekouras I would love your input on this one (and your help in case you can figure out the failing test) 🙏

// To do this, we disable text selection on the main container, then re-enable it only on the
// elements that actually get selected.
// To keep in mind: user-select is currently inherited to all nodes inside.
user-select: none;
Copy link
Contributor

Choose a reason for hiding this comment

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

Have you made any experiments with auto value(ref)? I haven't thought much about it, but this effects everything besides the exceptions below. For example you can't select any placeholder text etc.. - maybe that's better though..

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Thank you for looking 🙏

auto is default, and as it turns out, is the cause of the glitchy selection we've been seeing in Safari. For a partial selection between two paragraphs, the following selection is accurate to what you are actually selecting:

Screenshot 2022-08-22 at 13 09 11

The above works in this branch because we disallow everything but the paragraph text to be selected. It seems Safari's interpretation of selection in browsers is to capture everything, every div, every pseudo element. And so if we don't disable user select, we get the trunk behavior, which is this:

Screenshot 2022-08-22 at 13 06 45

So in order to accurately depict to the user what's selected (and what they can copy if they press ⌘C), we have to disable user-select on everything else. The fact that this affects everything down the stack is the main thing to test and write exceptions for, and I'm not sure if there's a better way.

@ntsekouras
Copy link
Contributor

That's a post-list, and the excerpts aren't selectable. But wouldn't we still want a user to select text there even if it isn't editable? Or is the fact that it isn't editable and therefore unselectable a good thing? 🤔

The downside I could see here it would be to a flow of selecting some blocks in Query Loop(not content editable) and pressing copy where it will first select the blocks(if they cannot be merged) and then you can actually copy them. This cannot be done here.

@jasmussen
Copy link
Contributor Author

The downside I could see here it would be to a flow of selecting some blocks in Query Loop(not content editable) and pressing copy where it will first select the blocks(if they cannot be merged) and then you can actually copy them. This cannot be done here.

Excellent point. I tried enabling selection also on blocks, and it seems to thread the needle here, so it still has a correct partial selection indication in Safari. What do you think?


// Hide the select style pseudo element as it interferes with the style.
&.is-partially-selected::after {
display: none;
Copy link
Contributor

Choose a reason for hiding this comment

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

This creates a regression when we have multiselected blocks and hover the block toolbar. This is in trunk:

Screen.Recording.2022-08-22.at.2.28.30.PM.mov

@ntsekouras
Copy link
Contributor

I took a look at the test and what happens is that with this change we can't select anything between selected blocks so if we click between them, the selection is not cleared. If that's okay, we can update the test to click somewhere else, but I have no strong opinions on which is a better experience..

@jasmussen
Copy link
Contributor Author

I took a look at the test and what happens is that with this change we can't select anything between selected blocks so if we click between them, the selection is not cleared. If that's okay, we can update the test to click somewhere else, but I have no strong opinions on which is a better experience..

Hmm. That's a lot of little issues popping up.

To be clear, ensuring a correct text selection is critical for 6.1 (though it's in bug-fix territory so we have a little time still). But there might be a better approach to it, than this CSS-only version, which was initially meant as a proof of concept.

The key to managing what shows up as selected is to judiciously apply the user-select property. But is there a dynamic way to do it, so we don't have to accept so many tradeoffs?

// Re-enable it on editable items and a few others.
.block-editor-block-list__block,
[contenteditable] {
user-select: text;
Copy link
Member

Choose a reason for hiding this comment

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

What is the point of adding [contenteditable] if it's already enabled on the block.
That actually seems like a god solution: disable text selection for block lists and re-enable it for blocks.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Good call, I removed contenteditable and just targetting blocks. I had to move the code a bit.

Copy link
Member

Choose a reason for hiding this comment

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

Which components are in a list of blocks that is not inside a block?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

The components reference is meant to target content inside placeholders.

Copy link
Member

Choose a reason for hiding this comment

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

Aren't these inside .block-editor-block-list__block? I don't get this extra rule, sorry.

Copy link
Member

Choose a reason for hiding this comment

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

@jasmussen I'm still not sure what this rule is needed btw.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

You're referring to [class^="components-"]? It's needed to enable text selection inside placeholders like Cover. It's not that you need to select text there that often, but right now the multi-select still selects that text, and without a visible selection marker, it becomes confusing why the multi-select isn't invoking. Possibly related to this: #42983 (comment)

// This is a hack to only disable user-select when blocks are selected inside.
// @todo: We shouldn't be targetting the label, this is only a POC. Should be replaced with a class.
//user-select: none;
[aria-label="Multiple selected blocks"] & {
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 is obviously in need of a change.

But what I did here was to scope the disabling of user-select: none; to only ever apply when a block is selected. I don't know if it's needed — if it is, we should assign a classname on this element instead — but it does seem safer. @ellatrix what do you think?


// Hide the select style pseudo element as it interferes with the style.
&.is-partially-selected::after {
height: 0;
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 is a good change which I think fixes the issues reported by @ntsekouras. Specifically instead of removing the pseudo element, it's made invisible. In practice for me that means I can hover the drag handle to highlight the blocks again, and click between them to de-select.

@jasmussen
Copy link
Contributor Author

Hooray, tests are green. That doesn't mean we can merge, but it means we can now figure out if #43313 (comment) is needed, and then either address the discussion point or go without it.

@jasmussen jasmussen force-pushed the try/better-safari-text-selection branch from 3bc62d7 to 33e0631 Compare August 26, 2022 12:32
@jasmussen
Copy link
Contributor Author

I have removed the hack I had in place, because I think we should land a first version of this PR as is. The hack demonstrates that if this version which deselects user-select in broad strokes need further scoping, there's a clear path to doing that as an easy bugfix. But we can try first without it.

@jasmussen jasmussen requested a review from a team August 26, 2022 12:39
@jasmussen
Copy link
Contributor Author

To connect dots, I noticed this issue as I was tinkering with this branch.

@adamziel
Copy link
Contributor

adamziel commented Aug 26, 2022

@jasmussen I took a liberty of updating your branch with some code that adds the class name when needed: 7aa51cc

Feel free to discard it or use it as needed.

@jasmussen
Copy link
Contributor Author

Oh nice! Thank you 🙏

I'll let this one sit over the weekend for any input, and then I can add the scoping-to-multi selected code back then.

@jasmussen jasmussen force-pushed the try/better-safari-text-selection branch from fee8037 to e5cb9b9 Compare August 29, 2022 12:43
@jasmussen
Copy link
Contributor Author

Thank you for the help, and for the green check! This is an important one, so when the checks pass, I'll land it. I added back the scoping for the user-select rule per Adam's help, but I'll be here to work on any followups we might encounter.

@jasmussen jasmussen merged commit 9620bae into trunk Aug 29, 2022
@jasmussen jasmussen deleted the try/better-safari-text-selection branch August 29, 2022 15:18
@github-actions github-actions bot added this to the Gutenberg 14.1 milestone Aug 29, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Package] Rich text /packages/rich-text [Type] Bug An existing feature does not function as intended
Projects
No open projects
Development

Successfully merging this pull request may close these issues.

5 participants