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

Image Block: Enable image block to be selected correctly when clicked #56043

Merged
merged 9 commits into from Nov 17, 2023

Conversation

t-hamano
Copy link
Contributor

@t-hamano t-hamano commented Nov 10, 2023

Follow-up on #55470
Fixes: #56017

What?

This PR allows you to select image blocks "correctly".

This will display a blue outline when a block is selected, and inserting a block with the Enter key and deleting a block with the Delete key will work correctly.

Why?

With #55470, the image block is now wrapped in an A tag when it's linked. As a result, even if you click on the block, it no longer appears to be selected correctly.

How?

To find a way to solve this, I looked into blocks where the block itself is an A element, or where there is an A element inside the block. As a result, I noticed that there are many approaches that add pointer-events:none to the A element.

I can't explain it exactly, but I found that block selection works correctly with this CSS.

Update: I found that if I simply added pointer-events: none to the a element, the image could no longer be resized. This is because the ResizableBox component is wrapped in an a element. To solve this I moved the a element inside the ResisableBox. Check this comment for details.

Testing Instructions

  • Insert an Image block.
  • Set a link to the Image block.
  • Remove focus from the Image block.
  • "Click" on the image block (Note: If you select the image block with the up and down keys on your keyboard, the block will be selected correctly, so click on the block with your mouse).
  • A blue outline will appear to indicate that the block is selected.
  • When you press Enter, an empty paragraph block will be generated next to the image block.
  • You can delete the image block by pressing the Delete key.

Screenshots or screencast

6eecccd992589fb13988da7ce03d9b7b.mp4

@t-hamano t-hamano added [Type] Bug An existing feature does not function as intended [Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). [Block] Image Affects the Image Block labels Nov 10, 2023
@t-hamano t-hamano self-assigned this Nov 10, 2023
Copy link

github-actions bot commented Nov 10, 2023

Size Change: +13 B (0%)

Total Size: 1.7 MB

Filename Size Change
build/block-library/blocks/image/editor-rtl.css 834 B -15 B (-2%)
build/block-library/blocks/image/editor.css 833 B -14 B (-2%)
build/block-library/editor-rtl.css 12.5 kB -4 B (0%)
build/block-library/editor.css 12.4 kB -5 B (0%)
build/block-library/index.min.js 212 kB +51 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 964 B
build/annotations/index.min.js 2.71 kB
build/api-fetch/index.min.js 2.29 kB
build/autop/index.min.js 2.11 kB
build/blob/index.min.js 590 B
build/block-directory/index.min.js 7.25 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.29 kB
build/block-editor/content.css 4.28 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 247 kB
build/block-editor/style-rtl.css 15.7 kB
build/block-editor/style.css 15.7 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 138 B
build/block-library/blocks/audio/theme.css 138 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 587 B
build/block-library/blocks/button/editor.css 587 B
build/block-library/blocks/button/style-rtl.css 633 B
build/block-library/blocks/button/style.css 632 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 421 B
build/block-library/blocks/columns/style.css 421 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 647 B
build/block-library/blocks/cover/editor.css 650 B
build/block-library/blocks/cover/style-rtl.css 1.7 kB
build/block-library/blocks/cover/style.css 1.69 kB
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 B
build/block-library/blocks/details/style-rtl.css 98 B
build/block-library/blocks/details/style.css 98 B
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 138 B
build/block-library/blocks/embed/theme.css 138 B
build/block-library/blocks/file/editor-rtl.css 316 B
build/block-library/blocks/file/editor.css 316 B
build/block-library/blocks/file/style-rtl.css 280 B
build/block-library/blocks/file/style.css 281 B
build/block-library/blocks/file/view.min.js 320 B
build/block-library/blocks/footnotes/style-rtl.css 201 B
build/block-library/blocks/footnotes/style.css 199 B
build/block-library/blocks/form-input/editor-rtl.css 229 B
build/block-library/blocks/form-input/editor.css 228 B
build/block-library/blocks/form-input/style-rtl.css 343 B
build/block-library/blocks/form-input/style.css 343 B
build/block-library/blocks/form-submission-notification/editor-rtl.css 343 B
build/block-library/blocks/form-submission-notification/editor.css 342 B
build/block-library/blocks/form-submit-button/style-rtl.css 69 B
build/block-library/blocks/form-submit-button/style.css 69 B
build/block-library/blocks/form/view.min.js 452 B
build/block-library/blocks/freeform/editor-rtl.css 2.61 kB
build/block-library/blocks/freeform/editor.css 2.61 kB
build/block-library/blocks/gallery/editor-rtl.css 957 B
build/block-library/blocks/gallery/editor.css 962 B
build/block-library/blocks/gallery/style-rtl.css 1.55 kB
build/block-library/blocks/gallery/style.css 1.55 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 654 B
build/block-library/blocks/group/editor.css 654 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 189 B
build/block-library/blocks/heading/style.css 189 B
build/block-library/blocks/html/editor-rtl.css 340 B
build/block-library/blocks/html/editor.css 341 B
build/block-library/blocks/image/style-rtl.css 1.61 kB
build/block-library/blocks/image/style.css 1.6 kB
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/image/view.min.js 2.05 kB
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 505 B
build/block-library/blocks/media-text/style.css 503 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 671 B
build/block-library/blocks/navigation-link/editor.css 672 B
build/block-library/blocks/navigation-link/style-rtl.css 103 B
build/block-library/blocks/navigation-link/style.css 103 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation/editor-rtl.css 2.26 kB
build/block-library/blocks/navigation/editor.css 2.26 kB
build/block-library/blocks/navigation/style-rtl.css 2.27 kB
build/block-library/blocks/navigation/style.css 2.26 kB
build/block-library/blocks/navigation/view.min.js 1.07 kB
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 401 B
build/block-library/blocks/page-list/editor.css 401 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 235 B
build/block-library/blocks/paragraph/editor.css 235 B
build/block-library/blocks/paragraph/style-rtl.css 335 B
build/block-library/blocks/paragraph/style.css 335 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 508 B
build/block-library/blocks/post-comments-form/style.css 508 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 666 B
build/block-library/blocks/post-featured-image/editor.css 662 B
build/block-library/blocks/post-featured-image/style-rtl.css 345 B
build/block-library/blocks/post-featured-image/style.css 345 B
build/block-library/blocks/post-navigation-link/style-rtl.css 215 B
build/block-library/blocks/post-navigation-link/style.css 214 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 409 B
build/block-library/blocks/post-template/style.css 408 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 69 B
build/block-library/blocks/post-time-to-read/style.css 69 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 125 B
build/block-library/blocks/preformatted/style.css 125 B
build/block-library/blocks/pullquote/editor-rtl.css 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 335 B
build/block-library/blocks/pullquote/style.css 335 B
build/block-library/blocks/pullquote/theme-rtl.css 168 B
build/block-library/blocks/pullquote/theme.css 168 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 288 B
build/block-library/blocks/query-pagination/style.css 284 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 486 B
build/block-library/blocks/query/editor.css 486 B
build/block-library/blocks/query/style-rtl.css 312 B
build/block-library/blocks/query/style.css 308 B
build/block-library/blocks/query/view.min.js 637 B
build/block-library/blocks/quote/style-rtl.css 237 B
build/block-library/blocks/quote/style.css 237 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 140 B
build/block-library/blocks/read-more/style.css 140 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 184 B
build/block-library/blocks/search/editor.css 184 B
build/block-library/blocks/search/style-rtl.css 613 B
build/block-library/blocks/search/style.css 613 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/search/view.min.js 471 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 329 B
build/block-library/blocks/shortcode/editor.css 329 B
build/block-library/blocks/site-logo/editor-rtl.css 760 B
build/block-library/blocks/site-logo/editor.css 760 B
build/block-library/blocks/site-logo/style-rtl.css 204 B
build/block-library/blocks/site-logo/style.css 204 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 682 B
build/block-library/blocks/social-links/editor.css 681 B
build/block-library/blocks/social-links/style-rtl.css 1.45 kB
build/block-library/blocks/social-links/style.css 1.45 kB
build/block-library/blocks/spacer/editor-rtl.css 359 B
build/block-library/blocks/spacer/editor.css 359 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 432 B
build/block-library/blocks/table/editor.css 432 B
build/block-library/blocks/table/style-rtl.css 646 B
build/block-library/blocks/table/style.css 645 B
build/block-library/blocks/table/theme-rtl.css 157 B
build/block-library/blocks/table/theme.css 157 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 403 B
build/block-library/blocks/template-part/editor.css 403 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/term-description/style-rtl.css 111 B
build/block-library/blocks/term-description/style.css 111 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 191 B
build/block-library/blocks/video/style.css 191 B
build/block-library/blocks/video/theme-rtl.css 139 B
build/block-library/blocks/video/theme.css 139 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.11 kB
build/block-library/common.css 1.11 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 472 B
build/block-library/reset.css 472 B
build/block-library/style-rtl.css 14.5 kB
build/block-library/style.css 14.5 kB
build/block-library/theme-rtl.css 700 B
build/block-library/theme.css 705 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/blocks/index.min.js 51.5 kB
build/commands/index.min.js 15.5 kB
build/commands/style-rtl.css 947 B
build/commands/style.css 942 B
build/components/index.min.js 256 kB
build/components/style-rtl.css 12 kB
build/components/style.css 12 kB
build/compose/index.min.js 12.7 kB
build/core-commands/index.min.js 2.72 kB
build/core-data/index.min.js 71.9 kB
build/customize-widgets/index.min.js 12.1 kB
build/customize-widgets/style-rtl.css 1.43 kB
build/customize-widgets/style.css 1.43 kB
build/data-controls/index.min.js 651 B
build/data/index.min.js 8.87 kB
build/date/index.min.js 17.9 kB
build/deprecated/index.min.js 462 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.68 kB
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/edit-post/index.min.js 35.7 kB
build/edit-post/style-rtl.css 7.62 kB
build/edit-post/style.css 7.62 kB
build/edit-site/index.min.js 208 kB
build/edit-site/style-rtl.css 14.2 kB
build/edit-site/style.css 14.2 kB
build/edit-widgets/index.min.js 17.2 kB
build/edit-widgets/style-rtl.css 4.65 kB
build/edit-widgets/style.css 4.65 kB
build/editor/index.min.js 46.8 kB
build/editor/style-rtl.css 3.69 kB
build/editor/style.css 3.68 kB
build/element/index.min.js 4.87 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 7.76 kB
build/format-library/style-rtl.css 577 B
build/format-library/style.css 577 B
build/hooks/index.min.js 1.57 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.61 kB
build/interactivity/index.min.js 11.4 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.76 kB
build/keycodes/index.min.js 1.9 kB
build/list-reusable-blocks/index.min.js 2.11 kB
build/list-reusable-blocks/style-rtl.css 865 B
build/list-reusable-blocks/style.css 865 B
build/media-utils/index.min.js 2.92 kB
build/notices/index.min.js 964 B
build/nux/index.min.js 2.01 kB
build/nux/style-rtl.css 775 B
build/nux/style.css 771 B
build/patterns/index.min.js 4.83 kB
build/patterns/style-rtl.css 567 B
build/patterns/style.css 566 B
build/plugins/index.min.js 1.81 kB
build/preferences-persistence/index.min.js 1.85 kB
build/preferences/index.min.js 1.26 kB
build/primitives/index.min.js 994 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 988 B
build/react-i18n/index.min.js 631 B
build/react-refresh-entry/index.min.js 9.46 kB
build/react-refresh-runtime/index.min.js 6.78 kB
build/redux-routine/index.min.js 2.71 kB
build/reusable-blocks/index.min.js 2.76 kB
build/reusable-blocks/style-rtl.css 265 B
build/reusable-blocks/style.css 265 B
build/rich-text/index.min.js 9.96 kB
build/router/index.min.js 1.79 kB
build/server-side-render/index.min.js 1.96 kB
build/shortcode/index.min.js 1.4 kB
build/style-engine/index.min.js 1.98 kB
build/token-list/index.min.js 587 B
build/url/index.min.js 3.83 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 967 B
build/warning/index.min.js 259 B
build/widgets/index.min.js 7.18 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.03 kB

compressed-size-action

@t-hamano t-hamano marked this pull request as ready for review November 10, 2023 16:07
@t-hamano
Copy link
Contributor Author

@alexstine I would appreciate it if you could let me know if applying pointer-events:none to the a element will cause accessibility issues 🙏

@t-hamano t-hamano added the Backport to WP Minor Release Pull request that needs to be backported to a WordPress minor release label Nov 10, 2023
@t-hamano t-hamano changed the title Image Block: Enable image blocks to be selected correctly when clicked Image Block: Enable image block to be selected correctly when clicked Nov 10, 2023
@alexstine
Copy link
Contributor

@t-hamano I am not sure about this but I would think so.

CC: @joedolson @afercia @jeryj.

@jeryj
Copy link
Contributor

jeryj commented Nov 10, 2023

The pointer-events: none; may be part of the solution, but it may not be necessary. Using the arrow keys to navigate the blocks shows the issue as the <a> is considered a selectable block, when it shouldn't be.

Reproduction

  • Have Paragraph Block, Image Block with link, Paragraph Block
  • Starting on First paragraph block, arrow down.
  • Image block will be selected
  • Arrow Down again
  • Bug: Image block is still selected, but on the <a>. No block border is visibile.
  • Arrow Down
  • Second Paragraph block is selected

I haven't dug into the code, but my guess is that it has to do with the <a> within the image block being considered a selectable element. If it's not a selectable element within the flow of the blocks, then clicking on the <a> shouldn't do anything.

Could we use role=link on the wrapping element and make it a generic <div>? Or would that be worse?

@carolinan
Copy link
Contributor

The markup in the editor and the font should match as close as possible, otherwise it becomes more difficult to style.

@alexstine
Copy link
Contributor

@jeryj In that case, I think writing-flow/use-arrow-nav hook needs to be explored. I think it matches <a> as a focusable element. Just not sure how to update the logic without breaking accessibility. It might also be related to block-list/use-focus-first-element hook. Using role="link" would probably be okay but maybe not for visuals.

@t-hamano
Copy link
Contributor Author

The problem with focusing on the a element with the arrow keys is probably because it is considered a focusable element, as @alexstine said.

I was able to solve this problem by adding tabIndex="-1" to the a element of the image block, but are there any concerns about this?

The video below shows pressing the up and down arrow keys repeatedly on an editor containing an Image, Site Logo, and Paragraph block. You can see that the focus no longer moves to the a element of the Image block. On the other hand, in the Site Logo block where the a element is included in the block, you can see that the focus has shifted to the a element.

1cd1b0e17b62389da42a5825bf970f12.mp4

Copy link
Member

@ramonjd ramonjd left a comment

Choose a reason for hiding this comment

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

Thank you @t-hamano for this PR!

Using role="link" would probably be okay but maybe not for visuals.

Unfortunately, in my testing, changing the tag and adding the role attribute doesn't trigger the styles as the markup is different as @carolinan notes.

The pointer-events: none; may be part of the solution, but it may not be necessary.

In my testing, I couldn't find an alternative to this. Removing the pointer events ensure that the click even is triggered on the parent element.

We only need to cater for Safari (surprise, surprise) by adding display: inline-block.

I've tested in FF, Chrome and Edge as well and it's working with the above change.

Here's what I'm seeing:

✅ Click bug is fixed (with display: inline-block for Safari)
✅ Arrow up and down selects previous and subsequent blocks immediately

Would it be helpful to add role="presentation" to the link to remove the <a /> semantics or am I completely overthinking it? 🤣

I'm happy to approve this if other folks are fine with the changes.

packages/block-library/src/image/editor.scss Outdated Show resolved Hide resolved
onClick: ( event ) => event.preventDefault(),
'aria-disabled': true,
tabIndex: -1,
Copy link
Member

Choose a reason for hiding this comment

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

was able to solve this problem by adding tabIndex="-1" to the a element of the image block, but are there any concerns about this?

This fixes the issue that @jeryj reported for me.

Seems to be acceptable according to the spec, but I'll defer to other folks.

Copy link
Contributor

Choose a reason for hiding this comment

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

@t-hamano No, you can't add tabindex="-1" like this. Doing that prevents the link from gaining focus with arrow key navigation. You need to be able to focus if you are going to hear things like the URL, ALT text, filename, etc.

Copy link
Member

Choose a reason for hiding this comment

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

In the context of the editor, the link is a very recent addition whose only function is to ensure the editor styles match the frontend because some global styles target A-tags. The A-tag doesn't actually need an href value to achieve this.

Would it be acceptable to remove it from the accessibility tree or mark it as presentation only or something?

Were the ALT text and filename not available from the IMG element previously?

If getting these attributes is preferable and, bear with me as this might be wild 😄, could we add a data-href to the surrounding figure, which is the selectable "block" element?

Copy link
Contributor

Choose a reason for hiding this comment

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

@ramonjd You can't add role="presentation" to the link or else you will also destroy the semantics of the <img> tag wrapped inside. I never actually knew you could link an image block so not sure how it worked before. Pretty sure if there is no link, you could not access that information because <img> by default cannot take focus. That is a bug that needs to be fixed somehow.

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 a very difficult problem, but for this PR, it might be better to focus on the problem of not being able to click the linked Image block correctly. That is, don't add code like tabIndex=-1 that prevents the a element in the block from being focused.

It is not only the Image block that the keyboard focuses on the a element within the block. For example, a similar problem occurs with the Site Logo block with the home link set.

I think we can discuss more broadly in another issue, such as what kind of keyboard interaction is expected in the editor and what should be communicated to screen readers when the block contains an a element or an img element. .

Copy link
Contributor

Choose a reason for hiding this comment

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

Agreed. If you use your arrow keys to select the block and the <a> becomes focussed, you can always focus the block wrapper with left arrow. This is how all blocks with wrappers work with tabindex="0" set on the wrapper.

Copy link
Member

Choose a reason for hiding this comment

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

Ah okay, I appreciate the explanation @alexstine Thank you! 👍🏻

I think we can discuss more broadly in another issue, such as what kind of keyboard interaction is expected in the editor and what should be communicated to screen readers when the block contains an a element or an img element. .

Sounds like a good approach.

@@ -790,7 +791,7 @@ export default function Image( {
{ ! temporaryURL && controls }
{ /* If the image has a href, wrap in an <a /> tag to trigger any inherited link element styles */ }
{ !! href ? (
<a href={ href } { ...disabledClickProps }>
<a href={ href } { ...disabledProps }>
Copy link
Member

Choose a reason for hiding this comment

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

👍🏻

@t-hamano
Copy link
Contributor Author

I noticed that if I applied pointer-events: none; to the a element, the resize handle inside would no longer work 😅 Let's try moving this a element into a ResizableBox.

4802ad85b1bcf757c12f9f7808e17c1c.mp4

@t-hamano
Copy link
Contributor Author

I noticed that if I applied pointer-events: none; to the a element, the resize handle inside would no longer work 😅 Let's try moving this a element into a ResizableBox.

I tried to solve this problem by wrapping the img element directly in an a tag if the image has an href. In other words, the way it is rendered will change as follows.

Before:

<a style={{pointerEvents: 'none'}}>
  <ResisableBox>
    <img />
  </ResisableBox>
</a>

After:

<ResisableBox>
  <a style={{pointerEvents: 'none'}}>
    <img />
  </a>
</ResisableBox>

Other changes are as follows:

  • The tabIndex="-1" of the a element added in this PR has been removed again. The reason is mentioned in this comment.
  • Changed styles such as pointer-events: none; from the stylesheet to inline styles. This is because the a element is not necessarily directly below the block, and CSS selectors like .wp-block-image > a cannot be used.

@t-hamano
Copy link
Contributor Author

It seems to work fine in my testing. In all scenarios, the Image block is clickable, and the border color also seems to inherit the link color.

In the screenshot below, I'm testing various scenarios with the Twenty Twenty-Three theme, which has a green link color.

8495a705d7cd1274095f3c6b42cc0750.mp4

// Restore cursor style so it doesn't appear 'clickable'
// and remove pointer events. Safari needs the display property.
pointerEvents: 'none',
cursor: 'default',
Copy link
Contributor

Choose a reason for hiding this comment

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

@t-hamano Do you think this could be confusing for low vision users to get a normal mouse pointer when the link is not clickable?

Copy link
Member

Choose a reason for hiding this comment

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

On the face of it, default seems appropriate to me given that the link is disabled. (?)

cursor: 'pointer' is the "hand", or default browser cursor, for linked elements.

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 think that since this element cannot actually be clicked, it is okay to leave the cursor as the default.

By the way, #56123 has been submitted to add a pressed state to the link button in the block toolbar to make it easier to tell if the image is linked.

Copy link
Contributor

@alexstine alexstine left a comment

Choose a reason for hiding this comment

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

@t-hamano One question but otherwise this is testing well with screen readers.

@ramonjd
Copy link
Member

ramonjd commented Nov 14, 2023

I can confirm that there's no regression to the fix for #55336 as well.

Just to confirm I can still reproduce the arrow selection scenario described above, but that's for a follow up, right?

Thanks @t-hamano and @alexstine for sticking with this 🍺

@t-hamano
Copy link
Contributor Author

Just to confirm I can still reproduce the arrow selection scenario described above, but that's for a follow up, right?

That's right. The behavior of being able to select the a element with the arrow keys is not the first time it has occurred in this PR, but may occur in all blocks that include the a element. So what scenario is ideal or not would be discussed in a separate issue/PR.

@t-hamano
Copy link
Contributor Author

t-hamano commented Nov 16, 2023

I checked again after merging the latest trunk and discovered another problem with this PR. When I apply a link to the image, the height of the image changes and it extends beyond the ResisableBox.

8bda9092985b55c6df010084abf68115.mp4

I expected that display:inline-block was having an effect and added vertical-align: top, but it had no effect. display:block also had no effect. In the end, I was able to solve the problem by adding display: inline.

@ramonjd In this comment of yours, you say that the display property is needed to solve the click bug in Firefox Safari.

Could you please confirm whether dipslay:inline also solves this problem? Because I'm a Windows user and Safari browser doesn't exist 😅

@t-hamano
Copy link
Contributor Author

Another approach might be to focus the block when the a element is clicked, instead of making it impossible to click on it. I'll try to find a more ideal approach.

@ramonjd
Copy link
Member

ramonjd commented Nov 16, 2023

@ramonjd In #56043 (review) of yours, you say that the display property is needed to solve the click bug in Firefox.

I think you mean Safari? No problem, I'll test today and get back to you!

@ramonjd
Copy link
Member

ramonjd commented Nov 16, 2023

I was able to solve the problem by adding display: inline.

It looks good to me

Here's what I'm seeing in Safari:

With display: inline

2023-11-17.07.07.22.mp4

With display: inline-block
Screenshot 2023-11-17 at 7 07 49 am

@t-hamano
Copy link
Contributor Author

Thanks for the testing, @ramonjd!

I think you mean Safari?

Yes, that's right 😅

I was able to solve the problem by adding display: inline.
It looks good to me

I was relieved that it seemed to work well. I believe that all problems have been resolved, so I would like to merge this PR.

Thank you for your cooperation!

@t-hamano t-hamano merged commit 22dcbde into trunk Nov 17, 2023
50 checks passed
@t-hamano t-hamano deleted the fix/image-click-event branch November 17, 2023 13:01
@github-actions github-actions bot added this to the Gutenberg 17.2 milestone Nov 17, 2023
@t-hamano
Copy link
Contributor Author

Note: As stated in this comment, this PR fixes a bug that first appeared in WP6.4. I'm giving it a backport label because I think this should be fixed in a minor release.

@t-hamano
Copy link
Contributor Author

@mikachan Is it possible to backport this PR to WP6.4.2?

@mikachan
Copy link
Member

@mikachan Is it possible to backport this PR to WP6.4.2?

Yes that should be fine, as 6.4.2 is still being worked on. I'll cherry-pick this PR for inclusion in a package update, ready for 6.4.2.

@mikachan
Copy link
Member

I just cherry-picked this PR to the 6-4-2-cherry-picks branch to get it included in the next release: d5de4af

mikachan pushed a commit that referenced this pull request Nov 21, 2023
…#56043)

* Image Block: Enable image blocks to be selected correctly when clicked

* Add tabIndex

* Update packages/block-library/src/image/editor.scss

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

* Wrap img element directly to make the image resizable

* Use `display:inline` instead of `display:inline-block`

---------

Co-authored-by: Ramon <ramonjd@users.noreply.github.com>
@mikachan mikachan removed the Backport to WP Minor Release Pull request that needs to be backported to a WordPress minor release label Nov 21, 2023
mikachan pushed a commit that referenced this pull request Nov 22, 2023
…#56043)

* Image Block: Enable image blocks to be selected correctly when clicked

* Add tabIndex

* Update packages/block-library/src/image/editor.scss

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

* Wrap img element directly to make the image resizable

* Use `display:inline` instead of `display:inline-block`

---------

Co-authored-by: Ramon <ramonjd@users.noreply.github.com>
pento pushed a commit to WordPress/wordpress-develop that referenced this pull request Jan 9, 2024
Package Update includes fixes for:
- Image Block: Enable image block to be selected correctly when clicked.
- Reduce specificity of default Cover text color styles.
- Image Block: Fix deprecation when width/height attribute is number.
- Text selection: show CSS hack to Safari only.
- SlotFill: Allow contextual SlotFillProviders.

See: #5696
See: WordPress/gutenberg@bd6767b
See: WordPress/gutenberg#56043
See: WordPress/gutenberg#56411
See: WordPress/gutenberg#57063
See: WordPress/gutenberg#57300
See: WordPress/gutenberg#56779

Props mikachan, wildworks, alexstine, poena, isabel_brison, andrewserong, czapla, andraganescu, joen, ellatrix, youknowriad, ntsekouras.
Fixes #59943, #59943.



git-svn-id: https://develop.svn.wordpress.org/trunk@57258 602fd350-edb4-49c9-b593-d223f7449a82
markjaquith pushed a commit to markjaquith/WordPress that referenced this pull request Jan 9, 2024
Package Update includes fixes for:
- Image Block: Enable image block to be selected correctly when clicked.
- Reduce specificity of default Cover text color styles.
- Image Block: Fix deprecation when width/height attribute is number.
- Text selection: show CSS hack to Safari only.
- SlotFill: Allow contextual SlotFillProviders.

See: WordPress/wordpress-develop#5696
See: WordPress/gutenberg@bd6767b
See: WordPress/gutenberg#56043
See: WordPress/gutenberg#56411
See: WordPress/gutenberg#57063
See: WordPress/gutenberg#57300
See: WordPress/gutenberg#56779

Props mikachan, wildworks, alexstine, poena, isabel_brison, andrewserong, czapla, andraganescu, joen, ellatrix, youknowriad, ntsekouras.
Fixes #59943, #59943.


Built from https://develop.svn.wordpress.org/trunk@57258


git-svn-id: http://core.svn.wordpress.org/trunk@56764 1a063a9b-81f0-0310-95a4-ce76da25c4cd
github-actions bot pushed a commit to platformsh/wordpress-performance that referenced this pull request Jan 9, 2024
Package Update includes fixes for:
- Image Block: Enable image block to be selected correctly when clicked.
- Reduce specificity of default Cover text color styles.
- Image Block: Fix deprecation when width/height attribute is number.
- Text selection: show CSS hack to Safari only.
- SlotFill: Allow contextual SlotFillProviders.

See: WordPress/wordpress-develop#5696
See: WordPress/gutenberg@bd6767b
See: WordPress/gutenberg#56043
See: WordPress/gutenberg#56411
See: WordPress/gutenberg#57063
See: WordPress/gutenberg#57300
See: WordPress/gutenberg#56779

Props mikachan, wildworks, alexstine, poena, isabel_brison, andrewserong, czapla, andraganescu, joen, ellatrix, youknowriad, ntsekouras.
Fixes #59943, #59943.


Built from https://develop.svn.wordpress.org/trunk@57258


git-svn-id: https://core.svn.wordpress.org/trunk@56764 1a063a9b-81f0-0310-95a4-ce76da25c4cd
widoz pushed a commit to widoz/WordPress that referenced this pull request Jan 26, 2024
Package Update includes fixes for:
- Image Block: Enable image block to be selected correctly when clicked.
- Reduce specificity of default Cover text color styles.
- Image Block: Fix deprecation when width/height attribute is number.
- Text selection: show CSS hack to Safari only.
- SlotFill: Allow contextual SlotFillProviders.

See: WordPress/wordpress-develop#5696
See: WordPress/gutenberg@bd6767b
See: WordPress/gutenberg#56043
See: WordPress/gutenberg#56411
See: WordPress/gutenberg#57063
See: WordPress/gutenberg#57300
See: WordPress/gutenberg#56779

Props mikachan, wildworks, alexstine, poena, isabel_brison, andrewserong, czapla, andraganescu, joen, ellatrix, youknowriad, ntsekouras.
Fixes #59943, #59943.


Built from https://develop.svn.wordpress.org/trunk@57258


git-svn-id: http://core.svn.wordpress.org/trunk@56764 1a063a9b-81f0-0310-95a4-ce76da25c4cd
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Block] Image Affects the Image Block [Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[WP 6.4.1] images can't be corrected selected as Gutenberg block after linking to media
6 participants