lightgallery 2.9.0 → 3.0.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +690 -0
- package/README.md +31 -21
- package/dist/README.md +229 -0
- package/{css → dist/css}/lg-autoplay.css +7 -4
- package/{css → dist/css}/lg-autoplay.css.map +1 -1
- package/{css → dist/css}/lg-comments.css +0 -6
- package/{css → dist/css}/lg-comments.css.map +1 -1
- package/dist/css/lg-fullscreen.css +11 -0
- package/dist/css/lg-fullscreen.css.map +1 -0
- package/dist/css/lg-justified.css +37 -0
- package/dist/css/lg-justified.css.map +1 -0
- package/{css → dist/css}/lg-pager.css.map +1 -1
- package/{css → dist/css}/lg-rotate.css +0 -16
- package/{css → dist/css}/lg-rotate.css.map +1 -1
- package/dist/css/lg-rtl.css +94 -0
- package/dist/css/lg-rtl.css.map +1 -0
- package/{css → dist/css}/lg-share.css +4 -32
- package/dist/css/lg-share.css.map +1 -0
- package/{css → dist/css}/lg-thumbnail.css +7 -3
- package/dist/css/lg-thumbnail.css.map +1 -0
- package/{css → dist/css}/lg-transitions.css +10 -0
- package/dist/css/lg-transitions.css.map +1 -0
- package/{css → dist/css}/lg-zoom.css +20 -9
- package/dist/css/lg-zoom.css.map +1 -0
- package/{css → dist/css}/lightgallery-bundle.css +150 -118
- package/dist/css/lightgallery-bundle.css.map +1 -0
- package/dist/css/lightgallery-bundle.min.css +1 -0
- package/{css → dist/css}/lightgallery-core.css +49 -7
- package/dist/css/lightgallery-core.css.map +1 -0
- package/{css → dist/css}/lightgallery.css +105 -44
- package/dist/css/lightgallery.css.map +1 -0
- package/dist/lightgallery.es5.js +3797 -0
- package/dist/lightgallery.es5.js.map +1 -0
- package/dist/lightgallery.min.js +1 -0
- package/dist/lightgallery.umd.js +3800 -0
- package/dist/lightgallery.umd.js.map +1 -0
- package/dist/package.json +33 -0
- package/dist/plugins/autoplay/lg-autoplay.es5.js +193 -0
- package/dist/plugins/autoplay/lg-autoplay.es5.js.map +1 -0
- package/dist/plugins/autoplay/lg-autoplay.min.js +1 -0
- package/dist/plugins/autoplay/lg-autoplay.umd.js +196 -0
- package/dist/plugins/autoplay/lg-autoplay.umd.js.map +1 -0
- package/dist/plugins/autoplay/package.json +7 -0
- package/dist/plugins/comment/lg-comment.es5.js +136 -0
- package/dist/plugins/comment/lg-comment.es5.js.map +1 -0
- package/dist/plugins/comment/lg-comment.min.js +1 -0
- package/dist/plugins/comment/lg-comment.umd.js +139 -0
- package/dist/plugins/comment/lg-comment.umd.js.map +1 -0
- package/dist/plugins/comment/package.json +7 -0
- package/dist/plugins/fullscreen/lg-fullscreen.es5.js +114 -0
- package/dist/plugins/fullscreen/lg-fullscreen.es5.js.map +1 -0
- package/dist/plugins/fullscreen/lg-fullscreen.min.js +1 -0
- package/dist/plugins/fullscreen/lg-fullscreen.umd.js +117 -0
- package/dist/plugins/fullscreen/lg-fullscreen.umd.js.map +1 -0
- package/dist/plugins/fullscreen/package.json +7 -0
- package/dist/plugins/hash/lg-hash.es5.js +207 -0
- package/dist/plugins/hash/lg-hash.es5.js.map +1 -0
- package/dist/plugins/hash/lg-hash.min.js +1 -0
- package/dist/plugins/hash/lg-hash.umd.js +210 -0
- package/dist/plugins/hash/lg-hash.umd.js.map +1 -0
- package/dist/plugins/hash/package.json +7 -0
- package/dist/plugins/justified/lg-justified.es5.js +415 -0
- package/dist/plugins/justified/lg-justified.es5.js.map +1 -0
- package/dist/plugins/justified/lg-justified.min.js +1 -0
- package/dist/plugins/justified/lg-justified.umd.js +418 -0
- package/dist/plugins/justified/lg-justified.umd.js.map +1 -0
- package/dist/plugins/justified/package.json +7 -0
- package/dist/plugins/mediumZoom/lg-medium-zoom.es5.js +95 -0
- package/dist/plugins/mediumZoom/lg-medium-zoom.es5.js.map +1 -0
- package/dist/plugins/mediumZoom/lg-medium-zoom.min.js +1 -0
- package/dist/plugins/mediumZoom/lg-medium-zoom.umd.js +98 -0
- package/dist/plugins/mediumZoom/lg-medium-zoom.umd.js.map +1 -0
- package/dist/plugins/mediumZoom/package.json +7 -0
- package/dist/plugins/originCrop/lg-origin-crop.es5.js +622 -0
- package/dist/plugins/originCrop/lg-origin-crop.es5.js.map +1 -0
- package/dist/plugins/originCrop/lg-origin-crop.min.js +1 -0
- package/dist/plugins/originCrop/lg-origin-crop.umd.js +625 -0
- package/dist/plugins/originCrop/lg-origin-crop.umd.js.map +1 -0
- package/dist/plugins/pager/lg-pager.es5.js +96 -0
- package/dist/plugins/pager/lg-pager.es5.js.map +1 -0
- package/dist/plugins/pager/lg-pager.min.js +1 -0
- package/dist/plugins/pager/lg-pager.umd.js +99 -0
- package/dist/plugins/pager/lg-pager.umd.js.map +1 -0
- package/dist/plugins/pager/package.json +7 -0
- package/dist/plugins/relativeCaption/lg-relative-caption.es5.js +98 -0
- package/dist/plugins/relativeCaption/lg-relative-caption.es5.js.map +1 -0
- package/dist/plugins/relativeCaption/lg-relative-caption.min.js +1 -0
- package/dist/plugins/relativeCaption/lg-relative-caption.umd.js +101 -0
- package/dist/plugins/relativeCaption/lg-relative-caption.umd.js.map +1 -0
- package/dist/plugins/relativeCaption/package.json +7 -0
- package/dist/plugins/rotate/lg-rotate.es5.js +226 -0
- package/dist/plugins/rotate/lg-rotate.es5.js.map +1 -0
- package/dist/plugins/rotate/lg-rotate.min.js +1 -0
- package/dist/plugins/rotate/lg-rotate.umd.js +229 -0
- package/dist/plugins/rotate/lg-rotate.umd.js.map +1 -0
- package/dist/plugins/rotate/package.json +7 -0
- package/dist/plugins/share/lg-share.es5.js +309 -0
- package/dist/plugins/share/lg-share.es5.js.map +1 -0
- package/dist/plugins/share/lg-share.min.js +1 -0
- package/dist/plugins/share/lg-share.umd.js +312 -0
- package/dist/plugins/share/lg-share.umd.js.map +1 -0
- package/dist/plugins/share/package.json +7 -0
- package/dist/plugins/thumbnail/lg-thumbnail.es5.js +792 -0
- package/dist/plugins/thumbnail/lg-thumbnail.es5.js.map +1 -0
- package/dist/plugins/thumbnail/lg-thumbnail.min.js +1 -0
- package/dist/plugins/thumbnail/lg-thumbnail.umd.js +795 -0
- package/dist/plugins/thumbnail/lg-thumbnail.umd.js.map +1 -0
- package/dist/plugins/thumbnail/package.json +7 -0
- package/dist/plugins/video/lg-video.es5.js +518 -0
- package/dist/plugins/video/lg-video.es5.js.map +1 -0
- package/dist/plugins/video/lg-video.min.js +1 -0
- package/dist/plugins/video/lg-video.umd.js +521 -0
- package/dist/plugins/video/lg-video.umd.js.map +1 -0
- package/dist/plugins/video/package.json +7 -0
- package/dist/plugins/vimeoThumbnail/lg-vimeo-thumbnail.es5.js +72 -0
- package/dist/plugins/vimeoThumbnail/lg-vimeo-thumbnail.es5.js.map +1 -0
- package/dist/plugins/vimeoThumbnail/lg-vimeo-thumbnail.min.js +1 -0
- package/dist/plugins/vimeoThumbnail/lg-vimeo-thumbnail.umd.js +75 -0
- package/dist/plugins/vimeoThumbnail/lg-vimeo-thumbnail.umd.js.map +1 -0
- package/dist/plugins/vimeoThumbnail/package.json +7 -0
- package/dist/plugins/zoom/lg-zoom.es5.js +1412 -0
- package/dist/plugins/zoom/lg-zoom.es5.js.map +1 -0
- package/dist/plugins/zoom/lg-zoom.min.js +1 -0
- package/dist/plugins/zoom/lg-zoom.umd.js +1415 -0
- package/dist/plugins/zoom/lg-zoom.umd.js.map +1 -0
- package/dist/plugins/zoom/package.json +7 -0
- package/{scss → dist/scss}/_lg-theme-default.scss +68 -18
- package/{scss → dist/scss}/_lg-variables.scss +0 -1
- package/{scss → dist/scss}/lg-autoplay.scss +10 -4
- package/{scss → dist/scss}/lg-comments.scss +0 -8
- package/dist/scss/lg-fullscreen.scss +15 -0
- package/dist/scss/lg-justified.scss +63 -0
- package/{scss → dist/scss}/lg-rotate.scss +0 -24
- package/dist/scss/lg-rtl.scss +145 -0
- package/{scss → dist/scss}/lg-share.scss +6 -33
- package/{scss → dist/scss}/lg-thumbnail.scss +16 -5
- package/{scss → dist/scss}/lg-zoom.scss +46 -9
- package/{scss → dist/scss}/lightgallery-bundle.scss +0 -1
- package/{scss → dist/scss}/lightgallery-core.scss +73 -6
- package/{scss → dist/scss}/lightgallery.scss +0 -1
- package/{scss → dist/scss}/transitions/_lg-scale-up.scss +6 -0
- package/{scss → dist/scss}/transitions/_lg-slide-circular-vertical.scss +6 -0
- package/{scss → dist/scss}/transitions/_lg-slide-circular.scss +6 -0
- package/{scss → dist/scss}/transitions/_lg-soft-zoom.scss +6 -0
- package/{scss → dist/scss}/transitions/_lg-zoom-in-big.scss +6 -0
- package/{scss → dist/scss}/transitions/_lg-zoom-in-out.scss +6 -0
- package/{scss → dist/scss}/transitions/_lg-zoom-in.scss +6 -0
- package/{scss → dist/scss}/transitions/_lg-zoom-out-big.scss +6 -0
- package/{scss → dist/scss}/transitions/_lg-zoom-out-in.scss +6 -0
- package/{scss → dist/scss}/transitions/_lg-zoom-out.scss +6 -0
- package/dist/types/headless/announce.d.ts +22 -0
- package/dist/types/headless/emitter.d.ts +14 -0
- package/dist/types/headless/gestures.d.ts +128 -0
- package/dist/types/headless/hash-driver.d.ts +77 -0
- package/dist/types/headless/icons.d.ts +56 -0
- package/dist/types/headless/index.d.ts +34 -0
- package/dist/types/headless/items.d.ts +92 -0
- package/dist/types/headless/justified-layout.d.ts +71 -0
- package/dist/types/headless/license.d.ts +35 -0
- package/dist/types/headless/origin-crop.d.ts +135 -0
- package/dist/types/headless/origin.d.ts +65 -0
- package/dist/types/headless/plugin-slices.d.ts +64 -0
- package/dist/types/headless/preload.d.ts +36 -0
- package/dist/types/headless/responsive.d.ts +90 -0
- package/dist/types/headless/settings.d.ts +268 -0
- package/dist/types/headless/share-urls.d.ts +60 -0
- package/dist/types/headless/spring.d.ts +42 -0
- package/dist/types/headless/state.d.ts +63 -0
- package/dist/types/headless/thumb-math.d.ts +85 -0
- package/dist/types/headless/toolbar-overflow.d.ts +61 -0
- package/dist/types/headless/transition.d.ts +33 -0
- package/dist/types/headless/velocity.d.ts +31 -0
- package/dist/types/headless/video-urls.d.ts +64 -0
- package/dist/types/headless/zoom-math.d.ts +89 -0
- package/{index.d.ts → dist/types/index.d.ts} +9 -4
- package/{lg-events.d.ts → dist/types/lg-events.d.ts} +300 -300
- package/dist/types/lg-icons.d.ts +27 -0
- package/{lg-plugin.d.ts → dist/types/lg-plugin.d.ts} +7 -7
- package/{lg-settings.d.ts → dist/types/lg-settings.d.ts} +549 -425
- package/dist/types/lg-spring-runner.d.ts +14 -0
- package/dist/types/lg-toolbar-overflow.d.ts +36 -0
- package/{lg-utils.d.ts → dist/types/lg-utils.d.ts} +236 -228
- package/{lgQuery.d.ts → dist/types/lgQuery.d.ts} +56 -56
- package/{lightgallery.d.ts → dist/types/lightgallery.d.ts} +384 -305
- package/{plugins → dist/types/plugins}/autoplay/lg-autoplay-settings.d.ts +41 -38
- package/{plugins → dist/types/plugins}/autoplay/lg-autoplay.d.ts +22 -22
- package/{plugins → dist/types/plugins}/comment/lg-comment-settings.d.ts +36 -33
- package/{plugins → dist/types/plugins}/comment/lg-comment.d.ts +25 -25
- package/{plugins → dist/types/plugins}/fullscreen/lg-fullscreen-settings.d.ts +17 -14
- package/{plugins → dist/types/plugins}/fullscreen/lg-fullscreen.d.ts +16 -16
- package/dist/types/plugins/hash/lg-hash-settings.d.ts +28 -0
- package/{plugins → dist/types/plugins}/hash/lg-hash.d.ts +25 -23
- package/dist/types/plugins/justified/lg-justified-settings.d.ts +42 -0
- package/dist/types/plugins/justified/lg-justified.d.ts +55 -0
- package/{plugins → dist/types/plugins}/mediumZoom/lg-medium-zoom-settings.d.ts +16 -16
- package/{plugins → dist/types/plugins}/mediumZoom/lg-medium-zoom.d.ts +12 -12
- package/dist/types/plugins/originCrop/lg-origin-crop-settings.d.ts +12 -0
- package/dist/types/plugins/originCrop/lg-origin-crop.d.ts +79 -0
- package/{plugins → dist/types/plugins}/pager/lg-pager-settings.d.ts +7 -7
- package/{plugins → dist/types/plugins}/pager/lg-pager.d.ts +13 -13
- package/{plugins → dist/types/plugins}/relativeCaption/lg-relative-caption-settings.d.ts +7 -7
- package/{plugins → dist/types/plugins}/relativeCaption/lg-relative-caption.d.ts +14 -14
- package/{plugins → dist/types/plugins}/rotate/lg-rotate-settings.d.ts +47 -45
- package/{plugins → dist/types/plugins}/rotate/lg-rotate.d.ts +25 -24
- package/{plugins → dist/types/plugins}/share/lg-fb-share-utils.d.ts +2 -2
- package/{plugins → dist/types/plugins}/share/lg-pinterest-share-utils.d.ts +2 -2
- package/{plugins → dist/types/plugins}/share/lg-share-settings.d.ts +71 -56
- package/dist/types/plugins/share/lg-share.d.ts +33 -0
- package/dist/types/plugins/share/lg-twitter-share-utils.d.ts +4 -0
- package/{plugins → dist/types/plugins}/share/types.d.ts +6 -6
- package/{plugins → dist/types/plugins}/thumbnail/lg-thumbnail-settings.d.ts +85 -70
- package/dist/types/plugins/thumbnail/lg-thumbnail.d.ts +88 -0
- package/{plugins → dist/types/plugins}/video/lg-video-settings.d.ts +94 -71
- package/{plugins → dist/types/plugins}/video/lg-video.d.ts +116 -104
- package/{plugins → dist/types/plugins}/video/types.d.ts +8 -8
- package/{plugins → dist/types/plugins}/vimeoThumbnail/lg-vimeo-thumbnail-settings.d.ts +11 -11
- package/{plugins → dist/types/plugins}/vimeoThumbnail/lg-vimeo-thumbnail.d.ts +14 -14
- package/{plugins → dist/types/plugins}/zoom/lg-zoom-settings.d.ts +54 -51
- package/{plugins → dist/types/plugins}/zoom/lg-zoom.d.ts +145 -108
- package/{types.d.ts → dist/types/types.d.ts} +40 -40
- package/package.json +222 -8
- package/angular/10/README.md +0 -24
- package/angular/10/bundles/lightgallery-angular-10.umd.js +0 -289
- package/angular/10/bundles/lightgallery-angular-10.umd.js.map +0 -1
- package/angular/10/bundles/lightgallery-angular-10.umd.min.js +0 -2
- package/angular/10/bundles/lightgallery-angular-10.umd.min.js.map +0 -1
- package/angular/10/esm2015/lib/lightgallery-angular.component.js +0 -225
- package/angular/10/esm2015/lib/lightgallery-angular.module.js +0 -17
- package/angular/10/esm2015/lib/lightgallery-angular.service.js +0 -14
- package/angular/10/esm2015/lightgallery-angular-10.js +0 -5
- package/angular/10/esm2015/public-api.js +0 -7
- package/angular/10/fesm2015/lightgallery-angular-10.js +0 -261
- package/angular/10/fesm2015/lightgallery-angular-10.js.map +0 -1
- package/angular/10/lib/lightgallery-angular.component.d.ts +0 -39
- package/angular/10/lib/lightgallery-angular.component.d.ts.map +0 -1
- package/angular/10/lib/lightgallery-angular.module.d.ts +0 -7
- package/angular/10/lib/lightgallery-angular.module.d.ts.map +0 -1
- package/angular/10/lib/lightgallery-angular.service.d.ts +0 -7
- package/angular/10/lib/lightgallery-angular.service.d.ts.map +0 -1
- package/angular/10/lightgallery-angular-10.d.ts +0 -6
- package/angular/10/lightgallery-angular-10.d.ts.map +0 -1
- package/angular/10/package.json +0 -21
- package/angular/10/public-api.d.ts +0 -4
- package/angular/10/public-api.d.ts.map +0 -1
- package/angular/11/README.md +0 -24
- package/angular/11/bundles/lightgallery-angular-11.umd.js +0 -290
- package/angular/11/bundles/lightgallery-angular-11.umd.js.map +0 -1
- package/angular/11/bundles/lightgallery-angular-11.umd.min.js +0 -2
- package/angular/11/bundles/lightgallery-angular-11.umd.min.js.map +0 -1
- package/angular/11/esm2015/lib/lightgallery-angular.component.js +0 -225
- package/angular/11/esm2015/lib/lightgallery-angular.module.js +0 -18
- package/angular/11/esm2015/lib/lightgallery-angular.service.js +0 -14
- package/angular/11/esm2015/lightgallery-angular-11.js +0 -5
- package/angular/11/esm2015/public-api.js +0 -7
- package/angular/11/fesm2015/lightgallery-angular-11.js +0 -262
- package/angular/11/fesm2015/lightgallery-angular-11.js.map +0 -1
- package/angular/11/lib/lightgallery-angular.component.d.ts +0 -39
- package/angular/11/lib/lightgallery-angular.component.d.ts.map +0 -1
- package/angular/11/lib/lightgallery-angular.module.d.ts +0 -8
- package/angular/11/lib/lightgallery-angular.module.d.ts.map +0 -1
- package/angular/11/lib/lightgallery-angular.service.d.ts +0 -7
- package/angular/11/lib/lightgallery-angular.service.d.ts.map +0 -1
- package/angular/11/lightgallery-angular-11.d.ts +0 -6
- package/angular/11/lightgallery-angular-11.d.ts.map +0 -1
- package/angular/11/package.json +0 -21
- package/angular/11/public-api.d.ts +0 -4
- package/angular/11/public-api.d.ts.map +0 -1
- package/angular/12/README.md +0 -24
- package/angular/12/bundles/lightgallery-angular-12.umd.js +0 -296
- package/angular/12/bundles/lightgallery-angular-12.umd.js.map +0 -1
- package/angular/12/esm2015/lib/lightgallery-angular.component.js +0 -221
- package/angular/12/esm2015/lib/lightgallery-angular.module.js +0 -17
- package/angular/12/esm2015/lib/lightgallery-angular.service.js +0 -14
- package/angular/12/esm2015/lightgallery-angular-12.js +0 -5
- package/angular/12/esm2015/public-api.js +0 -7
- package/angular/12/fesm2015/lightgallery-angular-12.js +0 -258
- package/angular/12/fesm2015/lightgallery-angular-12.js.map +0 -1
- package/angular/12/lib/lightgallery-angular.component.d.ts +0 -38
- package/angular/12/lib/lightgallery-angular.module.d.ts +0 -7
- package/angular/12/lib/lightgallery-angular.service.d.ts +0 -6
- package/angular/12/lightgallery-angular-12.d.ts +0 -5
- package/angular/12/package.json +0 -18
- package/angular/12/public-api.d.ts +0 -3
- package/angular/13/README.md +0 -24
- package/angular/13/esm2020/lib/lightgallery-angular.component.mjs +0 -221
- package/angular/13/esm2020/lib/lightgallery-angular.module.mjs +0 -17
- package/angular/13/esm2020/lib/lightgallery-angular.service.mjs +0 -14
- package/angular/13/esm2020/lightgallery-angular-13.mjs +0 -5
- package/angular/13/esm2020/public-api.mjs +0 -7
- package/angular/13/fesm2015/lightgallery-angular-13.mjs +0 -258
- package/angular/13/fesm2015/lightgallery-angular-13.mjs.map +0 -1
- package/angular/13/fesm2020/lightgallery-angular-13.mjs +0 -258
- package/angular/13/fesm2020/lightgallery-angular-13.mjs.map +0 -1
- package/angular/13/lib/lightgallery-angular.component.d.ts +0 -38
- package/angular/13/lib/lightgallery-angular.module.d.ts +0 -7
- package/angular/13/lib/lightgallery-angular.service.d.ts +0 -6
- package/angular/13/lightgallery-angular-13.d.ts +0 -5
- package/angular/13/package.json +0 -31
- package/angular/13/public-api.d.ts +0 -3
- package/angular/14/README.md +0 -24
- package/angular/14/esm2020/lib/lightgallery-angular.component.mjs +0 -217
- package/angular/14/esm2020/lib/lightgallery-angular.module.mjs +0 -17
- package/angular/14/esm2020/lib/lightgallery-angular.service.mjs +0 -14
- package/angular/14/esm2020/lightgallery-angular-14.mjs +0 -5
- package/angular/14/esm2020/public-api.mjs +0 -7
- package/angular/14/fesm2015/lightgallery-angular-14.mjs +0 -254
- package/angular/14/fesm2015/lightgallery-angular-14.mjs.map +0 -1
- package/angular/14/fesm2020/lightgallery-angular-14.mjs +0 -254
- package/angular/14/fesm2020/lightgallery-angular-14.mjs.map +0 -1
- package/angular/14/index.d.ts +0 -5
- package/angular/14/lib/lightgallery-angular.component.d.ts +0 -38
- package/angular/14/lib/lightgallery-angular.module.d.ts +0 -7
- package/angular/14/lib/lightgallery-angular.service.d.ts +0 -6
- package/angular/14/package.json +0 -31
- package/angular/14/public-api.d.ts +0 -3
- package/angular/15/README.md +0 -24
- package/angular/15/esm2022/lib/lightgallery-angular.component.mjs +0 -218
- package/angular/15/esm2022/lib/lightgallery-angular.module.mjs +0 -18
- package/angular/15/esm2022/lib/lightgallery-angular.service.mjs +0 -15
- package/angular/15/esm2022/lightgallery-angular-15.mjs +0 -5
- package/angular/15/esm2022/public-api.mjs +0 -7
- package/angular/15/fesm2022/lightgallery-angular-15.mjs +0 -254
- package/angular/15/fesm2022/lightgallery-angular-15.mjs.map +0 -1
- package/angular/15/index.d.ts +0 -5
- package/angular/15/lib/lightgallery-angular.component.d.ts +0 -38
- package/angular/15/lib/lightgallery-angular.module.d.ts +0 -7
- package/angular/15/lib/lightgallery-angular.service.d.ts +0 -6
- package/angular/15/package.json +0 -25
- package/angular/15/public-api.d.ts +0 -3
- package/angular/16/README.md +0 -24
- package/angular/16/esm2022/lib/lightgallery-angular.component.mjs +0 -218
- package/angular/16/esm2022/lib/lightgallery-angular.module.mjs +0 -18
- package/angular/16/esm2022/lib/lightgallery-angular.service.mjs +0 -15
- package/angular/16/esm2022/lightgallery-angular-16.mjs +0 -5
- package/angular/16/esm2022/public-api.mjs +0 -7
- package/angular/16/fesm2022/lightgallery-angular-16.mjs +0 -254
- package/angular/16/fesm2022/lightgallery-angular-16.mjs.map +0 -1
- package/angular/16/index.d.ts +0 -5
- package/angular/16/lib/lightgallery-angular.component.d.ts +0 -38
- package/angular/16/lib/lightgallery-angular.module.d.ts +0 -7
- package/angular/16/lib/lightgallery-angular.service.d.ts +0 -6
- package/angular/16/package.json +0 -25
- package/angular/16/public-api.d.ts +0 -3
- package/angular/9/README.md +0 -24
- package/angular/9/bundles/lightgallery-angular-9.umd.js +0 -271
- package/angular/9/bundles/lightgallery-angular-9.umd.js.map +0 -1
- package/angular/9/bundles/lightgallery-angular-9.umd.min.js +0 -2
- package/angular/9/bundles/lightgallery-angular-9.umd.min.js.map +0 -1
- package/angular/9/esm2015/lib/lightgallery-angular.component.js +0 -225
- package/angular/9/esm2015/lib/lightgallery-angular.module.js +0 -17
- package/angular/9/esm2015/lib/lightgallery-angular.service.js +0 -14
- package/angular/9/esm2015/lightgallery-angular-9.js +0 -5
- package/angular/9/esm2015/public-api.js +0 -7
- package/angular/9/esm5/lib/lightgallery-angular.component.js +0 -228
- package/angular/9/esm5/lib/lightgallery-angular.module.js +0 -21
- package/angular/9/esm5/lib/lightgallery-angular.service.js +0 -17
- package/angular/9/esm5/lightgallery-angular-9.js +0 -5
- package/angular/9/esm5/public-api.js +0 -7
- package/angular/9/fesm2015/lightgallery-angular-9.js +0 -261
- package/angular/9/fesm2015/lightgallery-angular-9.js.map +0 -1
- package/angular/9/fesm5/lightgallery-angular-9.js +0 -268
- package/angular/9/fesm5/lightgallery-angular-9.js.map +0 -1
- package/angular/9/lib/lightgallery-angular.component.d.ts +0 -38
- package/angular/9/lib/lightgallery-angular.module.d.ts +0 -6
- package/angular/9/lib/lightgallery-angular.service.d.ts +0 -6
- package/angular/9/lightgallery-angular-9.d.ts +0 -5
- package/angular/9/package.json +0 -23
- package/angular/9/public-api.d.ts +0 -3
- package/angular/README.md +0 -24
- package/angular/esm2022/lib/lightgallery-angular.component.mjs +0 -218
- package/angular/esm2022/lib/lightgallery-angular.module.mjs +0 -18
- package/angular/esm2022/lib/lightgallery-angular.service.mjs +0 -15
- package/angular/esm2022/lightgallery-angular.mjs +0 -5
- package/angular/esm2022/public-api.mjs +0 -7
- package/angular/fesm2022/lightgallery-angular.mjs +0 -254
- package/angular/fesm2022/lightgallery-angular.mjs.map +0 -1
- package/angular/index.d.ts +0 -5
- package/angular/lib/lightgallery-angular.component.d.ts +0 -38
- package/angular/lib/lightgallery-angular.module.d.ts +0 -7
- package/angular/lib/lightgallery-angular.service.d.ts +0 -6
- package/angular/package.json +0 -25
- package/angular/public-api.d.ts +0 -3
- package/css/lg-fullscreen.css +0 -8
- package/css/lg-fullscreen.css.map +0 -1
- package/css/lg-share.css.map +0 -1
- package/css/lg-thumbnail.css.map +0 -1
- package/css/lg-transitions.css.map +0 -1
- package/css/lg-zoom.css.map +0 -1
- package/css/lightgallery-bundle.css.map +0 -1
- package/css/lightgallery-bundle.min.css +0 -1
- package/css/lightgallery-core.css.map +0 -1
- package/css/lightgallery.css.map +0 -1
- package/fonts/lg.svg +0 -54
- package/fonts/lg.ttf +0 -0
- package/fonts/lg.woff +0 -0
- package/fonts/lg.woff2 +0 -0
- package/lib/index.js +0 -8
- package/lib/index.js.map +0 -1
- package/lib/lg-events.js +0 -37
- package/lib/lg-events.js.map +0 -1
- package/lib/lg-plugin.js +0 -13
- package/lib/lg-plugin.js.map +0 -1
- package/lib/lg-settings.js +0 -83
- package/lib/lg-settings.js.map +0 -1
- package/lib/lg-utils.js +0 -328
- package/lib/lg-utils.js.map +0 -1
- package/lib/lgQuery.js +0 -385
- package/lib/lgQuery.js.map +0 -1
- package/lib/lightgallery.js +0 -1949
- package/lib/lightgallery.js.map +0 -1
- package/lib/plugins/autoplay/lg-autoplay-settings.js +0 -16
- package/lib/plugins/autoplay/lg-autoplay-settings.js.map +0 -1
- package/lib/plugins/autoplay/lg-autoplay.js +0 -184
- package/lib/plugins/autoplay/lg-autoplay.js.map +0 -1
- package/lib/plugins/comment/lg-comment-settings.js +0 -17
- package/lib/plugins/comment/lg-comment-settings.js.map +0 -1
- package/lib/plugins/comment/lg-comment.js +0 -140
- package/lib/plugins/comment/lg-comment.js.map +0 -1
- package/lib/plugins/fullscreen/lg-fullscreen-settings.js +0 -10
- package/lib/plugins/fullscreen/lg-fullscreen-settings.js.map +0 -1
- package/lib/plugins/fullscreen/lg-fullscreen.js +0 -108
- package/lib/plugins/fullscreen/lg-fullscreen.js.map +0 -1
- package/lib/plugins/hash/lg-hash-settings.js +0 -9
- package/lib/plugins/hash/lg-hash-settings.js.map +0 -1
- package/lib/plugins/hash/lg-hash.js +0 -139
- package/lib/plugins/hash/lg-hash.js.map +0 -1
- package/lib/plugins/mediumZoom/lg-medium-zoom-settings.js +0 -9
- package/lib/plugins/mediumZoom/lg-medium-zoom-settings.js.map +0 -1
- package/lib/plugins/mediumZoom/lg-medium-zoom.js +0 -73
- package/lib/plugins/mediumZoom/lg-medium-zoom.js.map +0 -1
- package/lib/plugins/pager/lg-pager-settings.js +0 -7
- package/lib/plugins/pager/lg-pager-settings.js.map +0 -1
- package/lib/plugins/pager/lg-pager.js +0 -82
- package/lib/plugins/pager/lg-pager.js.map +0 -1
- package/lib/plugins/relativeCaption/lg-relative-caption-settings.js +0 -7
- package/lib/plugins/relativeCaption/lg-relative-caption-settings.js.map +0 -1
- package/lib/plugins/relativeCaption/lg-relative-caption.js +0 -97
- package/lib/plugins/relativeCaption/lg-relative-caption.js.map +0 -1
- package/lib/plugins/rotate/lg-rotate-settings.js +0 -18
- package/lib/plugins/rotate/lg-rotate-settings.js.map +0 -1
- package/lib/plugins/rotate/lg-rotate.js +0 -206
- package/lib/plugins/rotate/lg-rotate.js.map +0 -1
- package/lib/plugins/share/lg-fb-share-utils.js +0 -10
- package/lib/plugins/share/lg-fb-share-utils.js.map +0 -1
- package/lib/plugins/share/lg-pinterest-share-utils.js +0 -17
- package/lib/plugins/share/lg-pinterest-share-utils.js.map +0 -1
- package/lib/plugins/share/lg-share-settings.js +0 -15
- package/lib/plugins/share/lg-share-settings.js.map +0 -1
- package/lib/plugins/share/lg-share.js +0 -130
- package/lib/plugins/share/lg-share.js.map +0 -1
- package/lib/plugins/share/lg-twitter-share-utils.js +0 -11
- package/lib/plugins/share/lg-twitter-share-utils.js.map +0 -1
- package/lib/plugins/share/types.js +0 -3
- package/lib/plugins/share/types.js.map +0 -1
- package/lib/plugins/thumbnail/lg-thumbnail-settings.js +0 -23
- package/lib/plugins/thumbnail/lg-thumbnail-settings.js.map +0 -1
- package/lib/plugins/thumbnail/lg-thumbnail.js +0 -414
- package/lib/plugins/thumbnail/lg-thumbnail.js.map +0 -1
- package/lib/plugins/video/lg-video-settings.js +0 -15
- package/lib/plugins/video/lg-video-settings.js.map +0 -1
- package/lib/plugins/video/lg-video-utils.js +0 -84
- package/lib/plugins/video/lg-video-utils.js.map +0 -1
- package/lib/plugins/video/lg-video.js +0 -411
- package/lib/plugins/video/lg-video.js.map +0 -1
- package/lib/plugins/video/types.js +0 -3
- package/lib/plugins/video/types.js.map +0 -1
- package/lib/plugins/vimeoThumbnail/lg-vimeo-thumbnail-settings.js +0 -8
- package/lib/plugins/vimeoThumbnail/lg-vimeo-thumbnail-settings.js.map +0 -1
- package/lib/plugins/vimeoThumbnail/lg-vimeo-thumbnail.js +0 -122
- package/lib/plugins/vimeoThumbnail/lg-vimeo-thumbnail.js.map +0 -1
- package/lib/plugins/zoom/lg-zoom-settings.js +0 -21
- package/lib/plugins/zoom/lg-zoom-settings.js.map +0 -1
- package/lib/plugins/zoom/lg-zoom.js +0 -909
- package/lib/plugins/zoom/lg-zoom.js.map +0 -1
- package/lib/types.js +0 -3
- package/lib/types.js.map +0 -1
- package/lightgallery-2.9.0.tgz +0 -0
- package/lightgallery.es5.js +0 -2786
- package/lightgallery.es5.js.map +0 -1
- package/lightgallery.min.js +0 -8
- package/lightgallery.umd.js +0 -2794
- package/lightgallery.umd.js.map +0 -1
- package/lit/custom-elements.json +0 -82
- package/lit/lightgallery.esm.js +0 -59
- package/lit/lightgallery.umd.js +0 -37
- package/lit/package.json +0 -8
- package/plugins/autoplay/lg-autoplay.es5.js +0 -250
- package/plugins/autoplay/lg-autoplay.es5.js.map +0 -1
- package/plugins/autoplay/lg-autoplay.min.js +0 -8
- package/plugins/autoplay/lg-autoplay.umd.js +0 -258
- package/plugins/autoplay/lg-autoplay.umd.js.map +0 -1
- package/plugins/autoplay/package.json +0 -7
- package/plugins/comment/lg-comment.es5.js +0 -205
- package/plugins/comment/lg-comment.es5.js.map +0 -1
- package/plugins/comment/lg-comment.min.js +0 -8
- package/plugins/comment/lg-comment.umd.js +0 -213
- package/plugins/comment/lg-comment.umd.js.map +0 -1
- package/plugins/comment/package.json +0 -7
- package/plugins/fullscreen/lg-fullscreen.es5.js +0 -135
- package/plugins/fullscreen/lg-fullscreen.es5.js.map +0 -1
- package/plugins/fullscreen/lg-fullscreen.min.js +0 -8
- package/plugins/fullscreen/lg-fullscreen.umd.js +0 -143
- package/plugins/fullscreen/lg-fullscreen.umd.js.map +0 -1
- package/plugins/fullscreen/package.json +0 -7
- package/plugins/hash/lg-hash-settings.d.ts +0 -16
- package/plugins/hash/lg-hash.es5.js +0 -198
- package/plugins/hash/lg-hash.es5.js.map +0 -1
- package/plugins/hash/lg-hash.min.js +0 -8
- package/plugins/hash/lg-hash.umd.js +0 -206
- package/plugins/hash/lg-hash.umd.js.map +0 -1
- package/plugins/hash/package.json +0 -7
- package/plugins/mediumZoom/lg-medium-zoom.es5.js +0 -132
- package/plugins/mediumZoom/lg-medium-zoom.es5.js.map +0 -1
- package/plugins/mediumZoom/lg-medium-zoom.min.js +0 -8
- package/plugins/mediumZoom/lg-medium-zoom.umd.js +0 -140
- package/plugins/mediumZoom/lg-medium-zoom.umd.js.map +0 -1
- package/plugins/mediumZoom/package.json +0 -7
- package/plugins/pager/lg-pager.es5.js +0 -139
- package/plugins/pager/lg-pager.es5.js.map +0 -1
- package/plugins/pager/lg-pager.min.js +0 -8
- package/plugins/pager/lg-pager.umd.js +0 -147
- package/plugins/pager/lg-pager.umd.js.map +0 -1
- package/plugins/pager/package.json +0 -7
- package/plugins/relativeCaption/lg-relative-caption.es5.js +0 -154
- package/plugins/relativeCaption/lg-relative-caption.es5.js.map +0 -1
- package/plugins/relativeCaption/lg-relative-caption.min.js +0 -8
- package/plugins/relativeCaption/lg-relative-caption.umd.js +0 -162
- package/plugins/relativeCaption/lg-relative-caption.umd.js.map +0 -1
- package/plugins/relativeCaption/package.json +0 -7
- package/plugins/rotate/lg-rotate.es5.js +0 -274
- package/plugins/rotate/lg-rotate.es5.js.map +0 -1
- package/plugins/rotate/lg-rotate.min.js +0 -8
- package/plugins/rotate/lg-rotate.umd.js +0 -282
- package/plugins/rotate/lg-rotate.umd.js.map +0 -1
- package/plugins/rotate/package.json +0 -7
- package/plugins/share/lg-share.d.ts +0 -15
- package/plugins/share/lg-share.es5.js +0 -219
- package/plugins/share/lg-share.es5.js.map +0 -1
- package/plugins/share/lg-share.min.js +0 -8
- package/plugins/share/lg-share.umd.js +0 -227
- package/plugins/share/lg-share.umd.js.map +0 -1
- package/plugins/share/lg-twitter-share-utils.d.ts +0 -2
- package/plugins/share/package.json +0 -7
- package/plugins/thumbnail/lg-thumbnail.d.ts +0 -48
- package/plugins/thumbnail/lg-thumbnail.es5.js +0 -487
- package/plugins/thumbnail/lg-thumbnail.es5.js.map +0 -1
- package/plugins/thumbnail/lg-thumbnail.min.js +0 -8
- package/plugins/thumbnail/lg-thumbnail.umd.js +0 -495
- package/plugins/thumbnail/lg-thumbnail.umd.js.map +0 -1
- package/plugins/thumbnail/package.json +0 -7
- package/plugins/video/lg-video-utils.d.ts +0 -10
- package/plugins/video/lg-video.es5.js +0 -545
- package/plugins/video/lg-video.es5.js.map +0 -1
- package/plugins/video/lg-video.min.js +0 -8
- package/plugins/video/lg-video.umd.js +0 -553
- package/plugins/video/lg-video.umd.js.map +0 -1
- package/plugins/video/package.json +0 -7
- package/plugins/vimeoThumbnail/lg-vimeo-thumbnail.es5.js +0 -182
- package/plugins/vimeoThumbnail/lg-vimeo-thumbnail.es5.js.map +0 -1
- package/plugins/vimeoThumbnail/lg-vimeo-thumbnail.min.js +0 -8
- package/plugins/vimeoThumbnail/lg-vimeo-thumbnail.umd.js +0 -190
- package/plugins/vimeoThumbnail/lg-vimeo-thumbnail.umd.js.map +0 -1
- package/plugins/vimeoThumbnail/package.json +0 -7
- package/plugins/zoom/lg-zoom.es5.js +0 -980
- package/plugins/zoom/lg-zoom.es5.js.map +0 -1
- package/plugins/zoom/lg-zoom.min.js +0 -8
- package/plugins/zoom/lg-zoom.umd.js +0 -988
- package/plugins/zoom/lg-zoom.umd.js.map +0 -1
- package/plugins/zoom/package.json +0 -7
- package/react/Lightgallery.d.ts +0 -33
- package/react/Lightgallery.es5.js +0 -2988
- package/react/Lightgallery.es5.js.map +0 -1
- package/react/Lightgallery.umd.js +0 -2994
- package/react/Lightgallery.umd.js.map +0 -1
- package/react/package.json +0 -7
- package/scss/_lg-fonts.scss +0 -27
- package/scss/lg-fullscreen.scss +0 -9
- package/vue/LightGallery.vue.d.ts +0 -37
- package/vue/LightGalleryVue.common.js +0 -9343
- package/vue/LightGalleryVue.common.js.map +0 -1
- package/vue/LightGalleryVue.umd.js +0 -9353
- package/vue/LightGalleryVue.umd.js.map +0 -1
- package/vue/LightGalleryVue.umd.min.js +0 -8
- package/vue/LightGalleryVue.umd.min.js.map +0 -1
- package/vue/package.json +0 -7
- /package/{css → dist/css}/lg-medium-zoom.css +0 -0
- /package/{css → dist/css}/lg-medium-zoom.css.map +0 -0
- /package/{css → dist/css}/lg-pager.css +0 -0
- /package/{css → dist/css}/lg-relative-caption.css +0 -0
- /package/{css → dist/css}/lg-relative-caption.css.map +0 -0
- /package/{css → dist/css}/lg-video.css +0 -0
- /package/{css → dist/css}/lg-video.css.map +0 -0
- /package/{images → dist/images}/loading.gif +0 -0
- /package/{scss → dist/scss}/_lg-mixins.scss +0 -0
- /package/{scss → dist/scss}/lg-medium-zoom.scss +0 -0
- /package/{scss → dist/scss}/lg-pager.scss +0 -0
- /package/{scss → dist/scss}/lg-relative-caption.scss +0 -0
- /package/{scss → dist/scss}/lg-transitions.scss +0 -0
- /package/{scss → dist/scss}/lg-video.scss +0 -0
- /package/{scss → dist/scss}/transitions/_index.scss +0 -0
- /package/{scss → dist/scss}/transitions/_lg-lollipop-rev.scss +0 -0
- /package/{scss → dist/scss}/transitions/_lg-lollipop.scss +0 -0
- /package/{scss → dist/scss}/transitions/_lg-rotate-rev.scss +0 -0
- /package/{scss → dist/scss}/transitions/_lg-rotate.scss +0 -0
- /package/{scss → dist/scss}/transitions/_lg-slide-skew-cross-rev.scss +0 -0
- /package/{scss → dist/scss}/transitions/_lg-slide-skew-cross.scss +0 -0
- /package/{scss → dist/scss}/transitions/_lg-slide-skew-only-rev.scss +0 -0
- /package/{scss → dist/scss}/transitions/_lg-slide-skew-only-y-rev.scss +0 -0
- /package/{scss → dist/scss}/transitions/_lg-slide-skew-only-y.scss +0 -0
- /package/{scss → dist/scss}/transitions/_lg-slide-skew-only.scss +0 -0
- /package/{scss → dist/scss}/transitions/_lg-slide-skew-rev.scss +0 -0
- /package/{scss → dist/scss}/transitions/_lg-slide-skew-ver-cross-rev.scss +0 -0
- /package/{scss → dist/scss}/transitions/_lg-slide-skew-ver-cross.scss +0 -0
- /package/{scss → dist/scss}/transitions/_lg-slide-skew-ver-rev.scss +0 -0
- /package/{scss → dist/scss}/transitions/_lg-slide-skew-ver.scss +0 -0
- /package/{scss → dist/scss}/transitions/_lg-slide-skew.scss +0 -0
- /package/{scss → dist/scss}/transitions/_lg-slide-vertical-growth.scss +0 -0
- /package/{scss → dist/scss}/transitions/_lg-slide-vertical.scss +0 -0
- /package/{scss → dist/scss}/transitions/_lg-tube.scss +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lg-zoom.es5.js","sources":["../../../packages/headless/src/spring.ts","../../../packages/headless/src/origin.ts","../../../packages/headless/src/icons.ts","../../../packages/headless/src/zoom-math.ts","../../../packages/headless/src/responsive.ts","../../../packages/headless/src/velocity.ts","../../../packages/headless/src/plugin-slices.ts","../../../src/lg-spring-runner.ts","../../../src/plugins/zoom/lg-zoom-settings.ts","../../../src/lg-events.ts","../../../src/plugins/zoom/lg-zoom.ts"],"sourcesContent":["/**\n * Gesture-release physics: momentum projection and a damped-spring\n * stepper. Releases compute where momentum would land (`project`),\n * clamp that into bounds, and animate there with a spring seeded by the\n * live release velocity — velocity stays continuous across the\n * finger-lift boundary, which is most of what native feel is.\n *\n * The stepper advances the standard damped harmonic oscillator by its\n * closed-form solution over each frame, so step size never affects the\n * trajectory and the state (position + velocity) can re-seed a new\n * spring at any interruption point.\n */\n\nexport interface SpringState {\n position: number;\n /** px per ms (same unit as the windowed gesture velocity). */\n velocity: number;\n}\n\nexport interface SpringConfig {\n /** 1 = never overshoot; < 1 overshoots and returns. */\n dampingRatio?: number;\n /** Rad/s — higher settles faster. */\n naturalFrequency?: number;\n}\n\n/** Settling toward an in-bounds target: no overshoot. */\nexport const SPRING_SETTLE_DAMPING = 1;\n\n/** Settling against a clamped bound: one soft bounce. */\nexport const SPRING_BOUNCE_DAMPING = 0.82;\n\nexport const SPRING_NATURAL_FREQUENCY = 12;\n\n/**\n * Momentum projection: how far a release keeps traveling when it loses\n * `1 - decelerationRate` of its velocity every millisecond (the classic\n * scroll-view constant; 0.995 ≈ half a percent per ms).\n */\nexport const DECELERATION_RATE = 0.995;\n\nexport function project(\n velocity: number,\n decelerationRate: number = DECELERATION_RATE,\n): number {\n return (velocity * decelerationRate) / (1 - decelerationRate);\n}\n\n/**\n * Advance a spring toward `target` by `dtMs`, exactly (closed form with\n * the current state as initial conditions).\n */\nexport function stepSpring(\n state: SpringState,\n target: number,\n dtMs: number,\n {\n dampingRatio = SPRING_SETTLE_DAMPING,\n naturalFrequency = SPRING_NATURAL_FREQUENCY,\n }: SpringConfig = {},\n): SpringState {\n const t = dtMs / 1000;\n const w0 = naturalFrequency;\n const zeta = Math.min(dampingRatio, 1);\n const x0 = state.position - target;\n const v0 = state.velocity * 1000; // px/s for the oscillator\n const decay = Math.exp(-zeta * w0 * t);\n\n let x: number;\n let v: number;\n if (zeta < 1) {\n const wd = w0 * Math.sqrt(1 - zeta * zeta);\n const a = x0;\n const b = (v0 + zeta * w0 * x0) / wd;\n const cos = Math.cos(wd * t);\n const sin = Math.sin(wd * t);\n x = decay * (a * cos + b * sin);\n v =\n decay *\n ((b * wd - zeta * w0 * a) * cos - (a * wd + zeta * w0 * b) * sin);\n } else {\n const b = v0 + w0 * x0;\n x = decay * (x0 + b * t);\n v = decay * (b - w0 * (x0 + b * t));\n }\n return { position: target + x, velocity: v / 1000 };\n}\n\n/** Whether a spring is close enough to stop animating. */\nexport function isSpringSettled(\n state: SpringState,\n target: number,\n restDelta = 0.3,\n restVelocity = 0.012,\n): boolean {\n return (\n Math.abs(state.position - target) < restDelta &&\n Math.abs(state.velocity) < restVelocity\n );\n}\n","/**\n * Zoom-from-origin math, ported from 2.x `utils.getSize`/`utils.getTransform`\n * (`src/lg-utils.ts`) as pure rect arithmetic. The framework layer measures\n * the DOM (trigger/container bounding rects) and passes plain numbers in.\n *\n * Note: this module is an addition to the ADR 0001 §1 table — it\n * follows the standing rule that pure functions needed by React live in\n * headless. It is distinct from `zoom-math.ts` (zoom plugin).\n */\n\nexport interface ImageSize {\n width: number;\n height: number;\n}\n\nexport interface RectLike {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n/**\n * Parse an item's `lgSize` value (`\"1920-1280\"`, or a responsive list like\n * `\"240-160-375, 1600-1067\"` where the third number is the max viewport\n * width the entry applies to).\n */\nexport function parseImageSize(\n lgSize: string | undefined,\n viewportWidth: number,\n): ImageSize | undefined {\n if (!lgSize) {\n return undefined;\n }\n let size = lgSize;\n const responsiveSizes = lgSize.split(',');\n if (responsiveSizes[1]) {\n for (let i = 0; i < responsiveSizes.length; i++) {\n const candidate = responsiveSizes[i]!.trim();\n const responsiveWidth = parseInt(candidate.split('-')[2]!, 10);\n if (responsiveWidth > viewportWidth) {\n size = candidate;\n break;\n }\n if (i === responsiveSizes.length - 1) {\n size = candidate;\n }\n }\n }\n const parts = size.trim().split('-');\n const width = parseInt(parts[0]!, 10);\n const height = parseInt(parts[1]!, 10);\n if (!Number.isFinite(width) || !Number.isFinite(height)) {\n return undefined;\n }\n return { width, height };\n}\n\n/**\n * Fit a natural image size into the available container box, preserving\n * aspect ratio and never scaling up (2.x `utils.getSize` math).\n */\nexport function fitImageSize(\n size: ImageSize,\n containerWidth: number,\n containerHeight: number,\n): ImageSize {\n const maxWidth = Math.min(containerWidth, size.width);\n const maxHeight = Math.min(containerHeight, size.height);\n const ratio = Math.min(maxWidth / size.width, maxHeight / size.height);\n return { width: size.width * ratio, height: size.height * ratio };\n}\n\n/**\n * Whether a measured trigger rect can anchor the zoom-from-origin flight.\n * A trigger that is hidden (`display: none`, the `hidden` attribute),\n * detached or collapsed measures 0×0 at the viewport origin; a flight\n * aimed at it would shrink the slide into the top-left corner.\n */\nexport function isUsableOriginRect(\n rect: RectLike | null | undefined,\n): rect is RectLike {\n return (\n !!rect &&\n Number.isFinite(rect.left) &&\n Number.isFinite(rect.top) &&\n rect.width > 0 &&\n rect.height > 0\n );\n}\n\n/** Scale the closing slide shrinks to when it has no trigger to return to. */\nexport const CENTER_CLOSE_SCALE = 0.5;\n\n/**\n * Close transform for a slide without a usable origin (hidden or\n * collapsed trigger, no `lgSize`): shrink in place about the stage centre,\n * the mirror of the `lg-start-zoom` open. The runtime pairs it with the\n * `lg-close-to-center` class, which fades the slide out over the same\n * duration.\n */\nexport function getCenterCloseTransform(scale = CENTER_CLOSE_SCALE): string {\n return `translate3d(0, 0, 0) scale3d(${scale}, ${scale}, 1)`;\n}\n\nexport interface OriginTransformInput {\n /** Bounding rect of the trigger thumbnail image, viewport coordinates. */\n triggerRect: RectLike;\n\n /** Bounding rect of the gallery outer element, viewport coordinates. */\n containerRect: RectLike;\n\n /** Media container top offset (toolbar height), px. */\n top: number;\n\n /** Media container bottom offset (caption + thumb strip height), px. */\n bottom: number;\n\n /** Final displayed image size (see {@link fitImageSize}). */\n imageSize: ImageSize;\n}\n\n/**\n * CSS transform that places the (centered, final-size) slide image exactly\n * over the trigger thumbnail — the starting point of the zoom-from-origin\n * open animation and the end point of the close animation.\n */\nexport function getOriginTransform(input: OriginTransformInput): string {\n const { triggerRect, containerRect, top, bottom, imageSize } = input;\n\n const availableWidth = containerRect.width;\n const availableHeight = containerRect.height - (top + bottom);\n\n const x =\n (availableWidth - triggerRect.width) / 2 -\n triggerRect.left +\n containerRect.left;\n const y =\n (availableHeight - triggerRect.height) / 2 - triggerRect.top + top;\n\n const scaleX = triggerRect.width / imageSize.width;\n const scaleY = triggerRect.height / imageSize.height;\n\n return `translate3d(${-x}px, ${-y}px, 0) scale3d(${scaleX}, ${scaleY}, 1)`;\n}\n","/**\n * Built-in UI icon set: inline SVG strings, one per icon name, grouped\n * by the feature that renders them so bundlers ship only the groups a\n * consumer's plugins import. Pure string data — safe in this DOM-free\n * package. Runtimes render these when the consumer supplies no custom\n * icon for a name.\n *\n * The artwork is lightGallery's own icon set, carried over from the\n * 2.x icon font: each glyph's vector outline extracted from the font\n * and re-baselined onto a square viewBox (font ascent 960 on a 1024\n * em). Same shapes the library has always shipped — now crisp inline\n * SVGs that follow `currentColor`.\n */\n\n/** The icon-name contract shared by every runtime and plugin. */\nexport type LgIconName =\n | 'close'\n | 'prev'\n | 'next'\n | 'download'\n | 'maximize'\n | 'minimize'\n | 'more'\n | 'zoomIn'\n | 'zoomOut'\n | 'actualSize'\n | 'rotateLeft'\n | 'rotateRight'\n | 'flipHorizontal'\n | 'flipVertical'\n | 'share'\n | 'shareFacebook'\n | 'shareX'\n | 'sharePinterest'\n | 'autoplayPlay'\n | 'autoplayPause'\n | 'fullscreen'\n | 'fullscreenExit'\n | 'comment'\n | 'commentClose'\n | 'toggleThumbnails';\n\nexport const coreDefaultIcons = {\n close: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\"><path transform=\"translate(0, 960) scale(1, -1)\" d=\"M810 664.667l-238-238 238-238-60-60-238 238-238-238-60 60 238 238-238 238 60 60 238-238 238 238z\"/></svg>',\n // Three dots for the toolbar's More options menu button.\n more: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\"><circle cx=\"232\" cy=\"512\" r=\"80\"/><circle cx=\"512\" cy=\"512\" r=\"80\"/><circle cx=\"792\" cy=\"512\" r=\"80\"/></svg>',\n prev: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\"><path transform=\"translate(0, 960) scale(1, -1)\" d=\"M426.667 768q17.667 0 30.167-12.5t12.5-30.167q0-18-12.667-30.333l-225.667-225.667h665q17.667 0 30.167-12.5t12.5-30.167-12.5-30.167-30.167-12.5h-665l225.667-225.667q12.667-12.333 12.667-30.333 0-17.667-12.5-30.167t-30.167-12.5q-18 0-30.333 12.333l-298.667 298.667q-12.333 13-12.333 30.333t12.333 30.333l298.667 298.667q12.667 12.333 30.333 12.333z\"/></svg>',\n next: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\"><path transform=\"translate(0, 960) scale(1, -1)\" d=\"M597.333 768q18 0 30.333-12.333l298.667-298.667q12.333-12.333 12.333-30.333t-12.333-30.333l-298.667-298.667q-12.333-12.333-30.333-12.333-18.333 0-30.5 12.167t-12.167 30.5q0 18 12.333 30.333l226 225.667h-665q-17.667 0-30.167 12.5t-12.5 30.167 12.5 30.167 30.167 12.5h665l-226 225.667q-12.333 12.333-12.333 30.333 0 18.333 12.167 30.5t30.5 12.167z\"/></svg>',\n download:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\"><path transform=\"translate(0, 960) scale(1, -1)\" d=\"M170 128.667h684v-86h-684v86zM682 384.667l-170-172-170 172h128v426h84v-426h128z\"/></svg>',\n maximize:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\"><path transform=\"translate(0, 960) scale(1, -1)\" d=\"M793.003 768l-225.835-225.835c-16.683-16.683-16.683-43.691 0-60.331s43.691-16.683 60.331 0l225.835 225.835v-153.003c0-23.552 19.115-42.667 42.667-42.667s42.667 19.115 42.667 42.667v256c0 5.803-1.152 11.307-3.243 16.341s-5.163 9.728-9.216 13.781c-0.043 0.043-0.043 0.043-0.085 0.085-3.925 3.925-8.619 7.083-13.781 9.216-5.035 2.091-10.539 3.243-16.341 3.243h-256c-23.552 0-42.667-19.115-42.667-42.667s19.115-42.667 42.667-42.667zM230.997 85.334l225.835 225.835c16.683 16.683 16.683 43.691 0 60.331s-43.691 16.683-60.331 0l-225.835-225.835v153.003c0 23.552-19.115 42.667-42.667 42.667s-42.667-19.115-42.667-42.667v-256c0-23.552 19.115-42.667 42.667-42.667h256c23.552 0 42.667 19.115 42.667 42.667s-19.115 42.667-42.667 42.667z\"/></svg>',\n minimize:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\"><path transform=\"translate(0, 960) scale(1, -1)\" d=\"M700.331 554.667l225.835 225.835c16.683 16.683 16.683 43.691 0 60.331s-43.691 16.683-60.331 0l-225.835-225.835v153.003c0 23.552-19.115 42.667-42.667 42.667s-42.667-19.115-42.667-42.667v-256c0-5.803 1.152-11.307 3.243-16.341s5.163-9.728 9.216-13.781c0.043-0.043 0.043-0.043 0.085-0.085 3.925-3.925 8.619-7.083 13.781-9.216 5.035-2.091 10.539-3.243 16.341-3.243h256c23.552 0 42.667 19.115 42.667 42.667s-19.115 42.667-42.667 42.667zM158.165 12.502l225.835 225.835v-153.003c0-23.552 19.115-42.667 42.667-42.667s42.667 19.115 42.667 42.667v256c0 5.803-1.152 11.307-3.243 16.341s-5.163 9.728-9.216 13.781c-0.043 0.043-0.043 0.043-0.085 0.085-4.096 4.053-8.789 7.125-13.781 9.216-5.035 2.091-10.539 3.243-16.341 3.243h-256c-23.552 0-42.667-19.115-42.667-42.667s19.115-42.667 42.667-42.667h153.003l-225.835-225.835c-16.683-16.683-16.683-43.691 0-60.331s43.691-16.683 60.331 0z\"/></svg>',\n} as const;\n\nexport const zoomDefaultIcons = {\n zoomIn: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\"><path transform=\"translate(0, 960) scale(1, -1)\" d=\"M512 512.667h-86v-86h-42v86h-86v42h86v86h42v-86h86v-42zM406 340.667q80 0 136 56t56 136-56 136-136 56-136-56-56-136 56-136 136-56zM662 340.667l212-212-64-64-212 212v34l-12 12q-76-66-180-66-116 0-197 80t-81 196 81 197 197 81 196-81 80-197q0-104-66-180l12-12h34z\"/></svg>',\n zoomOut:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\"><path transform=\"translate(0, 960) scale(1, -1)\" d=\"M298 554.667h214v-42h-214v42zM406 340.667q80 0 136 56t56 136-56 136-136 56-136-56-56-136 56-136 136-56zM662 340.667l212-212-64-64-212 212v34l-12 12q-76-66-180-66-116 0-197 80t-81 196 81 197 197 81 196-81 80-197q0-104-66-180l12-12h34z\"/></svg>',\n actualSize:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\"><path transform=\"translate(0, 960) scale(1, -1)\" d=\"M384 853.334h426.667q53 0 90.5-37.5t37.5-90.5v-426.667q0-53-37.5-90.5t-90.5-37.5h-426.667q-53 0-90.5 37.5t-37.5 90.5v426.667q0 53 37.5 90.5t90.5 37.5zM170.667 675.334v-547.333q0-17.667 12.5-30.167t30.167-12.5h547.333q-13.333-37.667-46.333-61.5t-74.333-23.833h-426.667q-53 0-90.5 37.5t-37.5 90.5v426.667q0 41.333 23.833 74.333t61.5 46.333zM810.667 768h-426.667q-17.667 0-30.167-12.5t-12.5-30.167v-426.667q0-17.667 12.5-30.167t30.167-12.5h426.667q17.667 0 30.167 12.5t12.5 30.167v426.667q0 17.667-12.5 30.167t-30.167 12.5z\"/></svg>',\n} as const;\n\nexport const rotateDefaultIcons = {\n rotateLeft:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\"><path transform=\"translate(0, 960) scale(1, -1)\" d=\"M554 764.667q126-16 213-112t87-226-87-226-213-112v86q92 16 153 87t61 165-61 165-153 87v-166l-194 190 194 194v-132zM302 156.667l62 62q46-34 106-44v-86q-96 12-168 68zM260 384.667q10-58 42-106l-60-60q-56 74-68 166h86zM304 574.667q-36-52-44-106h-86q12 90 70 166z\"/></svg>',\n rotateRight:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\"><path transform=\"translate(0, 960) scale(1, -1)\" d=\"M720 278.667q34 46 44 106h86q-12-92-68-166zM554 174.667q60 10 106 44l62-62q-72-56-168-68v86zM850 468.667h-86q-10 60-44 106l62 60q58-72 68-166zM664 702.667l-194-190v166q-92-16-153-87t-61-165 61-165 153-87v-86q-126 16-213 112t-87 226 87 226 213 112v132z\"/></svg>',\n flipHorizontal:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\"><path transform=\"translate(0, 960) scale(1, -1)\" d=\"M896 554.667l-170-170v128h-300v84h300v128zM298 468.667v-128h300v-84h-300v-128l-170 170z\"/></svg>',\n flipVertical:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\"><path transform=\"translate(0, 960) scale(1, -1)\" d=\"M384 810.667l170-170h-128v-300h-84v300h-128zM682 212.667h128l-170-170-170 170h128v300h84v-300z\"/></svg>',\n} as const;\n\nexport const shareDefaultIcons = {\n share: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\"><path transform=\"translate(0, 960) scale(1, -1)\" d=\"M768 252.667c68 0 124-56 124-124s-56-126-124-126-124 58-124 126c0 10 0 20 2 28l-302 176c-24-22-54-34-88-34-70 0-128 58-128 128s58 128 128 128c34 0 64-12 88-34l300 174c-2 10-4 20-4 30 0 70 58 128 128 128s128-58 128-128-58-128-128-128c-34 0-64 14-88 36l-300-176c2-10 4-20 4-30s-2-20-4-30l304-176c22 20 52 32 84 32z\"/></svg>',\n shareFacebook:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\"><path transform=\"translate(0, 960) scale(1, -1)\" d=\"M512 952.32c-271.462 0-491.52-220.058-491.52-491.52s220.058-491.52 491.52-491.52 491.52 220.058 491.52 491.52-220.058 491.52-491.52 491.52zM628.429 612.659h-73.882c-8.755 0-18.483-11.52-18.483-26.829v-53.35h92.416l-13.978-76.083h-78.438v-228.403h-87.194v228.403h-79.104v76.083h79.104v44.749c0 64.205 44.544 116.378 105.677 116.378h73.882v-80.947z\"/></svg>',\n shareX: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\"><circle cx=\"512\" cy=\"512\" r=\"491.52\"/><path fill=\"#fff\" transform=\"translate(227 224) scale(24)\" d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\"/></svg>',\n sharePinterest:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\"><path transform=\"translate(0, 960) scale(1, -1)\" d=\"M512 952.32c-271.462 0-491.52-220.058-491.52-491.52s220.058-491.52 491.52-491.52 491.52 220.058 491.52 491.52-220.058 491.52-491.52 491.52zM545.638 344.32c-31.539 2.406-44.749 18.022-69.427 32.973-13.568-71.219-30.157-139.52-79.309-175.206-15.206 107.725 22.221 188.518 39.629 274.381-29.645 49.92 3.533 150.323 66.099 125.645 76.954-30.515-66.662-185.6 29.747-205.005 100.659-20.173 141.773 174.694 79.36 237.978-90.214 91.494-262.502 2.099-241.306-128.87 5.12-32 38.246-41.728 13.21-85.914-57.702 12.8-74.957 58.317-72.704 118.989 3.533 99.328 89.242 168.909 175.155 178.483 108.698 12.083 210.688-39.885 224.819-142.182 15.821-115.405-49.101-240.282-165.274-231.27z\"/></svg>',\n} as const;\n\nexport const autoplayDefaultIcons = {\n autoplayPlay:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\"><path transform=\"translate(0, 960) scale(1, -1)\" d=\"M512 84.667q140 0 241 101t101 241-101 241-241 101-241-101-101-241 101-241 241-101zM512 852.667q176 0 301-125t125-301-125-301-301-125-301 125-125 301 125 301 301 125zM426 234.667v384l256-192z\"/></svg>',\n autoplayPause:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\"><path transform=\"translate(0, 960) scale(1, -1)\" d=\"M554 256.667v340h86v-340h-86zM512 84.667q140 0 241 101t101 241-101 241-241 101-241-101-101-241 101-241 241-101zM512 852.667q176 0 301-125t125-301-125-301-301-125-301 125-125 301 125 301 301 125zM384 256.667v340h86v-340h-86z\"/></svg>',\n} as const;\n\nexport const fullscreenDefaultIcons = {\n fullscreen:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\"><path transform=\"translate(0, 960) scale(1, -1)\" d=\"M598 724.667h212v-212h-84v128h-128v84zM726 212.667v128h84v-212h-212v84h128zM214 512.667v212h212v-84h-128v-128h-84zM298 340.667v-128h128v-84h-212v212h84z\"/></svg>',\n fullscreenExit:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\"><path transform=\"translate(0, 960) scale(1, -1)\" d=\"M682 596.667h128v-84h-212v212h84v-128zM598 128.667v212h212v-84h-128v-128h-84zM342 596.667v128h84v-212h-212v84h128zM214 256.667v84h212v-212h-84v128h-128z\"/></svg>',\n} as const;\n\nexport const commentDefaultIcons = {\n comment:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\"><path transform=\"translate(0, 960) scale(1, -1)\" d=\"M938.667 448.128v21.205c0 0.725-0.043 1.621-0.085 2.475-5.803 99.755-47.488 190.336-112.725 258.176-68.352 71.125-162.731 117.419-268.843 123.264-0.683 0.043-1.536 0.085-2.347 0.085h-20.864c-59.947 0.683-122.965-13.227-181.931-43.008-52.181-26.496-97.749-63.488-133.931-108.16-56.405-69.717-89.899-158.080-89.941-253.696-0.597-54.4 10.795-111.36 35.157-165.419l-75.605-226.859c-2.816-8.363-3.072-17.835 0-26.965 7.467-22.357 31.616-34.432 53.973-26.965l226.731 75.563c49.493-22.485 105.984-35.243 165.376-35.115 58.539 0.384 115.797 13.141 168.149 36.949 81.579 37.163 151.040 101.248 193.749 186.667 27.477 53.291 43.307 115.84 43.136 181.803zM853.333 447.872c0.128-52.267-12.459-101.333-33.664-142.464-34.176-68.352-88.832-118.827-153.259-148.139-41.387-18.859-86.827-28.971-133.376-29.269-52.096-0.128-101.163 12.459-142.293 33.664-10.624 5.504-22.528 6.059-33.067 2.56l-162.261-54.101 54.101 162.261c3.755 11.221 2.56 22.912-2.389 32.725-23.552 46.677-34.304 96.171-33.792 142.421 0.043 76.331 26.411 145.92 70.955 200.917 28.629 35.371 64.768 64.725 106.24 85.76 46.592 23.552 96.085 34.304 142.336 33.792h19.456c83.712-4.565 158.037-41.003 212.011-97.152 51.285-53.376 84.139-124.416 89.003-202.795z\"/></svg>',\n commentClose:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\"><path transform=\"translate(0, 960) scale(1, -1)\" d=\"M810 664.667l-238-238 238-238-60-60-238 238-238-238-60 60 238 238-238 238 60 60 238-238 238 238z\"/></svg>',\n} as const;\n\nexport const thumbnailDefaultIcons = {\n toggleThumbnails:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\" fill=\"currentColor\"><path transform=\"translate(0, 960) scale(1, -1)\" d=\"M682 84.667v172h172v-172h-172zM682 340.667v172h172v-172h-172zM426 596.667v172h172v-172h-172zM682 768.667h172v-172h-172v172zM426 340.667v172h172v-172h-172zM170 340.667v172h172v-172h-172zM170 84.667v172h172v-172h-172zM426 84.667v172h172v-172h-172zM170 596.667v172h172v-172h-172z\"/></svg>',\n} as const;\n","/**\n * Zoom math for the zoom plugin, ported from the 2.x zoom\n * plugin's scale/position logic as pure functions: scale stepping and\n * clamping, actual-size scale, point-anchored zooming, pinch scale and\n * pan bounds. The React plugin writes the resulting transforms to the DOM.\n */\n\nexport interface ZoomPan {\n x: number;\n y: number;\n}\n\nexport interface PanBounds {\n maxX: number;\n maxY: number;\n}\n\n/**\n * How far a zoomed image may pan before its edge would detach from the\n * container edge. At scale <= 1 the image cannot pan at all.\n */\nexport function getPanBounds(\n imageWidth: number,\n imageHeight: number,\n containerWidth: number,\n containerHeight: number,\n scale: number,\n): PanBounds {\n return {\n maxX: Math.max(0, (imageWidth * scale - containerWidth) / 2),\n maxY: Math.max(0, (imageHeight * scale - containerHeight) / 2),\n };\n}\n\nexport function clampPan(pan: ZoomPan, bounds: PanBounds): ZoomPan {\n return {\n x: Math.min(Math.max(pan.x, -bounds.maxX), bounds.maxX),\n y: Math.min(Math.max(pan.y, -bounds.maxY), bounds.maxY),\n };\n}\n\n/**\n * Scale at which the image renders at its natural pixel size (2.x\n * `getCurrentImageActualSizeScale`, with its `|| 2` fallback).\n */\nexport function getActualSizeScale(\n naturalWidth: number,\n renderedWidth: number,\n): number {\n if (!renderedWidth) {\n return 2;\n }\n return naturalWidth / renderedWidth || 2;\n}\n\n/** Clamp a target scale: never below 1; capped unless `infiniteZoom`. */\nexport function clampScale(\n scale: number,\n maxScale: number,\n infiniteZoom: boolean,\n): number {\n if (scale < 1) {\n return 1;\n }\n if (!infiniteZoom && scale > maxScale) {\n return maxScale;\n }\n return scale;\n}\n\n/**\n * Pan that keeps the given point (relative to the container center)\n * anchored while the scale changes — used for double-click/tap zoom and\n * pinch focal points.\n */\nexport function getPointZoomPan(\n point: ZoomPan,\n prevPan: ZoomPan,\n prevScale: number,\n newScale: number,\n): ZoomPan {\n const ratio = newScale / prevScale;\n return {\n x: point.x - (point.x - prevPan.x) * ratio,\n y: point.y - (point.y - prevPan.y) * ratio,\n };\n}\n\n/**\n * Stage-aware pan clamp. X is symmetric. The pan-up floor on Y extends\n * past the content box by `stageBottomExtra` — the components strip\n * (thumbnails + caption) vacates when zoomed, so the visible stage\n * reaches the SCREEN bottom and the image may ride up until its bottom\n * edge meets it; a plain symmetric clamp would strand a strip-height\n * gap of black. Inversion-guarded (min against +maxY) for images\n * taller than the content box but shorter than the full stage.\n */\nexport function clampPanToStage(\n pan: ZoomPan,\n bounds: PanBounds,\n stageBottomExtra: number,\n): ZoomPan {\n const floorY = Math.min(-bounds.maxY + stageBottomExtra, bounds.maxY);\n return {\n x: Math.min(Math.max(pan.x, -bounds.maxX), bounds.maxX),\n y: Math.min(Math.max(pan.y, floorY), bounds.maxY),\n };\n}\n\n/**\n * Pan during a pinch: the focal zoom projection translated by the\n * midpoint's travel — the image point between the fingers stays\n * between the fingers wherever they go (iOS fused\n * zoom-and-pan; two fingers moving together pan without zooming).\n */\nexport function getPinchPan(\n currentMid: ZoomPan,\n startMid: ZoomPan,\n startPan: ZoomPan,\n startScale: number,\n scale: number,\n): ZoomPan {\n const projected = getPointZoomPan(startMid, startPan, startScale, scale);\n return {\n x: projected.x + (currentMid.x - startMid.x),\n y: projected.y + (currentMid.y - startMid.y),\n };\n}\n\n/** Distance between two pointers (pinch measurement). */\nexport function getPointerDistance(\n a: { x: number; y: number },\n b: { x: number; y: number },\n): number {\n return Math.sqrt(\n (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y),\n );\n}\n\n/**\n * Continuous resistance below fit scale — replaces the 2.x hard 0.5\n * floor: past the boundary the scale keeps moving at 15% per unit.\n */\nexport const PINCH_UNDER_FRICTION = 0.15;\n\n/**\n * Very stiff resistance beyond actual size instead of a hard stop;\n * the release spring lands back inside bounds. `infiniteZoom` disables\n * this boundary entirely.\n */\nexport const PINCH_OVER_FRICTION = 0.05;\n\n/**\n * Scale during a pinch: proportional to the distance ratio, with\n * friction (not clamps) at both boundaries. When pinch-to-close is\n * armed, the under-fit squeeze is free — the shrink IS the close\n * affordance; the release verdict is {@link shouldCloseOnPinch}.\n */\nexport function getPinchScale(\n startDistance: number,\n currentDistance: number,\n startScale: number,\n maxScale: number,\n infiniteZoom: boolean,\n pinchToCloseArmed = false,\n): number {\n if (startDistance <= 0) {\n return startScale;\n }\n let scale = (currentDistance / startDistance) * startScale;\n if (scale < 1 && !pinchToCloseArmed) {\n scale = 1 + (scale - 1) * PINCH_UNDER_FRICTION;\n }\n const cap = Math.max(maxScale, 1);\n if (!infiniteZoom && scale > cap) {\n scale = cap + (scale - cap) * PINCH_OVER_FRICTION;\n }\n return scale;\n}\n\n/**\n * Pinch-to-close verdict (iOS Photos signature): a pinch released\n * below fit closes ONLY when the whole gesture stayed at or under fit\n * — an over-then-under pinch is a zoom correction, not a dismissal.\n * `maxGestureScale` is the largest scale seen since the pinch started\n * (seeded with the start scale).\n */\nexport function shouldCloseOnPinch(input: {\n scale: number;\n maxGestureScale: number;\n pinchToClose: boolean;\n closable: boolean;\n}): boolean {\n return (\n input.pinchToClose &&\n input.closable &&\n input.scale < 1 &&\n input.maxGestureScale <= 1\n );\n}\n","/**\n * Responsive image selection + decode gating (plan: responsive loading).\n *\n * The browser already picks a candidate natively when the runtimes render\n * `<picture>`/`srcset` — these helpers exist for the places that need the\n * DECISION as data: preload warming at the right resolution, tooling, and\n * the framework image-component recipes. The algorithm mirrors the HTML\n * spec's srcset selection closely enough to be deterministic and\n * unit-testable: parse candidates, derive the slot width from `sizes`,\n * scale by DPR, pick the smallest candidate that covers the target\n * (falling back to the largest available).\n */\n\nimport type { GalleryItem, ImageSources } from './items';\nimport { parseImageSize } from './origin';\n\nexport interface SrcsetCandidate {\n url: string;\n /** Width descriptor (`640w`) in px, if given. */\n width?: number;\n /** Density descriptor (`2x`), if given; bare candidates read as 1x. */\n density?: number;\n}\n\nexport interface Viewport {\n width: number;\n height: number;\n /** devicePixelRatio; defaults to 1. */\n dpr?: number;\n}\n\n/** Parse a `srcset` attribute string into candidates. Malformed entries\n * are skipped rather than thrown — item data is author-provided. */\nexport function parseSrcset(srcset: string | undefined): SrcsetCandidate[] {\n const candidates: SrcsetCandidate[] = [];\n if (typeof srcset !== 'string') {\n return candidates;\n }\n for (const entry of srcset.split(',')) {\n const parts = entry.trim().split(/\\s+/);\n const url = parts[0];\n if (!url) {\n continue;\n }\n const descriptor = parts[1];\n if (!descriptor) {\n candidates.push({ url, density: 1 });\n continue;\n }\n const value = parseFloat(descriptor);\n if (Number.isNaN(value) || value <= 0) {\n continue;\n }\n if (descriptor.endsWith('w')) {\n candidates.push({ url, width: value });\n } else if (descriptor.endsWith('x')) {\n candidates.push({ url, density: value });\n }\n }\n return candidates;\n}\n\n/**\n * Effective slot width (px) from a `sizes` attribute for a viewport.\n * Supports the common authored forms deterministically: comma-separated\n * `(min-width: Npx) <len>` / `(max-width: Npx) <len>` clauses with a\n * bare `<len>` default, where `<len>` is `px` or `vw`. The first\n * matching clause wins (spec order). Unsupported conditions are skipped;\n * no match falls back to the full viewport width (`100vw`, the spec\n * default).\n */\nexport function resolveSizes(\n sizes: string | undefined,\n viewportWidth: number,\n): number {\n if (!sizes) {\n return viewportWidth;\n }\n const toLength = (raw: string): number | null => {\n const value = parseFloat(raw);\n if (Number.isNaN(value)) {\n return null;\n }\n if (raw.endsWith('vw')) {\n return (value / 100) * viewportWidth;\n }\n if (raw.endsWith('px')) {\n return value;\n }\n return null;\n };\n for (const clause of sizes.split(',')) {\n const trimmed = clause.trim();\n if (!trimmed) {\n continue;\n }\n const condition = /^\\((min|max)-width:\\s*([\\d.]+)px\\)\\s+(\\S+)$/.exec(\n trimmed,\n );\n if (condition) {\n const bound = parseFloat(condition[2]!);\n const matches =\n condition[1] === 'min'\n ? viewportWidth >= bound\n : viewportWidth <= bound;\n if (!matches) {\n continue;\n }\n const length = toLength(condition[3]!);\n if (length !== null) {\n return length;\n }\n continue;\n }\n // Bare default clause (no condition).\n if (!trimmed.startsWith('(')) {\n const length = toLength(trimmed);\n if (length !== null) {\n return length;\n }\n }\n }\n return viewportWidth;\n}\n\n/** Whether a `<source media>` condition matches the viewport. Same\n * deterministic subset as {@link resolveSizes}: min/max-width in px;\n * unsupported conditions read as NOT matching. Absent media matches. */\nexport function matchesMedia(\n media: string | undefined,\n viewport: Viewport,\n): boolean {\n if (!media) {\n return true;\n }\n const condition = /^\\(\\s*(min|max)-width:\\s*([\\d.]+)px\\s*\\)$/.exec(\n media.trim(),\n );\n if (!condition) {\n return false;\n }\n const bound = parseFloat(condition[2]!);\n return condition[1] === 'min'\n ? viewport.width >= bound\n : viewport.width <= bound;\n}\n\nfunction pickFromCandidates(\n candidates: SrcsetCandidate[],\n slotWidth: number,\n dpr: number,\n): SrcsetCandidate | null {\n if (!candidates.length) {\n return null;\n }\n const widthCandidates = candidates\n .filter((c) => c.width !== undefined)\n .sort((a, b) => a.width! - b.width!);\n if (widthCandidates.length) {\n const target = slotWidth * dpr;\n return (\n widthCandidates.find((c) => c.width! >= target) ??\n widthCandidates[widthCandidates.length - 1]!\n );\n }\n const densityCandidates = [...candidates].sort(\n (a, b) => (a.density ?? 1) - (b.density ?? 1),\n );\n return (\n densityCandidates.find((c) => (c.density ?? 1) >= dpr) ??\n densityCandidates[densityCandidates.length - 1]!\n );\n}\n\nexport interface ResolvedImageSource {\n src: string;\n /** Intrinsic width (px) when the winning candidate declared one. */\n width?: number;\n /** The `<source>` entry that won, when selection went through\n * `sources` (picture semantics) rather than the item srcset. */\n source?: ImageSources;\n}\n\n/**\n * Deterministically resolve which image URL a viewport displays for an\n * item, mirroring picture/srcset semantics: the first matching\n * `sources[]` entry wins (spec order), then the item-level\n * `srcset`/`sizes`, then plain `src`. Returns null for items with no\n * image source at all.\n */\nexport function resolveImageSource(\n item: Pick<GalleryItem, 'src' | 'srcset' | 'sizes' | 'sources'>,\n viewport: Viewport,\n): ResolvedImageSource | null {\n const dpr = viewport.dpr && viewport.dpr > 0 ? viewport.dpr : 1;\n for (const source of item.sources ?? []) {\n if (!matchesMedia(source.media, viewport)) {\n continue;\n }\n const picked = pickFromCandidates(\n parseSrcset(source.srcset),\n resolveSizes(source.sizes, viewport.width),\n dpr,\n );\n if (picked) {\n return { src: picked.url, width: picked.width, source };\n }\n }\n if (item.srcset) {\n const picked = pickFromCandidates(\n parseSrcset(item.srcset),\n resolveSizes(item.sizes, viewport.width),\n dpr,\n );\n if (picked) {\n return { src: picked.url, width: picked.width };\n }\n }\n return item.src ? { src: item.src } : null;\n}\n\n/**\n * The width \"actual size\" zoom refers to. `img.naturalWidth` LIES under\n * `srcset`/`sizes`: w-descriptor selection density-corrects the\n * intrinsic size to roughly the layout slot — on phones that collapses\n * the actual-size scale to ~1 and kills double-tap/pinch zoom. The\n * resolution order mirrors what the item DECLARES before trusting the\n * element: explicit `width` (2.x `data-width`), the largest candidate\n * the srcset ladder can serve (first matching `sources[]` entry per\n * picture semantics, else the item srcset), the `lgSize` natural dims,\n * and only then the reported natural width. The declared tiers are what\n * make optimizer components (next/image, NuxtImg, NgOptimizedImage) —\n * which manage their own srcset — zoomable to full resolution.\n */\nexport function getActualSizeWidth(\n item: Pick<GalleryItem, 'width' | 'srcset' | 'sources' | 'lgSize'>,\n viewport: Viewport,\n naturalWidth: number,\n): number {\n if (item.width) {\n const declared = parseFloat(item.width);\n if (!Number.isNaN(declared) && declared > 0) {\n return declared;\n }\n }\n let candidates: SrcsetCandidate[] = [];\n // Author data: a runtime may hand over `sources` before it has been\n // normalised (a raw `data-sources` JSON string) — never iterate that.\n const sources = Array.isArray(item.sources) ? item.sources : [];\n for (const source of sources) {\n if (matchesMedia(source.media, viewport)) {\n candidates = parseSrcset(source.srcset);\n break;\n }\n }\n if (!candidates.length && item.srcset) {\n candidates = parseSrcset(item.srcset);\n }\n const widths = candidates\n .map((candidate) => candidate.width)\n .filter((width): width is number => width !== undefined);\n if (widths.length) {\n return Math.max(...widths);\n }\n const natural = parseImageSize(item.lgSize, viewport.width);\n if (natural && natural.width > 0) {\n return natural.width;\n }\n return naturalWidth;\n}\n\n/**\n * How long a slide waits on `img.decode()` before completing anyway —\n * the gate must never strand a slide on a browser that rejects or\n * stalls decode (huge images evict decoded data; some UAs reject on\n * detached nodes).\n */\nexport const DECODE_TIMEOUT_MS = 500;\n\n/**\n * Decode gate: resolve when the image is safe to paint — after\n * `decode()` settles (success OR rejection; rejection still means the\n * data arrived) or after the timeout, whichever is first. Browsers\n * without `decode()` resolve immediately (the load event already\n * fired). Never rejects.\n */\nexport function awaitDecode(\n img: { decode?: () => Promise<void> },\n timeoutMs: number = DECODE_TIMEOUT_MS,\n): Promise<void> {\n if (typeof img.decode !== 'function') {\n return Promise.resolve();\n }\n return new Promise((resolve) => {\n let done = false;\n const finish = () => {\n if (!done) {\n done = true;\n clearTimeout(timer);\n resolve();\n }\n };\n const timer = setTimeout(finish, timeoutMs);\n img.decode!().then(finish, finish);\n });\n}\n","/**\n * Rolling-window velocity tracking. Release decisions must read the\n * velocity of the gesture's final instant, not its whole-gesture\n * average: a drag that pauses and then flicks reads fast, and a drag\n * that ends resting reads zero. Sessions push a sample per move; the\n * release reads the window ending at the release timestamp.\n */\n\nexport interface VelocitySample {\n x: number;\n y: number;\n /** Timestamp in ms (same clock as the release read). */\n t: number;\n}\n\nexport interface Velocity {\n /** px/ms, signed. */\n x: number;\n y: number;\n}\n\n/** How far back a release looks when reading the gesture velocity. */\nexport const VELOCITY_WINDOW_MS = 100;\n\n/** Below this displacement (px) an axis reads as at rest. */\nconst MIN_DISPLACEMENT = 1;\n\n/** Below this span (ms) the window cannot measure reliably. */\nconst MIN_WINDOW_SPAN_MS = 5;\n\n/**\n * Append a sample, pruning everything older than the window — the\n * buffer stays a handful of entries regardless of gesture length.\n */\nexport function pushVelocitySample(\n samples: readonly VelocitySample[],\n sample: VelocitySample,\n windowMs: number = VELOCITY_WINDOW_MS,\n): VelocitySample[] {\n return [...samples.filter((s) => sample.t - s.t <= windowMs), sample];\n}\n\n/**\n * Velocity (px/ms per axis) over the samples inside the window ending\n * at `releaseTime`. Fewer than two recent samples — the finger rested\n * before lifting — reads as zero, as does sub-pixel drift.\n */\nexport function getWindowedVelocity(\n samples: readonly VelocitySample[],\n releaseTime: number,\n windowMs: number = VELOCITY_WINDOW_MS,\n): Velocity {\n const recent = samples.filter((s) => releaseTime - s.t <= windowMs);\n if (recent.length < 2) {\n return { x: 0, y: 0 };\n }\n const first = recent[0]!;\n const last = recent[recent.length - 1]!;\n const dt = last.t - first.t;\n if (dt < MIN_WINDOW_SPAN_MS) {\n return { x: 0, y: 0 };\n }\n const dx = last.x - first.x;\n const dy = last.y - first.y;\n return {\n x: Math.abs(dx) > MIN_DISPLACEMENT ? dx / dt : 0,\n y: Math.abs(dy) > MIN_DISPLACEMENT ? dy / dt : 0,\n };\n}\n","/**\n * Typed per-plugin state slices (ADR 0001 §5). Framework layers hold these\n * in their own reactivity; the shapes and transitions live here so plugin\n * behavior matches across frameworks.\n */\n\nimport { clampScale, type ZoomPan } from './zoom-math';\n\nexport interface ZoomSlice {\n scale: number;\n pan: ZoomPan;\n zoomed: boolean;\n}\n\nexport const initialZoomSlice: ZoomSlice = {\n scale: 1,\n pan: { x: 0, y: 0 },\n zoomed: false,\n};\n\n/** Per-slide rotate/flip state (rotate plugin). */\nexport interface RotateSlice {\n /** Rotation in degrees (multiples of 90, may run negative). */\n rotate: number;\n /** 1 or -1. */\n flipHorizontal: number;\n /** 1 or -1. */\n flipVertical: number;\n}\n\nexport const initialRotateSlice: RotateSlice = {\n rotate: 0,\n flipHorizontal: 1,\n flipVertical: 1,\n};\n\nexport function rotateLeft(slice: RotateSlice): RotateSlice {\n return { ...slice, rotate: slice.rotate - 90 };\n}\n\nexport function rotateRight(slice: RotateSlice): RotateSlice {\n return { ...slice, rotate: slice.rotate + 90 };\n}\n\n/**\n * Which flip axis a horizontal/vertical flip actually toggles: at 90°/270°\n * the visual axes swap (2.x `getCurrentRotation` check).\n */\nfunction resolveFlipAxis(\n slice: RotateSlice,\n axis: 'flipHorizontal' | 'flipVertical',\n): 'flipHorizontal' | 'flipVertical' {\n const normalized = ((slice.rotate % 360) + 360) % 360;\n if (normalized === 90 || normalized === 270) {\n return axis === 'flipHorizontal' ? 'flipVertical' : 'flipHorizontal';\n }\n return axis;\n}\n\nexport function flipHorizontal(slice: RotateSlice): RotateSlice {\n const axis = resolveFlipAxis(slice, 'flipHorizontal');\n return { ...slice, [axis]: slice[axis] * -1 };\n}\n\nexport function flipVertical(slice: RotateSlice): RotateSlice {\n const axis = resolveFlipAxis(slice, 'flipVertical');\n return { ...slice, [axis]: slice[axis] * -1 };\n}\n\n/** Whether the slice's rotation swaps the image's visual axes (90°/270°). */\nexport function isOrientationSwapped(slice: RotateSlice): boolean {\n const normalized = ((slice.rotate % 360) + 360) % 360;\n return normalized === 90 || normalized === 270;\n}\n\n/**\n * Scale that refits a rotated image into its stage. At 90°/270° the\n * image's rendered width runs vertically (and vice versa), so the fit is\n * computed against the swapped axes; capped at 1 — rotation never\n * upscales. At 0°/180° (and with degenerate dimensions) the image already\n * fits the way it was laid out: scale 1.\n */\nexport function getRotateFitScale(\n imageWidth: number,\n imageHeight: number,\n stageWidth: number,\n stageHeight: number,\n slice: RotateSlice,\n): number {\n if (\n !isOrientationSwapped(slice) ||\n imageWidth <= 0 ||\n imageHeight <= 0 ||\n stageWidth <= 0 ||\n stageHeight <= 0\n ) {\n return 1;\n }\n return Math.min(stageWidth / imageHeight, stageHeight / imageWidth, 1);\n}\n\n/**\n * CSS transform for a rotate slice (2.x `applyStyles`), with the fit\n * scale folded into the same transform so rotate + refit animate as one\n * motion. `fitScale` defaults to 1 (the 2.x output, byte-identical).\n */\nexport function getRotateTransform(\n slice: RotateSlice,\n fitScale: number = 1,\n): string {\n return `rotate(${slice.rotate}deg) scale3d(${\n slice.flipHorizontal * fitScale\n }, ${slice.flipVertical * fitScale}, 1)`;\n}\n\n/**\n * Visual footprint of an image sitting inside the rotate wrapper.\n * Layout offsets ignore CSS transforms, so pan-bounds math fed by\n * them sees the unrotated box: at 90°/270° the rendered width runs\n * along the layout height (and vice versa), and the folded-in fit\n * scale shrinks both axes. `transform` is the wrapper's inline style\n * (`getRotateTransform` output); absent or unparseable input reads\n * as unrotated.\n */\nexport function getRotatedVisualSize(\n width: number,\n height: number,\n transform: string | null | undefined,\n): { width: number; height: number } {\n if (!transform) {\n return { width, height };\n }\n const rotate = /rotate\\((-?\\d+(?:\\.\\d+)?)deg\\)/.exec(transform);\n const scale = /scale3d\\((-?\\d+(?:\\.\\d+)?)/.exec(transform);\n const fit = scale?.[1] ? Math.abs(parseFloat(scale[1])) : 1;\n const degrees = rotate?.[1] ? parseFloat(rotate[1]) : 0;\n const normalized = ((degrees % 360) + 360) % 360;\n return normalized === 90 || normalized === 270\n ? { width: height * fit, height: width * fit }\n : { width: width * fit, height: height * fit };\n}\n\n/** Autoplay run-state (autoplay plugin). */\nexport interface AutoplaySlice {\n running: boolean;\n pausedOnDrag: boolean;\n pausedOnSlideChange: boolean;\n}\n\nexport const initialAutoplaySlice: AutoplaySlice = {\n running: false,\n pausedOnDrag: false,\n pausedOnSlideChange: false,\n};\n\n/** Commit a zoom change; scale 1 always recenters (2.x behavior). */\nexport function applyZoom(\n _slice: ZoomSlice,\n scale: number,\n pan: ZoomPan,\n maxScale: number,\n infiniteZoom: boolean,\n): ZoomSlice {\n const clamped = clampScale(scale, maxScale, infiniteZoom);\n if (clamped === 1) {\n return initialZoomSlice;\n }\n return { scale: clamped, pan, zoomed: true };\n}\n","import {\n isSpringSettled,\n stepSpring,\n type SpringConfig,\n type SpringState,\n} from '@lightgallery/headless';\n\n/**\n * rAF driver for the shared spring math: advances one spring per track\n * each frame and hands the values to the caller's DOM writer. The math\n * (and therefore the feel) lives in @lightgallery/headless; this file\n * only owns scheduling.\n */\n\nexport interface SpringTrack extends SpringConfig {\n from: number;\n /** Seed velocity, px/ms, the gesture's windowed release velocity. */\n velocity: number;\n target: number;\n}\n\n/** Frame gap clamp so a background-tab pause cannot teleport a spring. */\nconst MAX_FRAME_MS = 64;\n\nexport function runSprings(\n tracks: SpringTrack[],\n onFrame: (values: number[]) => void,\n onDone?: () => void,\n): () => void {\n let raf = 0;\n let last = Date.now();\n const states: SpringState[] = tracks.map((t) => ({\n position: t.from,\n velocity: t.velocity,\n }));\n const frame = () => {\n // Date.now over the rAF timestamp: one clock for seeding and\n // stepping (and the one fake timers drive in tests). Clamp into\n // [0, MAX]: a paused tab cannot teleport the spring and a\n // non-monotonic reading cannot blow it up (negative dt turns\n // the decay exponential).\n const now = Date.now();\n const dt = Math.min(Math.max(now - last, 0), MAX_FRAME_MS);\n last = now;\n let settled = true;\n tracks.forEach((t, i) => {\n states[i] = stepSpring(states[i], t.target, dt, t);\n if (!isSpringSettled(states[i], t.target)) {\n settled = false;\n }\n });\n if (settled) {\n onFrame(tracks.map((t) => t.target));\n onDone?.();\n return;\n }\n onFrame(states.map((s) => s.position));\n raf = requestAnimationFrame(frame);\n };\n raf = requestAnimationFrame(frame);\n return () => cancelAnimationFrame(raf);\n}\n","export interface ActualSizeIcons {\n zoomIn: 'lg-zoom-in' | 'lg-actual-size';\n zoomOut: 'lg-zoom-out' | 'lg-actual-size';\n}\n\nexport interface ZoomStrings {\n zoomIn: string;\n zoomOut: string;\n viewActualSize: string;\n}\n\nexport interface ZoomSettings {\n /**\n * Value of zoom should be incremented/decremented\n */\n scale: number;\n\n /**\n * Enable/Disable zoom option\n */\n zoom: boolean;\n\n /**\n * Enable/Disable infinite zoom\n * @description If you set this to true, you can zoom in more than the original size of the image.\n */\n infiniteZoom: boolean;\n\n /**\n * Enable actual size icon.\n */\n actualSize: boolean;\n\n /**\n * Once the slide transition is completed, how much time should take zoom plugin to activate\n * @description Some css styles will be added to the images if zoom is enabled.\n * So it might conflict if you add any custom styles to the images such as the initial transition while opening the gallery.\n * So you can delay adding zoom related styles to the images by changing the value of enableZoomAfter.\n */\n enableZoomAfter: number;\n\n /**\n * Show zoom in, zoom out icons\n */\n showZoomInOutIcons: boolean;\n\n /**\n * Actual size icons classnames.\n * Specify classnames for both ZoomIn and ZoomOut states\n * You can use `actualSizeIcons: { zoomIn: 'lg-actual-size', zoomOut: 'lg-zoom-out' }`\n * to show actual size icons instead of zoom in and zoom out icons.\n */\n actualSizeIcons: ActualSizeIcons;\n\n /**\n * Custom translation strings for aria-labels\n * @deprecated Set these labels on the core `strings` object instead,\n * every user-facing string lives in that one contract. An explicitly set\n * key here still wins (alias).\n */\n zoomPluginStrings?: Partial<ZoomStrings>;\n}\n\nexport const zoomSettings: ZoomSettings = {\n scale: 1,\n zoom: true,\n infiniteZoom: true,\n actualSize: true,\n showZoomInOutIcons: false,\n actualSizeIcons: {\n zoomIn: 'lg-zoom-in',\n zoomOut: 'lg-zoom-out',\n } as ActualSizeIcons,\n enableZoomAfter: 300,\n};\n","import { LightGallery } from './lightgallery';\nimport { VideoSource } from './plugins/video/types';\n\n/**\n * List of lightGallery events\n * All events should be documented here\n * Below interfaces are used to build the website documentations\n * */\nexport const lGEvents: {\n [key: string]: string;\n} = {\n afterAppendSlide: 'lgAfterAppendSlide',\n init: 'lgInit',\n hasVideo: 'lgHasVideo',\n containerResize: 'lgContainerResize',\n updateSlides: 'lgUpdateSlides',\n afterAppendSubHtml: 'lgAfterAppendSubHtml',\n beforeOpen: 'lgBeforeOpen',\n afterOpen: 'lgAfterOpen',\n slideItemLoad: 'lgSlideItemLoad',\n beforeSlide: 'lgBeforeSlide',\n afterSlide: 'lgAfterSlide',\n posterClick: 'lgPosterClick',\n dragStart: 'lgDragStart',\n dragMove: 'lgDragMove',\n dragEnd: 'lgDragEnd',\n beforeNextSlide: 'lgBeforeNextSlide',\n beforePrevSlide: 'lgBeforePrevSlide',\n beforeClose: 'lgBeforeClose',\n afterClose: 'lgAfterClose',\n rotateLeft: 'lgRotateLeft',\n rotateRight: 'lgRotateRight',\n flipHorizontal: 'lgFlipHorizontal',\n flipVertical: 'lgFlipVertical',\n autoplay: 'lgAutoplay',\n autoplayStart: 'lgAutoplayStart',\n autoplayStop: 'lgAutoplayStop',\n};\n\n// Follow the below format for the event documentation\n// @method is the method name when event is used with Angular/React components\n\n/**\n * Fired only once when lightGallery is initialized\n * @name lgInit\n * @method onInit\n * @example\n * const lg = document.getElementById('custom-events-demo');\n * // Perform any action on lightGallery initialization.\n * // Init event returns the plugin instance that can be used to call any lightGalley public method\n * let pluginInstance = null;\n * lg.addEventListener('lgInit', (event) => {\n * pluginInstance = event.detail.instance;\n * });\n * lightGallery(lg);\n * @see <a href=\"/docs/methods/\">Methods</a>\n */\nexport interface InitDetail {\n /**\n * lightGallery plugin instance\n */\n instance: LightGallery;\n}\n\n/**\n * Fired when the slide content has been inserted into it's slide container.\n * @name lgAfterAppendSlide\n * @method onAfterAppendSlide\n */\nexport interface AfterAppendSlideEventDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired immediately before opening the gallery\n * @name lgBeforeOpen\n * @method onBeforeOpen\n */\nexport interface BeforeOpenDetail {}\n\n/**\n * Fired immediately after opening the gallery\n * @name lgAfterOpen\n * @method onAfterOpen\n */\nexport interface AfterOpenDetail {}\n\n/**\n * Fired once the media inside the slide has been completely loaded .\n * @name lgSlideItemLoad\n * @method onSlideItemLoad\n */\nexport interface SlideItemLoadDetail {\n /**\n * Index of the slide\n */\n index: number;\n /**\n * For the first slide, lightGallery adds some delay for displaying the loaded slide item.\n * This delay is required for the transition effect when the slide item is displayed\n * Respect the delay when you use this event\n */\n delay: number;\n\n // Will be true for the first slide\n isFirstSlide: boolean;\n}\n\n/**\n * Fired immediately before each slide transition.\n * @name lgBeforeSlide\n * @method onBeforeSlide\n * @example\n * const lg = document.getElementById('custom-events-demo');\n * // Perform any action before each slide transition\n * lg.addEventListener('lgBeforeSlide', (event) => {\n * const { index, prevIndex } = event.detail;\n * alert(index, prevIndex);\n * });\n * lightGallery(lg);\n */\nexport interface BeforeSlideDetail {\n /**\n * Index of the previous slide\n */\n prevIndex: number;\n /**\n * Index of the slide\n */\n index: number;\n /**\n * true if slide function called via touch event or mouse drag\n */\n fromTouch: boolean;\n /**\n * true if slide function called via thumbnail click\n */\n fromThumb: boolean;\n}\n\n/**\n * Fired immediately after each slide transition.\n * @name lgAfterSlide\n * @method onAfterSlide\n */\nexport interface AfterSlideDetail {\n /**\n * Index of the previous slide\n */\n prevIndex: number;\n /**\n * Index of the slide\n */\n index: number;\n /**\n * true if slide function called via touch event or mouse drag\n */\n fromTouch: boolean;\n /**\n * true if slide function called via thumbnail click\n */\n fromThumb: boolean;\n}\n\n/**\n * Fired when the video poster is clicked.\n * @name lgPosterClick\n * @method onPosterClick\n */\nexport interface PosterClickDetail {}\n\n/**\n * Fired when the drag event to move to different slide starts.\n * @name lgDragStart\n * @method onDragStart\n */\nexport interface DragStartDetail {}\n\n/**\n * Fired periodically during the drag operation.\n * @name lgDragMove\n * @method onDragMove\n */\nexport interface DragMoveDetail {}\n\n/**\n * Fired when the user has finished the drag operation\n * @name lgDragEnd\n * @method onDragEnd\n */\nexport interface DragEndDetail {}\n\n/**\n * Fired immediately before the start of the close process.\n * @name lgBeforeClose\n * @method onBeforeClose\n */\nexport interface BeforeCloseDetail {}\n\n/**\n * Fired immediately once lightGallery is closed.\n * @name lgAfterClose\n * @method onAfterClose\n */\nexport interface AfterCloseDetail {\n /**\n * lightGallery plugin instance\n */\n instance: LightGallery;\n}\n\n/**\n * Fired immediately before each \"next\" slide transition\n * @name lgBeforeNextSlide\n * @method onBeforeNextSlide\n */\nexport interface BeforeNextSlideDetail {\n /**\n * Index of the slide\n */\n index: number;\n /**\n * true if slide function called via touch event or mouse drag\n */\n fromTouch: boolean;\n}\n\n/**\n * Fired immediately before each \"prev\" slide transition\n * @name lgBeforePrevSlide\n * @method onBeforePrevSlide\n */\nexport interface BeforePrevSlideDetail {\n /**\n * Index of the slide\n */\n index: number;\n /**\n * true if slide function called via touch event or mouse drag\n */\n fromTouch: boolean;\n}\n\n/**\n * Fired when the sub-html content (ex : title/ description) has been appended into the slide.\n * @name lgAfterAppendSubHtml\n * @method onAfterAppendSubHtml\n */\nexport interface AfterAppendSubHtmlDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired when the lightGallery container has been resized.\n * @name lgContainerResize\n * @method onContainerResize\n */\nexport interface ContainerResizeDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired when lightGallery detects video slide\n * @name lgHasVideo\n * @method onHasVideo\n */\nexport interface HasVideoDetail {\n /**\n * Index of the slide,\n */\n index: number;\n /**\n * Video source\n */\n src: string;\n /**\n * HTML5 video source if available\n * <p>\n HTML5 video source = source: {\n src: string;\n type: string;\n }[];\n attributes: HTMLVideoElement;\n * </p>\n */\n html5Video: VideoSource;\n /**\n * True if video has poster\n */\n hasPoster: boolean;\n}\n\n/**\n * Fired when the image is rotated in anticlockwise direction\n * @name lgRotateLeft\n * @method onRotateLeft\n */\nexport interface RotateLeftDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired when the image is rotated in clockwise direction\n * @name lgRotateRight\n * @method onRotateRight\n */\nexport interface RotateRightDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired when the image is flipped horizontally\n * @name lgFlipHorizontal\n * @method onFlipHorizontal\n */\nexport interface FlipHorizontalDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired when the image is flipped vertically\n * @name lgFlipVertical\n * @method onFlipVertical\n */\nexport interface FlipVerticalDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n","import {\n SPRING_BOUNCE_DAMPING,\n clampPanToStage,\n fitImageSize,\n getActualSizeScale as getNaturalSizeScale,\n getActualSizeWidth,\n getPanBounds,\n getPinchPan,\n getRotatedVisualSize,\n getPinchScale,\n shouldCloseOnPinch,\n getPointerDistance,\n getWindowedVelocity,\n project,\n pushVelocitySample,\n type Velocity,\n type VelocitySample,\n zoomDefaultIcons,\n} from '@lightgallery/headless';\n\nimport { runSprings } from '../../lg-spring-runner';\n\nimport { ZoomSettings, zoomSettings } from './lg-zoom-settings';\nimport { LgQuery, lgQuery } from '../../lgQuery';\nimport { LightGallery } from '../../lightgallery';\nimport { lGEvents } from '../../lg-events';\n\ninterface Coords {\n x: number;\n y: number;\n}\n\ninterface DragAllowedAxises {\n allowX: boolean;\n allowY: boolean;\n}\ninterface ZoomTouchEvent {\n pageX: number;\n touches: { pageY: number; pageX: number }[];\n pageY: number;\n}\ninterface PossibleCords {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nconst ZOOM_TRANSITION_DURATION = 500;\n\nexport default class Zoom {\n private core: LightGallery;\n private settings: ZoomSettings;\n private $LG!: LgQuery;\n private imageReset!: number | boolean;\n zoomableTimeout: any;\n positionChanged!: boolean;\n zoomInProgress!: boolean;\n pageX!: number;\n pageY!: number;\n scale!: number;\n\n containerRect!: ClientRect;\n dragAllowedAxises!: DragAllowedAxises;\n top!: number;\n left!: number;\n scrollTop!: number;\n private cancelZoomSpring?: () => void;\n constructor(instance: LightGallery, $LG: LgQuery) {\n // get lightGallery core plugin instance\n this.core = instance;\n this.$LG = $LG;\n\n this.settings = { ...zoomSettings, ...this.core.settings };\n\n return this;\n }\n\n // Append Zoom controls. Actual size, Zoom-in, Zoom-out\n buildTemplates(): void {\n // Zoom in/out and actual size repeat pinch and double-tap; touch\n // devices leave them out through mobileSettings.\n const gestureButtons = this.core.settings.showGestureButtons !== false;\n let zoomIcons =\n gestureButtons && this.settings.showZoomInOutIcons\n ? `<button id=\"${this.core.getIdName(\n 'lg-zoom-in',\n )}\" type=\"button\" aria-label=\"${\n this.settings.zoomPluginStrings?.zoomIn ??\n this.core.settings.strings.zoomIn\n }\" class=\"lg-zoom-in lg-icon\"></button><button id=\"${this.core.getIdName(\n 'lg-zoom-out',\n )}\" type=\"button\" aria-label=\"${\n this.settings.zoomPluginStrings?.zoomOut ??\n this.core.settings.strings.zoomOut\n }\" class=\"lg-zoom-out lg-icon\"></button>`\n : '';\n\n if (gestureButtons && this.settings.actualSize) {\n zoomIcons += `<button id=\"${this.core.getIdName(\n 'lg-actual-size',\n )}\" type=\"button\" aria-label=\"${\n this.settings.zoomPluginStrings?.viewActualSize ??\n this.core.settings.strings.viewActualSize\n }\" class=\"${\n this.settings.actualSizeIcons.zoomIn\n } lg-icon\"></button>`;\n }\n\n this.core.outer.addClass('lg-use-transition-for-zoom');\n\n this.core.$toolbar.first().append(zoomIcons);\n }\n\n /**\n * @desc Enable zoom option only once the image is completely loaded\n * If zoomFromOrigin is true, Zoom is enabled once the dummy image has been inserted\n *\n * Zoom styles are defined under lg-zoomable CSS class.\n */\n enableZoom(event: CustomEvent): void {\n // delay will be 0 except first time\n let _speed = this.settings.enableZoomAfter + event.detail.delay;\n\n // set _speed value 0 if gallery opened from direct url and if it is first slide\n if (\n this.$LG('body').first().hasClass('lg-from-hash') &&\n event.detail.delay\n ) {\n // will execute only once\n _speed = 0;\n } else {\n // Remove lg-from-hash to enable starting animation.\n this.$LG('body').first().removeClass('lg-from-hash');\n }\n\n this.zoomableTimeout = setTimeout(() => {\n if (!this.isImageSlide(this.core.index)) {\n return;\n }\n this.core.getSlideItem(event.detail.index).addClass('lg-zoomable');\n if (event.detail.index === this.core.index) {\n this.setZoomEssentials();\n }\n }, _speed + 30);\n }\n\n enableZoomOnSlideItemLoad(): void {\n // Add zoomable class\n this.core.LGel.on(\n `${lGEvents.slideItemLoad}.zoom`,\n this.enableZoom.bind(this),\n );\n }\n\n getDragCords(e: MouseEvent): Coords {\n return {\n x: e.pageX,\n y: e.pageY,\n };\n }\n getSwipeCords(e: TouchEvent): Coords {\n const x = e.touches[0].pageX;\n const y = e.touches[0].pageY;\n return {\n x,\n y,\n };\n }\n\n getDragAllowedAxises(scale: number, scaleDiff?: number): DragAllowedAxises {\n if (!this.containerRect) {\n return {\n allowX: false,\n allowY: false,\n };\n }\n const $image = this.core\n .getSlideItem(this.core.index)\n .find('.lg-image')\n .first()\n .get();\n\n let height = 0;\n let width = 0;\n const rect = $image.getBoundingClientRect();\n if (scale) {\n const visual = this.getVisualImageSize(\n $image,\n $image.offsetWidth,\n $image.offsetHeight,\n );\n height = visual.height * scale;\n width = visual.width * scale;\n } else if (scaleDiff) {\n height = rect.height + scaleDiff * rect.height;\n width = rect.width + scaleDiff * rect.width;\n } else if (this.core.currentImageSize) {\n // Rendered size, transform-independent: the actual-size\n // machinery rewrites the element's layout after a zoom\n // (reset-transition !important transform, natural-px swap),\n // so a rect read races it, the fitted size scaled by the\n // live zoom is stable in every mode.\n const visual = this.getVisualImageSize(\n $image,\n this.core.currentImageSize.width,\n this.core.currentImageSize.height,\n );\n height = visual.height * this.scale;\n width = visual.width * this.scale;\n } else {\n height = rect.height;\n width = rect.width;\n }\n const allowY = height > this.containerRect.height;\n const allowX = width > this.containerRect.width;\n return {\n allowX,\n allowY,\n };\n }\n\n setZoomEssentials(): void {\n this.containerRect = this.core.$content.get().getBoundingClientRect();\n }\n\n /**\n * @desc Image zoom\n * Translate the wrap and scale the image to get better user experience\n *\n * @param {String} scale - Zoom decrement/increment value\n */\n zoomImage(\n scale: number,\n scaleDiff: number,\n reposition: boolean,\n resetToMax: boolean,\n ): void {\n if (!this.containerRect || Math.abs(scaleDiff) <= 0) return;\n\n const offsetX = this.containerRect.width / 2 + this.containerRect.left;\n\n const offsetY =\n this.containerRect.height / 2 +\n this.containerRect.top +\n this.scrollTop;\n\n let originalX;\n let originalY;\n\n if (scale === 1) {\n this.positionChanged = false;\n }\n\n if (this.positionChanged) {\n // A rotate asks for a fresh origin, and the previous scale is\n // 0 on the first step out of 1: dividing by it handed pageX\n // and pageY NaN, which voids the transform string outright,\n // so the pan silently stopped tracking until something else\n // reset it. No previous scale means no previous offset.\n const previousScale = this.scale - scaleDiff;\n originalX = previousScale ? this.left / previousScale : 0;\n originalY = previousScale ? this.top / previousScale : 0;\n this.pageX = offsetX - originalX;\n this.pageY = offsetY - originalY;\n\n this.positionChanged = false;\n }\n\n let x;\n let y;\n let _x = offsetX - this.pageX;\n let _y = offsetY - this.pageY;\n\n if (scale - scaleDiff > 1) {\n const scaleVal = (scale - scaleDiff) / Math.abs(scaleDiff);\n _x =\n (scaleDiff < 0 ? -_x : _x) +\n this.left * (scaleVal + (scaleDiff < 0 ? -1 : 1));\n _y =\n (scaleDiff < 0 ? -_y : _y) +\n this.top * (scaleVal + (scaleDiff < 0 ? -1 : 1));\n x = _x / scaleVal;\n y = _y / scaleVal;\n } else {\n const scaleVal = (scale - scaleDiff) * scaleDiff;\n x = _x * scaleVal;\n y = _y * scaleVal;\n }\n\n if (reposition) {\n // Clamp with the shared bounds, the same ones the release\n // settle and every pinch run through. The local window is\n // wider than those on an axis the image barely overflows, so\n // a zoom aimed near an edge parked the image where the next\n // tap immediately yanked it back from — a wide, short image\n // zoomed near its bottom edge jumped up on the following\n // tap.\n const clamped = this.clampPinchPan({ x, y }, scale);\n x = clamped.x;\n y = clamped.y;\n }\n\n this.setZoomStyles({\n x: x,\n y: y,\n scale,\n });\n\n this.left = x;\n this.top = y;\n\n if (resetToMax) {\n this.setZoomImageSize();\n }\n }\n\n resetImageTranslate(index: number): void {\n if (!this.isImageSlide(index)) {\n return;\n }\n const $image = this.core.getSlideItem(index).find('.lg-image').first();\n this.imageReset = false;\n $image.removeClass(\n 'reset-transition reset-transition-y reset-transition-x',\n );\n this.core.outer.removeClass('lg-actual-size');\n $image.css('width', 'auto').css('height', 'auto');\n setTimeout(() => {\n $image.removeClass('no-transition');\n }, 10);\n }\n\n setZoomImageSize(delay: number = ZOOM_TRANSITION_DURATION): void {\n const $image = this.core\n .getSlideItem(this.core.index)\n .find('.lg-image')\n .first();\n\n // The natural-px swap must wait out the running zoom animation\n // (button bounce or gesture settle), firing mid-flight cuts it.\n // Both timers also stand down if a NEW gesture grabbed the image\n // meanwhile: swapping to natural px (and the reset-transition\n // !important rules) mid-pinch freezes the visible zoom and\n // corrupts the release clamp's layout measurements.\n setTimeout(() => {\n if (this.core.touchAction) {\n return;\n }\n const actualSizeScale = this.getCurrentImageActualSizeScale();\n\n if (this.scale >= actualSizeScale) {\n $image.addClass('no-transition');\n this.imageReset = true;\n }\n }, delay);\n\n setTimeout(() => {\n if (this.core.touchAction) {\n return;\n }\n const actualSizeScale = this.getCurrentImageActualSizeScale();\n\n if (this.scale >= actualSizeScale) {\n const dragAllowedAxises = this.getDragAllowedAxises(this.scale);\n\n // The natural-px swap uses the same actual-size\n // reference as the scale, `naturalWidth` is density-\n // corrected under srcset/sizes and would swap to\n // roughly the fitted size. Height follows the rendered\n // aspect ratio (ratios don't lie).\n const image = $image.get() as HTMLImageElement;\n const referenceWidth = this.getNaturalWidth(this.core.index);\n const referenceHeight =\n image.naturalWidth > 0\n ? (referenceWidth * image.naturalHeight) /\n image.naturalWidth\n : image.naturalHeight;\n $image\n .css('width', referenceWidth + 'px')\n .css('height', referenceHeight + 'px');\n\n this.core.outer.addClass('lg-actual-size');\n\n if (dragAllowedAxises.allowX && dragAllowedAxises.allowY) {\n $image.addClass('reset-transition');\n } else if (\n dragAllowedAxises.allowX &&\n !dragAllowedAxises.allowY\n ) {\n $image.addClass('reset-transition-x');\n } else if (\n !dragAllowedAxises.allowX &&\n dragAllowedAxises.allowY\n ) {\n $image.addClass('reset-transition-y');\n }\n }\n }, delay + 50);\n }\n\n /**\n * @desc apply scale3d to image and translate to image wrap\n * @param {style} X,Y and scale\n */\n setZoomStyles(style: { x: number; y: number; scale: number }): void {\n const $imageWrap = this.core\n .getSlideItem(this.core.index)\n .find('.lg-img-wrap')\n .first();\n const $image = this.core\n .getSlideItem(this.core.index)\n .find('.lg-image')\n .first();\n const $dummyImage = this.core.outer\n .find('.lg-current .lg-dummy-img')\n .first();\n this.scale = style.scale;\n $image.css(\n 'transform',\n 'scale3d(' + style.scale + ', ' + style.scale + ', 1)',\n );\n\n $dummyImage.css(\n 'transform',\n 'scale3d(' + style.scale + ', ' + style.scale + ', 1)',\n );\n\n const transform =\n 'translate3d(' + style.x + 'px, ' + style.y + 'px, 0)';\n $imageWrap.css('transform', transform);\n }\n\n /**\n * @param index - Index of the current slide\n * @param event - event will be available only if the function is called on clicking/taping the imags\n */\n setActualSize(index: number, event?: ZoomTouchEvent): void {\n if (this.zoomInProgress) {\n return;\n }\n this.zoomInProgress = true;\n const currentItem = this.core.galleryItems[this.core.index];\n this.resetImageTranslate(index);\n setTimeout(() => {\n // Allow zoom only on image\n if (\n !currentItem.src ||\n this.core.outer.hasClass('lg-first-slide-loading')\n ) {\n return;\n }\n const scale = this.getCurrentImageActualSizeScale();\n const prevScale = this.scale;\n if (this.core.outer.hasClass('lg-zoomed')) {\n this.scale = 1;\n } else {\n this.scale = this.getScale(scale);\n }\n this.setPageCords(event);\n\n this.beginZoom(this.scale);\n this.zoomImage(this.scale, this.scale - prevScale, true, true);\n }, 50);\n setTimeout(() => {\n this.core.outer.removeClass('lg-grabbing').addClass('lg-grab');\n }, 60);\n setTimeout(() => {\n this.zoomInProgress = false;\n }, ZOOM_TRANSITION_DURATION + 110);\n }\n\n getNaturalWidth(index: number): number {\n const $image = this.core.getSlideItem(index).find('.lg-image').first();\n // Declared tiers first, `img.naturalWidth` lies under\n // srcset/sizes (density-corrected to roughly the slot width;\n // actual-size zoom collapses to ~1 on phones): data-width, the\n // ladder's largest candidate, lg-size, then the element.\n return getActualSizeWidth(\n this.core.galleryItems[index],\n {\n width: window.innerWidth,\n height: window.innerHeight,\n dpr: window.devicePixelRatio,\n },\n ($image.get() as HTMLImageElement).naturalWidth,\n );\n }\n\n getActualSizeScale(naturalWidth: number, width: number): number {\n let scale;\n if (naturalWidth >= width) {\n scale = getNaturalSizeScale(naturalWidth, width);\n } else {\n // Documented deviation from the shared helper: 2.x never\n // zooms an image rendered above its natural size below the\n // fitted scale.\n scale = 1;\n }\n return scale;\n }\n\n getCurrentImageActualSizeScale(): number {\n const $image = this.core\n .getSlideItem(this.core.index)\n .find('.lg-image')\n .first();\n const image = $image.get() as HTMLImageElement;\n // The FITTED width is the stable denominator in every mode. The\n // element's offsetWidth reads the current layout, after the\n // actual-size swap that IS naturalWidth, and dividing by it\n // returns 1: settleIntoBounds would then clamp a tap on a\n // zoomed image into a full animated un-zoom back to fit.\n let width = this.core.currentImageSize?.width;\n if (!width) {\n if (this.core.outer.hasClass('lg-actual-size')) {\n // zoomFromOrigin:false, dynamic mode and items without\n // lg-size never populate currentImageSize, recompute the\n // contain-fit analytically from the stage box instead of\n // trusting the swapped element's layout.\n if (!this.containerRect) {\n this.setZoomEssentials();\n }\n // Reference dims, not the element's (density-corrected\n // under srcset, and the swap already rewrote its layout).\n const referenceWidth = this.getNaturalWidth(this.core.index);\n const referenceHeight =\n image.naturalWidth > 0\n ? (referenceWidth * image.naturalHeight) /\n image.naturalWidth\n : image.naturalHeight;\n width = fitImageSize(\n {\n width: referenceWidth,\n height: referenceHeight,\n },\n this.containerRect.width,\n this.containerRect.height,\n ).width;\n } else {\n width = image.offsetWidth;\n }\n }\n const naturalWidth = this.getNaturalWidth(this.core.index) || width;\n return this.getActualSizeScale(naturalWidth, width);\n }\n\n getPageCords(event?: ZoomTouchEvent): Coords {\n const cords: Coords = {} as Coords;\n if (event) {\n cords.x = event.pageX || event.touches[0].pageX;\n cords.y = event.pageY || event.touches[0].pageY;\n } else {\n const containerRect = this.core.$content\n .get()\n .getBoundingClientRect();\n cords.x = containerRect.width / 2 + containerRect.left;\n cords.y =\n containerRect.height / 2 + this.scrollTop + containerRect.top;\n }\n return cords;\n }\n\n setPageCords(event?: ZoomTouchEvent): void {\n const pageCords = this.getPageCords(event);\n\n this.pageX = pageCords.x;\n this.pageY = pageCords.y;\n }\n\n manageActualPixelClassNames(): void {\n const $actualSize = this.core.getElementById('lg-actual-size');\n $actualSize\n .removeClass(this.settings.actualSizeIcons.zoomIn)\n .addClass(this.settings.actualSizeIcons.zoomOut);\n }\n\n // If true, zoomed - in else zoomed out\n beginZoom(scale: number): boolean {\n this.core.outer.removeClass('lg-zoom-drag-transition lg-zoom-dragging');\n if (scale > 1) {\n this.core.outer.addClass('lg-zoomed');\n this.manageActualPixelClassNames();\n } else {\n this.resetZoom();\n }\n return scale > 1;\n }\n\n getScale(scale: number): number {\n const actualSizeScale = this.getCurrentImageActualSizeScale();\n if (scale < 1) {\n scale = 1;\n } else if (scale > actualSizeScale) {\n scale = actualSizeScale;\n }\n return scale;\n }\n\n init(): void {\n this.core.registerDefaultIcons(zoomDefaultIcons);\n if (!this.settings.zoom) {\n return;\n }\n this.buildTemplates();\n this.enableZoomOnSlideItemLoad();\n\n let tapped: ReturnType<typeof setTimeout> | null = null;\n\n this.core.outer.on('dblclick.lg', (event) => {\n if (!this.$LG(event.target).hasClass('lg-image')) {\n return;\n }\n this.setActualSize(this.core.index, event);\n });\n\n this.core.outer.on('touchstart.lg', (event) => {\n const $target = this.$LG(event.target);\n if (event.touches.length === 1 && $target.hasClass('lg-image')) {\n if (!tapped) {\n tapped = setTimeout(() => {\n tapped = null;\n }, 300);\n } else {\n clearTimeout(tapped);\n tapped = null;\n event.preventDefault();\n this.setActualSize(this.core.index, event);\n }\n }\n });\n\n this.core.LGel.on(\n `${lGEvents.containerResize}.zoom ${lGEvents.rotateRight}.zoom ${lGEvents.rotateLeft}.zoom ${lGEvents.flipHorizontal}.zoom ${lGEvents.flipVertical}.zoom`,\n () => {\n if (\n !this.core.lgOpened ||\n !this.isImageSlide(this.core.index) ||\n this.core.touchAction\n ) {\n return;\n }\n // A release spring runs with touchAction unset, left\n // running it would overwrite the reset below from its\n // next frame and finish at the OLD layout's clamp target.\n this.stopZoomSpring();\n const _LGel = this.core\n .getSlideItem(this.core.index)\n .find('.lg-img-wrap')\n .first();\n this.top = 0;\n this.left = 0;\n this.setZoomEssentials();\n this.setZoomSwipeStyles(_LGel, { x: 0, y: 0 });\n this.positionChanged = true;\n },\n );\n // Update zoom on resize and orientationchange\n this.$LG(window).on(`scroll.lg.zoom.global${this.core.lgId}`, () => {\n if (!this.core.lgOpened) return;\n this.scrollTop = this.$LG(window).scrollTop();\n });\n\n this.core.getElementById('lg-zoom-out').on('click.lg', () => {\n // Allow zoom only on image\n if (!this.isImageSlide(this.core.index)) {\n return;\n }\n\n let timeout = 0;\n if (this.imageReset) {\n this.resetImageTranslate(this.core.index);\n timeout = 50;\n }\n setTimeout(() => {\n let scale = this.scale - this.settings.scale;\n\n if (scale < 1) {\n scale = 1;\n }\n this.beginZoom(scale);\n this.zoomImage(\n scale,\n -this.settings.scale,\n true,\n !this.settings.infiniteZoom,\n );\n }, timeout);\n });\n\n this.core.getElementById('lg-zoom-in').on('click.lg', () => {\n this.zoomIn();\n });\n\n this.core.getElementById('lg-actual-size').on('click.lg', () => {\n this.setActualSize(this.core.index);\n });\n\n this.core.LGel.on(`${lGEvents.beforeOpen}.zoom`, () => {\n this.core.outer.find('.lg-item').removeClass('lg-zoomable');\n });\n this.core.LGel.on(`${lGEvents.afterOpen}.zoom`, () => {\n this.scrollTop = this.$LG(window).scrollTop();\n\n // Set the initial value center\n this.pageX = this.core.outer.width() / 2;\n this.pageY = this.core.outer.height() / 2 + this.scrollTop;\n\n this.scale = 1;\n });\n\n // Reset zoom on slide change\n this.core.LGel.on(\n `${lGEvents.afterSlide}.zoom`,\n (event: CustomEvent) => {\n const { prevIndex } = event.detail;\n this.scale = 1;\n this.positionChanged = false;\n this.zoomInProgress = false;\n this.resetZoom(prevIndex);\n this.resetImageTranslate(prevIndex);\n if (this.isImageSlide(this.core.index)) {\n this.setZoomEssentials();\n }\n },\n );\n\n // Drag option after zoom\n this.zoomDrag();\n\n this.pinchZoom();\n\n this.zoomSwipe();\n\n // Store the zoomable timeout value just to clear it while closing\n this.zoomableTimeout = false;\n this.positionChanged = false;\n this.zoomInProgress = false;\n }\n\n zoomIn(): void {\n // Allow zoom only on image\n if (!this.isImageSlide(this.core.index)) {\n return;\n }\n\n let scale = this.scale + this.settings.scale;\n\n if (!this.settings.infiniteZoom) {\n scale = this.getScale(scale);\n }\n this.beginZoom(scale);\n this.zoomImage(\n scale,\n Math.min(this.settings.scale, scale - this.scale),\n true,\n !this.settings.infiniteZoom,\n );\n }\n\n // Reset zoom effect\n resetZoom(index?: number): void {\n this.stopZoomSpring();\n this.core.outer.removeClass('lg-zoomed lg-zoom-drag-transition');\n const $actualSize = this.core.getElementById('lg-actual-size');\n const $item = this.core.getSlideItem(\n index !== undefined ? index : this.core.index,\n );\n $actualSize\n .removeClass(this.settings.actualSizeIcons.zoomOut)\n .addClass(this.settings.actualSizeIcons.zoomIn);\n $item.find('.lg-img-wrap').first().removeAttr('style');\n $item.find('.lg-image').first().removeAttr('style');\n this.scale = 1;\n this.left = 0;\n this.top = 0;\n\n // Reset pagx pagy values to center\n this.setPageCords();\n }\n\n /** Stop a running release spring; state stays at its live values. */\n stopZoomSpring(): void {\n if (this.cancelZoomSpring) {\n this.cancelZoomSpring();\n this.cancelZoomSpring = undefined;\n }\n }\n\n /**\n * Any gesture end must leave the image inside its pan bounds: a tap\n * interrupts a settling spring (stopZoomSpring at its touchstart),\n * and if it never turns into a drag nothing else re-clamps, the\n * fused pinch pan can legitimately be far outside mid-settle.\n * Springs home from wherever the interruption stopped it; a no-op\n * when already in bounds (the common tap).\n */\n settleIntoBounds(): void {\n // Absolute bounds from the transform-inclusive rendered size\n // (position-independent, the interrupted position may be far\n // out of bounds). Per axis the LEGAL ANCHOR range is\n // ±|imageSize − containerSize| / 2 whether or not the image\n // overflows: button/double-tap zooms deliberately park a\n // non-overflowing axis off-center to keep the tapped point\n // visible, and a plain tap must not recenter it. Only the\n // overflowing-Y floor is stage-aware (vacated strip).\n this.setZoomEssentials();\n const rect = this.core\n .getSlideItem(this.core.index)\n .find('.lg-image')\n .first()\n .get()\n .getBoundingClientRect();\n // The interrupted spring may also have been mid-SCALE (a pinch\n // release gliding into [1, actual size]); a stranded scale would\n // skip the actual-size machinery its completion owns. Project\n // the rendered sizes to the clamped target scale\n // (transform-invariant: rect × target / current).\n const actualSizeScale = this.getCurrentImageActualSizeScale();\n // infiniteZoom lifts the actual-size ceiling everywhere else, // a tap interrupting a glide above it must not spring the scale\n // back down to the cap.\n const targetScale = this.settings.infiniteZoom\n ? Math.max(this.scale, 1)\n : Math.min(Math.max(this.scale, 1), Math.max(actualSizeScale, 1));\n const sizeRatio = this.scale > 0 ? targetScale / this.scale : 1;\n const width = rect.width * sizeRatio;\n const height = rect.height * sizeRatio;\n const { bottom } = this.core.mediaContainerPosition;\n const halfX = Math.abs(width - this.containerRect.width) / 2;\n const halfY = Math.abs(height - this.containerRect.height) / 2;\n const floorY =\n height > this.containerRect.height\n ? Math.min(-halfY + bottom, halfY)\n : -halfY;\n const targetX = Math.min(Math.max(this.left, -halfX), halfX);\n const targetY = Math.min(Math.max(this.top, floorY), halfY);\n if (\n Math.abs(targetX - this.left) < 1 &&\n Math.abs(targetY - this.top) < 1 &&\n Math.abs(targetScale - this.scale) < 0.001\n ) {\n return;\n }\n this.core.outer.addClass('lg-zoom-drag-transition lg-zoom-dragging');\n this.stopZoomSpring();\n this.cancelZoomSpring = runSprings(\n [\n { from: this.scale, velocity: 0, target: targetScale },\n { from: this.left, velocity: 0, target: targetX },\n { from: this.top, velocity: 0, target: targetY },\n ],\n ([scale, x, y]) => {\n this.left = x!;\n this.top = y!;\n this.setZoomStyles({ x: x!, y: y!, scale: scale! });\n },\n () => {\n this.cancelZoomSpring = undefined;\n this.core.outer.removeClass(\n 'lg-zoom-dragging lg-zoom-drag-transition',\n );\n // Mirror the pinch-release completion machinery.\n if (\n targetScale > 1 &&\n targetScale >= Math.max(actualSizeScale, 1)\n ) {\n this.setZoomImageSize(0);\n }\n },\n );\n }\n\n getTouchDistance(e: TouchEvent): number {\n return getPointerDistance(\n { x: e.touches[0].pageX, y: e.touches[0].pageY },\n { x: e.touches[1].pageX, y: e.touches[1].pageY },\n );\n }\n\n /**\n * Pinch midpoint relative to the stage centre, the focal anchor the\n * whole gesture projects through.\n */\n private getPinchMidPoint(e: TouchEvent): Coords {\n const centerX = this.containerRect.width / 2 + this.containerRect.left;\n const centerY =\n this.containerRect.height / 2 +\n this.containerRect.top +\n this.scrollTop;\n return {\n x: (e.touches[0].pageX + e.touches[1].pageX) / 2 - centerX,\n y: (e.touches[0].pageY + e.touches[1].pageY) / 2 - centerY,\n };\n }\n\n /**\n * Clamp a pan into the stage-aware bounds at the given scale,\n * measured from the untransformed layout size (offset dimensions\n * ignore transforms, so this stays correct mid-gesture). Y matches\n * `getPossibleSwipeDragCords`: the vacated components strip belongs\n * to the stage, so the pan-up floor sits where the image's bottom\n * edge meets the SCREEN bottom, not the content box.\n */\n /**\n * Bounds-relevant size of the image: layout offsets swapped and\n * shrunk by the rotate plugin's wrapper transform when present,\n * at 90°/270° the visual width runs along the layout height, and\n * offsets don't see transforms.\n */\n getVisualImageSize(\n $image: HTMLElement,\n width: number,\n height: number,\n ): { width: number; height: number } {\n const rotateWrap = $image.closest<HTMLElement>('.lg-img-rotate');\n return getRotatedVisualSize(width, height, rotateWrap?.style.transform);\n }\n\n clampPinchPan(pan: Coords, scale: number): Coords {\n const $image = this.core\n .getSlideItem(this.core.index)\n .find('.lg-image')\n .first()\n .get();\n const visual = this.getVisualImageSize(\n $image,\n $image.offsetWidth,\n $image.offsetHeight,\n );\n const bounds = getPanBounds(\n visual.width,\n visual.height,\n this.containerRect.width,\n this.containerRect.height,\n scale,\n );\n return clampPanToStage(\n pan,\n bounds,\n this.core.mediaContainerPosition.bottom,\n );\n }\n\n pinchZoom(): void {\n let startDist = 0;\n let pinchStarted = false;\n let initScale = 1;\n let startMaxScale = 1;\n let startPan: Coords = { x: 0, y: 0 };\n let startMid: Coords = { x: 0, y: 0 };\n // Largest scale the gesture reached, the pinch-to-close guard\n // (an over-then-under pinch is a correction, not a dismissal).\n let maxGestureScale = 1;\n // The midpoint's live position and velocity samples: two fingers\n // moving together pan the image (fused zoom-and-pan), and the\n // release springs inherit the midpoint's momentum.\n let lastMid: Coords = { x: 0, y: 0 };\n let midSamples: VelocitySample[] = [];\n\n let $item = this.core.getSlideItem(this.core.index);\n\n this.core.outer.on('touchstart.lg', (e) => {\n $item = this.core.getSlideItem(this.core.index);\n if (!this.isImageSlide(this.core.index)) {\n return;\n }\n if (e.touches.length === 2) {\n e.preventDefault();\n if (this.core.outer.hasClass('lg-first-slide-loading')) {\n return;\n }\n this.stopZoomSpring();\n this.setZoomEssentials();\n initScale = this.scale || 1;\n startPan = { x: this.left, y: this.top };\n startMid = this.getPinchMidPoint(e);\n // Same choreography as zoomDrag/zoomSwipe: the\n // lg-zoom-dragging kill rule (0ms !important) makes the\n // transforms track the fingers 1:1 while both classes are\n // on; releasing drops only lg-zoom-dragging so the\n // lg-zoom-drag-transition settle ease animates the snap.\n this.core.outer.addClass(\n 'lg-zoom-drag-transition lg-zoom-dragging',\n );\n\n this.setPageCords(e);\n this.resetImageTranslate(this.core.index);\n // One snapshot serves the whole gesture: measured AFTER\n // the translate reset restores the fitted layout size\n // (actual-size mode renders at natural px), and the\n // fitted size cannot change mid-pinch (the resize recalc\n // stands down while touchAction is set). Live frames\n // must not pay a layout read.\n startMaxScale = this.getCurrentImageActualSizeScale();\n\n this.core.touchAction = 'pinch';\n\n startDist = this.getTouchDistance(e);\n maxGestureScale = initScale;\n lastMid = startMid;\n midSamples = [{ x: startMid.x, y: startMid.y, t: Date.now() }];\n }\n });\n\n this.core.$inner.on('touchmove.lg', (e) => {\n if (\n e.touches.length === 2 &&\n this.core.touchAction === 'pinch' &&\n (this.$LG(e.target).hasClass('lg-item') ||\n $item.get().contains(e.target))\n ) {\n e.preventDefault();\n const endDist = this.getTouchDistance(e);\n\n const distance = startDist - endDist;\n if (!pinchStarted && Math.abs(distance) > 5) {\n pinchStarted = true;\n }\n if (pinchStarted) {\n // With pinch-to-close armed (setting on, closable,\n // gesture never over fit) the under-fit squeeze is\n // free, the shrink is the close affordance;\n // otherwise it resists with friction.\n const closeArmed =\n this.core.settings.pinchToClose &&\n this.core.settings.closable &&\n maxGestureScale <= 1;\n const _scale = getPinchScale(\n startDist,\n endDist,\n initScale,\n startMaxScale,\n this.settings.infiniteZoom,\n closeArmed,\n );\n // 4-decimal precision: at 2 decimals a slow pinch\n // quantizes into visible ~16px steps on a 1600px\n // image.\n const scale =\n Math.round((_scale + Number.EPSILON) * 10000) / 10000;\n // Project from the gesture-start state so the image\n // point under the fingers stays put on every frame, // and follows the fingers: the midpoint's travel pans\n // 1:1 (fused zoom-and-pan).\n const mid = this.getPinchMidPoint(e);\n lastMid = mid;\n midSamples = pushVelocitySample(midSamples, {\n x: mid.x,\n y: mid.y,\n t: Date.now(),\n });\n const pan = getPinchPan(\n mid,\n startMid,\n startPan,\n initScale,\n scale,\n );\n // The pan stays FREE while the pinch is live, // iOS keeps the focal point glued under the fingers\n // with no bounds interference during the gesture\n // (live-clamping against scale-dependent bounds\n // reads as a drift wobble); the release spring\n // lands it inside the stage bounds.\n this.left = pan.x;\n this.top = pan.y;\n this.setZoomStyles({ x: pan.x, y: pan.y, scale });\n maxGestureScale = Math.max(maxGestureScale, scale);\n }\n }\n });\n\n this.core.$inner.on('touchend.lg', (e) => {\n if (\n this.core.touchAction === 'pinch' &&\n (this.$LG(e.target).hasClass('lg-item') ||\n $item.get().contains(e.target))\n ) {\n pinchStarted = false;\n startDist = 0;\n if (\n shouldCloseOnPinch({\n scale: this.scale,\n maxGestureScale,\n pinchToClose: this.core.settings.pinchToClose,\n closable: this.core.settings.closable,\n })\n ) {\n // Hand off from fit: the close pipeline strips zoom\n // styles synchronously (destroyModules → resetZoom),\n // so the close animation starts from the reset state.\n this.core.outer.removeClass('lg-zoom-dragging');\n this.resetZoom();\n this.core.closeGallery();\n } else if (this.scale <= 1) {\n // The under-fit squeeze springs back to fit exactly\n // like the over-fit snap. lg-zoomed drops now (swipe\n // availability and chrome state flip at release);\n // the drag classes stay so per-frame styles apply\n // uncut, and resetZoom's style strip at settle lands\n // as a visual no-op (state is at scale 1 / pan 0).\n this.core.outer.removeClass('lg-zoomed');\n this.stopZoomSpring();\n this.cancelZoomSpring = runSprings(\n [\n { from: this.scale, velocity: 0, target: 1 },\n { from: this.left, velocity: 0, target: 0 },\n { from: this.top, velocity: 0, target: 0 },\n ],\n ([scale, x, y]) => {\n this.left = x!;\n this.top = y!;\n this.setZoomStyles({\n x: x!,\n y: y!,\n scale: scale!,\n });\n },\n () => {\n this.cancelZoomSpring = undefined;\n this.core.outer.removeClass('lg-zoom-dragging');\n this.resetZoom();\n },\n );\n } else {\n // Snap into [1, actual size] and re-project the pan\n // through the same focal anchor, carried to the\n // midpoint's last position and projected along its\n // momentum, clamped into the exact bounds for the\n // landed scale. The gesture-start snapshot keeps the\n // cap identical to the live frames'. Velocity-seeded\n // springs animate the snap (bounce only where the\n // clamp cut the glide); transitions stand down until\n // they settle.\n const actualSizeScale = startMaxScale;\n const targetScale = Math.min(\n this.scale,\n Math.max(actualSizeScale, 1),\n );\n const midVelocity = getWindowedVelocity(\n midSamples,\n Date.now(),\n );\n const basePan = getPinchPan(\n lastMid,\n startMid,\n startPan,\n initScale,\n targetScale,\n );\n const glide = {\n x: basePan.x + project(midVelocity.x),\n y: basePan.y + project(midVelocity.y),\n };\n const pan = this.clampPinchPan(glide, targetScale);\n // Buttons re-derive their anchor from left/top.\n this.positionChanged = true;\n this.manageActualPixelClassNames();\n this.core.outer.addClass('lg-zoomed');\n\n this.stopZoomSpring();\n this.cancelZoomSpring = runSprings(\n [\n {\n from: this.scale,\n velocity: 0,\n target: targetScale,\n },\n {\n from: this.left,\n velocity: midVelocity.x,\n target: pan.x,\n dampingRatio:\n pan.x !== glide.x\n ? SPRING_BOUNCE_DAMPING\n : 1,\n },\n {\n from: this.top,\n velocity: midVelocity.y,\n target: pan.y,\n dampingRatio:\n pan.y !== glide.y\n ? SPRING_BOUNCE_DAMPING\n : 1,\n },\n ],\n ([scale, x, y]) => {\n this.left = x!;\n this.top = y!;\n this.setZoomStyles({\n x: x!,\n y: y!,\n scale: scale!,\n });\n },\n () => {\n this.cancelZoomSpring = undefined;\n this.core.outer.removeClass(\n 'lg-zoom-dragging lg-zoom-drag-transition',\n );\n if (targetScale >= actualSizeScale) {\n this.setZoomImageSize(0);\n }\n },\n );\n }\n this.core.touchAction = undefined;\n }\n });\n }\n\n touchendZoom(\n startCoords: Coords,\n endCoords: Coords,\n allowX: boolean,\n allowY: boolean,\n velocity: Velocity,\n ): void {\n const _LGel = this.core\n .getSlideItem(this.core.index)\n .find('.lg-img-wrap')\n .first();\n const possibleSwipeCords = this.getPossibleSwipeDragCords();\n\n // Where the fingers left the image (rubber-banding included).\n const current = this.getZoomSwipeCords(\n startCoords,\n endCoords,\n allowX,\n allowY,\n possibleSwipeCords,\n );\n\n // Project the momentum, then clamp into the pan bounds. A\n // clamped axis settles with a soft bounce; a free one glides.\n const clampAxis = (value: number, min: number, max: number): number =>\n Math.min(Math.max(value, max), min);\n const targetX = allowX\n ? clampAxis(\n current.x + project(velocity.x),\n possibleSwipeCords.minX,\n possibleSwipeCords.maxX,\n )\n : this.left;\n const targetY = allowY\n ? clampAxis(\n current.y + project(velocity.y),\n possibleSwipeCords.minY,\n possibleSwipeCords.maxY,\n )\n : this.top;\n\n this.positionChanged = true;\n if (\n Math.abs(targetX - current.x) < 1 &&\n Math.abs(targetY - current.y) < 1\n ) {\n this.left = targetX;\n this.top = targetY;\n this.setZoomSwipeStyles(_LGel, { x: targetX, y: targetY });\n this.core.outer.removeClass(\n 'lg-zoom-dragging lg-zoom-drag-transition',\n );\n return;\n }\n\n // The spring drives every frame, CSS transitions stand down\n // until it settles.\n this.core.outer.addClass('lg-zoom-dragging');\n this.stopZoomSpring();\n this.cancelZoomSpring = runSprings(\n [\n {\n from: current.x,\n velocity: velocity.x,\n target: targetX,\n dampingRatio:\n targetX !== current.x + project(velocity.x)\n ? SPRING_BOUNCE_DAMPING\n : 1,\n },\n {\n from: current.y,\n velocity: velocity.y,\n target: targetY,\n dampingRatio:\n targetY !== current.y + project(velocity.y)\n ? SPRING_BOUNCE_DAMPING\n : 1,\n },\n ],\n ([x, y]) => {\n this.left = x!;\n this.top = y!;\n this.setZoomSwipeStyles(_LGel, { x: x!, y: y! });\n },\n () => {\n this.cancelZoomSpring = undefined;\n this.core.outer.removeClass(\n 'lg-zoom-dragging lg-zoom-drag-transition',\n );\n },\n );\n }\n\n getZoomSwipeCords(\n startCoords: Coords,\n endCoords: Coords,\n allowX: boolean,\n allowY: boolean,\n possibleSwipeCords: PossibleCords,\n ): Coords {\n const distance: Coords = {} as Coords;\n if (allowY) {\n distance.y = this.top + (endCoords.y - startCoords.y);\n if (this.isBeyondPossibleTop(distance.y, possibleSwipeCords.minY)) {\n const diffMinY = possibleSwipeCords.minY - distance.y;\n distance.y = possibleSwipeCords.minY - diffMinY / 6;\n } else if (\n this.isBeyondPossibleBottom(distance.y, possibleSwipeCords.maxY)\n ) {\n const diffMaxY = distance.y - possibleSwipeCords.maxY;\n distance.y = possibleSwipeCords.maxY + diffMaxY / 6;\n }\n } else {\n distance.y = this.top;\n }\n\n if (allowX) {\n distance.x = this.left + (endCoords.x - startCoords.x);\n if (\n this.isBeyondPossibleLeft(distance.x, possibleSwipeCords.minX)\n ) {\n const diffMinX = possibleSwipeCords.minX - distance.x;\n distance.x = possibleSwipeCords.minX - diffMinX / 6;\n } else if (\n this.isBeyondPossibleRight(distance.x, possibleSwipeCords.maxX)\n ) {\n const difMaxX = distance.x - possibleSwipeCords.maxX;\n distance.x = possibleSwipeCords.maxX + difMaxX / 6;\n }\n } else {\n distance.x = this.left;\n }\n\n return distance;\n }\n\n private isBeyondPossibleLeft(x: number, minX: number) {\n return x >= minX;\n }\n private isBeyondPossibleRight(x: number, maxX: number) {\n return x <= maxX;\n }\n private isBeyondPossibleTop(y: number, minY: number) {\n return y >= minY;\n }\n private isBeyondPossibleBottom(y: number, maxY: number) {\n return y <= maxY;\n }\n\n isImageSlide(index: number): boolean {\n const currentItem = this.core.galleryItems[index];\n return this.core.getSlideType(currentItem) === 'image';\n }\n\n getPossibleSwipeDragCords(scale?: number): PossibleCords {\n const $image = this.core\n .getSlideItem(this.core.index)\n .find('.lg-image')\n .first();\n\n const imgRect = $image.get().getBoundingClientRect();\n\n let imageHeight = imgRect.height;\n let imageWidth = imgRect.width;\n\n if (scale) {\n imageHeight = imageHeight + scale * imageHeight;\n imageWidth = imageWidth + scale * imageWidth;\n }\n\n // Stage-aware bounds: the components strip (thumbnails+caption)\n // VACATES when zoomed, so the visible stage extends below the\n // content box to the screen bottom. The `+ bottom` floor stops\n // the pan-up exactly where the image's bottom edge meets the\n // SCREEN bottom, a symmetric content-box clamp would strand a\n // strip-height gap of black where the thumbnails were.\n const { bottom } = this.core.mediaContainerPosition;\n const minY = (imageHeight - this.containerRect.height) / 2;\n const maxY = (this.containerRect.height - imageHeight) / 2 + bottom;\n\n const minX = (imageWidth - this.containerRect.width) / 2;\n\n const maxX = (this.containerRect.width - imageWidth) / 2;\n\n const possibleSwipeCords = {\n minY: minY,\n maxY: maxY,\n minX: minX,\n maxX: maxX,\n };\n return possibleSwipeCords;\n }\n\n setZoomSwipeStyles(\n LGel: lgQuery,\n distance: { x: number; y: number },\n ): void {\n LGel.css(\n 'transform',\n 'translate3d(' + distance.x + 'px, ' + distance.y + 'px, 0)',\n );\n }\n\n zoomSwipe(): void {\n let startCoords = {} as Coords;\n let endCoords = {} as Coords;\n let isMoved = false;\n\n // Allow x direction drag\n let allowX = false;\n\n // Allow Y direction drag\n let allowY = false;\n\n let samples: VelocitySample[] = [];\n let possibleSwipeCords: PossibleCords;\n\n let _LGel: lgQuery;\n\n let $item = this.core.getSlideItem(this.core.index);\n\n this.core.$inner.on('touchstart.lg', (e) => {\n // Allow zoom only on image\n if (!this.isImageSlide(this.core.index)) {\n return;\n }\n $item = this.core.getSlideItem(this.core.index);\n if (\n (this.$LG(e.target).hasClass('lg-item') ||\n $item.get().contains(e.target)) &&\n e.touches.length === 1 &&\n this.core.outer.hasClass('lg-zoomed')\n ) {\n e.preventDefault();\n this.stopZoomSpring();\n // A previous swipe hijacked by a pinch never reaches its\n // touchend, stale isMoved/endCoords would make the NEXT\n // tap run touchendZoom on garbage deltas.\n isMoved = false;\n endCoords = {} as Coords;\n const startPoint = this.getSwipeCords(e);\n samples = [{ x: startPoint.x, y: startPoint.y, t: Date.now() }];\n this.core.touchAction = 'zoomSwipe';\n _LGel = this.core\n .getSlideItem(this.core.index)\n .find('.lg-img-wrap')\n .first();\n\n const dragAllowedAxises = this.getDragAllowedAxises(0);\n\n allowY = dragAllowedAxises.allowY;\n allowX = dragAllowedAxises.allowX;\n // Always captured: touchend runs on these whenever the\n // finger moved, and axis-gated capture fed it undefined\n // coords when both axes measured locked.\n startCoords = this.getSwipeCords(e);\n\n possibleSwipeCords = this.getPossibleSwipeDragCords();\n\n // reset opacity and transition duration\n this.core.outer.addClass(\n 'lg-zoom-dragging lg-zoom-drag-transition',\n );\n }\n });\n\n this.core.$inner.on('touchmove.lg', (e) => {\n if (\n e.touches.length === 1 &&\n this.core.touchAction === 'zoomSwipe' &&\n (this.$LG(e.target).hasClass('lg-item') ||\n $item.get().contains(e.target))\n ) {\n e.preventDefault();\n this.core.touchAction = 'zoomSwipe';\n\n endCoords = this.getSwipeCords(e);\n samples = pushVelocitySample(samples, {\n x: endCoords.x,\n y: endCoords.y,\n t: Date.now(),\n });\n\n const distance = this.getZoomSwipeCords(\n startCoords,\n endCoords,\n allowX,\n allowY,\n possibleSwipeCords,\n );\n\n if (\n Math.abs(endCoords.x - startCoords.x) > 15 ||\n Math.abs(endCoords.y - startCoords.y) > 15\n ) {\n isMoved = true;\n this.setZoomSwipeStyles(_LGel, distance);\n }\n }\n });\n\n this.core.$inner.on('touchend.lg', (e) => {\n if (\n this.core.touchAction === 'zoomSwipe' &&\n (this.$LG(e.target).hasClass('lg-item') ||\n $item.get().contains(e.target))\n ) {\n e.preventDefault();\n this.core.touchAction = undefined;\n this.core.outer.removeClass('lg-zoom-dragging');\n if (!isMoved) {\n // The touchstart stopped any settling spring, a tap\n // must not strand an out-of-bounds position.\n this.settleIntoBounds();\n return;\n }\n isMoved = false;\n this.touchendZoom(\n startCoords,\n endCoords,\n allowX,\n allowY,\n getWindowedVelocity(samples, Date.now()),\n );\n }\n });\n }\n\n zoomDrag(): void {\n let startCoords: Coords = {} as Coords;\n let endCoords: Coords = {} as Coords;\n let isDragging = false;\n let isMoved = false;\n\n // Allow x direction drag\n let allowX = false;\n\n // Allow Y direction drag\n let allowY = false;\n\n let dragSamples: VelocitySample[] = [];\n\n let possibleSwipeCords: PossibleCords;\n\n let _LGel: lgQuery;\n\n this.core.outer.on('mousedown.lg.zoom', (e) => {\n // Allow zoom only on image\n if (!this.isImageSlide(this.core.index)) {\n return;\n }\n const $item = this.core.getSlideItem(this.core.index);\n if (\n this.$LG(e.target).hasClass('lg-item') ||\n $item.get().contains(e.target)\n ) {\n // Only a drag that can actually take over may kill a\n // settling spring, an (often emulated) mousedown on an\n // un-zoomed image would strand the under-fit reset\n // mid-flight (zoomSwipe guards the same way).\n if (this.core.outer.hasClass('lg-zoomed')) {\n this.stopZoomSpring();\n }\n dragSamples = [{ x: e.pageX, y: e.pageY, t: Date.now() }];\n _LGel = this.core\n .getSlideItem(this.core.index)\n .find('.lg-img-wrap')\n .first();\n\n const dragAllowedAxises = this.getDragAllowedAxises(0);\n\n allowY = dragAllowedAxises.allowY;\n allowX = dragAllowedAxises.allowX;\n\n if (this.core.outer.hasClass('lg-zoomed')) {\n if (\n this.$LG(e.target).hasClass('lg-object') &&\n (allowX || allowY)\n ) {\n e.preventDefault();\n startCoords = this.getDragCords(e);\n\n possibleSwipeCords = this.getPossibleSwipeDragCords();\n\n isDragging = true;\n\n this.core.outer\n .removeClass('lg-grab')\n .addClass(\n 'lg-grabbing lg-zoom-drag-transition lg-zoom-dragging',\n );\n // reset opacity and transition duration\n }\n }\n }\n });\n\n this.$LG(window).on(\n `mousemove.lg.zoom.global${this.core.lgId}`,\n (e) => {\n if (isDragging) {\n isMoved = true;\n endCoords = this.getDragCords(e);\n dragSamples = pushVelocitySample(dragSamples, {\n x: endCoords.x,\n y: endCoords.y,\n t: Date.now(),\n });\n\n const distance = this.getZoomSwipeCords(\n startCoords,\n endCoords,\n allowX,\n allowY,\n possibleSwipeCords,\n );\n\n this.setZoomSwipeStyles(_LGel, distance);\n }\n },\n );\n\n this.$LG(window).on(`mouseup.lg.zoom.global${this.core.lgId}`, (e) => {\n if (isDragging) {\n isDragging = false;\n this.core.outer.removeClass('lg-zoom-dragging');\n\n // Fix for chrome mouse move on click\n if (\n isMoved &&\n (startCoords.x !== endCoords.x ||\n startCoords.y !== endCoords.y)\n ) {\n endCoords = this.getDragCords(e);\n\n this.touchendZoom(\n startCoords,\n endCoords,\n allowX,\n allowY,\n getWindowedVelocity(dragSamples, Date.now()),\n );\n } else {\n // The mousedown stopped any settling spring, a\n // click must not strand an out-of-bounds position.\n this.settleIntoBounds();\n }\n\n isMoved = false;\n }\n\n this.core.outer.removeClass('lg-grabbing').addClass('lg-grab');\n });\n }\n\n closeGallery(): void {\n // A settled actual-size zoom swapped the image to natural px and\n // added the reset-transition !important rules, resetZoom's style\n // strip alone would leave the image at natural size, and the\n // zoom-from-origin close would shrink toward the wrong rect.\n if (this.imageReset) {\n this.resetImageTranslate(this.core.index);\n }\n this.resetZoom();\n this.zoomInProgress = false;\n }\n\n destroy(): void {\n // Unbind all events added by lightGallery zoom plugin\n this.$LG(window).off(`.lg.zoom.global${this.core.lgId}`);\n this.core.LGel.off('.lg.zoom');\n this.core.LGel.off('.zoom');\n clearTimeout(this.zoomableTimeout);\n this.zoomableTimeout = false;\n }\n}\n"],"names":["getNaturalSizeScale"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).lgZoom=e()}(this,function(){"use strict";const t=.82;function e(t,e=.995){return t*e/(1-e)}const i={zoomIn:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" fill="currentColor"><path transform="translate(0, 960) scale(1, -1)" d="M512 512.667h-86v-86h-42v86h-86v42h86v86h42v-86h86v-42zM406 340.667q80 0 136 56t56 136-56 136-136 56-136-56-56-136 56-136 136-56zM662 340.667l212-212-64-64-212 212v34l-12 12q-76-66-180-66-116 0-197 80t-81 196 81 197 197 81 196-81 80-197q0-104-66-180l12-12h34z"/></svg>',zoomOut:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" fill="currentColor"><path transform="translate(0, 960) scale(1, -1)" d="M298 554.667h214v-42h-214v42zM406 340.667q80 0 136 56t56 136-56 136-136 56-136-56-56-136 56-136 136-56zM662 340.667l212-212-64-64-212 212v34l-12 12q-76-66-180-66-116 0-197 80t-81 196 81 197 197 81 196-81 80-197q0-104-66-180l12-12h34z"/></svg>',actualSize:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" fill="currentColor"><path transform="translate(0, 960) scale(1, -1)" d="M384 853.334h426.667q53 0 90.5-37.5t37.5-90.5v-426.667q0-53-37.5-90.5t-90.5-37.5h-426.667q-53 0-90.5 37.5t-37.5 90.5v426.667q0 53 37.5 90.5t90.5 37.5zM170.667 675.334v-547.333q0-17.667 12.5-30.167t30.167-12.5h547.333q-13.333-37.667-46.333-61.5t-74.333-23.833h-426.667q-53 0-90.5 37.5t-37.5 90.5v426.667q0 41.333 23.833 74.333t61.5 46.333zM810.667 768h-426.667q-17.667 0-30.167-12.5t-12.5-30.167v-426.667q0-17.667 12.5-30.167t30.167-12.5h426.667q17.667 0 30.167 12.5t12.5 30.167v426.667q0 17.667-12.5 30.167t-30.167 12.5z"/></svg>'};function s(t,e,i,s,o){const n=function(t,e,i,s){const o=s/i;return{x:t.x-(t.x-e.x)*o,y:t.y-(t.y-e.y)*o}}(e,i,s,o);return{x:n.x+(t.x-e.x),y:n.y+(t.y-e.y)}}function o(t){const e=[];if("string"!=typeof t)return e;for(const i of t.split(",")){const t=i.trim().split(/\s+/),s=t[0];if(!s)continue;const o=t[1];if(!o){e.push({url:s,density:1});continue}const n=parseFloat(o);Number.isNaN(n)||n<=0||(o.endsWith("w")?e.push({url:s,width:n}):o.endsWith("x")&&e.push({url:s,density:n}))}return e}function n(t,e){if(!t)return!0;const i=/^\(\s*(min|max)-width:\s*([\d.]+)px\s*\)$/.exec(t.trim());if(!i)return!1;const s=parseFloat(i[2]);return"min"===i[1]?e.width>=s:e.width<=s}function a(t,e,i){if(t.width){const e=parseFloat(t.width);if(!Number.isNaN(e)&&e>0)return e}let s=[];const a=Array.isArray(t.sources)?t.sources:[];for(const l of a)if(n(l.media,e)){s=o(l.srcset);break}!s.length&&t.srcset&&(s=o(t.srcset));const r=s.map(t=>t.width).filter(t=>void 0!==t);if(r.length)return Math.max(...r);const h=function(t,e){if(!t)return;let i=t;const s=t.split(",");if(s[1])for(let r=0;r<s.length;r++){const t=s[r].trim();if(parseInt(t.split("-")[2],10)>e){i=t;break}r===s.length-1&&(i=t)}const o=i.trim().split("-"),n=parseInt(o[0],10),a=parseInt(o[1],10);return Number.isFinite(n)&&Number.isFinite(a)?{width:n,height:a}:void 0}(t.lgSize,e.width);return h&&h.width>0?h.width:i}function r(t,e,i=100){return[...t.filter(t=>e.t-t.t<=i),e]}function h(t,e,i=100){const s=t.filter(t=>e-t.t<=i);if(s.length<2)return{x:0,y:0};const o=s[0],n=s[s.length-1],a=n.t-o.t;if(a<5)return{x:0,y:0};const r=n.x-o.x,h=n.y-o.y;return{x:Math.abs(r)>1?r/a:0,y:Math.abs(h)>1?h/a:0}}function l(t,e,i){let s=0,o=Date.now();const n=t.map(t=>({position:t.from,velocity:t.velocity})),a=()=>{const r=Date.now(),h=Math.min(Math.max(r-o,0),64);o=r;let l=!0;if(t.forEach((t,e)=>{n[e]=function(t,e,i,{dampingRatio:s=1,naturalFrequency:o=12}={}){const n=i/1e3,a=o,r=Math.min(s,1),h=t.position-e,l=1e3*t.velocity,c=Math.exp(-r*a*n);let g,m;if(r<1){const t=a*Math.sqrt(1-r*r),e=h,i=(l+r*a*h)/t,s=Math.cos(t*n),o=Math.sin(t*n);g=c*(e*s+i*o),m=c*((i*t-r*a*e)*s-(e*t+r*a*i)*o)}else{const t=l+a*h;g=c*(h+t*n),m=c*(t-a*(h+t*n))}return{position:e+g,velocity:m/1e3}}(n[e],t.target,h,t),function(t,e,i=.3,s=.012){return Math.abs(t.position-e)<i&&Math.abs(t.velocity)<s}(n[e],t.target)||(l=!1)}),l)return e(t.map(t=>t.target)),void(null==i||i());e(n.map(t=>t.position)),s=requestAnimationFrame(a)};return s=requestAnimationFrame(a),()=>cancelAnimationFrame(s)}const c={scale:1,zoom:!0,infiniteZoom:!0,actualSize:!0,showZoomInOutIcons:!1,actualSizeIcons:{zoomIn:"lg-zoom-in",zoomOut:"lg-zoom-out"},enableZoomAfter:300},g="lgContainerResize",m="lgBeforeOpen",d="lgAfterOpen",u="lgSlideItemLoad",f="lgAfterSlide",p="lgRotateLeft",x="lgRotateRight",y="lgFlipHorizontal",z="lgFlipVertical";var S=Object.defineProperty,w=Object.getOwnPropertySymbols,I=Object.prototype.hasOwnProperty,C=Object.prototype.propertyIsEnumerable,v=(t,e,i)=>e in t?S(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,b=(t,e)=>{for(var i in e||(e={}))I.call(e,i)&&v(t,i,e[i]);if(w)for(var i of w(e))C.call(e,i)&&v(t,i,e[i]);return t};return class{constructor(t,e){return this.core=t,this.$LG=e,this.settings=b(b({},c),this.core.settings),this}buildTemplates(){var t,e,i,s,o,n;const a=!1!==this.core.settings.showGestureButtons;let r=a&&this.settings.showZoomInOutIcons?`<button id="${this.core.getIdName("lg-zoom-in")}" type="button" aria-label="${null!=(e=null==(t=this.settings.zoomPluginStrings)?void 0:t.zoomIn)?e:this.core.settings.strings.zoomIn}" class="lg-zoom-in lg-icon"></button><button id="${this.core.getIdName("lg-zoom-out")}" type="button" aria-label="${null!=(s=null==(i=this.settings.zoomPluginStrings)?void 0:i.zoomOut)?s:this.core.settings.strings.zoomOut}" class="lg-zoom-out lg-icon"></button>`:"";a&&this.settings.actualSize&&(r+=`<button id="${this.core.getIdName("lg-actual-size")}" type="button" aria-label="${null!=(n=null==(o=this.settings.zoomPluginStrings)?void 0:o.viewActualSize)?n:this.core.settings.strings.viewActualSize}" class="${this.settings.actualSizeIcons.zoomIn} lg-icon"></button>`),this.core.outer.addClass("lg-use-transition-for-zoom"),this.core.$toolbar.first().append(r)}enableZoom(t){let e=this.settings.enableZoomAfter+t.detail.delay;this.$LG("body").first().hasClass("lg-from-hash")&&t.detail.delay?e=0:this.$LG("body").first().removeClass("lg-from-hash"),this.zoomableTimeout=setTimeout(()=>{this.isImageSlide(this.core.index)&&(this.core.getSlideItem(t.detail.index).addClass("lg-zoomable"),t.detail.index===this.core.index&&this.setZoomEssentials())},e+30)}enableZoomOnSlideItemLoad(){this.core.LGel.on(`${u}.zoom`,this.enableZoom.bind(this))}getDragCords(t){return{x:t.pageX,y:t.pageY}}getSwipeCords(t){return{x:t.touches[0].pageX,y:t.touches[0].pageY}}getDragAllowedAxises(t,e){if(!this.containerRect)return{allowX:!1,allowY:!1};const i=this.core.getSlideItem(this.core.index).find(".lg-image").first().get();let s=0,o=0;const n=i.getBoundingClientRect();if(t){const e=this.getVisualImageSize(i,i.offsetWidth,i.offsetHeight);s=e.height*t,o=e.width*t}else if(e)s=n.height+e*n.height,o=n.width+e*n.width;else if(this.core.currentImageSize){const t=this.getVisualImageSize(i,this.core.currentImageSize.width,this.core.currentImageSize.height);s=t.height*this.scale,o=t.width*this.scale}else s=n.height,o=n.width;const a=s>this.containerRect.height;return{allowX:o>this.containerRect.width,allowY:a}}setZoomEssentials(){this.containerRect=this.core.$content.get().getBoundingClientRect()}zoomImage(t,e,i,s){if(!this.containerRect||Math.abs(e)<=0)return;const o=this.containerRect.width/2+this.containerRect.left,n=this.containerRect.height/2+this.containerRect.top+this.scrollTop;let a,r,h,l;if(1===t&&(this.positionChanged=!1),this.positionChanged){const t=this.scale-e;a=t?this.left/t:0,r=t?this.top/t:0,this.pageX=o-a,this.pageY=n-r,this.positionChanged=!1}let c=o-this.pageX,g=n-this.pageY;if(t-e>1){const i=(t-e)/Math.abs(e);c=(e<0?-c:c)+this.left*(i+(e<0?-1:1)),g=(e<0?-g:g)+this.top*(i+(e<0?-1:1)),h=c/i,l=g/i}else{const i=(t-e)*e;h=c*i,l=g*i}if(i){const e=this.clampPinchPan({x:h,y:l},t);h=e.x,l=e.y}this.setZoomStyles({x:h,y:l,scale:t}),this.left=h,this.top=l,s&&this.setZoomImageSize()}resetImageTranslate(t){if(!this.isImageSlide(t))return;const e=this.core.getSlideItem(t).find(".lg-image").first();this.imageReset=!1,e.removeClass("reset-transition reset-transition-y reset-transition-x"),this.core.outer.removeClass("lg-actual-size"),e.css("width","auto").css("height","auto"),setTimeout(()=>{e.removeClass("no-transition")},10)}setZoomImageSize(t=500){const e=this.core.getSlideItem(this.core.index).find(".lg-image").first();setTimeout(()=>{if(this.core.touchAction)return;const t=this.getCurrentImageActualSizeScale();this.scale>=t&&(e.addClass("no-transition"),this.imageReset=!0)},t),setTimeout(()=>{if(this.core.touchAction)return;const t=this.getCurrentImageActualSizeScale();if(this.scale>=t){const t=this.getDragAllowedAxises(this.scale),i=e.get(),s=this.getNaturalWidth(this.core.index),o=i.naturalWidth>0?s*i.naturalHeight/i.naturalWidth:i.naturalHeight;e.css("width",s+"px").css("height",o+"px"),this.core.outer.addClass("lg-actual-size"),t.allowX&&t.allowY?e.addClass("reset-transition"):t.allowX&&!t.allowY?e.addClass("reset-transition-x"):!t.allowX&&t.allowY&&e.addClass("reset-transition-y")}},t+50)}setZoomStyles(t){const e=this.core.getSlideItem(this.core.index).find(".lg-img-wrap").first(),i=this.core.getSlideItem(this.core.index).find(".lg-image").first(),s=this.core.outer.find(".lg-current .lg-dummy-img").first();this.scale=t.scale,i.css("transform","scale3d("+t.scale+", "+t.scale+", 1)"),s.css("transform","scale3d("+t.scale+", "+t.scale+", 1)");const o="translate3d("+t.x+"px, "+t.y+"px, 0)";e.css("transform",o)}setActualSize(t,e){if(this.zoomInProgress)return;this.zoomInProgress=!0;const i=this.core.galleryItems[this.core.index];this.resetImageTranslate(t),setTimeout(()=>{if(!i.src||this.core.outer.hasClass("lg-first-slide-loading"))return;const t=this.getCurrentImageActualSizeScale(),s=this.scale;this.core.outer.hasClass("lg-zoomed")?this.scale=1:this.scale=this.getScale(t),this.setPageCords(e),this.beginZoom(this.scale),this.zoomImage(this.scale,this.scale-s,!0,!0)},50),setTimeout(()=>{this.core.outer.removeClass("lg-grabbing").addClass("lg-grab")},60),setTimeout(()=>{this.zoomInProgress=!1},610)}getNaturalWidth(t){const e=this.core.getSlideItem(t).find(".lg-image").first();return a(this.core.galleryItems[t],{width:window.innerWidth},e.get().naturalWidth)}getActualSizeScale(t,e){let i;return i=t>=e?function(t,e){return e&&t/e||2}(t,e):1,i}getCurrentImageActualSizeScale(){var t;const e=this.core.getSlideItem(this.core.index).find(".lg-image").first().get();let i=null==(t=this.core.currentImageSize)?void 0:t.width;if(!i)if(this.core.outer.hasClass("lg-actual-size")){this.containerRect||this.setZoomEssentials();const t=this.getNaturalWidth(this.core.index);i=function(t,e,i){const s=Math.min(e,t.width),o=Math.min(i,t.height),n=Math.min(s/t.width,o/t.height);return{width:t.width*n,height:t.height*n}}({width:t,height:e.naturalWidth>0?t*e.naturalHeight/e.naturalWidth:e.naturalHeight},this.containerRect.width,this.containerRect.height).width}else i=e.offsetWidth;const s=this.getNaturalWidth(this.core.index)||i;return this.getActualSizeScale(s,i)}getPageCords(t){const e={};if(t)e.x=t.pageX||t.touches[0].pageX,e.y=t.pageY||t.touches[0].pageY;else{const t=this.core.$content.get().getBoundingClientRect();e.x=t.width/2+t.left,e.y=t.height/2+this.scrollTop+t.top}return e}setPageCords(t){const e=this.getPageCords(t);this.pageX=e.x,this.pageY=e.y}manageActualPixelClassNames(){this.core.getElementById("lg-actual-size").removeClass(this.settings.actualSizeIcons.zoomIn).addClass(this.settings.actualSizeIcons.zoomOut)}beginZoom(t){return this.core.outer.removeClass("lg-zoom-drag-transition lg-zoom-dragging"),t>1?(this.core.outer.addClass("lg-zoomed"),this.manageActualPixelClassNames()):this.resetZoom(),t>1}getScale(t){const e=this.getCurrentImageActualSizeScale();return t<1?t=1:t>e&&(t=e),t}init(){if(this.core.registerDefaultIcons(i),!this.settings.zoom)return;this.buildTemplates(),this.enableZoomOnSlideItemLoad();let t=null;this.core.outer.on("dblclick.lg",t=>{this.$LG(t.target).hasClass("lg-image")&&this.setActualSize(this.core.index,t)}),this.core.outer.on("touchstart.lg",e=>{const i=this.$LG(e.target);1===e.touches.length&&i.hasClass("lg-image")&&(t?(clearTimeout(t),t=null,e.preventDefault(),this.setActualSize(this.core.index,e)):t=setTimeout(()=>{t=null},300))}),this.core.LGel.on(`${g}.zoom ${x}.zoom ${p}.zoom ${y}.zoom ${z}.zoom`,()=>{if(!this.core.lgOpened||!this.isImageSlide(this.core.index)||this.core.touchAction)return;this.stopZoomSpring();const t=this.core.getSlideItem(this.core.index).find(".lg-img-wrap").first();this.top=0,this.left=0,this.setZoomEssentials(),this.setZoomSwipeStyles(t,{x:0,y:0}),this.positionChanged=!0}),this.$LG(window).on(`scroll.lg.zoom.global${this.core.lgId}`,()=>{this.core.lgOpened&&(this.scrollTop=this.$LG(window).scrollTop())}),this.core.getElementById("lg-zoom-out").on("click.lg",()=>{if(!this.isImageSlide(this.core.index))return;let t=0;this.imageReset&&(this.resetImageTranslate(this.core.index),t=50),setTimeout(()=>{let t=this.scale-this.settings.scale;t<1&&(t=1),this.beginZoom(t),this.zoomImage(t,-this.settings.scale,!0,!this.settings.infiniteZoom)},t)}),this.core.getElementById("lg-zoom-in").on("click.lg",()=>{this.zoomIn()}),this.core.getElementById("lg-actual-size").on("click.lg",()=>{this.setActualSize(this.core.index)}),this.core.LGel.on(`${m}.zoom`,()=>{this.core.outer.find(".lg-item").removeClass("lg-zoomable")}),this.core.LGel.on(`${d}.zoom`,()=>{this.scrollTop=this.$LG(window).scrollTop(),this.pageX=this.core.outer.width()/2,this.pageY=this.core.outer.height()/2+this.scrollTop,this.scale=1}),this.core.LGel.on(`${f}.zoom`,t=>{const{prevIndex:e}=t.detail;this.scale=1,this.positionChanged=!1,this.zoomInProgress=!1,this.resetZoom(e),this.resetImageTranslate(e),this.isImageSlide(this.core.index)&&this.setZoomEssentials()}),this.zoomDrag(),this.pinchZoom(),this.zoomSwipe(),this.zoomableTimeout=!1,this.positionChanged=!1,this.zoomInProgress=!1}zoomIn(){if(!this.isImageSlide(this.core.index))return;let t=this.scale+this.settings.scale;this.settings.infiniteZoom||(t=this.getScale(t)),this.beginZoom(t),this.zoomImage(t,Math.min(this.settings.scale,t-this.scale),!0,!this.settings.infiniteZoom)}resetZoom(t){this.stopZoomSpring(),this.core.outer.removeClass("lg-zoomed lg-zoom-drag-transition");const e=this.core.getElementById("lg-actual-size"),i=this.core.getSlideItem(void 0!==t?t:this.core.index);e.removeClass(this.settings.actualSizeIcons.zoomOut).addClass(this.settings.actualSizeIcons.zoomIn),i.find(".lg-img-wrap").first().removeAttr("style"),i.find(".lg-image").first().removeAttr("style"),this.scale=1,this.left=0,this.top=0,this.setPageCords()}stopZoomSpring(){this.cancelZoomSpring&&(this.cancelZoomSpring(),this.cancelZoomSpring=void 0)}settleIntoBounds(){this.setZoomEssentials();const t=this.core.getSlideItem(this.core.index).find(".lg-image").first().get().getBoundingClientRect(),e=this.getCurrentImageActualSizeScale(),i=this.settings.infiniteZoom?Math.max(this.scale,1):Math.min(Math.max(this.scale,1),Math.max(e,1)),s=this.scale>0?i/this.scale:1,o=t.width*s,n=t.height*s,{bottom:a}=this.core.mediaContainerPosition,r=Math.abs(o-this.containerRect.width)/2,h=Math.abs(n-this.containerRect.height)/2,c=n>this.containerRect.height?Math.min(-h+a,h):-h,g=Math.min(Math.max(this.left,-r),r),m=Math.min(Math.max(this.top,c),h);Math.abs(g-this.left)<1&&Math.abs(m-this.top)<1&&Math.abs(i-this.scale)<.001||(this.core.outer.addClass("lg-zoom-drag-transition lg-zoom-dragging"),this.stopZoomSpring(),this.cancelZoomSpring=l([{from:this.scale,velocity:0,target:i},{from:this.left,velocity:0,target:g},{from:this.top,velocity:0,target:m}],([t,e,i])=>{this.left=e,this.top=i,this.setZoomStyles({x:e,y:i,scale:t})},()=>{this.cancelZoomSpring=void 0,this.core.outer.removeClass("lg-zoom-dragging lg-zoom-drag-transition"),i>1&&i>=Math.max(e,1)&&this.setZoomImageSize(0)}))}getTouchDistance(t){return e={x:t.touches[0].pageX,y:t.touches[0].pageY},i={x:t.touches[1].pageX,y:t.touches[1].pageY},Math.sqrt((e.x-i.x)*(e.x-i.x)+(e.y-i.y)*(e.y-i.y));var e,i}getPinchMidPoint(t){const e=this.containerRect.width/2+this.containerRect.left,i=this.containerRect.height/2+this.containerRect.top+this.scrollTop;return{x:(t.touches[0].pageX+t.touches[1].pageX)/2-e,y:(t.touches[0].pageY+t.touches[1].pageY)/2-i}}getVisualImageSize(t,e,i){const s=t.closest(".lg-img-rotate");return function(t,e,i){if(!i)return{width:t,height:e};const s=/rotate\((-?\d+(?:\.\d+)?)deg\)/.exec(i),o=/scale3d\((-?\d+(?:\.\d+)?)/.exec(i),n=(null==o?void 0:o[1])?Math.abs(parseFloat(o[1])):1,a=(((null==s?void 0:s[1])?parseFloat(s[1]):0)%360+360)%360;return 90===a||270===a?{width:e*n,height:t*n}:{width:t*n,height:e*n}}(e,i,null==s?void 0:s.style.transform)}clampPinchPan(t,e){const i=this.core.getSlideItem(this.core.index).find(".lg-image").first().get(),s=this.getVisualImageSize(i,i.offsetWidth,i.offsetHeight),o=function(t,e,i,s,o){return{maxX:Math.max(0,(t*o-i)/2),maxY:Math.max(0,(e*o-s)/2)}}(s.width,s.height,this.containerRect.width,this.containerRect.height,e);return function(t,e,i){const s=Math.min(-e.maxY+i,e.maxY);return{x:Math.min(Math.max(t.x,-e.maxX),e.maxX),y:Math.min(Math.max(t.y,s),e.maxY)}}(t,o,this.core.mediaContainerPosition.bottom)}pinchZoom(){let i=0,o=!1,n=1,a=1,c={x:0,y:0},g={x:0,y:0},m=1,d={x:0,y:0},u=[],f=this.core.getSlideItem(this.core.index);this.core.outer.on("touchstart.lg",t=>{if(f=this.core.getSlideItem(this.core.index),this.isImageSlide(this.core.index)&&2===t.touches.length){if(t.preventDefault(),this.core.outer.hasClass("lg-first-slide-loading"))return;this.stopZoomSpring(),this.setZoomEssentials(),n=this.scale||1,c={x:this.left,y:this.top},g=this.getPinchMidPoint(t),this.core.outer.addClass("lg-zoom-drag-transition lg-zoom-dragging"),this.setPageCords(t),this.resetImageTranslate(this.core.index),a=this.getCurrentImageActualSizeScale(),this.core.touchAction="pinch",i=this.getTouchDistance(t),m=n,d=g,u=[{x:g.x,y:g.y,t:Date.now()}]}}),this.core.$inner.on("touchmove.lg",t=>{if(2===t.touches.length&&"pinch"===this.core.touchAction&&(this.$LG(t.target).hasClass("lg-item")||f.get().contains(t.target))){t.preventDefault();const e=this.getTouchDistance(t),h=i-e;if(!o&&Math.abs(h)>5&&(o=!0),o){const o=this.core.settings.pinchToClose&&this.core.settings.closable&&m<=1,h=function(t,e,i,s,o,n=!1){if(t<=0)return i;let a=e/t*i;a<1&&!n&&(a=1+.15*(a-1));const r=Math.max(s,1);return!o&&a>r&&(a=r+.05*(a-r)),a}(i,e,n,a,this.settings.infiniteZoom,o),l=Math.round(1e4*(h+Number.EPSILON))/1e4,f=this.getPinchMidPoint(t);d=f,u=r(u,{x:f.x,y:f.y,t:Date.now()});const p=s(f,g,c,n,l);this.left=p.x,this.top=p.y,this.setZoomStyles({x:p.x,y:p.y,scale:l}),m=Math.max(m,l)}}}),this.core.$inner.on("touchend.lg",r=>{if("pinch"===this.core.touchAction&&(this.$LG(r.target).hasClass("lg-item")||f.get().contains(r.target))){if(o=!1,i=0,(p={scale:this.scale,maxGestureScale:m,pinchToClose:this.core.settings.pinchToClose,closable:this.core.settings.closable}).pinchToClose&&p.closable&&p.scale<1&&p.maxGestureScale<=1)this.core.outer.removeClass("lg-zoom-dragging"),this.resetZoom(),this.core.closeGallery();else if(this.scale<=1)this.core.outer.removeClass("lg-zoomed"),this.stopZoomSpring(),this.cancelZoomSpring=l([{from:this.scale,velocity:0,target:1},{from:this.left,velocity:0,target:0},{from:this.top,velocity:0,target:0}],([t,e,i])=>{this.left=e,this.top=i,this.setZoomStyles({x:e,y:i,scale:t})},()=>{this.cancelZoomSpring=void 0,this.core.outer.removeClass("lg-zoom-dragging"),this.resetZoom()});else{const i=a,o=Math.min(this.scale,Math.max(i,1)),r=h(u,Date.now()),m=s(d,g,c,n,o),f={x:m.x+e(r.x),y:m.y+e(r.y)},p=this.clampPinchPan(f,o);this.positionChanged=!0,this.manageActualPixelClassNames(),this.core.outer.addClass("lg-zoomed"),this.stopZoomSpring(),this.cancelZoomSpring=l([{from:this.scale,velocity:0,target:o},{from:this.left,velocity:r.x,target:p.x,dampingRatio:p.x!==f.x?t:1},{from:this.top,velocity:r.y,target:p.y,dampingRatio:p.y!==f.y?t:1}],([t,e,i])=>{this.left=e,this.top=i,this.setZoomStyles({x:e,y:i,scale:t})},()=>{this.cancelZoomSpring=void 0,this.core.outer.removeClass("lg-zoom-dragging lg-zoom-drag-transition"),o>=i&&this.setZoomImageSize(0)})}this.core.touchAction=void 0}var p})}touchendZoom(i,s,o,n,a){const r=this.core.getSlideItem(this.core.index).find(".lg-img-wrap").first(),h=this.getPossibleSwipeDragCords(),c=this.getZoomSwipeCords(i,s,o,n,h),g=(t,e,i)=>Math.min(Math.max(t,i),e),m=o?g(c.x+e(a.x),h.minX,h.maxX):this.left,d=n?g(c.y+e(a.y),h.minY,h.maxY):this.top;if(this.positionChanged=!0,Math.abs(m-c.x)<1&&Math.abs(d-c.y)<1)return this.left=m,this.top=d,this.setZoomSwipeStyles(r,{x:m,y:d}),void this.core.outer.removeClass("lg-zoom-dragging lg-zoom-drag-transition");this.core.outer.addClass("lg-zoom-dragging"),this.stopZoomSpring(),this.cancelZoomSpring=l([{from:c.x,velocity:a.x,target:m,dampingRatio:m!==c.x+e(a.x)?t:1},{from:c.y,velocity:a.y,target:d,dampingRatio:d!==c.y+e(a.y)?t:1}],([t,e])=>{this.left=t,this.top=e,this.setZoomSwipeStyles(r,{x:t,y:e})},()=>{this.cancelZoomSpring=void 0,this.core.outer.removeClass("lg-zoom-dragging lg-zoom-drag-transition")})}getZoomSwipeCords(t,e,i,s,o){const n={};if(s){if(n.y=this.top+(e.y-t.y),this.isBeyondPossibleTop(n.y,o.minY)){const t=o.minY-n.y;n.y=o.minY-t/6}else if(this.isBeyondPossibleBottom(n.y,o.maxY)){const t=n.y-o.maxY;n.y=o.maxY+t/6}}else n.y=this.top;if(i){if(n.x=this.left+(e.x-t.x),this.isBeyondPossibleLeft(n.x,o.minX)){const t=o.minX-n.x;n.x=o.minX-t/6}else if(this.isBeyondPossibleRight(n.x,o.maxX)){const t=n.x-o.maxX;n.x=o.maxX+t/6}}else n.x=this.left;return n}isBeyondPossibleLeft(t,e){return t>=e}isBeyondPossibleRight(t,e){return t<=e}isBeyondPossibleTop(t,e){return t>=e}isBeyondPossibleBottom(t,e){return t<=e}isImageSlide(t){const e=this.core.galleryItems[t];return"image"===this.core.getSlideType(e)}getPossibleSwipeDragCords(t){const e=this.core.getSlideItem(this.core.index).find(".lg-image").first().get().getBoundingClientRect();let i=e.height,s=e.width;t&&(i+=t*i,s+=t*s);const{bottom:o}=this.core.mediaContainerPosition;return{minY:(i-this.containerRect.height)/2,maxY:(this.containerRect.height-i)/2+o,minX:(s-this.containerRect.width)/2,maxX:(this.containerRect.width-s)/2}}setZoomSwipeStyles(t,e){t.css("transform","translate3d("+e.x+"px, "+e.y+"px, 0)")}zoomSwipe(){let t,e,i={},s={},o=!1,n=!1,a=!1,l=[],c=this.core.getSlideItem(this.core.index);this.core.$inner.on("touchstart.lg",r=>{if(this.isImageSlide(this.core.index)&&(c=this.core.getSlideItem(this.core.index),(this.$LG(r.target).hasClass("lg-item")||c.get().contains(r.target))&&1===r.touches.length&&this.core.outer.hasClass("lg-zoomed"))){r.preventDefault(),this.stopZoomSpring(),o=!1,s={};const h=this.getSwipeCords(r);l=[{x:h.x,y:h.y,t:Date.now()}],this.core.touchAction="zoomSwipe",e=this.core.getSlideItem(this.core.index).find(".lg-img-wrap").first();const c=this.getDragAllowedAxises(0);a=c.allowY,n=c.allowX,i=this.getSwipeCords(r),t=this.getPossibleSwipeDragCords(),this.core.outer.addClass("lg-zoom-dragging lg-zoom-drag-transition")}}),this.core.$inner.on("touchmove.lg",h=>{if(1===h.touches.length&&"zoomSwipe"===this.core.touchAction&&(this.$LG(h.target).hasClass("lg-item")||c.get().contains(h.target))){h.preventDefault(),this.core.touchAction="zoomSwipe",s=this.getSwipeCords(h),l=r(l,{x:s.x,y:s.y,t:Date.now()});const c=this.getZoomSwipeCords(i,s,n,a,t);(Math.abs(s.x-i.x)>15||Math.abs(s.y-i.y)>15)&&(o=!0,this.setZoomSwipeStyles(e,c))}}),this.core.$inner.on("touchend.lg",t=>{if("zoomSwipe"===this.core.touchAction&&(this.$LG(t.target).hasClass("lg-item")||c.get().contains(t.target))){if(t.preventDefault(),this.core.touchAction=void 0,this.core.outer.removeClass("lg-zoom-dragging"),!o)return void this.settleIntoBounds();o=!1,this.touchendZoom(i,s,n,a,h(l,Date.now()))}})}zoomDrag(){let t,e,i={},s={},o=!1,n=!1,a=!1,l=!1,c=[];this.core.outer.on("mousedown.lg.zoom",s=>{if(!this.isImageSlide(this.core.index))return;const n=this.core.getSlideItem(this.core.index);if(this.$LG(s.target).hasClass("lg-item")||n.get().contains(s.target)){this.core.outer.hasClass("lg-zoomed")&&this.stopZoomSpring(),c=[{x:s.pageX,y:s.pageY,t:Date.now()}],e=this.core.getSlideItem(this.core.index).find(".lg-img-wrap").first();const n=this.getDragAllowedAxises(0);l=n.allowY,a=n.allowX,this.core.outer.hasClass("lg-zoomed")&&this.$LG(s.target).hasClass("lg-object")&&(a||l)&&(s.preventDefault(),i=this.getDragCords(s),t=this.getPossibleSwipeDragCords(),o=!0,this.core.outer.removeClass("lg-grab").addClass("lg-grabbing lg-zoom-drag-transition lg-zoom-dragging"))}}),this.$LG(window).on(`mousemove.lg.zoom.global${this.core.lgId}`,h=>{if(o){n=!0,s=this.getDragCords(h),c=r(c,{x:s.x,y:s.y,t:Date.now()});const o=this.getZoomSwipeCords(i,s,a,l,t);this.setZoomSwipeStyles(e,o)}}),this.$LG(window).on(`mouseup.lg.zoom.global${this.core.lgId}`,t=>{o&&(o=!1,this.core.outer.removeClass("lg-zoom-dragging"),!n||i.x===s.x&&i.y===s.y?this.settleIntoBounds():(s=this.getDragCords(t),this.touchendZoom(i,s,a,l,h(c,Date.now()))),n=!1),this.core.outer.removeClass("lg-grabbing").addClass("lg-grab")})}closeGallery(){this.imageReset&&this.resetImageTranslate(this.core.index),this.resetZoom(),this.zoomInProgress=!1}destroy(){this.$LG(window).off(`.lg.zoom.global${this.core.lgId}`),this.core.LGel.off(".lg.zoom"),this.core.LGel.off(".zoom"),clearTimeout(this.zoomableTimeout),this.zoomableTimeout=!1}}});
|