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

Gallery: Add lightbox support #62906

Open
wants to merge 30 commits into
base: trunk
Choose a base branch
from
Open

Gallery: Add lightbox support #62906

wants to merge 30 commits into from

Conversation

madhusudhand
Copy link
Member

@madhusudhand madhusudhand commented Jun 27, 2024

Originally written by @madhusudhand

Details

What?

This introduces lightbox functionality to Gallery block.

How?

  • Image lightbox has been extended to support gallery
  • Next and Prev icons were added to image lightbox if the image is in the context of a gallery.
  • In this iteration (first) next/prev navigation for the lightbox in gallery are based on the "Expand on click" property of the image.

Following is the behaviour in various scenarios.

Case 1: "Expand on click" is enabled for the image block globally.

All images inside (unless overridden at block level), will invoke the lightbox on click and next and previous navigation is possible.

Case 2: One of the image (lets say 2nd image) is set to "Link to image file"

Lightbox will be invoked on click of 1st image and on click of next will move to 3rd image.

Case 3: "Expand on click" is not enabled globally, but few images are set with this option in gallery.

This is similar to case 2, lightbox opens with only those images.

What's in future PRs?

  • This change updates the image source on next and prev navigation. The smooth transition between the images will be addressed in a future PR.
  • This has no effect on touch devices. It will be addressed in followup.

Screenshots (Draft)

gallery-lightbox-1

image

Testing instructions

  • In global styles, enable "Click to expand" feature on image block.
  • Add a gallery block to a post or page. Add images to it.
  • In the frontend, click on an image to invoke lightbox and navigate between images by clicking on icons in the UI, or using next and prev arrow keys in the keyboard.

Related issues

First iteration of #56310


Latest description written by @t-hamano

What?

This PR enables navigation between images with lightbox enabled.

Why?

#56310

How?

  • If the Gallery block contains images with "Enlarge on click" enabled, you will be able to navigate between those images. If "Enlarge on click" is not enabled, those images will be skipped.
  • This feature is enabled by default, but can be disabled in the block sidebar. If the feature is disabled, the image lightboxes themselves will work as before, but navigation between images will not be enabled:
    block-sidebar
  • Swipe actions on touch devices are not currently possible. This may be addressed in a follow-up.
  • To localize the aria-label, inject an element with aria-live and aria-atomic attributes and vary the text inside. We could also use speak, but the @wordpress/a11y script module is available from WP 6.7. The Gutenberg plugin has to support WP 6.6 for now, so I didn't go with the speak approach.

Testing Instructions

  • Click the "Enlarge on click" button in the Gallery block toolbar. This will enable Lightbox for all images.
  • When you click on an image, a lightbox will open. Make sure the close, back, and next buttons work.
  • Disable "Lightbox navigation" in the Gallery block sidebar. A lightbox will open when you click on an image, but the back and next buttons will not be displayed.

Testing Instructions for Keyboard

  • Make sure you can perform all test steps using only the keyboard.
  • Tooltip text appears when the back and next buttons are hovered over or focused.
  • Make sure your screen reader reads the appropriate information. For example, NVDA reads:
    • Click lightbox toggle button: Enlarged image X of Y: {IMAGE_ALT_TEXT} dialog
    • Focus back and next buttons: button unavailable Previous, button Next
    • Click back and next buttons: Enlarged image X of Y: {IMAGE_ALT_TEXT}

Screenshots or screencast

6999948663987cac5545ba0e9eaa1a88.mp4

Copy link

github-actions bot commented Jun 27, 2024

Size Change: +1.44 kB (+0.08%)

Total Size: 1.85 MB

Filename Size Change
build-module/block-library/image/view.min.js 2.24 kB +441 B (+24.53%) 🚨
build/block-library/blocks/image/style-rtl.css 1.84 kB +243 B (+15.17%) ⚠️
build/block-library/blocks/image/style.css 1.84 kB +242 B (+15.17%) ⚠️
build/block-library/index.min.js 225 kB +106 B (+0.05%)
build/block-library/style-rtl.css 15.2 kB +207 B (+1.38%)
build/block-library/style.css 15.2 kB +203 B (+1.35%)
ℹ️ View Unchanged
Filename Size
build-module/a11y/index.min.js 482 B
build-module/block-library/file/view.min.js 447 B
build-module/block-library/form/view.min.js 533 B
build-module/block-library/navigation/view.min.js 1.18 kB
build-module/block-library/query/view.min.js 767 B
build-module/block-library/search/view.min.js 639 B
build-module/interactivity-router/index.min.js 3.04 kB
build-module/interactivity/debug.min.js 17.5 kB
build-module/interactivity/index.min.js 13.9 kB
build/a11y/index.min.js 952 B
build/annotations/index.min.js 2.26 kB
build/api-fetch/index.min.js 2.4 kB
build/autop/index.min.js 2.12 kB
build/blob/index.min.js 579 B
build/block-directory/index.min.js 7.13 kB
build/block-directory/style-rtl.css 1.03 kB
build/block-directory/style.css 1.03 kB
build/block-editor/content-rtl.css 4.42 kB
build/block-editor/content.css 4.41 kB
build/block-editor/default-editor-styles-rtl.css 394 B
build/block-editor/default-editor-styles.css 394 B
build/block-editor/index.min.js 263 kB
build/block-editor/style-rtl.css 15.9 kB
build/block-editor/style.css 15.9 kB
build/block-library/blocks/archives/editor-rtl.css 84 B
build/block-library/blocks/archives/editor.css 83 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 149 B
build/block-library/blocks/audio/editor.css 151 B
build/block-library/blocks/audio/style-rtl.css 132 B
build/block-library/blocks/audio/style.css 132 B
build/block-library/blocks/audio/theme-rtl.css 134 B
build/block-library/blocks/audio/theme.css 134 B
build/block-library/blocks/avatar/editor-rtl.css 115 B
build/block-library/blocks/avatar/editor.css 115 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/button/editor-rtl.css 265 B
build/block-library/blocks/button/editor.css 265 B
build/block-library/blocks/button/style-rtl.css 555 B
build/block-library/blocks/button/style.css 555 B
build/block-library/blocks/buttons/editor-rtl.css 291 B
build/block-library/blocks/buttons/editor.css 291 B
build/block-library/blocks/buttons/style-rtl.css 345 B
build/block-library/blocks/buttons/style.css 345 B
build/block-library/blocks/calendar/style-rtl.css 240 B
build/block-library/blocks/calendar/style.css 240 B
build/block-library/blocks/categories/editor-rtl.css 132 B
build/block-library/blocks/categories/editor.css 131 B
build/block-library/blocks/categories/style-rtl.css 152 B
build/block-library/blocks/categories/style.css 152 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 139 B
build/block-library/blocks/code/style.css 139 B
build/block-library/blocks/code/theme-rtl.css 122 B
build/block-library/blocks/code/theme.css 122 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 420 B
build/block-library/blocks/columns/style.css 420 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 124 B
build/block-library/blocks/comment-author-avatar/editor.css 124 B
build/block-library/blocks/comment-author-name/style-rtl.css 72 B
build/block-library/blocks/comment-author-name/style.css 72 B
build/block-library/blocks/comment-content/style-rtl.css 120 B
build/block-library/blocks/comment-content/style.css 120 B
build/block-library/blocks/comment-date/style-rtl.css 65 B
build/block-library/blocks/comment-date/style.css 65 B
build/block-library/blocks/comment-edit-link/style-rtl.css 70 B
build/block-library/blocks/comment-edit-link/style.css 70 B
build/block-library/blocks/comment-reply-link/style-rtl.css 71 B
build/block-library/blocks/comment-reply-link/style.css 71 B
build/block-library/blocks/comment-template/style-rtl.css 191 B
build/block-library/blocks/comment-template/style.css 191 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 238 B
build/block-library/blocks/comments-pagination/editor.css 231 B
build/block-library/blocks/comments-pagination/style-rtl.css 245 B
build/block-library/blocks/comments-pagination/style.css 241 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 842 B
build/block-library/blocks/comments/editor.css 842 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 637 B
build/block-library/blocks/cover/editor-rtl.css 631 B
build/block-library/blocks/cover/editor.css 631 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 86 B
build/block-library/blocks/details/style.css 86 B
build/block-library/blocks/embed/editor-rtl.css 331 B
build/block-library/blocks/embed/editor.css 331 B
build/block-library/blocks/embed/style-rtl.css 419 B
build/block-library/blocks/embed/style.css 419 B
build/block-library/blocks/embed/theme-rtl.css 133 B
build/block-library/blocks/embed/theme.css 133 B
build/block-library/blocks/file/editor-rtl.css 326 B
build/block-library/blocks/file/editor.css 326 B
build/block-library/blocks/file/style-rtl.css 278 B
build/block-library/blocks/file/style.css 279 B
build/block-library/blocks/footnotes/style-rtl.css 198 B
build/block-library/blocks/footnotes/style.css 197 B
build/block-library/blocks/form-input/editor-rtl.css 229 B
build/block-library/blocks/form-input/editor.css 229 B
build/block-library/blocks/form-input/style-rtl.css 349 B
build/block-library/blocks/form-input/style.css 349 B
build/block-library/blocks/form-submission-notification/editor-rtl.css 344 B
build/block-library/blocks/form-submission-notification/editor.css 341 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/freeform/editor-rtl.css 2.59 kB
build/block-library/blocks/freeform/editor.css 2.59 kB
build/block-library/blocks/gallery/editor-rtl.css 688 B
build/block-library/blocks/gallery/editor.css 691 B
build/block-library/blocks/gallery/style-rtl.css 1.83 kB
build/block-library/blocks/gallery/style.css 1.82 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 334 B
build/block-library/blocks/group/editor.css 334 B
build/block-library/blocks/group/style-rtl.css 103 B
build/block-library/blocks/group/style.css 103 B
build/block-library/blocks/group/theme-rtl.css 79 B
build/block-library/blocks/group/theme.css 79 B
build/block-library/blocks/heading/style-rtl.css 188 B
build/block-library/blocks/heading/style.css 188 B
build/block-library/blocks/html/editor-rtl.css 346 B
build/block-library/blocks/html/editor.css 347 B
build/block-library/blocks/image/editor-rtl.css 799 B
build/block-library/blocks/image/editor.css 799 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 355 B
build/block-library/blocks/latest-comments/style.css 354 B
build/block-library/blocks/latest-posts/editor-rtl.css 139 B
build/block-library/blocks/latest-posts/editor.css 138 B
build/block-library/blocks/latest-posts/style-rtl.css 520 B
build/block-library/blocks/latest-posts/style.css 520 B
build/block-library/blocks/list/style-rtl.css 107 B
build/block-library/blocks/list/style.css 107 B
build/block-library/blocks/loginout/style-rtl.css 61 B
build/block-library/blocks/loginout/style.css 61 B
build/block-library/blocks/media-text/editor-rtl.css 321 B
build/block-library/blocks/media-text/editor.css 320 B
build/block-library/blocks/media-text/style-rtl.css 552 B
build/block-library/blocks/media-text/style.css 550 B
build/block-library/blocks/more/editor-rtl.css 427 B
build/block-library/blocks/more/editor.css 427 B
build/block-library/blocks/navigation-link/editor-rtl.css 566 B
build/block-library/blocks/navigation-link/editor.css 568 B
build/block-library/blocks/navigation-link/style-rtl.css 192 B
build/block-library/blocks/navigation-link/style.css 191 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 295 B
build/block-library/blocks/navigation-submenu/editor.css 294 B
build/block-library/blocks/navigation/editor-rtl.css 2.2 kB
build/block-library/blocks/navigation/editor.css 2.2 kB
build/block-library/blocks/navigation/style-rtl.css 2.24 kB
build/block-library/blocks/navigation/style.css 2.23 kB
build/block-library/blocks/nextpage/editor-rtl.css 392 B
build/block-library/blocks/nextpage/editor.css 392 B
build/block-library/blocks/page-list/editor-rtl.css 378 B
build/block-library/blocks/page-list/editor.css 378 B
build/block-library/blocks/page-list/style-rtl.css 192 B
build/block-library/blocks/page-list/style.css 192 B
build/block-library/blocks/paragraph/editor-rtl.css 251 B
build/block-library/blocks/paragraph/editor.css 251 B
build/block-library/blocks/paragraph/style-rtl.css 341 B
build/block-library/blocks/paragraph/style.css 340 B
build/block-library/blocks/post-author-biography/style-rtl.css 74 B
build/block-library/blocks/post-author-biography/style.css 74 B
build/block-library/blocks/post-author-name/style-rtl.css 69 B
build/block-library/blocks/post-author-name/style.css 69 B
build/block-library/blocks/post-author/editor-rtl.css 107 B
build/block-library/blocks/post-author/editor.css 107 B
build/block-library/blocks/post-author/style-rtl.css 188 B
build/block-library/blocks/post-author/style.css 189 B
build/block-library/blocks/post-comments-count/style-rtl.css 72 B
build/block-library/blocks/post-comments-count/style.css 72 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 527 B
build/block-library/blocks/post-comments-form/style.css 528 B
build/block-library/blocks/post-comments-link/style-rtl.css 71 B
build/block-library/blocks/post-comments-link/style.css 71 B
build/block-library/blocks/post-content/style-rtl.css 61 B
build/block-library/blocks/post-content/style.css 61 B
build/block-library/blocks/post-date/style-rtl.css 62 B
build/block-library/blocks/post-date/style.css 62 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 155 B
build/block-library/blocks/post-excerpt/style.css 155 B
build/block-library/blocks/post-featured-image/editor-rtl.css 722 B
build/block-library/blocks/post-featured-image/editor.css 720 B
build/block-library/blocks/post-featured-image/style-rtl.css 347 B
build/block-library/blocks/post-featured-image/style.css 347 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/style-rtl.css 414 B
build/block-library/blocks/post-template/style.css 414 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 70 B
build/block-library/blocks/post-time-to-read/style.css 70 B
build/block-library/blocks/post-title/style-rtl.css 162 B
build/block-library/blocks/post-title/style.css 162 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 134 B
build/block-library/blocks/pullquote/editor.css 134 B
build/block-library/blocks/pullquote/style-rtl.css 351 B
build/block-library/blocks/pullquote/style.css 350 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 121 B
build/block-library/blocks/query-pagination-numbers/editor.css 118 B
build/block-library/blocks/query-pagination/editor-rtl.css 154 B
build/block-library/blocks/query-pagination/editor.css 154 B
build/block-library/blocks/query-pagination/style-rtl.css 237 B
build/block-library/blocks/query-pagination/style.css 237 B
build/block-library/blocks/query-title/style-rtl.css 64 B
build/block-library/blocks/query-title/style.css 64 B
build/block-library/blocks/query-total/style-rtl.css 64 B
build/block-library/blocks/query-total/style.css 64 B
build/block-library/blocks/query/editor-rtl.css 404 B
build/block-library/blocks/query/editor.css 404 B
build/block-library/blocks/quote/style-rtl.css 238 B
build/block-library/blocks/quote/style.css 238 B
build/block-library/blocks/quote/theme-rtl.css 233 B
build/block-library/blocks/quote/theme.css 236 B
build/block-library/blocks/read-more/style-rtl.css 131 B
build/block-library/blocks/read-more/style.css 131 B
build/block-library/blocks/rss/editor-rtl.css 126 B
build/block-library/blocks/rss/editor.css 126 B
build/block-library/blocks/rss/style-rtl.css 284 B
build/block-library/blocks/rss/style.css 283 B
build/block-library/blocks/search/editor-rtl.css 199 B
build/block-library/blocks/search/editor.css 199 B
build/block-library/blocks/search/style-rtl.css 660 B
build/block-library/blocks/search/style.css 658 B
build/block-library/blocks/search/theme-rtl.css 113 B
build/block-library/blocks/search/theme.css 113 B
build/block-library/blocks/separator/editor-rtl.css 100 B
build/block-library/blocks/separator/editor.css 100 B
build/block-library/blocks/separator/style-rtl.css 248 B
build/block-library/blocks/separator/style.css 248 B
build/block-library/blocks/separator/theme-rtl.css 195 B
build/block-library/blocks/separator/theme.css 195 B
build/block-library/blocks/shortcode/editor-rtl.css 286 B
build/block-library/blocks/shortcode/editor.css 286 B
build/block-library/blocks/site-logo/editor-rtl.css 773 B
build/block-library/blocks/site-logo/editor.css 770 B
build/block-library/blocks/site-logo/style-rtl.css 218 B
build/block-library/blocks/site-logo/style.css 218 B
build/block-library/blocks/site-tagline/editor-rtl.css 87 B
build/block-library/blocks/site-tagline/editor.css 87 B
build/block-library/blocks/site-tagline/style-rtl.css 65 B
build/block-library/blocks/site-tagline/style.css 65 B
build/block-library/blocks/site-title/editor-rtl.css 85 B
build/block-library/blocks/site-title/editor.css 85 B
build/block-library/blocks/site-title/style-rtl.css 143 B
build/block-library/blocks/site-title/style.css 143 B
build/block-library/blocks/social-link/editor-rtl.css 314 B
build/block-library/blocks/social-link/editor.css 314 B
build/block-library/blocks/social-links/editor-rtl.css 690 B
build/block-library/blocks/social-links/editor.css 688 B
build/block-library/blocks/social-links/style-rtl.css 1.51 kB
build/block-library/blocks/social-links/style.css 1.51 kB
build/block-library/blocks/spacer/editor-rtl.css 346 B
build/block-library/blocks/spacer/editor.css 346 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-of-contents/style-rtl.css 83 B
build/block-library/blocks/table-of-contents/style.css 83 B
build/block-library/blocks/table/editor-rtl.css 394 B
build/block-library/blocks/table/editor.css 394 B
build/block-library/blocks/table/style-rtl.css 640 B
build/block-library/blocks/table/style.css 639 B
build/block-library/blocks/table/theme-rtl.css 152 B
build/block-library/blocks/table/theme.css 152 B
build/block-library/blocks/tag-cloud/editor-rtl.css 92 B
build/block-library/blocks/tag-cloud/editor.css 92 B
build/block-library/blocks/tag-cloud/style-rtl.css 266 B
build/block-library/blocks/tag-cloud/style.css 265 B
build/block-library/blocks/template-part/editor-rtl.css 368 B
build/block-library/blocks/template-part/editor.css 368 B
build/block-library/blocks/template-part/theme-rtl.css 113 B
build/block-library/blocks/template-part/theme.css 113 B
build/block-library/blocks/term-description/style-rtl.css 126 B
build/block-library/blocks/term-description/style.css 126 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 165 B
build/block-library/blocks/text-columns/style.css 165 B
build/block-library/blocks/verse/style-rtl.css 98 B
build/block-library/blocks/verse/style.css 98 B
build/block-library/blocks/video/editor-rtl.css 441 B
build/block-library/blocks/video/editor.css 442 B
build/block-library/blocks/video/style-rtl.css 192 B
build/block-library/blocks/video/style.css 192 B
build/block-library/blocks/video/theme-rtl.css 134 B
build/block-library/blocks/video/theme.css 134 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.08 kB
build/block-library/common.css 1.08 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.4 kB
build/block-library/editor.css 11.4 kB
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/theme-rtl.css 708 B
build/block-library/theme.css 712 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/blocks/index.min.js 52.6 kB
build/commands/index.min.js 16.2 kB
build/commands/style-rtl.css 955 B
build/commands/style.css 952 B
build/components/index.min.js 229 kB
build/components/style-rtl.css 12.5 kB
build/components/style.css 12.5 kB
build/compose/index.min.js 12.8 kB
build/core-commands/index.min.js 3.09 kB
build/core-data/index.min.js 74.3 kB
build/customize-widgets/index.min.js 11 kB
build/customize-widgets/style-rtl.css 1.43 kB
build/customize-widgets/style.css 1.43 kB
build/data-controls/index.min.js 641 B
build/data/index.min.js 8.69 kB
build/date/index.min.js 18 kB
build/deprecated/index.min.js 458 B
build/dom-ready/index.min.js 325 B
build/dom/index.min.js 4.67 kB
build/edit-post/classic-rtl.css 578 B
build/edit-post/classic.css 580 B
build/edit-post/index.min.js 13.4 kB
build/edit-post/style-rtl.css 2.74 kB
build/edit-post/style.css 2.73 kB
build/edit-site/index.min.js 221 kB
build/edit-site/posts-rtl.css 7.5 kB
build/edit-site/posts.css 7.5 kB
build/edit-site/style-rtl.css 13.6 kB
build/edit-site/style.css 13.6 kB
build/edit-widgets/index.min.js 17.6 kB
build/edit-widgets/style-rtl.css 4.05 kB
build/edit-widgets/style.css 4.06 kB
build/editor/index.min.js 116 kB
build/editor/style-rtl.css 9.41 kB
build/editor/style.css 9.42 kB
build/element/index.min.js 4.82 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 8.05 kB
build/format-library/style-rtl.css 476 B
build/format-library/style.css 476 B
build/hooks/index.min.js 1.65 kB
build/html-entities/index.min.js 445 B
build/i18n/index.min.js 3.58 kB
build/is-shallow-equal/index.min.js 526 B
build/keyboard-shortcuts/index.min.js 1.31 kB
build/keycodes/index.min.js 1.46 kB
build/list-reusable-blocks/index.min.js 2.13 kB
build/list-reusable-blocks/style-rtl.css 852 B
build/list-reusable-blocks/style.css 852 B
build/media-utils/index.min.js 3.69 kB
build/notices/index.min.js 946 B
build/nux/index.min.js 1.62 kB
build/nux/style-rtl.css 767 B
build/nux/style.css 763 B
build/patterns/index.min.js 7.37 kB
build/patterns/style-rtl.css 687 B
build/patterns/style.css 685 B
build/plugins/index.min.js 1.86 kB
build/preferences-persistence/index.min.js 2.06 kB
build/preferences/index.min.js 2.9 kB
build/preferences/style-rtl.css 554 B
build/preferences/style.css 554 B
build/primitives/index.min.js 829 B
build/priority-queue/index.min.js 1.54 kB
build/private-apis/index.min.js 978 B
build/react-i18n/index.min.js 630 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 6.76 kB
build/redux-routine/index.min.js 2.7 kB
build/reusable-blocks/index.min.js 2.55 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.3 kB
build/router/index.min.js 5.42 kB
build/server-side-render/index.min.js 1.94 kB
build/shortcode/index.min.js 1.4 kB
build/style-engine/index.min.js 2.04 kB
build/token-list/index.min.js 581 B
build/url/index.min.js 3.9 kB
build/vendors/react-dom.min.js 41.7 kB
build/vendors/react-jsx-runtime.min.js 556 B
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 965 B
build/vips/index.min.js 36.2 kB
build/warning/index.min.js 250 B
build/widgets/index.min.js 7.16 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.03 kB

compressed-size-action

@madhusudhand madhusudhand force-pushed the gallery/lightbox branch 3 times, most recently from 5af6a6b to 4fdbd86 Compare July 15, 2024 11:22
@madhusudhand
Copy link
Member Author

madhusudhand commented Jul 23, 2024

@jasmussen @WordPress/gutenberg-design This is a first iteration of #56310.
It adds two icons (Chevron left and right) to the lightbox UI, and adds keyboard navigation to switch between images.
While the icons looks fine for smaller images, they overlap with larger images. (this can be adjusted by setting proper padding)

Small Image Large Image
image image

The same design doesn't work for smaller devices as the image fits to 100% width.

image

While icons can be avoided in touch based devices, that may not be accessible.
Could you suggest designs?

@t-hamano t-hamano added [Type] Enhancement A suggestion for improvement. Needs Design Feedback Needs general design feedback. [Block] Gallery Affects the Gallery Block - used to display groups of images labels Jul 23, 2024
@t-hamano
Copy link
Contributor

This PR should close #37652.

@jameskoster
Copy link
Contributor

The chevrons look a bit awkward when they get this close to the image:

Screenshot 2024-07-23 at 12 03 04

Ideally there should be no overlap.


When viewing the first or last image in the lightbox, the next / previous button is disabled accordingly, but there's no visual indication which makes the button feel broken. Two options to explore:

  1. Add the disabled state to the button
  2. Don't disable the button, and have it cycle to the beginning or the end accordingly

I'm not sure the chevrons need to appear on mobile, swiping left/right is probably more intuitive?

@paaljoachim
Copy link
Contributor

paaljoachim commented Jul 23, 2024

Great! Thank you for working on this @madhusudhand

Taking a step back. Doing some brain storming.
Should likely be addressed in another PR.

EDIT:

  1. DONE
    A link among other with the option to Expand has now been added to the toolbar through this PR:
    Move gallery link controls to the block toolbar #62762

Add a toggle to add left/right pagination for the Expand option.

So it would be something like this.
Gallery is selected.
(Another PR) In the sidebar settings: Link to drop down. User selects "Expand on click"
(This PR) Toggle becomes visible when "Expand on click" is selected to show left/right pagination for lightbox. Users can then select to add the left/right chevrons to their gallery. This toggle could be right below the Link to drop box.

Thanks!

@t-hamano
Copy link
Contributor

In #62762 we are moving the Link to option from the block sidebar to the block toolbar.

If we make this change, will it conflict with this PR?

@t-hamano
Copy link
Contributor

I think we need to consider various scenarios. Here are some examples:

  • If "Expand on click" is disabled for the Image block in the global style, but "Expand on click" is enabled for all image blocks in a Gallery block instance, do we want to enable the lightbox gallery?
  • If "Expand on click" is disabled for some blocks in a Gallery block, do we want to include those images in the lightbox gallery?
  • Is there a way to enable or disable the lightbox gallery for only some gallery blocks?

@madhusudhand
Copy link
Member Author

madhusudhand commented Jul 25, 2024

@jasmussen @luisherranz

It does open a question we have to answer eventually: what happens in a 5 image gallery if all but the third image is set to "expand on click"? My instinct: lightbox arrowkeys would navigate images 1 and 2, then you'd exit, and then you could again swap between 4 and 5, then exit. Of course not ideal, but nevertheless reflecting what you can do.

As per the current changes, lightbox invoked by clicking on any image except 3, and next/prev navigation moves the lightbox images between 1,2,4,5 without exiting after image 2 (on next). I would imagine this would be better experience have lightbox as single set [1,2,4,5], instead of breaking into two sets [1,2] and [3,4]. Please suggest.

In #62762 we are moving the Link to option from the block sidebar to the block toolbar.
If we make this change, will it conflict with this PR?

@t-hamano This PR now only based on the image having "Expand to click" enabled. I don't think it will conflict. The behaviour should be same as long as the image gets the value for lightbox.

If "Expand on click" is disabled for the Image block in the global style, but "Expand on click" is enabled for all image blocks in a Gallery block instance, do we want to enable the lightbox gallery?

This will be case 3 from the description. Yes, lightbox is enabled for those enabled images, and navigation is possible between them.

If "Expand on click" is disabled for some blocks in a Gallery block, do we want to include those images in the lightbox gallery?

They will be skipped and it is the right thing to do, because clicking on those images directly doesn't invoke lightbox.

Is there a way to enable or disable the lightbox gallery for only some gallery blocks?

This is not relevant for this iteration. But #62762 makes it possible, when the setting is enabled at a gallery block level.

@madhusudhand madhusudhand marked this pull request as ready for review July 25, 2024 10:56
@madhusudhand madhusudhand requested a review from luisherranz July 25, 2024 10:57
Copy link

github-actions bot commented Jul 25, 2024

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message.

Co-authored-by: madhusudhand <[email protected]>
Co-authored-by: t-hamano <[email protected]>
Co-authored-by: luisherranz <[email protected]>
Co-authored-by: gziolo <[email protected]>
Co-authored-by: artemiomorales <[email protected]>
Co-authored-by: mikachan <[email protected]>
Co-authored-by: afercia <[email protected]>
Co-authored-by: jameskoster <[email protected]>
Co-authored-by: paaljoachim <[email protected]>
Co-authored-by: richtabor <[email protected]>
Co-authored-by: akasunil <[email protected]>
Co-authored-by: sirreal <[email protected]>
Co-authored-by: colorful-tones <[email protected]>
Co-authored-by: noisysocks <[email protected]>
Co-authored-by: carolinan <[email protected]>
Co-authored-by: Mamaduka <[email protected]>

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.

@madhusudhand
Copy link
Member Author

@jameskoster

Images are given a better padding to avoid overlaps with the icon.
image

Add the disabled state to the button

Yes. The current change disables the buttons. Suggest on opacity.

I'm not sure the chevrons need to appear on mobile, swiping left/right is probably more intuitive?

They are removed on mobile devices, meaning the current PR has no effect on mobile devices and swipe actions will be added in a followup PR.

@madhusudhand madhusudhand self-assigned this Jul 25, 2024
@t-hamano
Copy link
Contributor

@madhusudhand

Thanks for the detailed explanation. Since it's based only on whether the Gallery block has images with lightbox enabled, does that mean there's no way to disable navigation between images?

Do we need to provide some way to disable (or enable) navigation between images?

@t-hamano
Copy link
Contributor

The Link to option in the Gallery block is just a global change to the linkDestination attribute of all the image blocks inside. And even if we enable lightboxes for individual images, some users might want to keep navigation between images, i.e. lightboxes at the gallery block level, disabled.

With that in mind, I think there might need to be an option to explicitly enable the Gallery lightbox.

For example, the UI would look like this:

image

However, if we move the block sidebar's "Link to" control to the block toolbar in #62762, the question is whether to leave the "Enable lightbox Gallery" toggle.

@t-hamano
Copy link
Contributor

Do you see a case where we would specifically want gallery to behave like individual images? (lightbox invoked but not navigation between them)

To be honest, I don't see many cases where people would want to disable image navigation. It just bothers me that there's no way to opt out of it 😅

@jameskoster
Copy link
Contributor

Suggest on opacity.

I think ideally these are Button instances and use the associated styles when disabled.

@luisherranz
Copy link
Member

I'll fix it as soon as possible so you can continue working on it.

Ok, this is fixed now. Sorry again for taking so long.

@t-hamano
Copy link
Contributor

@luisherranz Thank you for your response!

I've made some changes based on the feedback we've received so far, primarily the accessibility feedback in the comment here.

There are still some things left to be addressed and I'm not sure yet if we'll be able to ship this PR into 6.8, but I think it's ready for basic testing.


When the Previous and Next buttons are aria-disabled, they are still focusable and the focus style needs to be the default one. This is very similar to what has been fixed for the Button component in #62278 / #62480.
Basically, do not use opacity for the aria-disabled state. Use actual colors instead, as opacity impacts also the focus style.

I applied the opacity to the svg element inside, rather than to the button itself, so that disabled buttons don't get a faded outline when focused:

image

The Previous and Next buttons are labeled but they ned to visually expose their accessible name. In the editor this is done with tooltips. This applies to the Close button as well. I think this has been already discussed for the Image lightbox and is still unsolved. Anyways, there is the need to have an accessible tooltips implementation for the front end.

We could use the Tooltip component, but it would be less desirable to load the CSS/JS of the components package on the front end. Instead, I applied a custom tooltip using role="tooltip". The tooltip should appear when you focus or hover over the button:

tooltip

Visual order and DOM order mismatch. This neds to be fixed.
Visual order: Previous, Image, Next.
DOM order: Previous, Next, Image.

By moving the next button after the image, the DOM order matches the visual order.

@t-hamano
Copy link
Contributor

As we still don't have a module @wordpress/i18n let's implement the server option, and once we have the module, we can reevaluate this again.

There was no progress on that i18n front in the last three months. I guess the server approach is the only viable option that will allow to move it forward so we can start testing it with users 👍

I haven't done anything about this, but maybe fd51250 has improved it so that aria-label is localizable?

@t-hamano t-hamano self-assigned this Feb 23, 2025
@t-hamano
Copy link
Contributor

Ok, all feedback should have been addressed. See here for the latest summary and testing instructions: #62906 (comment)

@luisherranz
Copy link
Member

I haven't done anything about this, but maybe fd51250 has improved it so that aria-label is localizable?

Yes, all translations are now done on the server so there's no need for a frontend i18n package.

@t-hamano
Copy link
Contributor

@WordPress/gutenberg-core I would like to discuss whether this PR can/should be shipped to 6.8. This PR enables navigation between lightbox images in the Gallery block. This PR wasn't ready in time for 6.7 so it has been punted to 6.8.

For the latest description, see the first comment for details.

For accessibility feedback: @afercia @joedolson @alexstine

@afercia
Copy link
Contributor

afercia commented Feb 24, 2025

I'm concerned about this implementation and I think there's a few things that should be carefully considered before merging and releasing a feature that risks to be changed significantly in following releases, thus introducing backwards compatibility issues. Pinging @joedolson and @felixarntz for more context on the ongoing discussion on #55513

From an a11y perspective:

1
The previous and next buttons aren't labeled: they miss the accessible name, they only have a description provided by the tooltip. The lack of an accessible name isn't ok.

2
The role="tooltip" isn't ready to be used. As detailed at https://a11ysupport.io/tech/aria/tooltip_role support is very poor. In a way the tooltip role is still being discussed in the W3C as there's some unclarity about it usage. For reference:
w3c/aria#979. In fact, the ARIA Authoring Practices don't provide an example usage of the tooltip role yet. Work to provide an example is tracked at w3c/aria-practices#127 which is still open since October 2016. A so long pending issue is because there's no full clarity and agreement on what a tooltip is and what it should do. For more context see also this comment: #48222 (comment)
Overall, I don't recommend to use the tooltip role.

3
Icon-only buttons on the front end. When it comes to the front end, WordPress should provide alternatives to icon-only buttons.. They are not accessible for everyone. Rather, there should be a setting to change the appearance of the buttons on the front end. This applies to the previous and next buttons and other buttons as well, e.g. the open and close buttons.
It's worth reminding that other blocks do provide alternatives to front end icon-only controls for example the Navigation block where, for example, the 'hamburger' icon button does provide a setting to show text. In #55513 I'm proposing to provide the same option for the Lightbox. For the gallery, also the previous and next buttons should provide the same option.

General considerations

4
Routing.
There is an ongoing discussion on #55513 regarding the point that the Gallery navigation should use a routing mechanism integrated with the browser history API. Each image in a gallery should use links pointing to a fragment identifier rather than a button. The link pattern should be something like #wp-core-image-lightbox-{attachment_id}. Such a routing mechanism would make interaction more understandable and predictable, not to mention it would allow linking to a specific image in the gallery, navigating back and forth with the browser back and forward buttons etc.
This is probably the most important missing part from a technical perspective and I'm nost sure it can be implemented in a later release without introducing important backwards compatibility issues.

5
Naming (minor)
In the editor, the lightbox is referred to as 'Enlarge image'. There's no mention of the term lightbox. However, in this PR the lightBoxNavigation setting does refer to Lightbox navigation. To me, this is unclear and inconsistent naming. As an user, I may not have eany idea what a lightbox is.

6
I'm not sure I fully understand why there should be a setting fot the navigation. I'd tend to think it should be integrated by default.

Copy link
Contributor

@afercia afercia left a comment

Choose a reason for hiding this comment

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

Based on the comment at #62906 (comment) I'm not sure this PR should be in an approved state yet.
While the effort here is remarkable and very welcome, to me there's still many things to be considered. I'm not willing to block this PR but I do think more feedback and more eyes are necessary before marking this PR as approved.

@t-hamano
Copy link
Contributor

Thank you for your great feedback!

It seems that there are still many issues to be addressed in this PR. In particular, the following point is the most important and also the most technically difficult:

Routing.
There is an ongoing discussion on #55513 regarding the point that the Gallery navigation should use a routing mechanism integrated with the browser history API. Each image in a gallery should use links pointing to a fragment identifier rather than a button. The link pattern should be something like #wp-core-image-lightbox-{attachment_id}. Such a routing mechanism would make intereaciton more understandable and predictable, not to mention it would allow linking to a specific image in the gallery, navigating back and forth with the browser back and forward buttons etc.

Given this, I think it will be difficult to ship this in 6.8. I propose to punt this PR until 6.9 or later.

cc @Mamaduka @joemcgill

@Mamaduka
Copy link
Member

Agreed. Let's move this to WP 6.9.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Block] Gallery Affects the Gallery Block - used to display groups of images Needs Accessibility Feedback Need input from accessibility Needs Design Feedback Needs general design feedback. [Type] Enhancement A suggestion for improvement.
Projects
Status: 🦵 Punted to 6.9
Development

Successfully merging this pull request may close these issues.