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

Gallery: Add lightbox support #62906

wants to merge 15 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: +882 B (+0.05%)

Total Size: 1.83 MB

Filename Size Change
build-module/block-library/image/view.min.js 2.14 kB +360 B (+20.19%) 🚨
build/block-library/blocks/image/style-rtl.css 1.74 kB +135 B (+8.43%) 🔍
build/block-library/blocks/image/style.css 1.73 kB +133 B (+8.34%) 🔍
build/block-library/index.min.js 222 kB +14 B (+0.01%)
build/block-library/style-rtl.css 15.1 kB +122 B (+0.81%)
build/block-library/style.css 15.1 kB +118 B (+0.79%)
ℹ️ 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.16 kB
build-module/block-library/query/view.min.js 742 B
build-module/block-library/search/view.min.js 616 B
build-module/interactivity-router/index.min.js 3.03 kB
build-module/interactivity/debug.min.js 17.2 kB
build-module/interactivity/index.min.js 13.6 kB
build/a11y/index.min.js 952 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.26 kB
build/block-directory/style-rtl.css 1 kB
build/block-directory/style.css 1 kB
build/block-editor/content-rtl.css 4.47 kB
build/block-editor/content.css 4.46 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 258 kB
build/block-editor/style-rtl.css 15.6 kB
build/block-editor/style.css 15.6 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 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 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 357 B
build/block-library/blocks/form-input/style.css 357 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.6 kB
build/block-library/blocks/freeform/editor.css 2.6 kB
build/block-library/blocks/gallery/editor-rtl.css 946 B
build/block-library/blocks/gallery/editor.css 951 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 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.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 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/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 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 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/editor-rtl.css 527 B
build/block-library/blocks/query/editor.css 527 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 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 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 143 B
build/block-library/blocks/site-title/style.css 143 B
build/block-library/blocks/social-link/editor-rtl.css 309 B
build/block-library/blocks/social-link/editor.css 309 B
build/block-library/blocks/social-links/editor-rtl.css 727 B
build/block-library/blocks/social-links/editor.css 724 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 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 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.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/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 53 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 228 kB
build/components/style-rtl.css 12.4 kB
build/components/style.css 12.4 kB
build/compose/index.min.js 12.7 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.35 kB
build/customize-widgets/style.css 1.35 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.66 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.75 kB
build/edit-post/style.css 2.75 kB
build/edit-site/index.min.js 220 kB
build/edit-site/posts-rtl.css 7.38 kB
build/edit-site/posts.css 7.39 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.7 kB
build/edit-widgets/style-rtl.css 4.09 kB
build/edit-widgets/style.css 4.09 kB
build/editor/index.min.js 114 kB
build/editor/style-rtl.css 9.28 kB
build/editor/style.css 9.28 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.58 kB
build/notices/index.min.js 946 B
build/nux/index.min.js 1.62 kB
build/nux/style-rtl.css 749 B
build/nux/style.css 745 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 972 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: jameskoster <[email protected]>
Co-authored-by: paaljoachim <[email protected]>
Co-authored-by: richtabor <[email protected]>
Co-authored-by: akasunil <[email protected]>
Co-authored-by: afercia <[email protected]>
Co-authored-by: sirreal <[email protected]>
Co-authored-by: colorful-tones <[email protected]>
Co-authored-by: noisysocks <[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.

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

@luisherranz
Copy link
Member

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.

I've tried using the block context to pass a gallery ID with the render_block_context filter and it seems to work very well. I think it's a clean approach that makes sense.

Right now, the frontend implementation is broken, and I need to adjust it to this change, but I'll do it next Monday.

@gziolo
Copy link
Member

gziolo commented Dec 6, 2024

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 👍

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.