Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Image block: Add aspect ratio support to lightbox #52765

Merged
merged 43 commits into from
Aug 14, 2023

Conversation

artemiomorales
Copy link
Contributor

What?

This PR makes it so the lightbox zoom animation functions as expected when configuring a custom aspect ratio on an image.

Why?

Addresses #52192
We want the lightbox to be compatible with all of the image block's features.

How?

It calculates the aspect ratio of the resized image and uses it to calculate the target zoom dimensions.

Testing Instructions

  1. Ensure interactivity API experiments are enabled
  2. Add an image to a post
  3. Customize the image's aspect ratio in block settings
  4. Activate the lightbox under Advanced > Behaviors > Lightbox. Make sure the zoom animation is selected.
  5. Publish, view the post, and click on the image — it should zoom in as expected.

If possible, please also test on a mobile device.

Testing Instructions for Keyboard

N/A

Screenshots or screencast

Before

aspect-ratio-before.mp4

After

aspect-ratio-after.mp4

@github-actions
Copy link

This pull request has changed or added PHP files. Please confirm whether these changes need to be synced to WordPress Core, and therefore featured in the next release of WordPress.

If so, it is recommended to create a new Trac ticket and submit a pull request to the WordPress Core Github repository soon after this pull request is merged.

If you're unsure, you can always ask for help in the #core-editor channel in WordPress Slack.

Thank you! ❤️

View changed files
❔ lib/block-supports/behaviors.php

@artemiomorales
Copy link
Contributor Author

I can't think of any automated tests to go with this one, please just let me know if any make sense!

@github-actions
Copy link

github-actions bot commented Jul 19, 2023

Size Change: +429 B (0%)

Total Size: 1.5 MB

Filename Size Change
build/block-editor/index.min.js 211 kB +20 B (0%)
build/block-library/blocks/image/style.css 1.41 kB -5 B (0%)
build/block-library/blocks/image/view-interactivity.min.js 1.83 kB +368 B (+25%) 🚨
build/block-library/index.min.js 203 kB +29 B (0%)
build/block-library/style-rtl.css 13.8 kB +9 B (0%)
build/block-library/style.css 13.8 kB +4 B (0%)
build/rich-text/index.min.js 11 kB +4 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 955 B
build/annotations/index.min.js 2.69 kB
build/api-fetch/index.min.js 2.28 kB
build/autop/index.min.js 2.1 kB
build/blob/index.min.js 451 B
build/block-directory/index.min.js 7.01 kB
build/block-directory/style-rtl.css 1.02 kB
build/block-directory/style.css 1.02 kB
build/block-editor/content-rtl.css 4.26 kB
build/block-editor/content.css 4.25 kB
build/block-editor/default-editor-styles-rtl.css 381 B
build/block-editor/default-editor-styles.css 381 B
build/block-editor/style-rtl.css 14.9 kB
build/block-editor/style.css 14.9 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 126 B
build/block-library/blocks/audio/theme.css 126 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 584 B
build/block-library/blocks/button/editor.css 582 B
build/block-library/blocks/button/style-rtl.css 624 B
build/block-library/blocks/button/style.css 623 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 421 B
build/block-library/blocks/columns/style.css 421 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 647 B
build/block-library/blocks/cover/editor.css 650 B
build/block-library/blocks/cover/style-rtl.css 1.61 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 98 B
build/block-library/blocks/details/style.css 98 B
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 126 B
build/block-library/blocks/embed/theme.css 126 B
build/block-library/blocks/file/editor-rtl.css 316 B
build/block-library/blocks/file/editor.css 316 B
build/block-library/blocks/file/style-rtl.css 280 B
build/block-library/blocks/file/style.css 281 B
build/block-library/blocks/file/view-interactivity.min.js 317 B
build/block-library/blocks/file/view.min.js 375 B
build/block-library/blocks/footnotes/style-rtl.css 201 B
build/block-library/blocks/footnotes/style.css 199 B
build/block-library/blocks/freeform/editor-rtl.css 2.61 kB
build/block-library/blocks/freeform/editor.css 2.61 kB
build/block-library/blocks/gallery/editor-rtl.css 947 B
build/block-library/blocks/gallery/editor.css 952 B
build/block-library/blocks/gallery/style-rtl.css 1.53 kB
build/block-library/blocks/gallery/style.css 1.53 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/editor-rtl.css 654 B
build/block-library/blocks/group/editor.css 654 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 336 B
build/block-library/blocks/html/editor.css 337 B
build/block-library/blocks/image/editor-rtl.css 834 B
build/block-library/blocks/image/editor.css 833 B
build/block-library/blocks/image/style-rtl.css 1.42 kB
build/block-library/blocks/image/theme-rtl.css 126 B
build/block-library/blocks/image/theme.css 126 B
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 507 B
build/block-library/blocks/media-text/style.css 505 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 712 B
build/block-library/blocks/navigation-link/editor.css 711 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 B
build/block-library/blocks/navigation/editor-rtl.css 2.26 kB
build/block-library/blocks/navigation/editor.css 2.26 kB
build/block-library/blocks/navigation/style-rtl.css 2.23 kB
build/block-library/blocks/navigation/style.css 2.22 kB
build/block-library/blocks/navigation/view-interactivity.min.js 988 B
build/block-library/blocks/navigation/view-modal.min.js 2.85 kB
build/block-library/blocks/navigation/view.min.js 469 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 401 B
build/block-library/blocks/page-list/editor.css 401 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 508 B
build/block-library/blocks/post-comments-form/style.css 508 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 588 B
build/block-library/blocks/post-featured-image/editor.css 586 B
build/block-library/blocks/post-featured-image/style-rtl.css 319 B
build/block-library/blocks/post-featured-image/style.css 319 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/style.css 153 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 314 B
build/block-library/blocks/post-template/style.css 314 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 69 B
build/block-library/blocks/post-time-to-read/style.css 69 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 125 B
build/block-library/blocks/preformatted/style.css 125 B
build/block-library/blocks/pullquote/editor-rtl.css 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 335 B
build/block-library/blocks/pullquote/style.css 335 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 302 B
build/block-library/blocks/query-pagination/style.css 299 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 450 B
build/block-library/blocks/query/editor.css 449 B
build/block-library/blocks/quote/style-rtl.css 222 B
build/block-library/blocks/quote/style.css 222 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 149 B
build/block-library/blocks/rss/editor.css 149 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 178 B
build/block-library/blocks/search/editor.css 178 B
build/block-library/blocks/search/style-rtl.css 608 B
build/block-library/blocks/search/style.css 608 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/search/view.min.js 631 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 323 B
build/block-library/blocks/shortcode/editor.css 323 B
build/block-library/blocks/site-logo/editor-rtl.css 754 B
build/block-library/blocks/site-logo/editor.css 754 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.44 kB
build/block-library/blocks/social-links/style.css 1.43 kB
build/block-library/blocks/spacer/editor-rtl.css 348 B
build/block-library/blocks/spacer/editor.css 348 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 645 B
build/block-library/blocks/table/style.css 644 B
build/block-library/blocks/table/theme-rtl.css 146 B
build/block-library/blocks/table/theme.css 146 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 403 B
build/block-library/blocks/template-part/editor.css 403 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/term-description/style-rtl.css 111 B
build/block-library/blocks/term-description/style.css 111 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 185 B
build/block-library/blocks/video/style.css 185 B
build/block-library/blocks/video/theme-rtl.css 126 B
build/block-library/blocks/video/theme.css 126 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 12.1 kB
build/block-library/editor.css 12.1 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/theme-rtl.css 686 B
build/block-library/theme.css 691 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 51.2 kB
build/commands/index.min.js 15.3 kB
build/commands/style-rtl.css 863 B
build/commands/style.css 857 B
build/components/index.min.js 245 kB
build/components/style-rtl.css 11.8 kB
build/components/style.css 11.8 kB
build/compose/index.min.js 12.1 kB
build/core-commands/index.min.js 2.44 kB
build/core-data/index.min.js 16.8 kB
build/customize-widgets/index.min.js 12 kB
build/customize-widgets/style-rtl.css 1.46 kB
build/customize-widgets/style.css 1.45 kB
build/data-controls/index.min.js 640 B
build/data/index.min.js 8.38 kB
build/date/index.min.js 17.8 kB
build/deprecated/index.min.js 451 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.64 kB
build/edit-post/classic-rtl.css 544 B
build/edit-post/classic.css 545 B
build/edit-post/index.min.js 35.7 kB
build/edit-post/style-rtl.css 7.59 kB
build/edit-post/style.css 7.59 kB
build/edit-site/index.min.js 91 kB
build/edit-site/style-rtl.css 13.2 kB
build/edit-site/style.css 13.2 kB
build/edit-widgets/index.min.js 16.9 kB
build/edit-widgets/style-rtl.css 4.53 kB
build/edit-widgets/style.css 4.53 kB
build/editor/index.min.js 45.5 kB
build/editor/style-rtl.css 3.55 kB
build/editor/style.css 3.55 kB
build/element/index.min.js 4.82 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 7.59 kB
build/format-library/style-rtl.css 554 B
build/format-library/style.css 553 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.58 kB
build/interactivity/index.min.js 10.4 kB
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.64 kB
build/keycodes/index.min.js 1.87 kB
build/list-reusable-blocks/index.min.js 2.2 kB
build/list-reusable-blocks/style-rtl.css 836 B
build/list-reusable-blocks/style.css 836 B
build/media-utils/index.min.js 2.9 kB
build/notices/index.min.js 948 B
build/nux/index.min.js 1.99 kB
build/nux/style-rtl.css 735 B
build/nux/style.css 732 B
build/plugins/index.min.js 1.79 kB
build/preferences-persistence/index.min.js 1.84 kB
build/preferences/index.min.js 1.24 kB
build/primitives/index.min.js 943 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 951 B
build/react-i18n/index.min.js 615 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.7 kB
build/reusable-blocks/index.min.js 2.71 kB
build/reusable-blocks/style-rtl.css 243 B
build/reusable-blocks/style.css 243 B
build/router/index.min.js 1.78 kB
build/server-side-render/index.min.js 1.94 kB
build/shortcode/index.min.js 1.39 kB
build/style-engine/index.min.js 1.85 kB
build/sync/index.min.js 53.8 kB
build/token-list/index.min.js 582 B
build/url/index.min.js 3.73 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 958 B
build/warning/index.min.js 268 B
build/widgets/index.min.js 7.16 kB
build/widgets/style-rtl.css 1.15 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.02 kB

compressed-size-action

@github-actions
Copy link

github-actions bot commented Jul 19, 2023

Flaky tests detected in ec5f76a.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/5732529469
📝 Reported issues:

@artemiomorales artemiomorales force-pushed the update/support-aspect-ratio-in-lightbox branch from 1aed7b5 to a3014ac Compare July 19, 2023 18:02
@SantosGuillamot
Copy link
Contributor

As we worked together on this one, I'd prefer if @michalczaplinski or @c4rl0sbr4v0 could take a look at the code for the review 🙂

@cbravobernal
Copy link
Contributor

The image flickers on Safari browser 😿

weird_movement.mov

@skorasaurus skorasaurus added the [Block] Image Affects the Image Block label Jul 21, 2023
@artemiomorales
Copy link
Contributor Author

artemiomorales commented Jul 21, 2023

The image flickers on Safari browser 😿

@c4rl0sbr4v0 Thanks for catching this! The latest push fixes this jitteriness in Safari, as well as cleans up the animation code and addresses the use of a regular thumbnail resolution, which I realized wasn't working.

However, while working on all of that, I noticed a couple of other cases we still haven't accounted for:

  • If a user selects the thumbnail resolution, then selects a custom aspect ratio, the zoom animation does not work properly
  • We haven't provided support for when a user selects contain for the aspect ratio scale

In addition, something in my code is causing the PHP linter to fire an error.

Will continue hammering at these issues.

@SantosGuillamot
Copy link
Contributor

I guess the different devices interpret the CSS animations differently, right? It already happened that, using translate(-50%, -50%), wasn't working properly in Android devices. Maybe we can check how other solutions are creating this zooming animation.

@michalczaplinski
Copy link
Contributor

michalczaplinski commented Jul 24, 2023

If a user selects the thumbnail resolution, then selects a custom aspect ratio, the zoom animation does not work properly

Is this the issue that you mention @artemiomorales ? Then, I can reproduce it too:

Screen.Recording.2023-07-24.at.15.01.16.mov

Copy link
Contributor

@michalczaplinski michalczaplinski left a comment

Choose a reason for hiding this comment

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

I think I'm not too familiar with this part of the code to be able to review the code changes properly. A short video to explain what's going on could be useful.

Otherwise, I've tested the PR and it works as expected (sans the issue with thumbnails that I mention above)! 👍

@artemiomorales
Copy link
Contributor Author

artemiomorales commented Jul 24, 2023

Is this the issue that you mention @artemiomorales ? Then, I can reproduce it too:

@michalczaplinski Yup, that's the one!

I guess the different devices interpret the CSS animations differently, right? It already happened that, using translate(-50%, -50%), wasn't working properly in Android devices. Maybe we can check how other solutions are creating this zooming animation.

@SantosGuillamot So the issue with the thumbnails is that, when one selects thumbnail as an option, WordPress will serve a 1:1 aspect ratio source image, whereas the full-sized source image in the lightbox is typically not be 1:1. Moreover, if one specifies a custom aspect ratio, the image in the content will be resized accordingly within the container, but still using the 1:1 source image.

So as far as I see, to get this to work, we need to somehow calculate CSS values for the the full-sized image that would create the initial starting conditions of the thumbnail image while having completely different dimensions. There's probably a way to do it — am still thinking through it.

There may also be a way to handle the UX differently, but this seems to me to the approach that users would expect. Am happy to hear any ideas or suggestions! Though this case seems pretty specific for our implementation and constraints, I'll see about investing some time into looking at additional zoom implementations too.

@artemiomorales
Copy link
Contributor Author

artemiomorales commented Jul 25, 2023

EDIT: Updated to specify that that 16x9 aspect ratio problem is in the special case where a image has set to thumbnail resolution with a custom aspect ratio of 16x9.

The latest push seems to handle most cases, though it doesn't play nicely when a thumbnail has been defined with a 16x9 aspect ratio; I also need to add support for the contain image block setting.

For the moment, it checks the aspect ratio of the image's natural dimensions (for thumbnails, this is 150x150), and compares it to the aspect ratio of the target dimensions (this is the full-sized image).

If these aspect ratios differ, then we calculate the space the lightbox image would use as a cover image and apply that as a scale CSS attribute.

The logic isn't quite there yet and needs to be cleaned up, but would appreciate any suggestions and thoughts!

Comment on lines 210 to 225
@media screen and (min-width: 480px) {
padding: 40px;
}

@media screen and (min-width: 1920px) {
padding: 40px 80px;
}
Copy link
Contributor

Choose a reason for hiding this comment

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

Margins are paddings are usually defined in styles, can we move this to CSS vars calculations?

Screenshot 2023-07-25 at 11 15 42

@SantosGuillamot
Copy link
Contributor

I've been testing it, and the 16x9 aspect ratio seems to work for me. What issue are you having?

Apart from that, I guess that for the contain setting we could create something like this?

let originalWidth = offsetWidth;
let originalHeight = offsetHeight;
let originalLeftPosition = screenPosX;
let originalTopPosition = screenPosY;

// If the image has "object-fit: contain", calculate the dimensions without the extra space.
if (event.target.nextElementSibling.style.objectFit === "contain") {
  // If the image has blank space in the height, keep the width and calculate the height based on the natural ratio.
  if (naturalRatio > offsetRatio) {
    originalHeight = offsetWidth / naturalRatio;
    const extraHeight = offsetHeight - originalHeight;
    originalTopPosition = originalTopPosition + extraHeight / 2;
  } else {
    // If the image has blank space in the width, keep the height and calculate the width based on the natural ratio.
    originalWidth = offsetHeight * naturalRatio;
    const extraWidth = offsetWidth - originalWidth;
    originalLeftPosition = originalLeftPosition + extraWidth / 2;
  }
}

On another note, I would like to review the whole zooming implementation deeper. I feel that for each edge case we found (like the Android issue, Safari issue, the aspect ratio, the contain functionality, etc) we are adding more JavaScript to handle each case, and the logic is becoming quite complex. I want to fully understand why those issues are happening, the reasoning behind the JS logic, and ensure it cannot be simplified and moved part of it to CSS.

@artemiomorales artemiomorales added the [Type] Enhancement A suggestion for improvement. label Jul 27, 2023
@artemiomorales
Copy link
Contributor Author

I merged in changes by @SantosGuillamot refactoring the implementation. It's looking much better! I tested on a couple of mobile devices and it largely functions as expected. We do still have a few scenarios to cover:

1.) This portrait image with thumbnail resolution, aspect ratio of 9:16, and cover doesn’t animate properly, which maybe points at some faultiness in the logic somewhere that could surface with other images.

thumbnail-cover-9x16.mp4

2.) Thumbnails with contain don’t function well yet. Sometimes the lightbox image is the wrong aspect ratio, at other times there’s an erroneous overflow.

thumbnail-contain.mp4

3.) In general, we need to fix the inconsistent behavior with contain. As a user, I’d expect the lightbox image to display at full size when opened regardless of having cover or contain selected.

4.) We need to add the padding back in.

5.) The responsive image beneath the large image often shows as a broken image link.

@SantosGuillamot
Copy link
Contributor

Thanks for testing and raising the issues!

I didn't consider that an image could be cropped both in width and height. I just made a commit to fix that use case (I believe).

Lightbox.vertical.lightbox.-.28.July.2023.mp4

It'd be great if you can test it as it depends on the image resolution.

I'll take a look at the issue with contain.

@SantosGuillamot
Copy link
Contributor

I added support for the contain setting in the latest commit. I've tested it in multiple scenarios, and it seems to work. But it'd be great if you could test it with different images.

Lightbox.vertical.lightbox.-.28.July.2023.1.mp4

@SantosGuillamot SantosGuillamot force-pushed the update/support-aspect-ratio-in-lightbox branch from 768aa10 to 838d6a1 Compare July 28, 2023 10:22
@SantosGuillamot
Copy link
Contributor

I rebased trunk and I added a couple of commits to clean the code and remove the !important from CSS.

On another note, I just realized that the fade in animation is not working the same way for the different uses cases. I believe we can reuse the zooming logic. I'll try that.

@SantosGuillamot
Copy link
Contributor

I added a commit to reuse the zooming logic for the fade animation. It seems to solve all the problems the fade animation had with the different aspect ratio, contain, and thumbnails. However, I'm not 100% sure why there was a logic specific to the zoom, so I may be missing something.

SantosGuillamot and others added 11 commits August 11, 2023 08:30
As part of this commit, I added handling for button styles
in all images with the lightbox enabled, as we can't rely
on the CSS as was written to set the right dimensions
without breaking the layout on mobile.
The combination of 'loading=lazy' and the 'hidden' attributes
was breaking progressive image loading in Safari and Chrome; instead
we are now taking what seems to be a more reliable approach
to accomplish lazy loading of the enlarged image, namely
setting the src manually when the lightbox is opened.

*This was an approach we had implemented before, but we began using
'loading=lazy' during a code cleanup.
@artemiomorales artemiomorales force-pushed the update/support-aspect-ratio-in-lightbox branch from ad63011 to 0a04a6c Compare August 11, 2023 13:01
Comment on lines 23 to 24
windowWidth: window.innerWidth,
windowHeight: window.innerHeight,
Copy link
Contributor

Choose a reason for hiding this comment

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

I don't know if we should use namespaces here as well. It's true that it could be used by any other block, but it could also create conflicts if other blocks declare the same variables.

Copy link
Contributor Author

@artemiomorales artemiomorales Aug 11, 2023

Choose a reason for hiding this comment

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

@SantosGuillamot Good point — I pushed a commit adding a namespace.

Copy link
Contributor

@SantosGuillamot SantosGuillamot left a comment

Choose a reason for hiding this comment

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

I've tested it in multiple scenarios, and it seems to work great in all of them 👏 I just left a small comment.

@luisherranz luisherranz self-requested a review August 12, 2023 09:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Block] Image Affects the Image Block Needs User Documentation Needs new user documentation [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

10 participants