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 13 commits into
base: trunk
Choose a base branch
from
Open

Gallery: Add lightbox support #62906

wants to merge 13 commits into from

Conversation

madhusudhand
Copy link
Member

@madhusudhand madhusudhand commented Jun 27, 2024

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

Copy link

github-actions bot commented Jun 27, 2024

Size Change: +1.23 kB (+0.07%)

Total Size: 1.78 MB

Filename Size Change
build/block-library/blocks/image/style-rtl.css 1.73 kB +136 B (+8.53%) 🔍
build/block-library/blocks/image/style.css 1.72 kB +133 B (+8.38%) 🔍
build/block-library/blocks/image/view.min.js 2.01 kB +360 B (+21.83%) 🚨
build/block-library/style-rtl.css 15.1 kB +123 B (+0.82%)
build/block-library/style.css 15.1 kB +120 B (+0.8%)
build/interactivity/image.min.js 2.14 kB +360 B (+20.2%) 🚨
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 951 B
build/annotations/index.min.js 2.26 kB
build/api-fetch/index.min.js 2.32 kB
build/autop/index.min.js 2.12 kB
build/blob/index.min.js 579 B
build/block-directory/index.min.js 7.11 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/content-rtl.css 4.54 kB
build/block-editor/content.css 4.53 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 257 kB
build/block-editor/style-rtl.css 16.2 kB
build/block-editor/style.css 16.2 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 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 538 B
build/block-library/blocks/button/style.css 538 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 328 B
build/block-library/blocks/buttons/style.css 328 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 121 B
build/block-library/blocks/code/style.css 121 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 200 B
build/block-library/blocks/comment-template/style.css 199 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 228 B
build/block-library/blocks/comments-pagination/editor.css 217 B
build/block-library/blocks/comments-pagination/style-rtl.css 234 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 832 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 631 B
build/block-library/blocks/cover/editor-rtl.css 641 B
build/block-library/blocks/cover/editor.css 642 B
build/block-library/blocks/cover/style-rtl.css 1.62 kB
build/block-library/blocks/cover/style.css 1.6 kB
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 B
build/block-library/blocks/details/style-rtl.css 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/file/view.min.js 324 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 342 B
build/block-library/blocks/form-input/style.css 342 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/form/view.min.js 470 B
build/block-library/blocks/freeform/editor-rtl.css 2.6 kB
build/block-library/blocks/freeform/editor.css 2.6 kB
build/block-library/blocks/gallery/editor-rtl.css 955 B
build/block-library/blocks/gallery/editor.css 958 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 333 B
build/block-library/blocks/group/editor.css 333 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 891 B
build/block-library/blocks/image/editor.css 890 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 179 B
build/block-library/blocks/latest-posts/editor.css 179 B
build/block-library/blocks/latest-posts/style-rtl.css 509 B
build/block-library/blocks/latest-posts/style.css 510 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 558 B
build/block-library/blocks/media-text/style.css 556 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 644 B
build/block-library/blocks/navigation-link/editor.css 645 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.19 kB
build/block-library/blocks/navigation/editor.css 2.19 kB
build/block-library/blocks/navigation/style-rtl.css 2.25 kB
build/block-library/blocks/navigation/style.css 2.23 kB
build/block-library/blocks/navigation/view.min.js 1.03 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 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 236 B
build/block-library/blocks/paragraph/editor.css 236 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-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-content/editor-rtl.css 74 B
build/block-library/blocks/post-content/editor.css 74 B
build/block-library/blocks/post-content/style-rtl.css 79 B
build/block-library/blocks/post-content/style.css 79 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 729 B
build/block-library/blocks/post-featured-image/editor.css 726 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/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 399 B
build/block-library/blocks/post-template/style.css 398 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 226 B
build/block-library/blocks/post-title/style.css 226 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 342 B
build/block-library/blocks/pullquote/style.css 342 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/editor-rtl.css 452 B
build/block-library/blocks/query/editor.css 451 B
build/block-library/blocks/query/view.min.js 958 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 138 B
build/block-library/blocks/read-more/style.css 138 B
build/block-library/blocks/rss/editor-rtl.css 101 B
build/block-library/blocks/rss/editor.css 101 B
build/block-library/blocks/rss/style-rtl.css 288 B
build/block-library/blocks/rss/style.css 287 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 672 B
build/block-library/blocks/search/style.css 671 B
build/block-library/blocks/search/theme-rtl.css 113 B
build/block-library/blocks/search/theme.css 113 B
build/block-library/blocks/search/view.min.js 475 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 806 B
build/block-library/blocks/site-logo/editor.css 803 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 206 B
build/block-library/blocks/site-title/style.css 206 B
build/block-library/blocks/social-link/editor-rtl.css 338 B
build/block-library/blocks/social-link/editor.css 338 B
build/block-library/blocks/social-links/editor-rtl.css 757 B
build/block-library/blocks/social-links/editor.css 756 B
build/block-library/blocks/social-links/style-rtl.css 1.51 kB
build/block-library/blocks/social-links/style.css 1.5 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 144 B
build/block-library/blocks/tag-cloud/editor.css 144 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 396 B
build/block-library/blocks/video/editor.css 397 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.1 kB
build/block-library/common.css 1.1 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 11.8 kB
build/block-library/editor.css 11.8 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 218 kB
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.3 kB
build/commands/index.min.js 16.1 kB
build/commands/style-rtl.css 955 B
build/commands/style.css 952 B
build/components/index.min.js 224 kB
build/components/style-rtl.css 12.1 kB
build/components/style.css 12.1 kB
build/compose/index.min.js 12.6 kB
build/core-commands/index.min.js 2.82 kB
build/core-data/index.min.js 73.2 kB
build/customize-widgets/index.min.js 11 kB
build/customize-widgets/style-rtl.css 1.35 kB
build/customize-widgets/style.css 1.35 kB
build/data-controls/index.min.js 641 B
build/data/index.min.js 8.98 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.66 kB
build/edit-post/classic-rtl.css 578 B
build/edit-post/classic.css 580 B
build/edit-post/index.min.js 12.7 kB
build/edit-post/style-rtl.css 2.31 kB
build/edit-post/style.css 2.31 kB
build/edit-site/index.min.js 217 kB
build/edit-site/posts-rtl.css 7.31 kB
build/edit-site/posts.css 7.31 kB
build/edit-site/style-rtl.css 12.6 kB
build/edit-site/style.css 12.6 kB
build/edit-widgets/index.min.js 17.7 kB
build/edit-widgets/style-rtl.css 4.2 kB
build/edit-widgets/style.css 4.2 kB
build/editor/index.min.js 102 kB
build/editor/style-rtl.css 9.28 kB
build/editor/style.css 9.29 kB
build/element/index.min.js 4.83 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 8.11 kB
build/format-library/style-rtl.css 476 B
build/format-library/style.css 476 B
build/hooks/index.min.js 1.54 kB
build/html-entities/index.min.js 445 B
build/i18n/index.min.js 3.58 kB
build/interactivity/debug.min.js 16.4 kB
build/interactivity/file.min.js 447 B
build/interactivity/index.min.js 13.2 kB
build/interactivity/navigation.min.js 1.16 kB
build/interactivity/query.min.js 742 B
build/interactivity/router.min.js 2.8 kB
build/interactivity/search.min.js 615 B
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.18 kB
build/list-reusable-blocks/style-rtl.css 846 B
build/list-reusable-blocks/style.css 846 B
build/media-utils/index.min.js 3.2 kB
build/modules/importmap-polyfill.min.js 12.3 kB
build/notices/index.min.js 946 B
build/nux/index.min.js 1.61 kB
build/nux/style-rtl.css 749 B
build/nux/style.css 745 B
build/patterns/index.min.js 7.34 kB
build/patterns/style-rtl.css 687 B
build/patterns/style.css 685 B
build/plugins/index.min.js 1.81 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 1.01 kB
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.69 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.1 kB
build/router/index.min.js 1.96 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 560 B
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 965 B
build/warning/index.min.js 250 B
build/widgets/index.min.js 7.2 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
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 <madhudollu@git.wordpress.org>
Co-authored-by: t-hamano <wildworks@git.wordpress.org>
Co-authored-by: luisherranz <luisherranz@git.wordpress.org>
Co-authored-by: gziolo <gziolo@git.wordpress.org>
Co-authored-by: artemiomorales <artemiosans@git.wordpress.org>
Co-authored-by: mikachan <mikachan@git.wordpress.org>
Co-authored-by: jameskoster <jameskoster@git.wordpress.org>
Co-authored-by: paaljoachim <paaljoachim@git.wordpress.org>
Co-authored-by: richtabor <richtabor@git.wordpress.org>
Co-authored-by: akasunil <sunil25393@git.wordpress.org>
Co-authored-by: afercia <afercia@git.wordpress.org>
Co-authored-by: sirreal <jonsurrell@git.wordpress.org>
Co-authored-by: colorful-tones <colorful-tones@git.wordpress.org>
Co-authored-by: noisysocks <noisysocks@git.wordpress.org>

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.

@madhusudhand
Copy link
Member Author

madhusudhand commented Sep 2, 2024

The inert attribute is problematic for accessibility, see relevant feedback from @alexstine on this issue: #54369

inert attribute is added when the modal is invoked to prevent keyboard navigation and used only in the rendered page, not the editor. Also @alexstine suggest similar opinion in his comment.

Inert content is not something that should never be used, it just shouldn't be used for blocks in this way. For example, using inert on content outside of a modal would be a great use of the attribute to prevent any interactions from closing said modal. The modal generally covers much of the page so it is unimportant that screen readers have context for anything outside of modal content.

I think, It shouldn't block this PR.

@afercia
Copy link
Contributor

afercia commented Sep 2, 2024

A few a11y findings so far:

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

Screenshot: notice the Next button insufficient focus style:

Screenshot 2024-09-02 at 13 51 00

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

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

4
The modal dialog is labeled aria-label="Enlarged images" where images is plural. It shows only one image at a time though so I'd label it Enlarged image.

5
I get a PHP notice, not sure where it comes from:
Notice: Undefined index: 66d5ab14e7100 in /var/www/src/wp-content/plugins/gutenberg/build/block-library/blocks/image.php on line 211

Screenshot 2024-09-02 at 14 10 02

@sirreal
Copy link
Member

sirreal commented Sep 2, 2024

@sirreal, what do you think?

Sure, I'm happy to help add a Script Module for this if that's the approach we'd like to take 👍

@gziolo
Copy link
Member

gziolo commented Sep 4, 2024

WordPress already has wp.speak to dispatch audible messages to ARIA live regions. Instead of creating ad-hoc specific live regions for the gallery, I'd recommend to enqueue the relevant script on the front end when needed and just use that.

I can't find that package. Do you mean wp.a11y.speak()?

The Interactivity API uses script modules instead of scripts, and there is still no way to create a dependency from a script module to a script, but this is probably a good case for creating a script module that provides that functionality in the front end. The navigate action of the router in the Interactivity API is also doing something similar (server, client). Maybe the code could be reused.

This PR introduces a third method (in addition to the Interactivity API runtime's approach) for handling the speak functionality, which has been part of WordPress core for over seven years and was moved to a WordPress package before version 5.0 was released in 2018. While a temporary solution, as suggested, is possible, it's evident that without a focused effort to address compatibility between scripts and script modules, we'll inevitably add technical debt that will become increasingly difficult to refactor over time. In the meantime, these workarounds are likely to be replicated in other core blocks and throughout the WordPress community.

@sirreal, what do you think?

Sure, I'm happy to help add a Script Module for this if that's the approach we'd like to take 👍

Thank you for offering your help. How would you handle the refactoring it so @wordpress/a11y can be consumed as ES Module and loaded dynamically on the frontend? By the way, it depends on @wordpress/dom which might not be applicable in the case when using ES Modules.

@gziolo
Copy link
Member

gziolo commented Sep 4, 2024

Several options have been proposed in this GitHub discussion for generating all possible translated strings on the server when a lightbox is enabled for the gallery block. However, these options are complex, making it difficult to decide which approach to take, especially given the limitations due to the inability to use the well-established JavaScript i18n support introduced in WordPress 5.0. If we were using regular scripts, the following client-side code would have sufficed:

import { __, _x, _n, _nx } '@wordpress/i18n';

__( '__', 'my-domain' );
_x( '_x', '_x_context', 'my-domain' );
_n( '_n_single', '_n_plural', number, 'my-domain' );
_nx( '_nx_single', '_nx_plural', number, '_nx_context', 'my-domain' );

For more complex cases where variables need to be used, the sprintf helper is also available.

However, before we can bring this same native experience to ES Modules, we must resolve the ongoing issue of compatibility between scripts and script modules. This will pave the way for better integration with the translation pipeline, which is already being tracked in Script Modules API: Add a translations API.

This presents us with a significant dilemma. Do we continue working under the assumption that the limitations mentioned above are acceptable, hoping that we can iterate quickly by finding suitable workarounds for every edge case? Or is it time to step back and resolve the root issue, ensuring that developers using the Interactivity API can have the same seamless experience they've enjoyed for years—handling translations both server-side in PHP and client-side in JS using the i18n helpers that have been a core part of WordPress? This same principle applies to other existing APIs; for instance, developers familiar with wp.a11y.speak or similar helpers should be able to use them seamlessly with the Interactivity API, regardless of whether ES Modules are being used behind the scenes.

In conclusion, I hope that the experience gained while improving the Gallery block will encourage us to reassess our priorities. We should aim to avoid situations where we can’t use tools that WordPress developers have relied on for years, and where we too quickly concede that something isn't supported with ES Modules.

If we agree that user experience should take precedence over the technical solution, then I urge you to consider the following aspects when deciding on the final approach:

  • Any changes to block attributes stored in the database will have future implications. Keep in mind the long-term consequences when adding new attributes.
  • The current implementation relies heavily on filters to achieve the desired functionality, which is not the most efficient approach for rendering a block within WordPress core. A particular concern is that some filters are added dynamically (add_filter) during callback execution and are never removed (remove_filter). As a result, the more blocks on a page, the more times the same filter is run, potentially leading to performance issues. This needs close investigation to either confirm or alleviate these concerns.
  • On the backward compatibility front, every function introduced will have to be maintained or correctly deprecated once it ships in WordPress core. So whenever providing a new filter or shared util you should take that into account.
  • Finally, it would be beneficial to measure the impact of enabling the lightbox on the gallery, particularly with regard to metadata storage through state and context compared to the version in trunk. I’m especially interested in the potential impact on HTML size when serving a page with a large gallery, such as 50 images—a realistic scenario for a photography blog.

@sirreal
Copy link
Member

sirreal commented Sep 4, 2024

I'll spend some time looking into what's involved for providing functionality from the accessibility packages as a script module.

It doesn't depend on @wordpress/dom but on @wordpress/dom-ready. That shouldn't be a big hurdle.
It does depend on @wordpress/i18n, but that appears to be for exactly one static translation:

introText.textContent = __( 'Notifications' );

That can be translated on the server and passed to the module via script module data.


This provides a good opportunity to explore options around modules built from existing packages. I have some exploration in #60952 that can serve as inspiration.

@sirreal
Copy link
Member

sirreal commented Sep 6, 2024

I've been working on an a11y module in #65101. I'm planning to use it in the interactivity-router package gated on IS_GUTENBERG_PLUGIN in #65123. The same approach can likely be used here if and when #65101 lands.

@colorful-tones
Copy link
Member

Love seeing the a11y module integration exploration. This will be super helpful. Thanks!

@noisysocks
Copy link
Member

Looks like more work is needed here so marking this as punted to 6.8.

@luisherranz
Copy link
Member

luisherranz commented Nov 19, 2024

However, these options are complex, making it difficult to decide which approach to take, especially given the limitations due to the inability to use the well-established JavaScript i18n support introduced in WordPress 5.0.

I respectfully disagree 😄

From the options I outlined above, the only thing that makes things complex is the inability to share a simple PHP function between two Gutenberg blocks due to the complexities of the build system and the automatic renaming of the Gutenberg <-> Core functions. If that weren't the case, we wouldn't be having the conversation about the JavaScript i18n module or about any of the alternative solutions.

Solving this problem with JavaScript requires sending an additional 5 kilobytes to the front end, plus loading that code and processing the strings. In contrast, sending those translated strings directly from the server only requires the bytes that those strings occupy, with no additional download and processing needed.

If we agree that user experience should take precedence over the technical solution

Yes, I believe that user experience should take precedence over the technical solution. We should also set an example in core blocks: if something can be translated on the server, it should be translated on the server. The external plugin blocks don't have our limitations when it comes to sharing functions between two Gutenberg blocks, so that should be the solution we teach them for this pattern.

That doesn't mean we don't need to create a module for the i18n package. It simply means that the package should be used exclusively in exceptional cases where server translations cannot be used. In my humble opinion, this is not one of those.

EDIT: Passing down block context would also be a simple and acceptable solution, and actually even better than the shared function as it would pass down the information in the context of the block structure, but only as long as it doesn't require the creation of a serialized attribute (I'm unsure it can work that way at this moment).

@@ -355,6 +438,14 @@ const { state, actions, callbacks } = store(
}
`;
},
setScreenReaderText() {
const { ref } = getElement();
Copy link
Member

Choose a reason for hiding this comment

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

It is now possible to use @wordpress/a11y module and speak method. See the dev note from @sirreal: https://make.wordpress.org/core/2024/10/14/updates-to-script-modules-in-6-7/.

Example usage in @wordpress/interactivity-router for reference:

import( '@wordpress/a11y' ).then(
( { speak } ) => speak( message ),
// Ignore failures to load the a11y module.
() => {}
);

@gziolo
Copy link
Member

gziolo commented Nov 21, 2024

In contrast, sending those translated strings directly from the server only requires the bytes that those strings occupy, with no additional download and processing needed.

Remember that the processing still happens on the server for every possible image that can be enlarged. That is necessary with the proposed approach even when the user never opens the lightbox, which is the prerequisite to use the translation.

Solving this problem with JavaScript requires sending an additional 5 kilobytes to the front end, plus loading that code and processing the strings.

@sirreal had these justified idea that @wordpress/i18n doesn't need to depend on @wordpress/hooks on the frontend. In addition to that, we could potentially refactor the package's internal implementation for sprintf by using its drop-in replacement as explored in #65273. In effect, the size of the module would decrease to 2.25 kB. Moreover, these translations aren't needed on the initial page load, so @wordpress/i18n can be dynamically imported only when the user opens the lightbox for the first time.

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.8
Development

Successfully merging this pull request may close these issues.