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.
Files changed (619) hide show
  1. package/LICENSE +690 -0
  2. package/README.md +31 -21
  3. package/dist/README.md +229 -0
  4. package/{css → dist/css}/lg-autoplay.css +7 -4
  5. package/{css → dist/css}/lg-autoplay.css.map +1 -1
  6. package/{css → dist/css}/lg-comments.css +0 -6
  7. package/{css → dist/css}/lg-comments.css.map +1 -1
  8. package/dist/css/lg-fullscreen.css +11 -0
  9. package/dist/css/lg-fullscreen.css.map +1 -0
  10. package/dist/css/lg-justified.css +37 -0
  11. package/dist/css/lg-justified.css.map +1 -0
  12. package/{css → dist/css}/lg-pager.css.map +1 -1
  13. package/{css → dist/css}/lg-rotate.css +0 -16
  14. package/{css → dist/css}/lg-rotate.css.map +1 -1
  15. package/dist/css/lg-rtl.css +94 -0
  16. package/dist/css/lg-rtl.css.map +1 -0
  17. package/{css → dist/css}/lg-share.css +4 -32
  18. package/dist/css/lg-share.css.map +1 -0
  19. package/{css → dist/css}/lg-thumbnail.css +7 -3
  20. package/dist/css/lg-thumbnail.css.map +1 -0
  21. package/{css → dist/css}/lg-transitions.css +10 -0
  22. package/dist/css/lg-transitions.css.map +1 -0
  23. package/{css → dist/css}/lg-zoom.css +20 -9
  24. package/dist/css/lg-zoom.css.map +1 -0
  25. package/{css → dist/css}/lightgallery-bundle.css +150 -118
  26. package/dist/css/lightgallery-bundle.css.map +1 -0
  27. package/dist/css/lightgallery-bundle.min.css +1 -0
  28. package/{css → dist/css}/lightgallery-core.css +49 -7
  29. package/dist/css/lightgallery-core.css.map +1 -0
  30. package/{css → dist/css}/lightgallery.css +105 -44
  31. package/dist/css/lightgallery.css.map +1 -0
  32. package/dist/lightgallery.es5.js +3797 -0
  33. package/dist/lightgallery.es5.js.map +1 -0
  34. package/dist/lightgallery.min.js +1 -0
  35. package/dist/lightgallery.umd.js +3800 -0
  36. package/dist/lightgallery.umd.js.map +1 -0
  37. package/dist/package.json +33 -0
  38. package/dist/plugins/autoplay/lg-autoplay.es5.js +193 -0
  39. package/dist/plugins/autoplay/lg-autoplay.es5.js.map +1 -0
  40. package/dist/plugins/autoplay/lg-autoplay.min.js +1 -0
  41. package/dist/plugins/autoplay/lg-autoplay.umd.js +196 -0
  42. package/dist/plugins/autoplay/lg-autoplay.umd.js.map +1 -0
  43. package/dist/plugins/autoplay/package.json +7 -0
  44. package/dist/plugins/comment/lg-comment.es5.js +136 -0
  45. package/dist/plugins/comment/lg-comment.es5.js.map +1 -0
  46. package/dist/plugins/comment/lg-comment.min.js +1 -0
  47. package/dist/plugins/comment/lg-comment.umd.js +139 -0
  48. package/dist/plugins/comment/lg-comment.umd.js.map +1 -0
  49. package/dist/plugins/comment/package.json +7 -0
  50. package/dist/plugins/fullscreen/lg-fullscreen.es5.js +114 -0
  51. package/dist/plugins/fullscreen/lg-fullscreen.es5.js.map +1 -0
  52. package/dist/plugins/fullscreen/lg-fullscreen.min.js +1 -0
  53. package/dist/plugins/fullscreen/lg-fullscreen.umd.js +117 -0
  54. package/dist/plugins/fullscreen/lg-fullscreen.umd.js.map +1 -0
  55. package/dist/plugins/fullscreen/package.json +7 -0
  56. package/dist/plugins/hash/lg-hash.es5.js +207 -0
  57. package/dist/plugins/hash/lg-hash.es5.js.map +1 -0
  58. package/dist/plugins/hash/lg-hash.min.js +1 -0
  59. package/dist/plugins/hash/lg-hash.umd.js +210 -0
  60. package/dist/plugins/hash/lg-hash.umd.js.map +1 -0
  61. package/dist/plugins/hash/package.json +7 -0
  62. package/dist/plugins/justified/lg-justified.es5.js +415 -0
  63. package/dist/plugins/justified/lg-justified.es5.js.map +1 -0
  64. package/dist/plugins/justified/lg-justified.min.js +1 -0
  65. package/dist/plugins/justified/lg-justified.umd.js +418 -0
  66. package/dist/plugins/justified/lg-justified.umd.js.map +1 -0
  67. package/dist/plugins/justified/package.json +7 -0
  68. package/dist/plugins/mediumZoom/lg-medium-zoom.es5.js +95 -0
  69. package/dist/plugins/mediumZoom/lg-medium-zoom.es5.js.map +1 -0
  70. package/dist/plugins/mediumZoom/lg-medium-zoom.min.js +1 -0
  71. package/dist/plugins/mediumZoom/lg-medium-zoom.umd.js +98 -0
  72. package/dist/plugins/mediumZoom/lg-medium-zoom.umd.js.map +1 -0
  73. package/dist/plugins/mediumZoom/package.json +7 -0
  74. package/dist/plugins/originCrop/lg-origin-crop.es5.js +622 -0
  75. package/dist/plugins/originCrop/lg-origin-crop.es5.js.map +1 -0
  76. package/dist/plugins/originCrop/lg-origin-crop.min.js +1 -0
  77. package/dist/plugins/originCrop/lg-origin-crop.umd.js +625 -0
  78. package/dist/plugins/originCrop/lg-origin-crop.umd.js.map +1 -0
  79. package/dist/plugins/pager/lg-pager.es5.js +96 -0
  80. package/dist/plugins/pager/lg-pager.es5.js.map +1 -0
  81. package/dist/plugins/pager/lg-pager.min.js +1 -0
  82. package/dist/plugins/pager/lg-pager.umd.js +99 -0
  83. package/dist/plugins/pager/lg-pager.umd.js.map +1 -0
  84. package/dist/plugins/pager/package.json +7 -0
  85. package/dist/plugins/relativeCaption/lg-relative-caption.es5.js +98 -0
  86. package/dist/plugins/relativeCaption/lg-relative-caption.es5.js.map +1 -0
  87. package/dist/plugins/relativeCaption/lg-relative-caption.min.js +1 -0
  88. package/dist/plugins/relativeCaption/lg-relative-caption.umd.js +101 -0
  89. package/dist/plugins/relativeCaption/lg-relative-caption.umd.js.map +1 -0
  90. package/dist/plugins/relativeCaption/package.json +7 -0
  91. package/dist/plugins/rotate/lg-rotate.es5.js +226 -0
  92. package/dist/plugins/rotate/lg-rotate.es5.js.map +1 -0
  93. package/dist/plugins/rotate/lg-rotate.min.js +1 -0
  94. package/dist/plugins/rotate/lg-rotate.umd.js +229 -0
  95. package/dist/plugins/rotate/lg-rotate.umd.js.map +1 -0
  96. package/dist/plugins/rotate/package.json +7 -0
  97. package/dist/plugins/share/lg-share.es5.js +309 -0
  98. package/dist/plugins/share/lg-share.es5.js.map +1 -0
  99. package/dist/plugins/share/lg-share.min.js +1 -0
  100. package/dist/plugins/share/lg-share.umd.js +312 -0
  101. package/dist/plugins/share/lg-share.umd.js.map +1 -0
  102. package/dist/plugins/share/package.json +7 -0
  103. package/dist/plugins/thumbnail/lg-thumbnail.es5.js +792 -0
  104. package/dist/plugins/thumbnail/lg-thumbnail.es5.js.map +1 -0
  105. package/dist/plugins/thumbnail/lg-thumbnail.min.js +1 -0
  106. package/dist/plugins/thumbnail/lg-thumbnail.umd.js +795 -0
  107. package/dist/plugins/thumbnail/lg-thumbnail.umd.js.map +1 -0
  108. package/dist/plugins/thumbnail/package.json +7 -0
  109. package/dist/plugins/video/lg-video.es5.js +518 -0
  110. package/dist/plugins/video/lg-video.es5.js.map +1 -0
  111. package/dist/plugins/video/lg-video.min.js +1 -0
  112. package/dist/plugins/video/lg-video.umd.js +521 -0
  113. package/dist/plugins/video/lg-video.umd.js.map +1 -0
  114. package/dist/plugins/video/package.json +7 -0
  115. package/dist/plugins/vimeoThumbnail/lg-vimeo-thumbnail.es5.js +72 -0
  116. package/dist/plugins/vimeoThumbnail/lg-vimeo-thumbnail.es5.js.map +1 -0
  117. package/dist/plugins/vimeoThumbnail/lg-vimeo-thumbnail.min.js +1 -0
  118. package/dist/plugins/vimeoThumbnail/lg-vimeo-thumbnail.umd.js +75 -0
  119. package/dist/plugins/vimeoThumbnail/lg-vimeo-thumbnail.umd.js.map +1 -0
  120. package/dist/plugins/vimeoThumbnail/package.json +7 -0
  121. package/dist/plugins/zoom/lg-zoom.es5.js +1412 -0
  122. package/dist/plugins/zoom/lg-zoom.es5.js.map +1 -0
  123. package/dist/plugins/zoom/lg-zoom.min.js +1 -0
  124. package/dist/plugins/zoom/lg-zoom.umd.js +1415 -0
  125. package/dist/plugins/zoom/lg-zoom.umd.js.map +1 -0
  126. package/dist/plugins/zoom/package.json +7 -0
  127. package/{scss → dist/scss}/_lg-theme-default.scss +68 -18
  128. package/{scss → dist/scss}/_lg-variables.scss +0 -1
  129. package/{scss → dist/scss}/lg-autoplay.scss +10 -4
  130. package/{scss → dist/scss}/lg-comments.scss +0 -8
  131. package/dist/scss/lg-fullscreen.scss +15 -0
  132. package/dist/scss/lg-justified.scss +63 -0
  133. package/{scss → dist/scss}/lg-rotate.scss +0 -24
  134. package/dist/scss/lg-rtl.scss +145 -0
  135. package/{scss → dist/scss}/lg-share.scss +6 -33
  136. package/{scss → dist/scss}/lg-thumbnail.scss +16 -5
  137. package/{scss → dist/scss}/lg-zoom.scss +46 -9
  138. package/{scss → dist/scss}/lightgallery-bundle.scss +0 -1
  139. package/{scss → dist/scss}/lightgallery-core.scss +73 -6
  140. package/{scss → dist/scss}/lightgallery.scss +0 -1
  141. package/{scss → dist/scss}/transitions/_lg-scale-up.scss +6 -0
  142. package/{scss → dist/scss}/transitions/_lg-slide-circular-vertical.scss +6 -0
  143. package/{scss → dist/scss}/transitions/_lg-slide-circular.scss +6 -0
  144. package/{scss → dist/scss}/transitions/_lg-soft-zoom.scss +6 -0
  145. package/{scss → dist/scss}/transitions/_lg-zoom-in-big.scss +6 -0
  146. package/{scss → dist/scss}/transitions/_lg-zoom-in-out.scss +6 -0
  147. package/{scss → dist/scss}/transitions/_lg-zoom-in.scss +6 -0
  148. package/{scss → dist/scss}/transitions/_lg-zoom-out-big.scss +6 -0
  149. package/{scss → dist/scss}/transitions/_lg-zoom-out-in.scss +6 -0
  150. package/{scss → dist/scss}/transitions/_lg-zoom-out.scss +6 -0
  151. package/dist/types/headless/announce.d.ts +22 -0
  152. package/dist/types/headless/emitter.d.ts +14 -0
  153. package/dist/types/headless/gestures.d.ts +128 -0
  154. package/dist/types/headless/hash-driver.d.ts +77 -0
  155. package/dist/types/headless/icons.d.ts +56 -0
  156. package/dist/types/headless/index.d.ts +34 -0
  157. package/dist/types/headless/items.d.ts +92 -0
  158. package/dist/types/headless/justified-layout.d.ts +71 -0
  159. package/dist/types/headless/license.d.ts +35 -0
  160. package/dist/types/headless/origin-crop.d.ts +135 -0
  161. package/dist/types/headless/origin.d.ts +65 -0
  162. package/dist/types/headless/plugin-slices.d.ts +64 -0
  163. package/dist/types/headless/preload.d.ts +36 -0
  164. package/dist/types/headless/responsive.d.ts +90 -0
  165. package/dist/types/headless/settings.d.ts +268 -0
  166. package/dist/types/headless/share-urls.d.ts +60 -0
  167. package/dist/types/headless/spring.d.ts +42 -0
  168. package/dist/types/headless/state.d.ts +63 -0
  169. package/dist/types/headless/thumb-math.d.ts +85 -0
  170. package/dist/types/headless/toolbar-overflow.d.ts +61 -0
  171. package/dist/types/headless/transition.d.ts +33 -0
  172. package/dist/types/headless/velocity.d.ts +31 -0
  173. package/dist/types/headless/video-urls.d.ts +64 -0
  174. package/dist/types/headless/zoom-math.d.ts +89 -0
  175. package/{index.d.ts → dist/types/index.d.ts} +9 -4
  176. package/{lg-events.d.ts → dist/types/lg-events.d.ts} +300 -300
  177. package/dist/types/lg-icons.d.ts +27 -0
  178. package/{lg-plugin.d.ts → dist/types/lg-plugin.d.ts} +7 -7
  179. package/{lg-settings.d.ts → dist/types/lg-settings.d.ts} +549 -425
  180. package/dist/types/lg-spring-runner.d.ts +14 -0
  181. package/dist/types/lg-toolbar-overflow.d.ts +36 -0
  182. package/{lg-utils.d.ts → dist/types/lg-utils.d.ts} +236 -228
  183. package/{lgQuery.d.ts → dist/types/lgQuery.d.ts} +56 -56
  184. package/{lightgallery.d.ts → dist/types/lightgallery.d.ts} +384 -305
  185. package/{plugins → dist/types/plugins}/autoplay/lg-autoplay-settings.d.ts +41 -38
  186. package/{plugins → dist/types/plugins}/autoplay/lg-autoplay.d.ts +22 -22
  187. package/{plugins → dist/types/plugins}/comment/lg-comment-settings.d.ts +36 -33
  188. package/{plugins → dist/types/plugins}/comment/lg-comment.d.ts +25 -25
  189. package/{plugins → dist/types/plugins}/fullscreen/lg-fullscreen-settings.d.ts +17 -14
  190. package/{plugins → dist/types/plugins}/fullscreen/lg-fullscreen.d.ts +16 -16
  191. package/dist/types/plugins/hash/lg-hash-settings.d.ts +28 -0
  192. package/{plugins → dist/types/plugins}/hash/lg-hash.d.ts +25 -23
  193. package/dist/types/plugins/justified/lg-justified-settings.d.ts +42 -0
  194. package/dist/types/plugins/justified/lg-justified.d.ts +55 -0
  195. package/{plugins → dist/types/plugins}/mediumZoom/lg-medium-zoom-settings.d.ts +16 -16
  196. package/{plugins → dist/types/plugins}/mediumZoom/lg-medium-zoom.d.ts +12 -12
  197. package/dist/types/plugins/originCrop/lg-origin-crop-settings.d.ts +12 -0
  198. package/dist/types/plugins/originCrop/lg-origin-crop.d.ts +79 -0
  199. package/{plugins → dist/types/plugins}/pager/lg-pager-settings.d.ts +7 -7
  200. package/{plugins → dist/types/plugins}/pager/lg-pager.d.ts +13 -13
  201. package/{plugins → dist/types/plugins}/relativeCaption/lg-relative-caption-settings.d.ts +7 -7
  202. package/{plugins → dist/types/plugins}/relativeCaption/lg-relative-caption.d.ts +14 -14
  203. package/{plugins → dist/types/plugins}/rotate/lg-rotate-settings.d.ts +47 -45
  204. package/{plugins → dist/types/plugins}/rotate/lg-rotate.d.ts +25 -24
  205. package/{plugins → dist/types/plugins}/share/lg-fb-share-utils.d.ts +2 -2
  206. package/{plugins → dist/types/plugins}/share/lg-pinterest-share-utils.d.ts +2 -2
  207. package/{plugins → dist/types/plugins}/share/lg-share-settings.d.ts +71 -56
  208. package/dist/types/plugins/share/lg-share.d.ts +33 -0
  209. package/dist/types/plugins/share/lg-twitter-share-utils.d.ts +4 -0
  210. package/{plugins → dist/types/plugins}/share/types.d.ts +6 -6
  211. package/{plugins → dist/types/plugins}/thumbnail/lg-thumbnail-settings.d.ts +85 -70
  212. package/dist/types/plugins/thumbnail/lg-thumbnail.d.ts +88 -0
  213. package/{plugins → dist/types/plugins}/video/lg-video-settings.d.ts +94 -71
  214. package/{plugins → dist/types/plugins}/video/lg-video.d.ts +116 -104
  215. package/{plugins → dist/types/plugins}/video/types.d.ts +8 -8
  216. package/{plugins → dist/types/plugins}/vimeoThumbnail/lg-vimeo-thumbnail-settings.d.ts +11 -11
  217. package/{plugins → dist/types/plugins}/vimeoThumbnail/lg-vimeo-thumbnail.d.ts +14 -14
  218. package/{plugins → dist/types/plugins}/zoom/lg-zoom-settings.d.ts +54 -51
  219. package/{plugins → dist/types/plugins}/zoom/lg-zoom.d.ts +145 -108
  220. package/{types.d.ts → dist/types/types.d.ts} +40 -40
  221. package/package.json +222 -8
  222. package/angular/10/README.md +0 -24
  223. package/angular/10/bundles/lightgallery-angular-10.umd.js +0 -289
  224. package/angular/10/bundles/lightgallery-angular-10.umd.js.map +0 -1
  225. package/angular/10/bundles/lightgallery-angular-10.umd.min.js +0 -2
  226. package/angular/10/bundles/lightgallery-angular-10.umd.min.js.map +0 -1
  227. package/angular/10/esm2015/lib/lightgallery-angular.component.js +0 -225
  228. package/angular/10/esm2015/lib/lightgallery-angular.module.js +0 -17
  229. package/angular/10/esm2015/lib/lightgallery-angular.service.js +0 -14
  230. package/angular/10/esm2015/lightgallery-angular-10.js +0 -5
  231. package/angular/10/esm2015/public-api.js +0 -7
  232. package/angular/10/fesm2015/lightgallery-angular-10.js +0 -261
  233. package/angular/10/fesm2015/lightgallery-angular-10.js.map +0 -1
  234. package/angular/10/lib/lightgallery-angular.component.d.ts +0 -39
  235. package/angular/10/lib/lightgallery-angular.component.d.ts.map +0 -1
  236. package/angular/10/lib/lightgallery-angular.module.d.ts +0 -7
  237. package/angular/10/lib/lightgallery-angular.module.d.ts.map +0 -1
  238. package/angular/10/lib/lightgallery-angular.service.d.ts +0 -7
  239. package/angular/10/lib/lightgallery-angular.service.d.ts.map +0 -1
  240. package/angular/10/lightgallery-angular-10.d.ts +0 -6
  241. package/angular/10/lightgallery-angular-10.d.ts.map +0 -1
  242. package/angular/10/package.json +0 -21
  243. package/angular/10/public-api.d.ts +0 -4
  244. package/angular/10/public-api.d.ts.map +0 -1
  245. package/angular/11/README.md +0 -24
  246. package/angular/11/bundles/lightgallery-angular-11.umd.js +0 -290
  247. package/angular/11/bundles/lightgallery-angular-11.umd.js.map +0 -1
  248. package/angular/11/bundles/lightgallery-angular-11.umd.min.js +0 -2
  249. package/angular/11/bundles/lightgallery-angular-11.umd.min.js.map +0 -1
  250. package/angular/11/esm2015/lib/lightgallery-angular.component.js +0 -225
  251. package/angular/11/esm2015/lib/lightgallery-angular.module.js +0 -18
  252. package/angular/11/esm2015/lib/lightgallery-angular.service.js +0 -14
  253. package/angular/11/esm2015/lightgallery-angular-11.js +0 -5
  254. package/angular/11/esm2015/public-api.js +0 -7
  255. package/angular/11/fesm2015/lightgallery-angular-11.js +0 -262
  256. package/angular/11/fesm2015/lightgallery-angular-11.js.map +0 -1
  257. package/angular/11/lib/lightgallery-angular.component.d.ts +0 -39
  258. package/angular/11/lib/lightgallery-angular.component.d.ts.map +0 -1
  259. package/angular/11/lib/lightgallery-angular.module.d.ts +0 -8
  260. package/angular/11/lib/lightgallery-angular.module.d.ts.map +0 -1
  261. package/angular/11/lib/lightgallery-angular.service.d.ts +0 -7
  262. package/angular/11/lib/lightgallery-angular.service.d.ts.map +0 -1
  263. package/angular/11/lightgallery-angular-11.d.ts +0 -6
  264. package/angular/11/lightgallery-angular-11.d.ts.map +0 -1
  265. package/angular/11/package.json +0 -21
  266. package/angular/11/public-api.d.ts +0 -4
  267. package/angular/11/public-api.d.ts.map +0 -1
  268. package/angular/12/README.md +0 -24
  269. package/angular/12/bundles/lightgallery-angular-12.umd.js +0 -296
  270. package/angular/12/bundles/lightgallery-angular-12.umd.js.map +0 -1
  271. package/angular/12/esm2015/lib/lightgallery-angular.component.js +0 -221
  272. package/angular/12/esm2015/lib/lightgallery-angular.module.js +0 -17
  273. package/angular/12/esm2015/lib/lightgallery-angular.service.js +0 -14
  274. package/angular/12/esm2015/lightgallery-angular-12.js +0 -5
  275. package/angular/12/esm2015/public-api.js +0 -7
  276. package/angular/12/fesm2015/lightgallery-angular-12.js +0 -258
  277. package/angular/12/fesm2015/lightgallery-angular-12.js.map +0 -1
  278. package/angular/12/lib/lightgallery-angular.component.d.ts +0 -38
  279. package/angular/12/lib/lightgallery-angular.module.d.ts +0 -7
  280. package/angular/12/lib/lightgallery-angular.service.d.ts +0 -6
  281. package/angular/12/lightgallery-angular-12.d.ts +0 -5
  282. package/angular/12/package.json +0 -18
  283. package/angular/12/public-api.d.ts +0 -3
  284. package/angular/13/README.md +0 -24
  285. package/angular/13/esm2020/lib/lightgallery-angular.component.mjs +0 -221
  286. package/angular/13/esm2020/lib/lightgallery-angular.module.mjs +0 -17
  287. package/angular/13/esm2020/lib/lightgallery-angular.service.mjs +0 -14
  288. package/angular/13/esm2020/lightgallery-angular-13.mjs +0 -5
  289. package/angular/13/esm2020/public-api.mjs +0 -7
  290. package/angular/13/fesm2015/lightgallery-angular-13.mjs +0 -258
  291. package/angular/13/fesm2015/lightgallery-angular-13.mjs.map +0 -1
  292. package/angular/13/fesm2020/lightgallery-angular-13.mjs +0 -258
  293. package/angular/13/fesm2020/lightgallery-angular-13.mjs.map +0 -1
  294. package/angular/13/lib/lightgallery-angular.component.d.ts +0 -38
  295. package/angular/13/lib/lightgallery-angular.module.d.ts +0 -7
  296. package/angular/13/lib/lightgallery-angular.service.d.ts +0 -6
  297. package/angular/13/lightgallery-angular-13.d.ts +0 -5
  298. package/angular/13/package.json +0 -31
  299. package/angular/13/public-api.d.ts +0 -3
  300. package/angular/14/README.md +0 -24
  301. package/angular/14/esm2020/lib/lightgallery-angular.component.mjs +0 -217
  302. package/angular/14/esm2020/lib/lightgallery-angular.module.mjs +0 -17
  303. package/angular/14/esm2020/lib/lightgallery-angular.service.mjs +0 -14
  304. package/angular/14/esm2020/lightgallery-angular-14.mjs +0 -5
  305. package/angular/14/esm2020/public-api.mjs +0 -7
  306. package/angular/14/fesm2015/lightgallery-angular-14.mjs +0 -254
  307. package/angular/14/fesm2015/lightgallery-angular-14.mjs.map +0 -1
  308. package/angular/14/fesm2020/lightgallery-angular-14.mjs +0 -254
  309. package/angular/14/fesm2020/lightgallery-angular-14.mjs.map +0 -1
  310. package/angular/14/index.d.ts +0 -5
  311. package/angular/14/lib/lightgallery-angular.component.d.ts +0 -38
  312. package/angular/14/lib/lightgallery-angular.module.d.ts +0 -7
  313. package/angular/14/lib/lightgallery-angular.service.d.ts +0 -6
  314. package/angular/14/package.json +0 -31
  315. package/angular/14/public-api.d.ts +0 -3
  316. package/angular/15/README.md +0 -24
  317. package/angular/15/esm2022/lib/lightgallery-angular.component.mjs +0 -218
  318. package/angular/15/esm2022/lib/lightgallery-angular.module.mjs +0 -18
  319. package/angular/15/esm2022/lib/lightgallery-angular.service.mjs +0 -15
  320. package/angular/15/esm2022/lightgallery-angular-15.mjs +0 -5
  321. package/angular/15/esm2022/public-api.mjs +0 -7
  322. package/angular/15/fesm2022/lightgallery-angular-15.mjs +0 -254
  323. package/angular/15/fesm2022/lightgallery-angular-15.mjs.map +0 -1
  324. package/angular/15/index.d.ts +0 -5
  325. package/angular/15/lib/lightgallery-angular.component.d.ts +0 -38
  326. package/angular/15/lib/lightgallery-angular.module.d.ts +0 -7
  327. package/angular/15/lib/lightgallery-angular.service.d.ts +0 -6
  328. package/angular/15/package.json +0 -25
  329. package/angular/15/public-api.d.ts +0 -3
  330. package/angular/16/README.md +0 -24
  331. package/angular/16/esm2022/lib/lightgallery-angular.component.mjs +0 -218
  332. package/angular/16/esm2022/lib/lightgallery-angular.module.mjs +0 -18
  333. package/angular/16/esm2022/lib/lightgallery-angular.service.mjs +0 -15
  334. package/angular/16/esm2022/lightgallery-angular-16.mjs +0 -5
  335. package/angular/16/esm2022/public-api.mjs +0 -7
  336. package/angular/16/fesm2022/lightgallery-angular-16.mjs +0 -254
  337. package/angular/16/fesm2022/lightgallery-angular-16.mjs.map +0 -1
  338. package/angular/16/index.d.ts +0 -5
  339. package/angular/16/lib/lightgallery-angular.component.d.ts +0 -38
  340. package/angular/16/lib/lightgallery-angular.module.d.ts +0 -7
  341. package/angular/16/lib/lightgallery-angular.service.d.ts +0 -6
  342. package/angular/16/package.json +0 -25
  343. package/angular/16/public-api.d.ts +0 -3
  344. package/angular/9/README.md +0 -24
  345. package/angular/9/bundles/lightgallery-angular-9.umd.js +0 -271
  346. package/angular/9/bundles/lightgallery-angular-9.umd.js.map +0 -1
  347. package/angular/9/bundles/lightgallery-angular-9.umd.min.js +0 -2
  348. package/angular/9/bundles/lightgallery-angular-9.umd.min.js.map +0 -1
  349. package/angular/9/esm2015/lib/lightgallery-angular.component.js +0 -225
  350. package/angular/9/esm2015/lib/lightgallery-angular.module.js +0 -17
  351. package/angular/9/esm2015/lib/lightgallery-angular.service.js +0 -14
  352. package/angular/9/esm2015/lightgallery-angular-9.js +0 -5
  353. package/angular/9/esm2015/public-api.js +0 -7
  354. package/angular/9/esm5/lib/lightgallery-angular.component.js +0 -228
  355. package/angular/9/esm5/lib/lightgallery-angular.module.js +0 -21
  356. package/angular/9/esm5/lib/lightgallery-angular.service.js +0 -17
  357. package/angular/9/esm5/lightgallery-angular-9.js +0 -5
  358. package/angular/9/esm5/public-api.js +0 -7
  359. package/angular/9/fesm2015/lightgallery-angular-9.js +0 -261
  360. package/angular/9/fesm2015/lightgallery-angular-9.js.map +0 -1
  361. package/angular/9/fesm5/lightgallery-angular-9.js +0 -268
  362. package/angular/9/fesm5/lightgallery-angular-9.js.map +0 -1
  363. package/angular/9/lib/lightgallery-angular.component.d.ts +0 -38
  364. package/angular/9/lib/lightgallery-angular.module.d.ts +0 -6
  365. package/angular/9/lib/lightgallery-angular.service.d.ts +0 -6
  366. package/angular/9/lightgallery-angular-9.d.ts +0 -5
  367. package/angular/9/package.json +0 -23
  368. package/angular/9/public-api.d.ts +0 -3
  369. package/angular/README.md +0 -24
  370. package/angular/esm2022/lib/lightgallery-angular.component.mjs +0 -218
  371. package/angular/esm2022/lib/lightgallery-angular.module.mjs +0 -18
  372. package/angular/esm2022/lib/lightgallery-angular.service.mjs +0 -15
  373. package/angular/esm2022/lightgallery-angular.mjs +0 -5
  374. package/angular/esm2022/public-api.mjs +0 -7
  375. package/angular/fesm2022/lightgallery-angular.mjs +0 -254
  376. package/angular/fesm2022/lightgallery-angular.mjs.map +0 -1
  377. package/angular/index.d.ts +0 -5
  378. package/angular/lib/lightgallery-angular.component.d.ts +0 -38
  379. package/angular/lib/lightgallery-angular.module.d.ts +0 -7
  380. package/angular/lib/lightgallery-angular.service.d.ts +0 -6
  381. package/angular/package.json +0 -25
  382. package/angular/public-api.d.ts +0 -3
  383. package/css/lg-fullscreen.css +0 -8
  384. package/css/lg-fullscreen.css.map +0 -1
  385. package/css/lg-share.css.map +0 -1
  386. package/css/lg-thumbnail.css.map +0 -1
  387. package/css/lg-transitions.css.map +0 -1
  388. package/css/lg-zoom.css.map +0 -1
  389. package/css/lightgallery-bundle.css.map +0 -1
  390. package/css/lightgallery-bundle.min.css +0 -1
  391. package/css/lightgallery-core.css.map +0 -1
  392. package/css/lightgallery.css.map +0 -1
  393. package/fonts/lg.svg +0 -54
  394. package/fonts/lg.ttf +0 -0
  395. package/fonts/lg.woff +0 -0
  396. package/fonts/lg.woff2 +0 -0
  397. package/lib/index.js +0 -8
  398. package/lib/index.js.map +0 -1
  399. package/lib/lg-events.js +0 -37
  400. package/lib/lg-events.js.map +0 -1
  401. package/lib/lg-plugin.js +0 -13
  402. package/lib/lg-plugin.js.map +0 -1
  403. package/lib/lg-settings.js +0 -83
  404. package/lib/lg-settings.js.map +0 -1
  405. package/lib/lg-utils.js +0 -328
  406. package/lib/lg-utils.js.map +0 -1
  407. package/lib/lgQuery.js +0 -385
  408. package/lib/lgQuery.js.map +0 -1
  409. package/lib/lightgallery.js +0 -1949
  410. package/lib/lightgallery.js.map +0 -1
  411. package/lib/plugins/autoplay/lg-autoplay-settings.js +0 -16
  412. package/lib/plugins/autoplay/lg-autoplay-settings.js.map +0 -1
  413. package/lib/plugins/autoplay/lg-autoplay.js +0 -184
  414. package/lib/plugins/autoplay/lg-autoplay.js.map +0 -1
  415. package/lib/plugins/comment/lg-comment-settings.js +0 -17
  416. package/lib/plugins/comment/lg-comment-settings.js.map +0 -1
  417. package/lib/plugins/comment/lg-comment.js +0 -140
  418. package/lib/plugins/comment/lg-comment.js.map +0 -1
  419. package/lib/plugins/fullscreen/lg-fullscreen-settings.js +0 -10
  420. package/lib/plugins/fullscreen/lg-fullscreen-settings.js.map +0 -1
  421. package/lib/plugins/fullscreen/lg-fullscreen.js +0 -108
  422. package/lib/plugins/fullscreen/lg-fullscreen.js.map +0 -1
  423. package/lib/plugins/hash/lg-hash-settings.js +0 -9
  424. package/lib/plugins/hash/lg-hash-settings.js.map +0 -1
  425. package/lib/plugins/hash/lg-hash.js +0 -139
  426. package/lib/plugins/hash/lg-hash.js.map +0 -1
  427. package/lib/plugins/mediumZoom/lg-medium-zoom-settings.js +0 -9
  428. package/lib/plugins/mediumZoom/lg-medium-zoom-settings.js.map +0 -1
  429. package/lib/plugins/mediumZoom/lg-medium-zoom.js +0 -73
  430. package/lib/plugins/mediumZoom/lg-medium-zoom.js.map +0 -1
  431. package/lib/plugins/pager/lg-pager-settings.js +0 -7
  432. package/lib/plugins/pager/lg-pager-settings.js.map +0 -1
  433. package/lib/plugins/pager/lg-pager.js +0 -82
  434. package/lib/plugins/pager/lg-pager.js.map +0 -1
  435. package/lib/plugins/relativeCaption/lg-relative-caption-settings.js +0 -7
  436. package/lib/plugins/relativeCaption/lg-relative-caption-settings.js.map +0 -1
  437. package/lib/plugins/relativeCaption/lg-relative-caption.js +0 -97
  438. package/lib/plugins/relativeCaption/lg-relative-caption.js.map +0 -1
  439. package/lib/plugins/rotate/lg-rotate-settings.js +0 -18
  440. package/lib/plugins/rotate/lg-rotate-settings.js.map +0 -1
  441. package/lib/plugins/rotate/lg-rotate.js +0 -206
  442. package/lib/plugins/rotate/lg-rotate.js.map +0 -1
  443. package/lib/plugins/share/lg-fb-share-utils.js +0 -10
  444. package/lib/plugins/share/lg-fb-share-utils.js.map +0 -1
  445. package/lib/plugins/share/lg-pinterest-share-utils.js +0 -17
  446. package/lib/plugins/share/lg-pinterest-share-utils.js.map +0 -1
  447. package/lib/plugins/share/lg-share-settings.js +0 -15
  448. package/lib/plugins/share/lg-share-settings.js.map +0 -1
  449. package/lib/plugins/share/lg-share.js +0 -130
  450. package/lib/plugins/share/lg-share.js.map +0 -1
  451. package/lib/plugins/share/lg-twitter-share-utils.js +0 -11
  452. package/lib/plugins/share/lg-twitter-share-utils.js.map +0 -1
  453. package/lib/plugins/share/types.js +0 -3
  454. package/lib/plugins/share/types.js.map +0 -1
  455. package/lib/plugins/thumbnail/lg-thumbnail-settings.js +0 -23
  456. package/lib/plugins/thumbnail/lg-thumbnail-settings.js.map +0 -1
  457. package/lib/plugins/thumbnail/lg-thumbnail.js +0 -414
  458. package/lib/plugins/thumbnail/lg-thumbnail.js.map +0 -1
  459. package/lib/plugins/video/lg-video-settings.js +0 -15
  460. package/lib/plugins/video/lg-video-settings.js.map +0 -1
  461. package/lib/plugins/video/lg-video-utils.js +0 -84
  462. package/lib/plugins/video/lg-video-utils.js.map +0 -1
  463. package/lib/plugins/video/lg-video.js +0 -411
  464. package/lib/plugins/video/lg-video.js.map +0 -1
  465. package/lib/plugins/video/types.js +0 -3
  466. package/lib/plugins/video/types.js.map +0 -1
  467. package/lib/plugins/vimeoThumbnail/lg-vimeo-thumbnail-settings.js +0 -8
  468. package/lib/plugins/vimeoThumbnail/lg-vimeo-thumbnail-settings.js.map +0 -1
  469. package/lib/plugins/vimeoThumbnail/lg-vimeo-thumbnail.js +0 -122
  470. package/lib/plugins/vimeoThumbnail/lg-vimeo-thumbnail.js.map +0 -1
  471. package/lib/plugins/zoom/lg-zoom-settings.js +0 -21
  472. package/lib/plugins/zoom/lg-zoom-settings.js.map +0 -1
  473. package/lib/plugins/zoom/lg-zoom.js +0 -909
  474. package/lib/plugins/zoom/lg-zoom.js.map +0 -1
  475. package/lib/types.js +0 -3
  476. package/lib/types.js.map +0 -1
  477. package/lightgallery-2.9.0.tgz +0 -0
  478. package/lightgallery.es5.js +0 -2786
  479. package/lightgallery.es5.js.map +0 -1
  480. package/lightgallery.min.js +0 -8
  481. package/lightgallery.umd.js +0 -2794
  482. package/lightgallery.umd.js.map +0 -1
  483. package/lit/custom-elements.json +0 -82
  484. package/lit/lightgallery.esm.js +0 -59
  485. package/lit/lightgallery.umd.js +0 -37
  486. package/lit/package.json +0 -8
  487. package/plugins/autoplay/lg-autoplay.es5.js +0 -250
  488. package/plugins/autoplay/lg-autoplay.es5.js.map +0 -1
  489. package/plugins/autoplay/lg-autoplay.min.js +0 -8
  490. package/plugins/autoplay/lg-autoplay.umd.js +0 -258
  491. package/plugins/autoplay/lg-autoplay.umd.js.map +0 -1
  492. package/plugins/autoplay/package.json +0 -7
  493. package/plugins/comment/lg-comment.es5.js +0 -205
  494. package/plugins/comment/lg-comment.es5.js.map +0 -1
  495. package/plugins/comment/lg-comment.min.js +0 -8
  496. package/plugins/comment/lg-comment.umd.js +0 -213
  497. package/plugins/comment/lg-comment.umd.js.map +0 -1
  498. package/plugins/comment/package.json +0 -7
  499. package/plugins/fullscreen/lg-fullscreen.es5.js +0 -135
  500. package/plugins/fullscreen/lg-fullscreen.es5.js.map +0 -1
  501. package/plugins/fullscreen/lg-fullscreen.min.js +0 -8
  502. package/plugins/fullscreen/lg-fullscreen.umd.js +0 -143
  503. package/plugins/fullscreen/lg-fullscreen.umd.js.map +0 -1
  504. package/plugins/fullscreen/package.json +0 -7
  505. package/plugins/hash/lg-hash-settings.d.ts +0 -16
  506. package/plugins/hash/lg-hash.es5.js +0 -198
  507. package/plugins/hash/lg-hash.es5.js.map +0 -1
  508. package/plugins/hash/lg-hash.min.js +0 -8
  509. package/plugins/hash/lg-hash.umd.js +0 -206
  510. package/plugins/hash/lg-hash.umd.js.map +0 -1
  511. package/plugins/hash/package.json +0 -7
  512. package/plugins/mediumZoom/lg-medium-zoom.es5.js +0 -132
  513. package/plugins/mediumZoom/lg-medium-zoom.es5.js.map +0 -1
  514. package/plugins/mediumZoom/lg-medium-zoom.min.js +0 -8
  515. package/plugins/mediumZoom/lg-medium-zoom.umd.js +0 -140
  516. package/plugins/mediumZoom/lg-medium-zoom.umd.js.map +0 -1
  517. package/plugins/mediumZoom/package.json +0 -7
  518. package/plugins/pager/lg-pager.es5.js +0 -139
  519. package/plugins/pager/lg-pager.es5.js.map +0 -1
  520. package/plugins/pager/lg-pager.min.js +0 -8
  521. package/plugins/pager/lg-pager.umd.js +0 -147
  522. package/plugins/pager/lg-pager.umd.js.map +0 -1
  523. package/plugins/pager/package.json +0 -7
  524. package/plugins/relativeCaption/lg-relative-caption.es5.js +0 -154
  525. package/plugins/relativeCaption/lg-relative-caption.es5.js.map +0 -1
  526. package/plugins/relativeCaption/lg-relative-caption.min.js +0 -8
  527. package/plugins/relativeCaption/lg-relative-caption.umd.js +0 -162
  528. package/plugins/relativeCaption/lg-relative-caption.umd.js.map +0 -1
  529. package/plugins/relativeCaption/package.json +0 -7
  530. package/plugins/rotate/lg-rotate.es5.js +0 -274
  531. package/plugins/rotate/lg-rotate.es5.js.map +0 -1
  532. package/plugins/rotate/lg-rotate.min.js +0 -8
  533. package/plugins/rotate/lg-rotate.umd.js +0 -282
  534. package/plugins/rotate/lg-rotate.umd.js.map +0 -1
  535. package/plugins/rotate/package.json +0 -7
  536. package/plugins/share/lg-share.d.ts +0 -15
  537. package/plugins/share/lg-share.es5.js +0 -219
  538. package/plugins/share/lg-share.es5.js.map +0 -1
  539. package/plugins/share/lg-share.min.js +0 -8
  540. package/plugins/share/lg-share.umd.js +0 -227
  541. package/plugins/share/lg-share.umd.js.map +0 -1
  542. package/plugins/share/lg-twitter-share-utils.d.ts +0 -2
  543. package/plugins/share/package.json +0 -7
  544. package/plugins/thumbnail/lg-thumbnail.d.ts +0 -48
  545. package/plugins/thumbnail/lg-thumbnail.es5.js +0 -487
  546. package/plugins/thumbnail/lg-thumbnail.es5.js.map +0 -1
  547. package/plugins/thumbnail/lg-thumbnail.min.js +0 -8
  548. package/plugins/thumbnail/lg-thumbnail.umd.js +0 -495
  549. package/plugins/thumbnail/lg-thumbnail.umd.js.map +0 -1
  550. package/plugins/thumbnail/package.json +0 -7
  551. package/plugins/video/lg-video-utils.d.ts +0 -10
  552. package/plugins/video/lg-video.es5.js +0 -545
  553. package/plugins/video/lg-video.es5.js.map +0 -1
  554. package/plugins/video/lg-video.min.js +0 -8
  555. package/plugins/video/lg-video.umd.js +0 -553
  556. package/plugins/video/lg-video.umd.js.map +0 -1
  557. package/plugins/video/package.json +0 -7
  558. package/plugins/vimeoThumbnail/lg-vimeo-thumbnail.es5.js +0 -182
  559. package/plugins/vimeoThumbnail/lg-vimeo-thumbnail.es5.js.map +0 -1
  560. package/plugins/vimeoThumbnail/lg-vimeo-thumbnail.min.js +0 -8
  561. package/plugins/vimeoThumbnail/lg-vimeo-thumbnail.umd.js +0 -190
  562. package/plugins/vimeoThumbnail/lg-vimeo-thumbnail.umd.js.map +0 -1
  563. package/plugins/vimeoThumbnail/package.json +0 -7
  564. package/plugins/zoom/lg-zoom.es5.js +0 -980
  565. package/plugins/zoom/lg-zoom.es5.js.map +0 -1
  566. package/plugins/zoom/lg-zoom.min.js +0 -8
  567. package/plugins/zoom/lg-zoom.umd.js +0 -988
  568. package/plugins/zoom/lg-zoom.umd.js.map +0 -1
  569. package/plugins/zoom/package.json +0 -7
  570. package/react/Lightgallery.d.ts +0 -33
  571. package/react/Lightgallery.es5.js +0 -2988
  572. package/react/Lightgallery.es5.js.map +0 -1
  573. package/react/Lightgallery.umd.js +0 -2994
  574. package/react/Lightgallery.umd.js.map +0 -1
  575. package/react/package.json +0 -7
  576. package/scss/_lg-fonts.scss +0 -27
  577. package/scss/lg-fullscreen.scss +0 -9
  578. package/vue/LightGallery.vue.d.ts +0 -37
  579. package/vue/LightGalleryVue.common.js +0 -9343
  580. package/vue/LightGalleryVue.common.js.map +0 -1
  581. package/vue/LightGalleryVue.umd.js +0 -9353
  582. package/vue/LightGalleryVue.umd.js.map +0 -1
  583. package/vue/LightGalleryVue.umd.min.js +0 -8
  584. package/vue/LightGalleryVue.umd.min.js.map +0 -1
  585. package/vue/package.json +0 -7
  586. /package/{css → dist/css}/lg-medium-zoom.css +0 -0
  587. /package/{css → dist/css}/lg-medium-zoom.css.map +0 -0
  588. /package/{css → dist/css}/lg-pager.css +0 -0
  589. /package/{css → dist/css}/lg-relative-caption.css +0 -0
  590. /package/{css → dist/css}/lg-relative-caption.css.map +0 -0
  591. /package/{css → dist/css}/lg-video.css +0 -0
  592. /package/{css → dist/css}/lg-video.css.map +0 -0
  593. /package/{images → dist/images}/loading.gif +0 -0
  594. /package/{scss → dist/scss}/_lg-mixins.scss +0 -0
  595. /package/{scss → dist/scss}/lg-medium-zoom.scss +0 -0
  596. /package/{scss → dist/scss}/lg-pager.scss +0 -0
  597. /package/{scss → dist/scss}/lg-relative-caption.scss +0 -0
  598. /package/{scss → dist/scss}/lg-transitions.scss +0 -0
  599. /package/{scss → dist/scss}/lg-video.scss +0 -0
  600. /package/{scss → dist/scss}/transitions/_index.scss +0 -0
  601. /package/{scss → dist/scss}/transitions/_lg-lollipop-rev.scss +0 -0
  602. /package/{scss → dist/scss}/transitions/_lg-lollipop.scss +0 -0
  603. /package/{scss → dist/scss}/transitions/_lg-rotate-rev.scss +0 -0
  604. /package/{scss → dist/scss}/transitions/_lg-rotate.scss +0 -0
  605. /package/{scss → dist/scss}/transitions/_lg-slide-skew-cross-rev.scss +0 -0
  606. /package/{scss → dist/scss}/transitions/_lg-slide-skew-cross.scss +0 -0
  607. /package/{scss → dist/scss}/transitions/_lg-slide-skew-only-rev.scss +0 -0
  608. /package/{scss → dist/scss}/transitions/_lg-slide-skew-only-y-rev.scss +0 -0
  609. /package/{scss → dist/scss}/transitions/_lg-slide-skew-only-y.scss +0 -0
  610. /package/{scss → dist/scss}/transitions/_lg-slide-skew-only.scss +0 -0
  611. /package/{scss → dist/scss}/transitions/_lg-slide-skew-rev.scss +0 -0
  612. /package/{scss → dist/scss}/transitions/_lg-slide-skew-ver-cross-rev.scss +0 -0
  613. /package/{scss → dist/scss}/transitions/_lg-slide-skew-ver-cross.scss +0 -0
  614. /package/{scss → dist/scss}/transitions/_lg-slide-skew-ver-rev.scss +0 -0
  615. /package/{scss → dist/scss}/transitions/_lg-slide-skew-ver.scss +0 -0
  616. /package/{scss → dist/scss}/transitions/_lg-slide-skew.scss +0 -0
  617. /package/{scss → dist/scss}/transitions/_lg-slide-vertical-growth.scss +0 -0
  618. /package/{scss → dist/scss}/transitions/_lg-slide-vertical.scss +0 -0
  619. /package/{scss → dist/scss}/transitions/_lg-tube.scss +0 -0
@@ -0,0 +1,3797 @@
1
+ /*!
2
+ * lightgallery | 3.0.0-beta.3 | October 1st 2026
3
+ * http://www.lightgalleryjs.com/
4
+ * Copyright (c) 2020 Sachin Neravath;
5
+ * @license GPLv3
6
+ */
7
+ function getVideoInfo(src, hasHtml5Video) {
8
+ if (!src) {
9
+ return hasHtml5Video ? { html5: true } : void 0;
10
+ }
11
+ const youtube = src.match(
12
+ /\/\/(?:www\.)?youtu(?:\.be|be\.com|be-nocookie\.com)\/(?:watch\?v=|embed\/)?([a-z0-9\-_%]+)([&|?][\S]*)*/i
13
+ );
14
+ if (youtube) {
15
+ return { youtube: [...youtube] };
16
+ }
17
+ const vimeo = src.match(
18
+ /\/\/(?:www\.)?(?:player\.)?vimeo.com\/(?:video\/)?([0-9a-z\-_]+)(.*)?/i
19
+ );
20
+ if (vimeo) {
21
+ return { vimeo: [...vimeo] };
22
+ }
23
+ const wistia = src.match(
24
+ /https?:\/\/(.+)?(wistia\.com|wi\.st)\/(medias|embed)\/([0-9a-z\-_]+)(.*)/
25
+ );
26
+ if (wistia) {
27
+ return { wistia: [...wistia] };
28
+ }
29
+ return hasHtml5Video ? { html5: true } : void 0;
30
+ }
31
+ function getYouTubePosterUrl(videoInfo) {
32
+ if (!(videoInfo == null ? void 0 : videoInfo.youtube)) {
33
+ return void 0;
34
+ }
35
+ return `//img.youtube.com/vi/${videoInfo.youtube[1]}/maxresdefault.jpg`;
36
+ }
37
+ function getFacadePoster(item, videoInfo, loadYouTubePoster) {
38
+ if (!videoInfo || videoInfo.html5) {
39
+ return item.poster || void 0;
40
+ }
41
+ return item.poster || (loadYouTubePoster ? getYouTubePosterUrl(videoInfo) : void 0) || item.thumb || void 0;
42
+ }
43
+ const TESTING_LICENSE_KEY = "0000-0000-000-0000";
44
+ const LICENSE_KEY_PREFIX = "LIG";
45
+ const LICENSE_DOCS = "https://www.lightgalleryjs.com/docs/license/";
46
+ function checkLicenseKey(licenseKey) {
47
+ const key = (licenseKey != null ? licenseKey : "").trim();
48
+ if (!key) {
49
+ return {
50
+ level: "error",
51
+ message: `lightGallery: please provide a valid license key. See ${LICENSE_DOCS}`
52
+ };
53
+ }
54
+ if (key === TESTING_LICENSE_KEY) {
55
+ return {
56
+ level: "warn",
57
+ message: `lightGallery: ${key} license key is not valid for production use. See ${LICENSE_DOCS}`
58
+ };
59
+ }
60
+ if (!key.startsWith(LICENSE_KEY_PREFIX)) {
61
+ return {
62
+ level: "warn",
63
+ message: `lightGallery: this license key is for v1 or v2 and is not valid for v3. Please upgrade to a v3 license. See ${LICENSE_DOCS}`
64
+ };
65
+ }
66
+ return null;
67
+ }
68
+ let pageLicenseKey;
69
+ const loggedNotices = /* @__PURE__ */ new Set();
70
+ function setLicenseKey(licenseKey) {
71
+ pageLicenseKey = licenseKey;
72
+ }
73
+ function resolveLicenseKey(instanceKey) {
74
+ const own = (instanceKey != null ? instanceKey : "").trim();
75
+ if (pageLicenseKey !== void 0 && (!own || own === TESTING_LICENSE_KEY)) {
76
+ return pageLicenseKey;
77
+ }
78
+ return instanceKey != null ? instanceKey : TESTING_LICENSE_KEY;
79
+ }
80
+ function takeLicenseNotice(instanceKey) {
81
+ const notice = checkLicenseKey(resolveLicenseKey(instanceKey));
82
+ if (!notice || loggedNotices.has(notice.message)) return null;
83
+ loggedNotices.add(notice.message);
84
+ return notice;
85
+ }
86
+ function formatSlideAnnouncement(options) {
87
+ const base = options.template.replace("{index}", String(options.index)).replace("{total}", String(options.total));
88
+ const caption = (options.caption || "").replace(/\s+/g, " ").trim();
89
+ return caption ? `${base}, ${caption}` : base;
90
+ }
91
+ const SPRING_SETTLE_DAMPING = 1;
92
+ const SPRING_NATURAL_FREQUENCY = 12;
93
+ const DECELERATION_RATE = 0.995;
94
+ function project(velocity, decelerationRate = DECELERATION_RATE) {
95
+ return velocity * decelerationRate / (1 - decelerationRate);
96
+ }
97
+ function stepSpring(state, target, dtMs, {
98
+ dampingRatio = SPRING_SETTLE_DAMPING,
99
+ naturalFrequency = SPRING_NATURAL_FREQUENCY
100
+ } = {}) {
101
+ const t = dtMs / 1e3;
102
+ const w0 = naturalFrequency;
103
+ const zeta = Math.min(dampingRatio, 1);
104
+ const x0 = state.position - target;
105
+ const v0 = state.velocity * 1e3;
106
+ const decay = Math.exp(-zeta * w0 * t);
107
+ let x;
108
+ let v;
109
+ if (zeta < 1) {
110
+ const wd = w0 * Math.sqrt(1 - zeta * zeta);
111
+ const a = x0;
112
+ const b = (v0 + zeta * w0 * x0) / wd;
113
+ const cos = Math.cos(wd * t);
114
+ const sin = Math.sin(wd * t);
115
+ x = decay * (a * cos + b * sin);
116
+ v = decay * ((b * wd - zeta * w0 * a) * cos - (a * wd + zeta * w0 * b) * sin);
117
+ } else {
118
+ const b = v0 + w0 * x0;
119
+ x = decay * (x0 + b * t);
120
+ v = decay * (b - w0 * (x0 + b * t));
121
+ }
122
+ return { position: target + x, velocity: v / 1e3 };
123
+ }
124
+ function isSpringSettled(state, target, restDelta = 0.3, restVelocity = 0.012) {
125
+ return Math.abs(state.position - target) < restDelta && Math.abs(state.velocity) < restVelocity;
126
+ }
127
+ const SWIPE_AXIS_THRESHOLD = 10;
128
+ const FLICK_VELOCITY = 0.5;
129
+ const FLICK_MIN_DISTANCE = 20;
130
+ const VERTICAL_CLOSE_THRESHOLD = 100;
131
+ const VERTICAL_CLOSE_RATIO = 0.4;
132
+ const VERTICAL_CLOSE_MIN_DRAG = 40;
133
+ const SLIDE_EDGE_FRICTION = 0.35;
134
+ function getEdgeFrictionedDelta(deltaX, hasPrev, hasNext, direction = "ltr") {
135
+ const [towardPrev, towardNext] = direction === "rtl" ? [hasNext, hasPrev] : [hasPrev, hasNext];
136
+ if (deltaX > 0 && !towardPrev || deltaX < 0 && !towardNext) {
137
+ return deltaX * SLIDE_EDGE_FRICTION;
138
+ }
139
+ return deltaX;
140
+ }
141
+ function getSwipeAxis(deltaX, deltaY, current) {
142
+ if (current) {
143
+ return current;
144
+ }
145
+ if (Math.abs(deltaX) > SWIPE_AXIS_THRESHOLD) {
146
+ return "horizontal";
147
+ }
148
+ if (Math.abs(deltaY) > SWIPE_AXIS_THRESHOLD) {
149
+ return "vertical";
150
+ }
151
+ return void 0;
152
+ }
153
+ function getHorizontalDragTransforms(deltaX, slideWidth, direction = "ltr") {
154
+ const slideWidthAmount = slideWidth * 15 / 100;
155
+ const gutter = slideWidthAmount - Math.abs(deltaX * 10 / 100);
156
+ const before = `translate3d(${-slideWidth + deltaX - gutter}px, 0px, 0px)`;
157
+ const after = `translate3d(${slideWidth + deltaX + gutter}px, 0px, 0px)`;
158
+ return {
159
+ current: `translate3d(${deltaX}px, 0px, 0px)`,
160
+ // In RTL the prev slide rests to the physical right (lg-rtl.css
161
+ // flips the resting positions the same way).
162
+ prev: direction === "rtl" ? after : before,
163
+ next: direction === "rtl" ? before : after
164
+ };
165
+ }
166
+ function getVerticalDragEffects(deltaY, viewportWidth, viewportHeight) {
167
+ const distance = Math.abs(deltaY);
168
+ const scale = 1 - distance / (viewportWidth * 2);
169
+ return {
170
+ backdropOpacity: 1 - distance / viewportHeight,
171
+ transform: `translate3d(0px, ${deltaY}px, 0px) scale3d(${scale}, ${scale}, 1)`,
172
+ hideUi: distance > VERTICAL_CLOSE_THRESHOLD
173
+ };
174
+ }
175
+ function getSwipeReleaseVerdict({
176
+ deltaX,
177
+ velocityX,
178
+ threshold,
179
+ flickVelocity = FLICK_VELOCITY,
180
+ viewportWidth,
181
+ direction = "ltr"
182
+ }) {
183
+ const distance = Math.abs(deltaX);
184
+ const directionMatches = deltaX !== 0 && Math.sign(velocityX) === Math.sign(deltaX);
185
+ const projected = deltaX + project(velocityX);
186
+ const passes = distance > threshold || distance > FLICK_MIN_DISTANCE && directionMatches && Math.abs(velocityX) > flickVelocity || viewportWidth !== void 0 && distance > FLICK_MIN_DISTANCE && directionMatches && Math.abs(projected) > viewportWidth / 2;
187
+ if (!passes) {
188
+ return "stay";
189
+ }
190
+ const towardNext = direction === "rtl" ? deltaX > 0 : deltaX < 0;
191
+ return towardNext ? "next" : "prev";
192
+ }
193
+ function shouldCloseOnVerticalDrag(deltaY, velocityY, viewportHeight, options) {
194
+ if (!options.closable || !options.swipeToClose || deltaY === 0) {
195
+ return false;
196
+ }
197
+ if (Math.abs(deltaY) < VERTICAL_CLOSE_MIN_DRAG) {
198
+ return false;
199
+ }
200
+ const projected = deltaY + project(velocityY);
201
+ return Math.sign(projected) === Math.sign(deltaY) && Math.abs(projected) > VERTICAL_CLOSE_RATIO * viewportHeight;
202
+ }
203
+ function resolveSwipeTarget(verdict, currentIndex, slidesCount, loop) {
204
+ if (verdict === "stay") {
205
+ return null;
206
+ }
207
+ const touchLoop = loop && slidesCount >= 3;
208
+ if (verdict === "next") {
209
+ if (currentIndex + 1 < slidesCount) {
210
+ return currentIndex + 1;
211
+ }
212
+ return touchLoop ? 0 : null;
213
+ }
214
+ if (currentIndex > 0) {
215
+ return currentIndex - 1;
216
+ }
217
+ return touchLoop ? slidesCount - 1 : null;
218
+ }
219
+ function parseImageSize(lgSize, viewportWidth) {
220
+ if (!lgSize) {
221
+ return void 0;
222
+ }
223
+ let size = lgSize;
224
+ const responsiveSizes = lgSize.split(",");
225
+ if (responsiveSizes[1]) {
226
+ for (let i = 0; i < responsiveSizes.length; i++) {
227
+ const candidate = responsiveSizes[i].trim();
228
+ const responsiveWidth = parseInt(candidate.split("-")[2], 10);
229
+ if (responsiveWidth > viewportWidth) {
230
+ size = candidate;
231
+ break;
232
+ }
233
+ if (i === responsiveSizes.length - 1) {
234
+ size = candidate;
235
+ }
236
+ }
237
+ }
238
+ const parts = size.trim().split("-");
239
+ const width = parseInt(parts[0], 10);
240
+ const height = parseInt(parts[1], 10);
241
+ if (!Number.isFinite(width) || !Number.isFinite(height)) {
242
+ return void 0;
243
+ }
244
+ return { width, height };
245
+ }
246
+ function fitImageSize(size, containerWidth, containerHeight) {
247
+ const maxWidth = Math.min(containerWidth, size.width);
248
+ const maxHeight = Math.min(containerHeight, size.height);
249
+ const ratio = Math.min(maxWidth / size.width, maxHeight / size.height);
250
+ return { width: size.width * ratio, height: size.height * ratio };
251
+ }
252
+ function isUsableOriginRect(rect) {
253
+ return !!rect && Number.isFinite(rect.left) && Number.isFinite(rect.top) && rect.width > 0 && rect.height > 0;
254
+ }
255
+ const CENTER_CLOSE_SCALE = 0.5;
256
+ function getCenterCloseTransform(scale = CENTER_CLOSE_SCALE) {
257
+ return `translate3d(0, 0, 0) scale3d(${scale}, ${scale}, 1)`;
258
+ }
259
+ function getOriginTransform(input) {
260
+ const { triggerRect, containerRect, top, bottom, imageSize } = input;
261
+ const availableWidth = containerRect.width;
262
+ const availableHeight = containerRect.height - (top + bottom);
263
+ const x = (availableWidth - triggerRect.width) / 2 - triggerRect.left + containerRect.left;
264
+ const y = (availableHeight - triggerRect.height) / 2 - triggerRect.top + top;
265
+ const scaleX = triggerRect.width / imageSize.width;
266
+ const scaleY = triggerRect.height / imageSize.height;
267
+ return `translate3d(${-x}px, ${-y}px, 0) scale3d(${scaleX}, ${scaleY}, 1)`;
268
+ }
269
+ const coreDefaultIcons = {
270
+ 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>',
271
+ // Three dots for the toolbar's More options menu button.
272
+ 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>',
273
+ 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>',
274
+ 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>',
275
+ download: '<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>',
276
+ maximize: '<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>',
277
+ minimize: '<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>'
278
+ };
279
+ var __defProp$1 = Object.defineProperty;
280
+ var __defProps$1 = Object.defineProperties;
281
+ var __getOwnPropDescs$1 = Object.getOwnPropertyDescriptors;
282
+ var __getOwnPropSymbols$1 = Object.getOwnPropertySymbols;
283
+ var __hasOwnProp$1 = Object.prototype.hasOwnProperty;
284
+ var __propIsEnum$1 = Object.prototype.propertyIsEnumerable;
285
+ var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
286
+ var __spreadValues$1 = (a, b) => {
287
+ for (var prop in b || (b = {}))
288
+ if (__hasOwnProp$1.call(b, prop))
289
+ __defNormalProp$1(a, prop, b[prop]);
290
+ if (__getOwnPropSymbols$1)
291
+ for (var prop of __getOwnPropSymbols$1(b)) {
292
+ if (__propIsEnum$1.call(b, prop))
293
+ __defNormalProp$1(a, prop, b[prop]);
294
+ }
295
+ return a;
296
+ };
297
+ var __spreadProps$1 = (a, b) => __defProps$1(a, __getOwnPropDescs$1(b));
298
+ const TOOLBAR_PINNED = Number.POSITIVE_INFINITY;
299
+ const TOOLBAR_DEFAULT_PRIORITY = 20;
300
+ const PRIORITY_BY_CLASS = [
301
+ ["lg-close", TOOLBAR_PINNED],
302
+ ["lg-share", 30],
303
+ ["lg-autoplay-button", 30],
304
+ ["lg-download", 30],
305
+ ["lg-fullscreen", 20],
306
+ ["lg-toggle-thumb", 20],
307
+ ["lg-comment-toggle", 20],
308
+ ["lg-maximize", 10],
309
+ ["lg-rotate-left", 10],
310
+ ["lg-rotate-right", 10],
311
+ ["lg-flip-hor", 10],
312
+ ["lg-flip-ver", 10],
313
+ // Gesture duplicates go first: pinch and double-tap do the same.
314
+ ["lg-zoom-in", 0],
315
+ ["lg-zoom-out", 0],
316
+ ["lg-actual-size", 0]
317
+ ];
318
+ function getToolbarItemPriority(classList) {
319
+ const classes = new Set(classList);
320
+ for (const [className, priority] of PRIORITY_BY_CLASS) {
321
+ if (classes.has(className)) {
322
+ return priority;
323
+ }
324
+ }
325
+ return TOOLBAR_DEFAULT_PRIORITY;
326
+ }
327
+ function getToolbarOverflow({
328
+ available,
329
+ reserved,
330
+ moreWidth,
331
+ items
332
+ }) {
333
+ if (available <= 0) {
334
+ return [];
335
+ }
336
+ const total = items.reduce((sum, item) => sum + item.width, 0);
337
+ if (reserved + total <= available) {
338
+ return [];
339
+ }
340
+ const candidates = items.map((item, index) => __spreadProps$1(__spreadValues$1({}, item), { index })).filter((item) => item.priority !== TOOLBAR_PINNED).sort((a, b) => a.priority - b.priority || b.index - a.index);
341
+ let used = reserved + moreWidth + total;
342
+ const moved = [];
343
+ for (const item of candidates) {
344
+ if (used <= available) {
345
+ break;
346
+ }
347
+ moved.push(item.index);
348
+ used -= item.width;
349
+ }
350
+ return moved.sort((a, b) => a - b);
351
+ }
352
+ const BACKDROP_CLASS_NAMES = [
353
+ "lg-outer",
354
+ "lg-item",
355
+ "lg-img-wrap",
356
+ "lg-img-rotate"
357
+ ];
358
+ function consumeBackdropPress(event) {
359
+ var _a;
360
+ const classList = (_a = event.target) == null ? void 0 : _a.classList;
361
+ if (!classList || !BACKDROP_CLASS_NAMES.some((name) => classList.contains(name))) {
362
+ return false;
363
+ }
364
+ event.preventDefault();
365
+ event.stopPropagation();
366
+ return true;
367
+ }
368
+ function onTransitionSettle(element, property, fallbackMs, callback) {
369
+ let settled = false;
370
+ let timer;
371
+ const isOwn = (event) => event.target === element && event.propertyName === property;
372
+ const dispose = () => {
373
+ clearTimeout(timer);
374
+ element.removeEventListener("transitionstart", onStart);
375
+ element.removeEventListener("transitionend", onEnd);
376
+ };
377
+ const settle = () => {
378
+ if (settled) {
379
+ return;
380
+ }
381
+ settled = true;
382
+ dispose();
383
+ callback();
384
+ };
385
+ const onStart = (event) => {
386
+ if (isOwn(event)) {
387
+ clearTimeout(timer);
388
+ timer = setTimeout(settle, fallbackMs);
389
+ }
390
+ };
391
+ const onEnd = (event) => {
392
+ if (isOwn(event)) {
393
+ settle();
394
+ }
395
+ };
396
+ element.addEventListener("transitionstart", onStart);
397
+ element.addEventListener("transitionend", onEnd);
398
+ timer = setTimeout(settle, fallbackMs);
399
+ return () => {
400
+ settled = true;
401
+ dispose();
402
+ };
403
+ }
404
+ const DECODE_TIMEOUT_MS = 500;
405
+ function awaitDecode(img, timeoutMs = DECODE_TIMEOUT_MS) {
406
+ if (typeof img.decode !== "function") {
407
+ return Promise.resolve();
408
+ }
409
+ return new Promise((resolve) => {
410
+ let done = false;
411
+ const finish = () => {
412
+ if (!done) {
413
+ done = true;
414
+ clearTimeout(timer);
415
+ resolve();
416
+ }
417
+ };
418
+ const timer = setTimeout(finish, timeoutMs);
419
+ img.decode().then(finish, finish);
420
+ });
421
+ }
422
+ const VELOCITY_WINDOW_MS = 100;
423
+ const MIN_DISPLACEMENT = 1;
424
+ const MIN_WINDOW_SPAN_MS = 5;
425
+ function pushVelocitySample(samples, sample, windowMs = VELOCITY_WINDOW_MS) {
426
+ return [...samples.filter((s) => sample.t - s.t <= windowMs), sample];
427
+ }
428
+ function getWindowedVelocity(samples, releaseTime, windowMs = VELOCITY_WINDOW_MS) {
429
+ const recent = samples.filter((s) => releaseTime - s.t <= windowMs);
430
+ if (recent.length < 2) {
431
+ return { x: 0, y: 0 };
432
+ }
433
+ const first = recent[0];
434
+ const last = recent[recent.length - 1];
435
+ const dt = last.t - first.t;
436
+ if (dt < MIN_WINDOW_SPAN_MS) {
437
+ return { x: 0, y: 0 };
438
+ }
439
+ const dx = last.x - first.x;
440
+ const dy = last.y - first.y;
441
+ return {
442
+ x: Math.abs(dx) > MIN_DISPLACEMENT ? dx / dt : 0,
443
+ y: Math.abs(dy) > MIN_DISPLACEMENT ? dy / dt : 0
444
+ };
445
+ }
446
+ const lGEvents = {
447
+ afterAppendSlide: "lgAfterAppendSlide",
448
+ init: "lgInit",
449
+ hasVideo: "lgHasVideo",
450
+ containerResize: "lgContainerResize",
451
+ updateSlides: "lgUpdateSlides",
452
+ afterAppendSubHtml: "lgAfterAppendSubHtml",
453
+ beforeOpen: "lgBeforeOpen",
454
+ afterOpen: "lgAfterOpen",
455
+ slideItemLoad: "lgSlideItemLoad",
456
+ beforeSlide: "lgBeforeSlide",
457
+ afterSlide: "lgAfterSlide",
458
+ posterClick: "lgPosterClick",
459
+ dragStart: "lgDragStart",
460
+ dragMove: "lgDragMove",
461
+ dragEnd: "lgDragEnd",
462
+ beforeNextSlide: "lgBeforeNextSlide",
463
+ beforePrevSlide: "lgBeforePrevSlide",
464
+ beforeClose: "lgBeforeClose",
465
+ afterClose: "lgAfterClose"
466
+ };
467
+ const lightGalleryCoreSettings = {
468
+ mode: "lg-slide",
469
+ easing: "ease",
470
+ speed: 400,
471
+ licenseKey: "0000-0000-000-0000",
472
+ height: "100%",
473
+ width: "100%",
474
+ addClass: "",
475
+ startClass: "lg-start-zoom",
476
+ backdropDuration: 300,
477
+ container: "",
478
+ startAnimationDuration: 400,
479
+ zoomFromOrigin: true,
480
+ hideBarsDelay: 0,
481
+ showBarsAfter: 1e4,
482
+ slideDelay: 0,
483
+ allowMediaOverlap: false,
484
+ videoMaxSize: "1280-720",
485
+ loadYouTubePoster: true,
486
+ defaultCaptionHeight: 0,
487
+ ariaLabelledby: "",
488
+ ariaDescribedby: "",
489
+ ariaAnnouncements: true,
490
+ resetScrollPosition: true,
491
+ hideScrollbar: false,
492
+ closable: true,
493
+ swipeToClose: true,
494
+ closeOnTap: true,
495
+ showCloseIcon: true,
496
+ showMaximizeIcon: false,
497
+ loop: true,
498
+ escKey: true,
499
+ keyPress: true,
500
+ trapFocus: true,
501
+ controls: true,
502
+ slideEndAnimation: true,
503
+ hideControlOnEnd: false,
504
+ mousewheel: false,
505
+ direction: "ltr",
506
+ getCaptionFromTitleOrAlt: true,
507
+ appendSubHtmlTo: ".lg-sub-html",
508
+ subHtmlSelectorRelative: false,
509
+ preload: 2,
510
+ numberOfSlideItemsInDom: 10,
511
+ selector: "",
512
+ selectWithin: "",
513
+ nextHtml: "",
514
+ prevHtml: "",
515
+ index: 0,
516
+ iframeWidth: "100%",
517
+ iframeHeight: "100%",
518
+ iframeMaxWidth: "100%",
519
+ iframeMaxHeight: "100%",
520
+ download: true,
521
+ counter: true,
522
+ appendCounterTo: ".lg-toolbar",
523
+ swipeThreshold: 50,
524
+ flickVelocity: 0.5,
525
+ pinchToClose: true,
526
+ enableSwipe: true,
527
+ enableDrag: true,
528
+ dynamic: false,
529
+ dynamicEl: [],
530
+ extraProps: [],
531
+ exThumbImage: "",
532
+ toolbarOverflow: true,
533
+ showGestureButtons: true,
534
+ isMobile: void 0,
535
+ mobileSettings: {
536
+ controls: false,
537
+ showCloseIcon: false,
538
+ download: false,
539
+ showGestureButtons: false
540
+ },
541
+ plugins: [],
542
+ strings: {
543
+ closeGallery: "Close gallery",
544
+ toggleMaximize: "Toggle maximize",
545
+ previousSlide: "Previous slide",
546
+ nextSlide: "Next slide",
547
+ download: "Download",
548
+ playVideo: "Play video",
549
+ mediaLoadingFailed: "Oops... Failed to load content...",
550
+ galleryLabel: "Gallery",
551
+ slideAnnouncement: "Image {index} of {total}",
552
+ moreOptions: "More options",
553
+ share: "Share",
554
+ toggleThumbnails: "Toggle thumbnails",
555
+ toggleAutoplay: "Toggle Autoplay",
556
+ toggleFullscreen: "Toggle Fullscreen",
557
+ zoomIn: "Zoom in",
558
+ zoomOut: "Zoom out",
559
+ viewActualSize: "View actual size",
560
+ rotateLeft: "Rotate left",
561
+ rotateRight: "Rotate right",
562
+ flipHorizontal: "Flip horizontal",
563
+ flipVertical: "Flip vertical",
564
+ toggleComments: "Toggle Comments"
565
+ },
566
+ icons: {}
567
+ };
568
+ const schedule = typeof requestAnimationFrame === "function" ? (callback) => requestAnimationFrame(callback) : (callback) => window.setTimeout(callback, 16);
569
+ const cancel = typeof cancelAnimationFrame === "function" ? (handle) => cancelAnimationFrame(handle) : (handle) => window.clearTimeout(handle);
570
+ function toolbarButtons(toolbar, more) {
571
+ return Array.from(toolbar.querySelectorAll(".lg-icon")).filter(
572
+ (button) => {
573
+ var _a;
574
+ return button !== more && !button.closest(".lg-toolbar-menu, .lg-dropdown") && !((_a = button.parentElement) == null ? void 0 : _a.closest(".lg-icon"));
575
+ }
576
+ );
577
+ }
578
+ function visibleIconMarkup(button) {
579
+ var _a, _b, _c;
580
+ const icons = Array.from(button.querySelectorAll(".lg-ci"));
581
+ if (!icons.length) {
582
+ return (_b = (_a = button.querySelector("svg")) == null ? void 0 : _a.outerHTML) != null ? _b : "";
583
+ }
584
+ const shown = (_c = icons.find(
585
+ (icon) => window.getComputedStyle(icon).display !== "none"
586
+ )) != null ? _c : icons[0];
587
+ return shown.outerHTML;
588
+ }
589
+ class ToolbarOverflow {
590
+ constructor(toolbar, options) {
591
+ this.toolbar = toolbar;
592
+ this.options = options;
593
+ this.menu = null;
594
+ this.frame = 0;
595
+ this.movedSignature = "";
596
+ this.widths = /* @__PURE__ */ new WeakMap();
597
+ this.requestUpdate = () => {
598
+ if (this.frame) {
599
+ return;
600
+ }
601
+ this.frame = schedule(() => {
602
+ this.frame = 0;
603
+ this.update();
604
+ });
605
+ };
606
+ this.onMoreClick = () => {
607
+ if (this.menu) {
608
+ this.close(true);
609
+ } else {
610
+ this.open();
611
+ }
612
+ };
613
+ this.onMenuKeydown = (event) => {
614
+ var _a, _b, _c, _d;
615
+ const items = this.items();
616
+ const index = items.indexOf(document.activeElement);
617
+ switch (event.key) {
618
+ case "Escape":
619
+ this.close(true);
620
+ break;
621
+ case "ArrowDown":
622
+ (_a = items[(index + 1) % items.length]) == null ? void 0 : _a.focus();
623
+ break;
624
+ case "ArrowUp":
625
+ (_b = items[(index - 1 + items.length) % items.length]) == null ? void 0 : _b.focus();
626
+ break;
627
+ case "Home":
628
+ (_c = items[0]) == null ? void 0 : _c.focus();
629
+ break;
630
+ case "End":
631
+ (_d = items[items.length - 1]) == null ? void 0 : _d.focus();
632
+ break;
633
+ case "ArrowLeft":
634
+ case "ArrowRight":
635
+ break;
636
+ case "Tab":
637
+ this.close(false);
638
+ return;
639
+ default:
640
+ return;
641
+ }
642
+ event.preventDefault();
643
+ event.stopPropagation();
644
+ };
645
+ this.onDocumentPointerDown = (event) => {
646
+ var _a;
647
+ const target = event.target;
648
+ if (target && (((_a = this.menu) == null ? void 0 : _a.contains(target)) || this.more.contains(target))) {
649
+ return;
650
+ }
651
+ consumeBackdropPress(event);
652
+ this.close(false);
653
+ };
654
+ const more = document.createElement("button");
655
+ more.type = "button";
656
+ more.id = options.id;
657
+ more.className = "lg-more lg-icon";
658
+ more.hidden = true;
659
+ more.setAttribute("aria-label", options.label);
660
+ more.setAttribute("aria-haspopup", "menu");
661
+ more.setAttribute("aria-expanded", "false");
662
+ more.addEventListener("click", this.onMoreClick);
663
+ const close = toolbar.querySelector(".lg-close");
664
+ if (close) {
665
+ close.insertAdjacentElement("afterend", more);
666
+ } else {
667
+ toolbar.insertBefore(more, toolbar.firstChild);
668
+ }
669
+ this.more = more;
670
+ if (typeof ResizeObserver === "function") {
671
+ this.resizeObserver = new ResizeObserver(this.requestUpdate);
672
+ this.resizeObserver.observe(toolbar);
673
+ }
674
+ if (typeof MutationObserver === "function") {
675
+ this.mutationObserver = new MutationObserver((records) => {
676
+ if (records.some(
677
+ (record) => {
678
+ var _a, _b;
679
+ return !((_b = (_a = record.target).closest) == null ? void 0 : _b.call(
680
+ _a,
681
+ ".lg-toolbar-menu"
682
+ ));
683
+ }
684
+ )) {
685
+ this.requestUpdate();
686
+ }
687
+ });
688
+ this.mutationObserver.observe(toolbar, {
689
+ childList: true,
690
+ subtree: true
691
+ });
692
+ }
693
+ }
694
+ /** Re-measure the row and move buttons in or out of the menu. */
695
+ update() {
696
+ var _a, _b;
697
+ const buttons = toolbarButtons(this.toolbar, this.more);
698
+ buttons.forEach((button) => {
699
+ if (!button.hasAttribute("data-lg-overflow")) {
700
+ const width = button.offsetWidth;
701
+ if (width) {
702
+ this.widths.set(button, width);
703
+ }
704
+ }
705
+ });
706
+ const fallback = (_a = buttons.map((button) => this.widths.get(button)).find((width) => !!width)) != null ? _a : 0;
707
+ const counter = this.toolbar.querySelector(".lg-counter");
708
+ const moved = getToolbarOverflow({
709
+ available: this.toolbar.clientWidth,
710
+ reserved: counter ? counter.offsetWidth : 0,
711
+ moreWidth: (_b = this.widths.get(this.more)) != null ? _b : fallback,
712
+ items: buttons.map((button) => {
713
+ var _a2;
714
+ return {
715
+ width: (_a2 = this.widths.get(button)) != null ? _a2 : fallback,
716
+ priority: getToolbarItemPriority(Array.from(button.classList))
717
+ };
718
+ })
719
+ });
720
+ const overflow = new Set(moved);
721
+ buttons.forEach((button, index) => {
722
+ if (overflow.has(index)) {
723
+ button.setAttribute("data-lg-overflow", "");
724
+ } else {
725
+ button.removeAttribute("data-lg-overflow");
726
+ }
727
+ });
728
+ this.more.hidden = overflow.size === 0;
729
+ if (!this.more.hidden && this.more.offsetWidth) {
730
+ this.widths.set(this.more, this.more.offsetWidth);
731
+ }
732
+ const signature = `${buttons.length}:${moved.join(",")}`;
733
+ const changed = signature !== this.movedSignature;
734
+ this.movedSignature = signature;
735
+ if (!overflow.size) {
736
+ this.close(false);
737
+ } else if (this.menu && changed) {
738
+ this.renderMenu();
739
+ }
740
+ }
741
+ /** Close the menu; optionally hand focus back to the More button. */
742
+ close(returnFocus) {
743
+ if (!this.menu) {
744
+ return;
745
+ }
746
+ this.menu.removeEventListener("keydown", this.onMenuKeydown);
747
+ this.menu.remove();
748
+ this.menu = null;
749
+ document.removeEventListener(
750
+ "pointerdown",
751
+ this.onDocumentPointerDown,
752
+ true
753
+ );
754
+ this.more.setAttribute("aria-expanded", "false");
755
+ this.more.removeAttribute("aria-controls");
756
+ if (returnFocus) {
757
+ this.more.focus();
758
+ }
759
+ }
760
+ destroy() {
761
+ var _a, _b;
762
+ this.close(false);
763
+ cancel(this.frame);
764
+ (_a = this.resizeObserver) == null ? void 0 : _a.disconnect();
765
+ (_b = this.mutationObserver) == null ? void 0 : _b.disconnect();
766
+ toolbarButtons(this.toolbar, this.more).forEach(
767
+ (button) => button.removeAttribute("data-lg-overflow")
768
+ );
769
+ this.more.remove();
770
+ }
771
+ open() {
772
+ var _a;
773
+ const menu = document.createElement("div");
774
+ menu.id = `${this.options.id}-menu`;
775
+ menu.className = "lg-toolbar-menu";
776
+ menu.setAttribute("role", "menu");
777
+ menu.setAttribute("aria-label", this.options.label);
778
+ menu.addEventListener("keydown", this.onMenuKeydown);
779
+ this.menu = menu;
780
+ this.renderMenu();
781
+ this.toolbar.appendChild(menu);
782
+ this.more.setAttribute("aria-expanded", "true");
783
+ this.more.setAttribute("aria-controls", menu.id);
784
+ document.addEventListener(
785
+ "pointerdown",
786
+ this.onDocumentPointerDown,
787
+ true
788
+ );
789
+ (_a = this.items()[0]) == null ? void 0 : _a.focus();
790
+ }
791
+ renderMenu() {
792
+ const menu = this.menu;
793
+ if (!menu) {
794
+ return;
795
+ }
796
+ menu.textContent = "";
797
+ toolbarButtons(this.toolbar, this.more).filter((button) => button.hasAttribute("data-lg-overflow")).forEach((button) => {
798
+ var _a;
799
+ const item = document.createElement("button");
800
+ item.type = "button";
801
+ item.className = "lg-toolbar-menu-item";
802
+ item.setAttribute("role", "menuitem");
803
+ const icon = document.createElement("span");
804
+ icon.className = "lg-toolbar-menu-icon";
805
+ icon.setAttribute("aria-hidden", "true");
806
+ icon.innerHTML = visibleIconMarkup(button);
807
+ const label = document.createElement("span");
808
+ label.textContent = (_a = button.getAttribute("aria-label")) != null ? _a : "";
809
+ item.append(icon, label);
810
+ item.addEventListener("click", () => {
811
+ this.close(true);
812
+ button.click();
813
+ });
814
+ menu.appendChild(item);
815
+ });
816
+ }
817
+ items() {
818
+ return this.menu ? Array.from(
819
+ this.menu.querySelectorAll('[role="menuitem"]')
820
+ ) : [];
821
+ }
822
+ }
823
+ const ICON_TARGETS = [
824
+ { selector: ".lg-close", names: ["close"] },
825
+ { selector: ".lg-prev", names: ["prev"] },
826
+ { selector: ".lg-next", names: ["next"] },
827
+ { selector: ".lg-download", names: ["download"] },
828
+ { selector: ".lg-more", names: ["more"] },
829
+ // Shown while `.lg-inline` (prompting maximize) / after maximizing.
830
+ { selector: ".lg-maximize", names: ["maximize", "minimize"] },
831
+ // The actual-size button's CLASS toggles between the two zoom
832
+ // classes as the zoom state changes (2.x swapped the glyph that
833
+ // way), it carries BOTH zoom icons and the class picks one in
834
+ // CSS. Listed before the class-based zoom targets so the id match
835
+ // claims it first (the pass skips already-processed elements).
836
+ { selector: '[id^="lg-actual-size-"]', names: ["zoomIn", "zoomOut"] },
837
+ { selector: ".lg-zoom-in", names: ["zoomIn"] },
838
+ { selector: ".lg-zoom-out", names: ["zoomOut"] },
839
+ // No '.lg-actual-size' target: vanilla's actual-size BUTTON never
840
+ // carries that class (it rides the zoom classes above; the outer
841
+ // gets `lg-actual-size` as a zoom-state class after build). The
842
+ // `actualSize` name serves the framework ports' static button.
843
+ { selector: ".lg-rotate-left", names: ["rotateLeft"] },
844
+ { selector: ".lg-rotate-right", names: ["rotateRight"] },
845
+ { selector: ".lg-flip-hor", names: ["flipHorizontal"] },
846
+ { selector: ".lg-flip-ver", names: ["flipVertical"] },
847
+ { selector: ".lg-share", names: ["share"] },
848
+ { selector: ".lg-share-facebook .lg-icon", names: ["shareFacebook"] },
849
+ { selector: ".lg-share-twitter .lg-icon", names: ["shareX"] },
850
+ { selector: ".lg-share-pinterest .lg-icon", names: ["sharePinterest"] },
851
+ // Shown while idle (prompting play) / while `.lg-show-autoplay`.
852
+ {
853
+ selector: ".lg-autoplay-button",
854
+ names: ["autoplayPlay", "autoplayPause"]
855
+ },
856
+ // Shown while windowed / while `.lg-fullscreen-on`.
857
+ { selector: ".lg-fullscreen", names: ["fullscreen", "fullscreenExit"] },
858
+ { selector: ".lg-comment-toggle", names: ["comment"] },
859
+ { selector: ".lg-comment-close", names: ["commentClose"] },
860
+ { selector: ".lg-toggle-thumb", names: ["toggleThumbnails"] }
861
+ ];
862
+ const toKebab = (name) => name.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`);
863
+ function getCustomIconMarkup(icons, names) {
864
+ if (!names.every((name) => icons[name])) {
865
+ return "";
866
+ }
867
+ return names.map(
868
+ (name) => `<span class="lg-ci lg-ci-${toKebab(
869
+ name
870
+ )}" aria-hidden="true">${icons[name]}</span>`
871
+ ).join("");
872
+ }
873
+ function applyCustomIcons(container, defaults, overrides) {
874
+ ICON_TARGETS.forEach(({ selector, names }) => {
875
+ const source = overrides && names.every((name) => overrides[name]) ? overrides : defaults;
876
+ const markup = getCustomIconMarkup(source, names);
877
+ if (!markup) {
878
+ return;
879
+ }
880
+ container.querySelectorAll(selector).forEach((element) => {
881
+ if (element.classList.contains("lg-icon-custom")) {
882
+ return;
883
+ }
884
+ element.classList.add("lg-icon-custom");
885
+ element.insertAdjacentHTML("afterbegin", markup);
886
+ });
887
+ });
888
+ }
889
+ const MAX_FRAME_MS = 64;
890
+ function runSprings(tracks, onFrame, onDone) {
891
+ let raf = 0;
892
+ let last = Date.now();
893
+ const states = tracks.map((t) => ({
894
+ position: t.from,
895
+ velocity: t.velocity
896
+ }));
897
+ const frame = () => {
898
+ const now = Date.now();
899
+ const dt = Math.min(Math.max(now - last, 0), MAX_FRAME_MS);
900
+ last = now;
901
+ let settled = true;
902
+ tracks.forEach((t, i) => {
903
+ states[i] = stepSpring(states[i], t.target, dt, t);
904
+ if (!isSpringSettled(states[i], t.target)) {
905
+ settled = false;
906
+ }
907
+ });
908
+ if (settled) {
909
+ onFrame(tracks.map((t) => t.target));
910
+ onDone == null ? void 0 : onDone();
911
+ return;
912
+ }
913
+ onFrame(states.map((s) => s.position));
914
+ raf = requestAnimationFrame(frame);
915
+ };
916
+ raf = requestAnimationFrame(frame);
917
+ return () => cancelAnimationFrame(raf);
918
+ }
919
+ const _lgQuery = class _lgQuery2 {
920
+ constructor(selector) {
921
+ this.cssVenderPrefixes = [
922
+ "TransitionDuration",
923
+ "TransitionTimingFunction",
924
+ "Transform",
925
+ "Transition"
926
+ ];
927
+ this.selector = this._getSelector(selector);
928
+ this.firstElement = this._getFirstEl();
929
+ return this;
930
+ }
931
+ static generateUUID() {
932
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(
933
+ /[xy]/g,
934
+ function(c) {
935
+ const r = Math.random() * 16 | 0, v = c == "x" ? r : r & 3 | 8;
936
+ return v.toString(16);
937
+ }
938
+ );
939
+ }
940
+ _getSelector(selector, context = document) {
941
+ if (typeof selector !== "string") {
942
+ return selector;
943
+ }
944
+ context = context || document;
945
+ const fl = selector.substring(0, 1);
946
+ if (fl === "#") {
947
+ return context.querySelector(selector);
948
+ } else {
949
+ return context.querySelectorAll(selector);
950
+ }
951
+ }
952
+ _each(func) {
953
+ if (!this.selector) {
954
+ return this;
955
+ }
956
+ if (this.selector.length !== void 0) {
957
+ [].forEach.call(this.selector, func);
958
+ } else {
959
+ func(this.selector, 0);
960
+ }
961
+ return this;
962
+ }
963
+ _setCssVendorPrefix(el, cssProperty, value) {
964
+ if (cssProperty.startsWith("--")) {
965
+ el.style.setProperty(cssProperty, String(value));
966
+ return;
967
+ }
968
+ const property = cssProperty.replace(/-([a-z])/gi, function(s, group1) {
969
+ return group1.toUpperCase();
970
+ });
971
+ if (this.cssVenderPrefixes.indexOf(property) !== -1) {
972
+ el.style[property.charAt(0).toLowerCase() + property.slice(1)] = value;
973
+ el.style["webkit" + property] = value;
974
+ el.style["moz" + property] = value;
975
+ el.style["ms" + property] = value;
976
+ el.style["o" + property] = value;
977
+ } else {
978
+ el.style[property] = value;
979
+ }
980
+ }
981
+ _getFirstEl() {
982
+ if (this.selector && this.selector.length !== void 0) {
983
+ return this.selector[0];
984
+ } else {
985
+ return this.selector;
986
+ }
987
+ }
988
+ isEventMatched(event, eventName) {
989
+ const eventNamespace = eventName.split(".");
990
+ return event.split(".").filter((e) => e).every((e) => {
991
+ return eventNamespace.indexOf(e) !== -1;
992
+ });
993
+ }
994
+ attr(attr, value) {
995
+ if (value === void 0) {
996
+ if (!this.firstElement) {
997
+ return "";
998
+ }
999
+ return this.firstElement.getAttribute(attr);
1000
+ }
1001
+ this._each((el) => {
1002
+ el.setAttribute(attr, value);
1003
+ });
1004
+ return this;
1005
+ }
1006
+ find(selector) {
1007
+ return $LG(this._getSelector(selector, this.selector));
1008
+ }
1009
+ first() {
1010
+ if (this.selector && this.selector.length !== void 0) {
1011
+ return $LG(this.selector[0]);
1012
+ } else {
1013
+ return $LG(this.selector);
1014
+ }
1015
+ }
1016
+ eq(index) {
1017
+ return $LG(this.selector[index]);
1018
+ }
1019
+ parent() {
1020
+ return $LG(this.selector.parentElement);
1021
+ }
1022
+ get() {
1023
+ return this._getFirstEl();
1024
+ }
1025
+ removeAttr(attributes) {
1026
+ const attrs = attributes.split(" ");
1027
+ this._each((el) => {
1028
+ attrs.forEach((attr) => el.removeAttribute(attr));
1029
+ });
1030
+ return this;
1031
+ }
1032
+ wrap(className) {
1033
+ if (!this.firstElement) {
1034
+ return this;
1035
+ }
1036
+ const wrapper = document.createElement("div");
1037
+ wrapper.className = className;
1038
+ this.firstElement.parentNode.insertBefore(wrapper, this.firstElement);
1039
+ this.firstElement.parentNode.removeChild(this.firstElement);
1040
+ wrapper.appendChild(this.firstElement);
1041
+ return this;
1042
+ }
1043
+ addClass(classNames = "") {
1044
+ this._each((el) => {
1045
+ classNames.split(" ").forEach((className) => {
1046
+ if (className) {
1047
+ el.classList.add(className);
1048
+ }
1049
+ });
1050
+ });
1051
+ return this;
1052
+ }
1053
+ removeClass(classNames) {
1054
+ this._each((el) => {
1055
+ classNames.split(" ").forEach((className) => {
1056
+ if (className) {
1057
+ el.classList.remove(className);
1058
+ }
1059
+ });
1060
+ });
1061
+ return this;
1062
+ }
1063
+ hasClass(className) {
1064
+ if (!this.firstElement) {
1065
+ return false;
1066
+ }
1067
+ return this.firstElement.classList.contains(className);
1068
+ }
1069
+ hasAttribute(attribute) {
1070
+ if (!this.firstElement) {
1071
+ return false;
1072
+ }
1073
+ return this.firstElement.hasAttribute(attribute);
1074
+ }
1075
+ toggleClass(className) {
1076
+ if (!this.firstElement) {
1077
+ return this;
1078
+ }
1079
+ if (this.hasClass(className)) {
1080
+ this.removeClass(className);
1081
+ } else {
1082
+ this.addClass(className);
1083
+ }
1084
+ return this;
1085
+ }
1086
+ css(property, value) {
1087
+ this._each((el) => {
1088
+ this._setCssVendorPrefix(el, property, value);
1089
+ });
1090
+ return this;
1091
+ }
1092
+ // Need to pass separate namespaces for separate elements
1093
+ on(events, listener) {
1094
+ if (!this.selector) {
1095
+ return this;
1096
+ }
1097
+ events.split(" ").forEach((event) => {
1098
+ if (!Array.isArray(_lgQuery2.eventListeners[event])) {
1099
+ _lgQuery2.eventListeners[event] = [];
1100
+ }
1101
+ _lgQuery2.eventListeners[event].push(listener);
1102
+ this.selector.addEventListener(event.split(".")[0], listener);
1103
+ });
1104
+ return this;
1105
+ }
1106
+ // @todo - test this
1107
+ once(event, listener) {
1108
+ this.on(event, () => {
1109
+ this.off(event);
1110
+ listener(event);
1111
+ });
1112
+ return this;
1113
+ }
1114
+ off(event) {
1115
+ if (!this.selector) {
1116
+ return this;
1117
+ }
1118
+ Object.keys(_lgQuery2.eventListeners).forEach((eventName) => {
1119
+ if (this.isEventMatched(event, eventName)) {
1120
+ _lgQuery2.eventListeners[eventName].forEach((listener) => {
1121
+ this.selector.removeEventListener(
1122
+ eventName.split(".")[0],
1123
+ listener
1124
+ );
1125
+ });
1126
+ _lgQuery2.eventListeners[eventName] = [];
1127
+ }
1128
+ });
1129
+ return this;
1130
+ }
1131
+ trigger(event, detail) {
1132
+ if (!this.firstElement) {
1133
+ return this;
1134
+ }
1135
+ const customEvent = new CustomEvent(event.split(".")[0], {
1136
+ detail: detail || null
1137
+ });
1138
+ this.firstElement.dispatchEvent(customEvent);
1139
+ return this;
1140
+ }
1141
+ // Does not support IE
1142
+ load(url) {
1143
+ fetch(url).then((res) => res.text()).then((html) => {
1144
+ this.selector.innerHTML = html;
1145
+ });
1146
+ return this;
1147
+ }
1148
+ html(html) {
1149
+ if (html === void 0) {
1150
+ if (!this.firstElement) {
1151
+ return "";
1152
+ }
1153
+ return this.firstElement.innerHTML;
1154
+ }
1155
+ this._each((el) => {
1156
+ el.innerHTML = html;
1157
+ });
1158
+ return this;
1159
+ }
1160
+ append(html) {
1161
+ this._each((el) => {
1162
+ if (typeof html === "string") {
1163
+ el.insertAdjacentHTML("beforeend", html);
1164
+ } else {
1165
+ el.appendChild(html);
1166
+ }
1167
+ });
1168
+ return this;
1169
+ }
1170
+ prepend(html) {
1171
+ this._each((el) => {
1172
+ if (typeof html === "string") {
1173
+ el.insertAdjacentHTML("afterbegin", html);
1174
+ } else if (html instanceof HTMLElement) {
1175
+ el.insertBefore(html.cloneNode(true), el.firstChild);
1176
+ }
1177
+ });
1178
+ return this;
1179
+ }
1180
+ remove() {
1181
+ this._each((el) => {
1182
+ el.parentNode.removeChild(el);
1183
+ });
1184
+ return this;
1185
+ }
1186
+ empty() {
1187
+ this._each((el) => {
1188
+ el.innerHTML = "";
1189
+ });
1190
+ return this;
1191
+ }
1192
+ scrollTop(scrollTop) {
1193
+ if (scrollTop !== void 0) {
1194
+ window.scrollTo(window.scrollX, scrollTop);
1195
+ return this;
1196
+ } else {
1197
+ return window.scrollY;
1198
+ }
1199
+ }
1200
+ scrollLeft(scrollLeft) {
1201
+ if (scrollLeft !== void 0) {
1202
+ window.scrollTo(scrollLeft, window.scrollY);
1203
+ return this;
1204
+ } else {
1205
+ return window.scrollX;
1206
+ }
1207
+ }
1208
+ offset() {
1209
+ if (!this.firstElement) {
1210
+ return {
1211
+ left: 0,
1212
+ top: 0
1213
+ };
1214
+ }
1215
+ const rect = this.firstElement.getBoundingClientRect();
1216
+ const bodyMarginLeft = $LG("body").style().marginLeft;
1217
+ return {
1218
+ left: rect.left - parseFloat(bodyMarginLeft) + this.scrollLeft(),
1219
+ top: rect.top + this.scrollTop()
1220
+ };
1221
+ }
1222
+ style() {
1223
+ if (!this.firstElement) {
1224
+ return {};
1225
+ }
1226
+ return this.firstElement.currentStyle || window.getComputedStyle(this.firstElement);
1227
+ }
1228
+ // Width without padding and border even if box-sizing is used.
1229
+ width() {
1230
+ const style = this.style();
1231
+ return this.firstElement.clientWidth - parseFloat(style.paddingLeft) - parseFloat(style.paddingRight);
1232
+ }
1233
+ // Height without padding and border even if box-sizing is used.
1234
+ height() {
1235
+ const style = this.style();
1236
+ return this.firstElement.clientHeight - parseFloat(style.paddingTop) - parseFloat(style.paddingBottom);
1237
+ }
1238
+ };
1239
+ _lgQuery.eventListeners = {};
1240
+ let lgQuery = _lgQuery;
1241
+ function $LG(selector) {
1242
+ return new lgQuery(selector);
1243
+ }
1244
+ const defaultDynamicOptions = [
1245
+ "src",
1246
+ "sources",
1247
+ "subHtml",
1248
+ "subHtmlUrl",
1249
+ "html",
1250
+ "video",
1251
+ "poster",
1252
+ "slideName",
1253
+ "responsive",
1254
+ "srcset",
1255
+ "sizes",
1256
+ "iframe",
1257
+ "downloadUrl",
1258
+ "download",
1259
+ "width",
1260
+ "shareUrl",
1261
+ "facebookShareUrl",
1262
+ "tweetText",
1263
+ "iframeTitle",
1264
+ "twitterShareUrl",
1265
+ "pinterestShareUrl",
1266
+ "pinterestText",
1267
+ "fbHtml",
1268
+ "disqusIdentifier",
1269
+ "disqusUrl"
1270
+ ];
1271
+ function convertToData(attr) {
1272
+ if (attr === "href") {
1273
+ return "src";
1274
+ }
1275
+ attr = attr.replace("data-", "");
1276
+ attr = attr.charAt(0).toLowerCase() + attr.slice(1);
1277
+ attr = attr.replace(/-([a-z])/g, (g) => g[1].toUpperCase());
1278
+ return attr;
1279
+ }
1280
+ const utils = {
1281
+ /**
1282
+ * Fetches HTML content from a given URL and inserts it into a specified element.
1283
+ *
1284
+ * @param url - The URL to fetch the HTML content from.
1285
+ * @param element - The DOM element (jQuery object) to insert the HTML content into.
1286
+ * @param insertMethod - The method to insert the HTML ('append' or 'replace').
1287
+ */
1288
+ fetchCaptionFromUrl(url, element, insertMethod) {
1289
+ fetch(url).then((response) => response.text()).then((htmlContent) => {
1290
+ if (insertMethod === "append") {
1291
+ const contentDiv = `<div class="lg-sub-html">${htmlContent}</div>`;
1292
+ element.append(contentDiv);
1293
+ } else {
1294
+ element.html(htmlContent);
1295
+ }
1296
+ });
1297
+ },
1298
+ /**
1299
+ * get possible width and height from the lgSize attribute. Used for ZoomFromOrigin option
1300
+ */
1301
+ getSize(el, container, spacing = 0, defaultLgSize) {
1302
+ const LGel = $LG(el);
1303
+ const lgSize = LGel.attr("data-lg-size") || defaultLgSize;
1304
+ const parsed = parseImageSize(lgSize, window.innerWidth);
1305
+ if (!parsed) {
1306
+ return;
1307
+ }
1308
+ return fitImageSize(
1309
+ parsed,
1310
+ container.width(),
1311
+ container.height() - spacing
1312
+ );
1313
+ },
1314
+ /**
1315
+ * @desc Get transform value based on the imageSize. Used for ZoomFromOrigin option
1316
+ * @param {jQuery Element}
1317
+ * @returns {String} Transform CSS string
1318
+ */
1319
+ getTransform(el, container, top, bottom, imageSize) {
1320
+ if (!imageSize || imageSize.width <= 0 || imageSize.height <= 0) {
1321
+ return;
1322
+ }
1323
+ const LGel = $LG(el).find("img").first();
1324
+ if (!LGel.get()) {
1325
+ return;
1326
+ }
1327
+ const containerRect = container.get().getBoundingClientRect();
1328
+ const rect = LGel.get().getBoundingClientRect();
1329
+ const triggerRect = {
1330
+ left: rect.left,
1331
+ top: rect.top,
1332
+ width: rect.width,
1333
+ height: rect.height
1334
+ };
1335
+ if (!isUsableOriginRect(triggerRect)) {
1336
+ return;
1337
+ }
1338
+ return getOriginTransform({
1339
+ triggerRect,
1340
+ containerRect: {
1341
+ left: containerRect.left,
1342
+ top: containerRect.top,
1343
+ width: containerRect.width,
1344
+ // Element height, not rect height, includes the mobile
1345
+ // safari bottom bar handling this always had.
1346
+ height: container.height()
1347
+ },
1348
+ top,
1349
+ bottom,
1350
+ imageSize
1351
+ });
1352
+ },
1353
+ getIframeMarkup(iframeWidth, iframeHeight, iframeMaxWidth, iframeMaxHeight, src, iframeTitle) {
1354
+ const title = iframeTitle ? 'title="' + iframeTitle + '"' : "";
1355
+ return `<div class="lg-media-cont lg-has-iframe" style="width:${iframeWidth}; max-width:${iframeMaxWidth}; height: ${iframeHeight}; max-height:${iframeMaxHeight}">
1356
+ <iframe class="lg-object" frameborder="0" ${title} src="${src}" allowfullscreen="true"></iframe>
1357
+ </div>`;
1358
+ },
1359
+ getImgMarkup(index, src, altAttr, srcset, sizes, sources) {
1360
+ const srcsetAttr = srcset ? `srcset="${srcset}"` : "";
1361
+ const sizesAttr = sizes ? `sizes="${sizes}"` : "";
1362
+ const imgMarkup = `<img ${altAttr} ${srcsetAttr} ${sizesAttr} class="lg-object lg-image" data-index="${index}" src="${src}" />`;
1363
+ let sourceTag = "";
1364
+ if (sources) {
1365
+ const sourceObj = typeof sources === "string" ? JSON.parse(sources) : sources;
1366
+ sourceTag = sourceObj.map((source) => {
1367
+ let attrs = "";
1368
+ Object.keys(source).forEach((key) => {
1369
+ attrs += ` ${key}="${source[key]}"`;
1370
+ });
1371
+ return `<source ${attrs}></source>`;
1372
+ });
1373
+ }
1374
+ return `${sourceTag}${imgMarkup}`;
1375
+ },
1376
+ // Get src from responsive src
1377
+ getResponsiveSrc(srcItms) {
1378
+ const rsWidth = [];
1379
+ const rsSrc = [];
1380
+ let src = "";
1381
+ for (let i = 0; i < srcItms.length; i++) {
1382
+ const _src = srcItms[i].split(" ");
1383
+ if (_src[0] === "") {
1384
+ _src.splice(0, 1);
1385
+ }
1386
+ rsSrc.push(_src[0]);
1387
+ rsWidth.push(_src[1]);
1388
+ }
1389
+ const wWidth = window.innerWidth;
1390
+ for (let j = 0; j < rsWidth.length; j++) {
1391
+ if (parseInt(rsWidth[j], 10) > wWidth) {
1392
+ src = rsSrc[j];
1393
+ break;
1394
+ }
1395
+ }
1396
+ return src;
1397
+ },
1398
+ isImageLoaded(img) {
1399
+ if (!img) return false;
1400
+ if (!img.complete) {
1401
+ return false;
1402
+ }
1403
+ if (img.naturalWidth === 0) {
1404
+ return false;
1405
+ }
1406
+ return true;
1407
+ },
1408
+ getVideoPosterMarkup(_poster, dummyImg, videoContStyle, playVideoString, _isVideo) {
1409
+ let videoClass = "";
1410
+ if (_isVideo && _isVideo.youtube) {
1411
+ videoClass = "lg-has-youtube";
1412
+ } else if (_isVideo && _isVideo.vimeo) {
1413
+ videoClass = "lg-has-vimeo";
1414
+ } else if (_isVideo && _isVideo.wistia) {
1415
+ videoClass = "lg-has-wistia";
1416
+ } else {
1417
+ videoClass = "lg-has-html5";
1418
+ }
1419
+ let _dummy = dummyImg;
1420
+ if (typeof dummyImg !== "string") {
1421
+ _dummy = dummyImg.outerHTML;
1422
+ }
1423
+ return `<div class="lg-video-cont ${videoClass}" style="${videoContStyle}">
1424
+ <div class="lg-video-play-button">
1425
+ <svg
1426
+ viewBox="0 0 20 20"
1427
+ preserveAspectRatio="xMidYMid"
1428
+ focusable="false"
1429
+ aria-labelledby="${playVideoString}"
1430
+ role="img"
1431
+ class="lg-video-play-icon"
1432
+ >
1433
+ <title>${playVideoString}</title>
1434
+ <polygon class="lg-video-play-icon-inner" points="1,0 20,10 1,20"></polygon>
1435
+ </svg>
1436
+ <svg class="lg-video-play-icon-bg" viewBox="0 0 50 50" focusable="false">
1437
+ <circle cx="50%" cy="50%" r="20"></circle></svg>
1438
+ <svg class="lg-video-play-icon-circle" viewBox="0 0 50 50" focusable="false">
1439
+ <circle cx="50%" cy="50%" r="20"></circle>
1440
+ </svg>
1441
+ </div>
1442
+ ${_dummy}
1443
+ <img class="lg-object lg-video-poster" src="${_poster}" />
1444
+ </div>`;
1445
+ },
1446
+ getFocusableElements(container) {
1447
+ const elements = container.querySelectorAll(
1448
+ 'a[href]:not([disabled]), button:not([disabled]), textarea:not([disabled]), input[type="text"]:not([disabled]), input[type="radio"]:not([disabled]), input[type="checkbox"]:not([disabled]), select:not([disabled])'
1449
+ );
1450
+ const visibleElements = [].filter.call(
1451
+ elements,
1452
+ (element) => {
1453
+ const style = window.getComputedStyle(element);
1454
+ return style.display !== "none" && style.visibility !== "hidden" && // Hidden or moved into the toolbar's More menu, whatever
1455
+ // the stylesheet says about their display.
1456
+ !element.closest("[hidden], [data-lg-overflow]");
1457
+ }
1458
+ );
1459
+ return visibleElements;
1460
+ },
1461
+ /**
1462
+ * @desc Create dynamic elements array from gallery items when dynamic option is false
1463
+ * It helps to avoid frequent DOM interaction
1464
+ * and avoid multiple checks for dynamic elments
1465
+ *
1466
+ * @returns {Array} dynamicEl
1467
+ */
1468
+ getDynamicOptions(items, extraProps, getCaptionFromTitleOrAlt, exThumbImage) {
1469
+ const dynamicElements = [];
1470
+ const availableDynamicOptions = [
1471
+ ...defaultDynamicOptions,
1472
+ ...extraProps
1473
+ ];
1474
+ [].forEach.call(items, (item) => {
1475
+ const dynamicEl = {};
1476
+ for (let i = 0; i < item.attributes.length; i++) {
1477
+ const attr = item.attributes[i];
1478
+ if (attr.specified) {
1479
+ const dynamicAttr = convertToData(attr.name);
1480
+ let label = "";
1481
+ if (availableDynamicOptions.indexOf(dynamicAttr) > -1) {
1482
+ label = dynamicAttr;
1483
+ }
1484
+ if (label) {
1485
+ dynamicEl[label] = attr.value;
1486
+ }
1487
+ }
1488
+ }
1489
+ if (typeof dynamicEl.sources === "string") {
1490
+ try {
1491
+ dynamicEl.sources = JSON.parse(dynamicEl.sources);
1492
+ } catch (e) {
1493
+ console.warn(
1494
+ "lightGallery :- data-sources must be a JSON array of picture source objects. See https://www.lightgalleryjs.com/docs/responsive-loading/"
1495
+ );
1496
+ delete dynamicEl.sources;
1497
+ }
1498
+ }
1499
+ const currentItem = $LG(item);
1500
+ const alt = currentItem.find("img").first().attr("alt");
1501
+ const title = currentItem.attr("title");
1502
+ const thumb = exThumbImage ? currentItem.attr(exThumbImage) : currentItem.find("img").first().attr("src");
1503
+ dynamicEl.thumb = thumb;
1504
+ if (getCaptionFromTitleOrAlt && !dynamicEl.subHtml) {
1505
+ dynamicEl.subHtml = title || alt || "";
1506
+ }
1507
+ dynamicEl.alt = alt || title || "";
1508
+ dynamicElements.push(dynamicEl);
1509
+ });
1510
+ return dynamicElements;
1511
+ },
1512
+ isMobile() {
1513
+ return /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);
1514
+ },
1515
+ /**
1516
+ * @desc Check the given src is video
1517
+ * @param {String} src
1518
+ * @return {Object} video type
1519
+ * Ex:{ youtube : ["//www.youtube.com/watch?v=c0asJgSyxcY", "c0asJgSyxcY"] }
1520
+ *
1521
+ * @todo - this information can be moved to dynamicEl to avoid frequent calls
1522
+ */
1523
+ isVideo(src, isHTML5VIdeo, index) {
1524
+ if (!src) {
1525
+ if (isHTML5VIdeo) {
1526
+ return {
1527
+ html5: true
1528
+ };
1529
+ } else {
1530
+ console.error(
1531
+ "lightGallery :- data-src is not provided on slide item " + (index + 1) + ". Please make sure the selector property is properly configured. More info - https://www.lightgalleryjs.com/demos/html-markup/"
1532
+ );
1533
+ return;
1534
+ }
1535
+ }
1536
+ return getVideoInfo(src, false);
1537
+ }
1538
+ };
1539
+ var __defProp = Object.defineProperty;
1540
+ var __defProps = Object.defineProperties;
1541
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
1542
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
1543
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
1544
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
1545
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1546
+ var __spreadValues = (a, b) => {
1547
+ for (var prop in b || (b = {}))
1548
+ if (__hasOwnProp.call(b, prop))
1549
+ __defNormalProp(a, prop, b[prop]);
1550
+ if (__getOwnPropSymbols)
1551
+ for (var prop of __getOwnPropSymbols(b)) {
1552
+ if (__propIsEnum.call(b, prop))
1553
+ __defNormalProp(a, prop, b[prop]);
1554
+ }
1555
+ return a;
1556
+ };
1557
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
1558
+ let lgId = 0;
1559
+ class LightGallery {
1560
+ constructor(element, options) {
1561
+ this.lgOpened = false;
1562
+ this.index = 0;
1563
+ this.plugins = [];
1564
+ this.lGalleryOn = false;
1565
+ this.lgBusy = false;
1566
+ this.defaultIcons = __spreadValues({}, coreDefaultIcons);
1567
+ this.swipeSamples = [];
1568
+ this.currentItemsInDom = [];
1569
+ this.prevScrollTop = 0;
1570
+ this.bodyPaddingRight = 0;
1571
+ this.isDummyImageRemoved = false;
1572
+ this.dragOrSwipeEnabled = false;
1573
+ this.mediaContainerPosition = {
1574
+ top: 0,
1575
+ bottom: 0
1576
+ };
1577
+ if (!element) {
1578
+ return this;
1579
+ }
1580
+ lgId++;
1581
+ this.lgId = lgId;
1582
+ this.el = element;
1583
+ this.LGel = $LG(element);
1584
+ this.generateSettings(options);
1585
+ this.buildModules();
1586
+ if (this.settings.dynamic && this.settings.dynamicEl !== void 0 && !Array.isArray(this.settings.dynamicEl)) {
1587
+ throw "When using dynamic mode, you must also define dynamicEl as an Array.";
1588
+ }
1589
+ this.galleryItems = this.getItems();
1590
+ this.normalizeSettings();
1591
+ this.init();
1592
+ this.validateLicense();
1593
+ return this;
1594
+ }
1595
+ generateSettings(options) {
1596
+ var _a;
1597
+ this.settings = __spreadProps(__spreadValues(__spreadValues({}, lightGalleryCoreSettings), options), {
1598
+ // Strings merge per-key (headless resolveSettings parity), // a partial override keeps every other default.
1599
+ strings: __spreadValues(__spreadValues({}, lightGalleryCoreSettings.strings), (_a = options == null ? void 0 : options.strings) != null ? _a : {})
1600
+ });
1601
+ if (this.settings.isMobile && typeof this.settings.isMobile === "function" ? this.settings.isMobile() : utils.isMobile()) {
1602
+ const mobileSettings = __spreadValues({}, this.settings.mobileSettings);
1603
+ this.settings = __spreadValues(__spreadValues({}, this.settings), mobileSettings);
1604
+ }
1605
+ if (typeof window !== "undefined" && typeof window.matchMedia === "function" && window.matchMedia("(prefers-reduced-motion: reduce)").matches) {
1606
+ this.settings = __spreadProps(__spreadValues({}, this.settings), {
1607
+ speed: 0,
1608
+ backdropDuration: 0,
1609
+ startAnimationDuration: 0,
1610
+ zoomFromOrigin: false,
1611
+ slideEndAnimation: false
1612
+ });
1613
+ }
1614
+ }
1615
+ normalizeSettings() {
1616
+ if (this.settings.direction === "auto") {
1617
+ this.settings.direction = typeof window !== "undefined" && typeof window.getComputedStyle === "function" && window.getComputedStyle(this.el).direction === "rtl" ? "rtl" : "ltr";
1618
+ }
1619
+ if (this.settings.slideEndAnimation) {
1620
+ this.settings.hideControlOnEnd = false;
1621
+ }
1622
+ if (!this.settings.closable) {
1623
+ this.settings.swipeToClose = false;
1624
+ }
1625
+ this.zoomFromOrigin = this.settings.zoomFromOrigin;
1626
+ if (this.settings.dynamic) {
1627
+ this.zoomFromOrigin = false;
1628
+ }
1629
+ if (this.settings.container) {
1630
+ const { container } = this.settings;
1631
+ if (typeof container === "function") {
1632
+ this.settings.container = container();
1633
+ } else if (typeof container === "string") {
1634
+ const el = document.querySelector(container);
1635
+ this.settings.container = el != null ? el : document.body;
1636
+ }
1637
+ } else {
1638
+ this.settings.container = document.body;
1639
+ }
1640
+ this.settings.preload = Math.min(
1641
+ this.settings.preload,
1642
+ this.galleryItems.length
1643
+ );
1644
+ }
1645
+ init() {
1646
+ this.addSlideVideoInfo(this.galleryItems);
1647
+ this.buildStructure();
1648
+ this.LGel.trigger(lGEvents.init, {
1649
+ instance: this
1650
+ });
1651
+ if (this.settings.keyPress) {
1652
+ this.keyPress();
1653
+ }
1654
+ setTimeout(() => {
1655
+ this.enableDrag();
1656
+ this.enableSwipe();
1657
+ this.triggerPosterClick();
1658
+ }, 50);
1659
+ this.arrow();
1660
+ if (this.settings.mousewheel) {
1661
+ this.mousewheel();
1662
+ }
1663
+ if (!this.settings.dynamic) {
1664
+ this.openGalleryOnItemClick();
1665
+ }
1666
+ }
1667
+ openGalleryOnItemClick() {
1668
+ for (let index = 0; index < this.items.length; index++) {
1669
+ const element = this.items[index];
1670
+ const $element = $LG(element);
1671
+ const uuid = lgQuery.generateUUID();
1672
+ $element.attr("data-lg-id", uuid).on(`click.lgcustom-item-${uuid}`, (e) => {
1673
+ e.preventDefault();
1674
+ const currentItemIndex = this.settings.index || index;
1675
+ this.openGallery(currentItemIndex, element);
1676
+ });
1677
+ }
1678
+ }
1679
+ /**
1680
+ * Module constructor
1681
+ * Modules are build incrementally.
1682
+ * Gallery should be opened only once all the modules are initialized.
1683
+ * use moduleBuildTimeout to make sure this
1684
+ */
1685
+ buildModules() {
1686
+ this.settings.plugins.forEach((plugin) => {
1687
+ this.plugins.push(new plugin(this, $LG));
1688
+ });
1689
+ }
1690
+ validateLicense() {
1691
+ const notice = takeLicenseNotice(this.settings.licenseKey);
1692
+ if (notice) console[notice.level](notice.message);
1693
+ }
1694
+ getSlideItem(index) {
1695
+ return $LG(this.getSlideItemId(index));
1696
+ }
1697
+ getSlideItemId(index) {
1698
+ return `#lg-item-${this.lgId}-${index}`;
1699
+ }
1700
+ getIdName(id) {
1701
+ return `${id}-${this.lgId}`;
1702
+ }
1703
+ getElementById(id) {
1704
+ return $LG(`#${this.getIdName(id)}`);
1705
+ }
1706
+ manageSingleSlideClassName() {
1707
+ if (this.galleryItems.length < 2) {
1708
+ this.outer.addClass("lg-single-item");
1709
+ } else {
1710
+ this.outer.removeClass("lg-single-item");
1711
+ }
1712
+ }
1713
+ buildStructure() {
1714
+ const container = this.$container && this.$container.get();
1715
+ if (container) {
1716
+ return;
1717
+ }
1718
+ let controls = "";
1719
+ let subHtmlCont = "";
1720
+ if (this.settings.controls) {
1721
+ controls = `<button type="button" id="${this.getIdName(
1722
+ "lg-prev"
1723
+ )}" aria-label="${this.settings.strings["previousSlide"]}" class="lg-prev lg-icon"> ${this.settings.prevHtml} </button>
1724
+ <button type="button" id="${this.getIdName(
1725
+ "lg-next"
1726
+ )}" aria-label="${this.settings.strings["nextSlide"]}" class="lg-next lg-icon"> ${this.settings.nextHtml} </button>`;
1727
+ }
1728
+ if (this.settings.appendSubHtmlTo !== ".lg-item") {
1729
+ subHtmlCont = this.settings.ariaAnnouncements ? '<div class="lg-sub-html"></div>' : '<div class="lg-sub-html" role="status" aria-live="polite"></div>';
1730
+ }
1731
+ let addClasses = "";
1732
+ if (this.settings.allowMediaOverlap) {
1733
+ addClasses += "lg-media-overlap ";
1734
+ }
1735
+ const ariaLabelledby = this.settings.ariaLabelledby ? 'aria-labelledby="' + this.settings.ariaLabelledby + '"' : `aria-label="${this.settings.strings["galleryLabel"]}"`;
1736
+ const ariaDescribedby = this.settings.ariaDescribedby ? 'aria-describedby="' + this.settings.ariaDescribedby + '"' : "";
1737
+ const containerClassName = `lg-container ${this.settings.addClass} ${document.body !== this.settings.container ? "lg-inline" : ""}`;
1738
+ const closeIcon = this.settings.closable && this.settings.showCloseIcon ? `<button type="button" aria-label="${this.settings.strings["closeGallery"]}" id="${this.getIdName(
1739
+ "lg-close"
1740
+ )}" class="lg-close lg-icon"></button>` : "";
1741
+ const maximizeIcon = this.settings.showMaximizeIcon ? `<button type="button" aria-label="${this.settings.strings["toggleMaximize"]}" id="${this.getIdName(
1742
+ "lg-maximize"
1743
+ )}" class="lg-maximize lg-icon"></button>` : "";
1744
+ const template = `
1745
+ <div class="${containerClassName}" id="${this.getIdName(
1746
+ "lg-container"
1747
+ )}" tabindex="-1" aria-modal="true" ${ariaLabelledby} ${ariaDescribedby} role="dialog" dir="${this.getDirection()}"
1748
+ >
1749
+ <div id="${this.getIdName(
1750
+ "lg-backdrop"
1751
+ )}" class="lg-backdrop"></div>
1752
+ ${this.settings.ariaAnnouncements ? `<div id="${this.getIdName(
1753
+ "lg-announcer"
1754
+ )}" class="lg-announcer" role="status" aria-live="polite"></div>` : ""}
1755
+
1756
+ <div id="${this.getIdName(
1757
+ "lg-outer"
1758
+ )}" class="lg-outer lg-use-css3 lg-css3 lg-hide-items ${addClasses} ">
1759
+
1760
+ <div id="${this.getIdName("lg-content")}" class="lg-content">
1761
+ <div id="${this.getIdName("lg-inner")}" class="lg-inner">
1762
+ </div>
1763
+ ${controls}
1764
+ </div>
1765
+ <div id="${this.getIdName(
1766
+ "lg-toolbar"
1767
+ )}" class="lg-toolbar lg-group">
1768
+ ${maximizeIcon}
1769
+ ${closeIcon}
1770
+ </div>
1771
+ ${this.settings.appendSubHtmlTo === ".lg-outer" ? subHtmlCont : ""}
1772
+ <div id="${this.getIdName(
1773
+ "lg-components"
1774
+ )}" class="lg-components">
1775
+ ${this.settings.appendSubHtmlTo === ".lg-sub-html" ? subHtmlCont : ""}
1776
+ </div>
1777
+ </div>
1778
+ </div>
1779
+ `;
1780
+ $LG(this.settings.container).append(template);
1781
+ if (document.body !== this.settings.container) {
1782
+ $LG(this.settings.container).css("position", "relative");
1783
+ }
1784
+ this.outer = this.getElementById("lg-outer");
1785
+ this.$lgComponents = this.getElementById("lg-components");
1786
+ this.$backdrop = this.getElementById("lg-backdrop");
1787
+ this.$container = this.getElementById("lg-container");
1788
+ this.$inner = this.getElementById("lg-inner");
1789
+ this.$content = this.getElementById("lg-content");
1790
+ this.$toolbar = this.getElementById("lg-toolbar");
1791
+ this.$backdrop.css(
1792
+ "transition-duration",
1793
+ this.settings.backdropDuration + "ms"
1794
+ );
1795
+ let outerClassNames = `${this.settings.mode} `;
1796
+ this.manageSingleSlideClassName();
1797
+ if (this.settings.enableDrag) {
1798
+ outerClassNames += "lg-grab ";
1799
+ }
1800
+ this.outer.addClass(outerClassNames);
1801
+ this.$inner.css("transition-timing-function", this.settings.easing);
1802
+ this.$inner.css("transition-duration", this.settings.speed + "ms");
1803
+ this.$inner.css("--lg-speed", this.settings.speed + "ms");
1804
+ if (this.settings.download) {
1805
+ this.$toolbar.append(
1806
+ `<a id="${this.getIdName(
1807
+ "lg-download"
1808
+ )}" target="_blank" rel="noopener" aria-label="${this.settings.strings["download"]}" download class="lg-download lg-icon"></a>`
1809
+ );
1810
+ }
1811
+ this.counter();
1812
+ $LG(window).on(
1813
+ `resize.lg.global${this.lgId} orientationchange.lg.global${this.lgId}`,
1814
+ () => {
1815
+ this.refreshOnResize();
1816
+ }
1817
+ );
1818
+ this.hideBars();
1819
+ this.manageCloseGallery();
1820
+ this.toggleMaximize();
1821
+ this.initModules();
1822
+ if (this.settings.toolbarOverflow) {
1823
+ this.toolbarOverflow = new ToolbarOverflow(this.$toolbar.get(), {
1824
+ id: this.getIdName("lg-more"),
1825
+ label: this.settings.strings.moreOptions
1826
+ });
1827
+ const update = () => {
1828
+ var _a;
1829
+ return (_a = this.toolbarOverflow) == null ? void 0 : _a.update();
1830
+ };
1831
+ this.LGel.on(`${lGEvents.afterOpen}.lg`, update);
1832
+ this.LGel.on(`${lGEvents.afterSlide}.lg`, update);
1833
+ this.LGel.on(`${lGEvents.containerResize}.lg`, update);
1834
+ this.LGel.on(
1835
+ `${lGEvents.beforeClose}.lg`,
1836
+ () => {
1837
+ var _a;
1838
+ return (_a = this.toolbarOverflow) == null ? void 0 : _a.close(false);
1839
+ }
1840
+ );
1841
+ }
1842
+ applyCustomIcons(
1843
+ this.$container.get(),
1844
+ this.defaultIcons,
1845
+ this.settings.icons
1846
+ );
1847
+ }
1848
+ /**
1849
+ * Merge a plugin's built-in icon SVGs into the default set (called
1850
+ * from plugin `init()`, before the icon pass runs). Consumer
1851
+ * `settings.icons` still win over anything registered here.
1852
+ */
1853
+ registerDefaultIcons(icons) {
1854
+ this.defaultIcons = __spreadValues(__spreadValues({}, this.defaultIcons), icons);
1855
+ }
1856
+ /**
1857
+ * Cache the fitted (contain) size of a slide's media. Every consumer
1858
+ * of `currentImageSize` measures against the CURRENT slide: the
1859
+ * actual-size zoom divides the natural width by it, and the
1860
+ * zoom-from-origin close flight positions against it. Recomputed on
1861
+ * every slide change, not just at open — one cached landscape size
1862
+ * makes a portrait slide zoom to the wrong scale and then snap to
1863
+ * its real size when the natural-px swap lands.
1864
+ */
1865
+ updateCurrentImageSize(index) {
1866
+ const { __slideVideoInfo } = this.galleryItems[index];
1867
+ const { top, bottom } = this.mediaContainerPosition;
1868
+ this.currentImageSize = utils.getSize(
1869
+ this.items[index],
1870
+ this.outer,
1871
+ top + bottom,
1872
+ __slideVideoInfo && this.settings.videoMaxSize
1873
+ );
1874
+ }
1875
+ refreshOnResize() {
1876
+ if (this.lgOpened) {
1877
+ const currentGalleryItem = this.galleryItems[this.index];
1878
+ const { __slideVideoInfo } = currentGalleryItem;
1879
+ this.mediaContainerPosition = this.getMediaContainerPosition();
1880
+ this.updateCurrentImageSize(this.index);
1881
+ if (__slideVideoInfo) {
1882
+ this.resizeVideoSlide(this.index, this.currentImageSize);
1883
+ }
1884
+ if (this.zoomFromOrigin && !this.isDummyImageRemoved) {
1885
+ const imgStyle = this.getDummyImgStyles(this.currentImageSize);
1886
+ this.outer.find(".lg-current .lg-dummy-img").first().attr("style", imgStyle);
1887
+ }
1888
+ this.LGel.trigger(lGEvents.containerResize);
1889
+ }
1890
+ }
1891
+ resizeVideoSlide(index, imageSize) {
1892
+ const lgVideoStyle = this.getVideoContStyle(imageSize);
1893
+ const currentSlide = this.getSlideItem(index);
1894
+ currentSlide.find(".lg-video-cont").attr("style", lgVideoStyle);
1895
+ }
1896
+ /**
1897
+ * Update slides dynamically.
1898
+ * Add, edit or delete slides dynamically when lightGallery is opened.
1899
+ * Modify the current gallery items and pass it via updateSlides method
1900
+ * @note
1901
+ * - Do not mutate existing lightGallery items directly.
1902
+ * - Always pass new list of gallery items
1903
+ * - You need to take care of thumbnails outside the gallery if any
1904
+ * - user this method only if you want to update slides when the gallery is opened. Otherwise, use `refresh()` method.
1905
+ * @param items Gallery items
1906
+ * @param index After the update operation, which slide gallery should navigate to
1907
+ * @category lGPublicMethods
1908
+ * @example
1909
+ * const plugin = lightGallery();
1910
+ *
1911
+ * // Adding slides dynamically
1912
+ * let galleryItems = [
1913
+ * // Access existing lightGallery items
1914
+ * // galleryItems are automatically generated internally from the gallery HTML markup
1915
+ * // or directly from galleryItems when dynamic gallery is used
1916
+ * ...plugin.galleryItems,
1917
+ * ...[
1918
+ * {
1919
+ * src: 'img/img-1.png',
1920
+ * thumb: 'img/thumb1.png',
1921
+ * },
1922
+ * ],
1923
+ * ];
1924
+ * plugin.updateSlides(
1925
+ * galleryItems,
1926
+ * plugin.index,
1927
+ * );
1928
+ *
1929
+ *
1930
+ * // Remove slides dynamically
1931
+ * galleryItems = JSON.parse(
1932
+ * JSON.stringify(updateSlideInstance.galleryItems),
1933
+ * );
1934
+ * galleryItems.shift();
1935
+ * updateSlideInstance.updateSlides(galleryItems, 1);
1936
+ * @see <a href="/demos/update-slides/">Demo</a>
1937
+ */
1938
+ updateSlides(items, index) {
1939
+ if (this.index > items.length - 1) {
1940
+ this.index = items.length - 1;
1941
+ }
1942
+ if (items.length === 1) {
1943
+ this.index = 0;
1944
+ }
1945
+ if (!items.length) {
1946
+ this.closeGallery();
1947
+ return;
1948
+ }
1949
+ const currentSrc = this.galleryItems[index].src;
1950
+ this.galleryItems = items;
1951
+ this.updateControls();
1952
+ this.$inner.empty();
1953
+ this.currentItemsInDom = [];
1954
+ let _index = 0;
1955
+ this.galleryItems.some((galleryItem, itemIndex) => {
1956
+ if (galleryItem.src === currentSrc) {
1957
+ _index = itemIndex;
1958
+ return true;
1959
+ }
1960
+ return false;
1961
+ });
1962
+ this.currentItemsInDom = this.organizeSlideItems(_index, -1);
1963
+ this.loadContent(_index, true);
1964
+ this.getSlideItem(_index).addClass("lg-current");
1965
+ this.index = _index;
1966
+ this.updateCurrentCounter(_index);
1967
+ this.LGel.trigger(lGEvents.updateSlides);
1968
+ }
1969
+ // Get gallery items based on multiple conditions
1970
+ getItems() {
1971
+ this.items = [];
1972
+ if (!this.settings.dynamic) {
1973
+ if (this.settings.selector === "this") {
1974
+ this.items.push(this.el);
1975
+ } else if (this.settings.selector) {
1976
+ if (typeof this.settings.selector === "string") {
1977
+ if (this.settings.selectWithin) {
1978
+ const selectWithin = $LG(this.settings.selectWithin);
1979
+ this.items = selectWithin.find(this.settings.selector).get();
1980
+ } else {
1981
+ this.items = this.el.querySelectorAll(
1982
+ this.settings.selector
1983
+ );
1984
+ }
1985
+ } else {
1986
+ this.items = this.settings.selector;
1987
+ }
1988
+ } else {
1989
+ this.items = this.el.children;
1990
+ }
1991
+ return utils.getDynamicOptions(
1992
+ this.items,
1993
+ this.settings.extraProps,
1994
+ this.settings.getCaptionFromTitleOrAlt,
1995
+ this.settings.exThumbImage
1996
+ );
1997
+ } else {
1998
+ return this.settings.dynamicEl || [];
1999
+ }
2000
+ }
2001
+ shouldHideScrollbar() {
2002
+ return this.settings.hideScrollbar && document.body === this.settings.container;
2003
+ }
2004
+ hideScrollbar() {
2005
+ if (!this.shouldHideScrollbar()) {
2006
+ return;
2007
+ }
2008
+ this.bodyPaddingRight = parseFloat($LG("body").style().paddingRight);
2009
+ const bodyRect = document.documentElement.getBoundingClientRect();
2010
+ const scrollbarWidth = window.innerWidth - bodyRect.width;
2011
+ $LG(document.body).css(
2012
+ "padding-right",
2013
+ scrollbarWidth + this.bodyPaddingRight + "px"
2014
+ );
2015
+ $LG(document.body).addClass("lg-overlay-open");
2016
+ }
2017
+ resetScrollBar() {
2018
+ if (!this.shouldHideScrollbar()) {
2019
+ return;
2020
+ }
2021
+ $LG(document.body).css("padding-right", this.bodyPaddingRight + "px");
2022
+ $LG(document.body).removeClass("lg-overlay-open");
2023
+ }
2024
+ /**
2025
+ * Open lightGallery.
2026
+ * Open gallery with specific slide by passing index of the slide as parameter.
2027
+ * @category lGPublicMethods
2028
+ * @param {Number} index - index of the slide
2029
+ * @param {HTMLElement} element - Which image lightGallery should zoom from
2030
+ *
2031
+ * @example
2032
+ * const $dynamicGallery = document.getElementById('dynamic-gallery-demo');
2033
+ * const dynamicGallery = lightGallery($dynamicGallery, {
2034
+ * dynamic: true,
2035
+ * dynamicEl: [
2036
+ * {
2037
+ * src: 'img/1.jpg',
2038
+ * thumb: 'img/thumb-1.jpg',
2039
+ * subHtml: '<h4>Image 1 title</h4><p>Image 1 descriptions.</p>',
2040
+ * },
2041
+ * ...
2042
+ * ],
2043
+ * });
2044
+ * $dynamicGallery.addEventListener('click', function () {
2045
+ * // Starts with third item.(Optional).
2046
+ * // This is useful if you want use dynamic mode with
2047
+ * // custom thumbnails (thumbnails outside gallery),
2048
+ * dynamicGallery.openGallery(2);
2049
+ * });
2050
+ *
2051
+ */
2052
+ openGallery(index = this.settings.index, element) {
2053
+ if (this.lgOpened) return;
2054
+ this.lgOpened = true;
2055
+ this.outer.removeClass("lg-hide-items");
2056
+ this.hideScrollbar();
2057
+ this.$container.addClass("lg-show");
2058
+ const itemsToBeInsertedToDom = this.getItemsToBeInsertedToDom(
2059
+ index,
2060
+ index
2061
+ );
2062
+ this.currentItemsInDom = itemsToBeInsertedToDom;
2063
+ let items = "";
2064
+ itemsToBeInsertedToDom.forEach((item) => {
2065
+ items = items + `<div id="${item}" class="lg-item"></div>`;
2066
+ });
2067
+ this.$inner.append(items);
2068
+ this.addHtml(index);
2069
+ let transform = "";
2070
+ this.mediaContainerPosition = this.getMediaContainerPosition();
2071
+ const { top, bottom } = this.mediaContainerPosition;
2072
+ if (!this.settings.allowMediaOverlap) {
2073
+ this.setMediaContainerPosition(top, bottom);
2074
+ }
2075
+ const { __slideVideoInfo } = this.galleryItems[index];
2076
+ if (this.zoomFromOrigin && element) {
2077
+ this.currentImageSize = utils.getSize(
2078
+ element,
2079
+ this.outer,
2080
+ top + bottom,
2081
+ __slideVideoInfo && this.settings.videoMaxSize
2082
+ );
2083
+ transform = this.getOriginTransform(element, this.currentImageSize);
2084
+ }
2085
+ if (!this.zoomFromOrigin || !transform) {
2086
+ this.outer.addClass(this.settings.startClass);
2087
+ this.getSlideItem(index).removeClass("lg-complete");
2088
+ }
2089
+ const timeout = this.settings.zoomFromOrigin ? 100 : this.settings.backdropDuration;
2090
+ setTimeout(() => {
2091
+ this.outer.addClass("lg-components-open");
2092
+ }, timeout);
2093
+ this.index = index;
2094
+ this.LGel.trigger(lGEvents.beforeOpen);
2095
+ this.getSlideItem(index).addClass("lg-current");
2096
+ this.lGalleryOn = false;
2097
+ this.prevScrollTop = $LG(window).scrollTop();
2098
+ if (this.settings.trapFocus && document.body === this.settings.container) {
2099
+ this.prevActiveElement = document.activeElement instanceof HTMLElement ? document.activeElement : void 0;
2100
+ }
2101
+ setTimeout(() => {
2102
+ if (this.zoomFromOrigin && transform) {
2103
+ const currentSlide = this.getSlideItem(index);
2104
+ currentSlide.css("transform", transform);
2105
+ setTimeout(() => {
2106
+ currentSlide.addClass("lg-start-progress lg-start-end-progress").css(
2107
+ "transition-duration",
2108
+ this.settings.startAnimationDuration + "ms"
2109
+ );
2110
+ this.outer.addClass("lg-zoom-from-image");
2111
+ });
2112
+ setTimeout(() => {
2113
+ currentSlide.css("transform", "translate3d(0, 0, 0)");
2114
+ }, 100);
2115
+ }
2116
+ setTimeout(() => {
2117
+ this.$backdrop.addClass("in");
2118
+ this.$container.addClass("lg-show-in");
2119
+ }, 10);
2120
+ setTimeout(() => {
2121
+ if (this.settings.trapFocus && document.body === this.settings.container) {
2122
+ this.trapFocus();
2123
+ }
2124
+ }, this.settings.backdropDuration + 50);
2125
+ if (!this.zoomFromOrigin || !transform) {
2126
+ setTimeout(() => {
2127
+ this.outer.addClass("lg-visible");
2128
+ }, this.settings.backdropDuration);
2129
+ }
2130
+ this.slide(index, false, false, false);
2131
+ this.LGel.trigger(lGEvents.afterOpen);
2132
+ });
2133
+ if (document.body === this.settings.container) {
2134
+ $LG("html").addClass("lg-on");
2135
+ }
2136
+ }
2137
+ /**
2138
+ * The zoom-from-origin transform for a trigger: it lands the slide on
2139
+ * the trigger's thumbnail, the start of the opening flight and the end
2140
+ * of the closing one. Undefined when the trigger cannot anchor a flight,
2141
+ * and the gallery opens or closes about the stage centre instead.
2142
+ * Plugins may replace it on the instance to fly differently.
2143
+ */
2144
+ getOriginTransform(element, imageSize) {
2145
+ const { top, bottom } = this.mediaContainerPosition;
2146
+ return utils.getTransform(element, this.outer, top, bottom, imageSize);
2147
+ }
2148
+ /**
2149
+ * Note - Changing the position of the media on every slide transition creates a flickering effect.
2150
+ * Therefore, The height of the caption is calculated dynamically, only once based on the first slide caption.
2151
+ * if you have dynamic captions for each media,
2152
+ * you can provide an appropriate height for the captions via allowMediaOverlap option
2153
+ */
2154
+ getMediaContainerPosition() {
2155
+ if (this.settings.allowMediaOverlap) {
2156
+ return {
2157
+ top: 0,
2158
+ bottom: 0
2159
+ };
2160
+ }
2161
+ const top = this.$toolbar.get().clientHeight || 0;
2162
+ const subHtml = this.outer.find(".lg-components .lg-sub-html").get();
2163
+ const captionHeight = this.settings.defaultCaptionHeight || subHtml && subHtml.clientHeight || 0;
2164
+ const thumbContainer = this.outer.find(".lg-thumb-outer").get();
2165
+ const thumbHeight = thumbContainer ? thumbContainer.clientHeight : 0;
2166
+ const bottom = thumbHeight + captionHeight;
2167
+ return {
2168
+ top,
2169
+ bottom
2170
+ };
2171
+ }
2172
+ setMediaContainerPosition(top = 0, bottom = 0) {
2173
+ this.$content.css("top", top + "px").css("bottom", bottom + "px");
2174
+ }
2175
+ hideBars() {
2176
+ setTimeout(() => {
2177
+ this.outer.removeClass("lg-hide-items");
2178
+ if (this.settings.hideBarsDelay > 0) {
2179
+ this.outer.on("mousemove.lg click.lg touchstart.lg", () => {
2180
+ this.outer.removeClass("lg-hide-items");
2181
+ clearTimeout(this.hideBarTimeout);
2182
+ this.hideBarTimeout = setTimeout(() => {
2183
+ this.outer.addClass("lg-hide-items");
2184
+ }, this.settings.hideBarsDelay);
2185
+ });
2186
+ this.outer.trigger("mousemove.lg");
2187
+ }
2188
+ }, this.settings.showBarsAfter);
2189
+ }
2190
+ /**
2191
+ * @desc Create image counter
2192
+ * Ex: 1/10
2193
+ */
2194
+ counter() {
2195
+ if (this.settings.counter) {
2196
+ const counterA11yAttrs = this.settings.ariaAnnouncements ? 'aria-hidden="true"' : 'role="status" aria-live="polite"';
2197
+ const counterHtml = `<div class="lg-counter" ${counterA11yAttrs}>
2198
+ <span id="${this.getIdName(
2199
+ "lg-counter-current"
2200
+ )}" class="lg-counter-current">${this.index + 1} </span> /
2201
+ <span id="${this.getIdName(
2202
+ "lg-counter-all"
2203
+ )}" class="lg-counter-all">${this.galleryItems.length} </span></div>`;
2204
+ this.outer.find(this.settings.appendCounterTo).append(counterHtml);
2205
+ }
2206
+ }
2207
+ /**
2208
+ * @desc add sub-html into the slide
2209
+ * @param {Number} index - index of the slide
2210
+ */
2211
+ addHtml(index) {
2212
+ let subHtml;
2213
+ let subHtmlUrl;
2214
+ if (this.galleryItems[index].subHtmlUrl) {
2215
+ subHtmlUrl = this.galleryItems[index].subHtmlUrl;
2216
+ } else {
2217
+ subHtml = this.galleryItems[index].subHtml;
2218
+ }
2219
+ if (!subHtmlUrl) {
2220
+ if (subHtml) {
2221
+ const fL = subHtml.substring(0, 1);
2222
+ if (fL === "." || fL === "#") {
2223
+ try {
2224
+ if (this.settings.subHtmlSelectorRelative && !this.settings.dynamic) {
2225
+ subHtml = $LG(this.items).eq(index).find(subHtml).first().html();
2226
+ } else {
2227
+ subHtml = $LG(subHtml).first().html();
2228
+ }
2229
+ } catch (error) {
2230
+ console.warn(
2231
+ `lightGallery: error processing subHtml selector "${subHtml}". See https://www.lightgalleryjs.com/demos/captions/`
2232
+ );
2233
+ subHtml = "";
2234
+ }
2235
+ }
2236
+ } else {
2237
+ subHtml = "";
2238
+ }
2239
+ }
2240
+ if (this.settings.appendSubHtmlTo !== ".lg-item") {
2241
+ if (subHtmlUrl) {
2242
+ utils.fetchCaptionFromUrl(
2243
+ subHtmlUrl,
2244
+ this.outer.find(".lg-sub-html"),
2245
+ "replace"
2246
+ );
2247
+ } else {
2248
+ this.outer.find(".lg-sub-html").html(subHtml);
2249
+ }
2250
+ } else {
2251
+ const currentSlide = $LG(this.getSlideItemId(index));
2252
+ if (subHtmlUrl) {
2253
+ utils.fetchCaptionFromUrl(subHtmlUrl, currentSlide, "append");
2254
+ } else {
2255
+ currentSlide.append(
2256
+ `<div class="lg-sub-html">${subHtml}</div>`
2257
+ );
2258
+ }
2259
+ }
2260
+ if (typeof subHtml !== "undefined" && subHtml !== null) {
2261
+ if (subHtml === "") {
2262
+ this.outer.find(this.settings.appendSubHtmlTo).addClass("lg-empty-html");
2263
+ } else {
2264
+ this.outer.find(this.settings.appendSubHtmlTo).removeClass("lg-empty-html");
2265
+ }
2266
+ }
2267
+ this.LGel.trigger(
2268
+ lGEvents.afterAppendSubHtml,
2269
+ {
2270
+ index
2271
+ }
2272
+ );
2273
+ }
2274
+ /**
2275
+ * @desc Preload slides
2276
+ * @param {Number} index - index of the slide
2277
+ * @todo preload not working for the first slide, Also, should work for the first and last slide as well
2278
+ */
2279
+ preload(index) {
2280
+ for (let i = 1; i <= this.settings.preload; i++) {
2281
+ if (i >= this.galleryItems.length - index) {
2282
+ break;
2283
+ }
2284
+ this.loadContent(index + i, false);
2285
+ }
2286
+ for (let j = 1; j <= this.settings.preload; j++) {
2287
+ if (index - j < 0) {
2288
+ break;
2289
+ }
2290
+ this.loadContent(index - j, false);
2291
+ }
2292
+ }
2293
+ getDummyImgStyles(imageSize) {
2294
+ if (!imageSize) return "";
2295
+ return `width:${imageSize.width}px;
2296
+ margin-left: -${imageSize.width / 2}px;
2297
+ margin-top: -${imageSize.height / 2}px;
2298
+ height:${imageSize.height}px`;
2299
+ }
2300
+ getVideoContStyle(imageSize) {
2301
+ if (!imageSize) return "";
2302
+ return `width:${imageSize.width}px;
2303
+ height:${imageSize.height}px`;
2304
+ }
2305
+ getDummyImageContent($currentSlide, index, alt) {
2306
+ let $currentItem;
2307
+ if (!this.settings.dynamic) {
2308
+ $currentItem = $LG(this.items).eq(index);
2309
+ }
2310
+ if ($currentItem) {
2311
+ let _dummyImgSrc;
2312
+ if (!this.settings.exThumbImage) {
2313
+ _dummyImgSrc = $currentItem.find("img").first().attr("src");
2314
+ } else {
2315
+ _dummyImgSrc = $currentItem.attr(this.settings.exThumbImage);
2316
+ }
2317
+ if (!_dummyImgSrc) return "";
2318
+ const imgStyle = this.getDummyImgStyles(this.currentImageSize);
2319
+ const dummyImgContentImg = document.createElement("img");
2320
+ dummyImgContentImg.alt = alt || "";
2321
+ dummyImgContentImg.src = _dummyImgSrc;
2322
+ dummyImgContentImg.className = `lg-dummy-img`;
2323
+ dummyImgContentImg.style.cssText = imgStyle;
2324
+ $currentSlide.addClass("lg-first-slide");
2325
+ this.outer.addClass("lg-first-slide-loading");
2326
+ return dummyImgContentImg;
2327
+ }
2328
+ return "";
2329
+ }
2330
+ setImgMarkup(src, $currentSlide, index) {
2331
+ const currentGalleryItem = this.galleryItems[index];
2332
+ const { alt, srcset, sizes, sources } = currentGalleryItem;
2333
+ let imgContent = "";
2334
+ const altAttr = alt ? 'alt="' + alt + '"' : "";
2335
+ if (this.isFirstSlideWithZoomAnimation()) {
2336
+ imgContent = this.getDummyImageContent(
2337
+ $currentSlide,
2338
+ index,
2339
+ altAttr
2340
+ );
2341
+ } else {
2342
+ imgContent = utils.getImgMarkup(
2343
+ index,
2344
+ src,
2345
+ altAttr,
2346
+ srcset,
2347
+ sizes,
2348
+ sources
2349
+ );
2350
+ }
2351
+ const picture = document.createElement("picture");
2352
+ picture.className = "lg-img-wrap";
2353
+ $LG(picture).append(imgContent);
2354
+ $currentSlide.prepend(picture);
2355
+ }
2356
+ onSlideObjectLoad($slide, isHTML5VideoWithoutPoster, onLoad, onError) {
2357
+ const mediaObject = $slide.find(".lg-object").first();
2358
+ const media = mediaObject.get();
2359
+ const gated = (handler) => {
2360
+ if (media instanceof HTMLImageElement && typeof media.decode === "function") {
2361
+ void awaitDecode(media).then(handler);
2362
+ } else {
2363
+ handler();
2364
+ }
2365
+ };
2366
+ if (utils.isImageLoaded(media) || isHTML5VideoWithoutPoster) {
2367
+ gated(onLoad);
2368
+ } else {
2369
+ mediaObject.on("load.lg error.lg", () => {
2370
+ gated(() => onLoad && onLoad());
2371
+ });
2372
+ mediaObject.on("error.lg", () => {
2373
+ onError && onError();
2374
+ });
2375
+ }
2376
+ }
2377
+ /**
2378
+ *
2379
+ * @param $el Current slide item
2380
+ * @param index
2381
+ * @param delay Delay is 0 except first time
2382
+ * @param speed Speed is same as delay, except it is 0 if gallery is opened via hash plugin
2383
+ * @param isFirstSlide
2384
+ */
2385
+ onLgObjectLoad(currentSlide, index, delay, speed, isFirstSlide, isHTML5VideoWithoutPoster) {
2386
+ this.onSlideObjectLoad(
2387
+ currentSlide,
2388
+ isHTML5VideoWithoutPoster,
2389
+ () => {
2390
+ this.triggerSlideItemLoad(
2391
+ currentSlide,
2392
+ index,
2393
+ delay,
2394
+ speed,
2395
+ isFirstSlide
2396
+ );
2397
+ },
2398
+ () => {
2399
+ currentSlide.addClass("lg-complete lg-complete_");
2400
+ currentSlide.html(
2401
+ '<span class="lg-error-msg">' + this.settings.strings["mediaLoadingFailed"] + "</span>"
2402
+ );
2403
+ }
2404
+ );
2405
+ }
2406
+ triggerSlideItemLoad($currentSlide, index, delay, speed, isFirstSlide) {
2407
+ const currentGalleryItem = this.galleryItems[index];
2408
+ const _speed = isFirstSlide && this.getSlideType(currentGalleryItem) === "video" && !currentGalleryItem.poster ? speed : 0;
2409
+ setTimeout(() => {
2410
+ $currentSlide.addClass("lg-complete lg-complete_");
2411
+ this.LGel.trigger(lGEvents.slideItemLoad, {
2412
+ index,
2413
+ delay: delay || 0,
2414
+ isFirstSlide
2415
+ });
2416
+ }, _speed);
2417
+ }
2418
+ isFirstSlideWithZoomAnimation() {
2419
+ return !!(!this.lGalleryOn && this.zoomFromOrigin && this.currentImageSize);
2420
+ }
2421
+ // Add video slideInfo
2422
+ addSlideVideoInfo(items) {
2423
+ items.forEach((element, index) => {
2424
+ element.__slideVideoInfo = utils.isVideo(
2425
+ element.src,
2426
+ !!element.video,
2427
+ index
2428
+ );
2429
+ const videoInfo = element.__slideVideoInfo;
2430
+ if (!videoInfo) {
2431
+ return;
2432
+ }
2433
+ if (this.settings.videoFacade !== false) {
2434
+ element.poster = getFacadePoster(
2435
+ element,
2436
+ videoInfo,
2437
+ this.settings.loadYouTubePoster
2438
+ );
2439
+ } else if (this.settings.loadYouTubePoster && !element.poster && videoInfo.youtube) {
2440
+ element.poster = getYouTubePosterUrl(videoInfo);
2441
+ }
2442
+ });
2443
+ }
2444
+ /**
2445
+ * Load slide content into slide.
2446
+ * This is used to load content into slides that is not visible too
2447
+ * @param {Number} index - index of the slide.
2448
+ * @param {Boolean} rec - if true call loadcontent() function again.
2449
+ */
2450
+ loadContent(index, rec) {
2451
+ const currentGalleryItem = this.galleryItems[index];
2452
+ const $currentSlide = $LG(this.getSlideItemId(index));
2453
+ const { poster, srcset, sizes, sources } = currentGalleryItem;
2454
+ let { src } = currentGalleryItem;
2455
+ const video = currentGalleryItem.video;
2456
+ const _html5Video = video && typeof video === "string" ? JSON.parse(video) : video;
2457
+ if (currentGalleryItem.responsive) {
2458
+ const srcDyItms = currentGalleryItem.responsive.split(",");
2459
+ src = utils.getResponsiveSrc(srcDyItms) || src;
2460
+ }
2461
+ const videoInfo = currentGalleryItem.__slideVideoInfo;
2462
+ let lgVideoStyle = "";
2463
+ const iframe = !!currentGalleryItem.iframe;
2464
+ const isFirstSlide = !this.lGalleryOn;
2465
+ let delay = 0;
2466
+ if (isFirstSlide) {
2467
+ if (this.zoomFromOrigin && this.currentImageSize) {
2468
+ delay = this.settings.startAnimationDuration + 10;
2469
+ } else {
2470
+ delay = this.settings.backdropDuration + 10;
2471
+ }
2472
+ }
2473
+ if (!$currentSlide.hasClass("lg-loaded")) {
2474
+ if (videoInfo) {
2475
+ const { top, bottom } = this.mediaContainerPosition;
2476
+ const videoSize = utils.getSize(
2477
+ this.items[index],
2478
+ this.outer,
2479
+ top + bottom,
2480
+ videoInfo && this.settings.videoMaxSize
2481
+ );
2482
+ lgVideoStyle = this.getVideoContStyle(videoSize);
2483
+ }
2484
+ if (iframe) {
2485
+ const markup = utils.getIframeMarkup(
2486
+ this.settings.iframeWidth,
2487
+ this.settings.iframeHeight,
2488
+ this.settings.iframeMaxWidth,
2489
+ this.settings.iframeMaxHeight,
2490
+ src,
2491
+ currentGalleryItem.iframeTitle
2492
+ );
2493
+ $currentSlide.prepend(markup);
2494
+ } else if (poster) {
2495
+ let dummyImg = "";
2496
+ const hasStartAnimation = isFirstSlide && this.zoomFromOrigin && this.currentImageSize;
2497
+ if (hasStartAnimation) {
2498
+ dummyImg = this.getDummyImageContent(
2499
+ $currentSlide,
2500
+ index,
2501
+ ""
2502
+ );
2503
+ }
2504
+ const markup = utils.getVideoPosterMarkup(
2505
+ poster,
2506
+ dummyImg || "",
2507
+ lgVideoStyle,
2508
+ this.settings.strings["playVideo"],
2509
+ videoInfo
2510
+ );
2511
+ $currentSlide.prepend(markup);
2512
+ } else if (videoInfo) {
2513
+ const markup = `<div class="lg-video-cont " style="${lgVideoStyle}"></div>`;
2514
+ $currentSlide.prepend(markup);
2515
+ } else {
2516
+ this.setImgMarkup(src, $currentSlide, index);
2517
+ }
2518
+ if (poster || videoInfo) {
2519
+ this.LGel.trigger(lGEvents.hasVideo, {
2520
+ index,
2521
+ src,
2522
+ html5Video: _html5Video,
2523
+ hasPoster: !!poster
2524
+ });
2525
+ }
2526
+ this.LGel.trigger(
2527
+ lGEvents.afterAppendSlide,
2528
+ { index }
2529
+ );
2530
+ if (this.lGalleryOn && this.settings.appendSubHtmlTo === ".lg-item") {
2531
+ this.addHtml(index);
2532
+ }
2533
+ }
2534
+ let _speed = 0;
2535
+ if (delay && !$LG(document.body).hasClass("lg-from-hash")) {
2536
+ _speed = delay;
2537
+ }
2538
+ if (this.isFirstSlideWithZoomAnimation()) {
2539
+ const settleFlight = (onLanded) => onTransitionSettle(
2540
+ $currentSlide.get(),
2541
+ "transform",
2542
+ this.settings.startAnimationDuration + 100,
2543
+ onLanded
2544
+ );
2545
+ settleFlight(() => {
2546
+ $currentSlide.removeClass("lg-start-end-progress lg-start-progress").removeAttr("style");
2547
+ });
2548
+ if (!$currentSlide.hasClass("lg-loaded")) {
2549
+ settleFlight(() => {
2550
+ if (this.getSlideType(currentGalleryItem) === "image") {
2551
+ const { alt } = currentGalleryItem;
2552
+ const altAttr = alt ? 'alt="' + alt + '"' : "";
2553
+ $currentSlide.find(".lg-img-wrap").append(
2554
+ utils.getImgMarkup(
2555
+ index,
2556
+ src,
2557
+ altAttr,
2558
+ srcset,
2559
+ sizes,
2560
+ currentGalleryItem.sources
2561
+ )
2562
+ );
2563
+ }
2564
+ if (this.getSlideType(currentGalleryItem) === "image" || this.getSlideType(currentGalleryItem) === "video" && poster) {
2565
+ this.onLgObjectLoad(
2566
+ $currentSlide,
2567
+ index,
2568
+ delay,
2569
+ _speed,
2570
+ true,
2571
+ false
2572
+ );
2573
+ this.onSlideObjectLoad(
2574
+ $currentSlide,
2575
+ !!(videoInfo && videoInfo.html5 && !poster),
2576
+ () => {
2577
+ this.loadContentOnFirstSlideLoad(
2578
+ index,
2579
+ $currentSlide,
2580
+ _speed
2581
+ );
2582
+ },
2583
+ () => {
2584
+ this.loadContentOnFirstSlideLoad(
2585
+ index,
2586
+ $currentSlide,
2587
+ _speed
2588
+ );
2589
+ }
2590
+ );
2591
+ }
2592
+ });
2593
+ }
2594
+ }
2595
+ $currentSlide.addClass("lg-loaded");
2596
+ if (!this.isFirstSlideWithZoomAnimation() || this.getSlideType(currentGalleryItem) === "video" && !poster) {
2597
+ this.onLgObjectLoad(
2598
+ $currentSlide,
2599
+ index,
2600
+ delay,
2601
+ _speed,
2602
+ isFirstSlide,
2603
+ !!(videoInfo && videoInfo.html5 && !poster)
2604
+ );
2605
+ }
2606
+ if ((!this.zoomFromOrigin || !this.currentImageSize) && $currentSlide.hasClass("lg-complete_") && !this.lGalleryOn) {
2607
+ setTimeout(() => {
2608
+ $currentSlide.addClass("lg-complete");
2609
+ }, this.settings.backdropDuration);
2610
+ }
2611
+ this.lGalleryOn = true;
2612
+ if (rec === true) {
2613
+ if (!$currentSlide.hasClass("lg-complete_")) {
2614
+ $currentSlide.find(".lg-object").first().on("load.lg error.lg", () => {
2615
+ this.preload(index);
2616
+ });
2617
+ } else {
2618
+ this.preload(index);
2619
+ }
2620
+ }
2621
+ }
2622
+ /**
2623
+ * @desc Remove dummy image content and load next slides
2624
+ * Called only for the first time if zoomFromOrigin animation is enabled
2625
+ * @param index
2626
+ * @param $currentSlide
2627
+ * @param speed
2628
+ */
2629
+ loadContentOnFirstSlideLoad(index, $currentSlide, speed) {
2630
+ setTimeout(() => {
2631
+ $currentSlide.find(".lg-dummy-img").remove();
2632
+ $currentSlide.removeClass("lg-first-slide");
2633
+ this.outer.removeClass("lg-first-slide-loading");
2634
+ this.isDummyImageRemoved = true;
2635
+ this.preload(index);
2636
+ }, speed + 300);
2637
+ }
2638
+ getItemsToBeInsertedToDom(index, prevIndex, numberOfItems = 0) {
2639
+ const itemsToBeInsertedToDom = [];
2640
+ let possibleNumberOfItems = Math.max(numberOfItems, 3);
2641
+ possibleNumberOfItems = Math.min(
2642
+ possibleNumberOfItems,
2643
+ this.galleryItems.length
2644
+ );
2645
+ const prevIndexItem = `lg-item-${this.lgId}-${prevIndex}`;
2646
+ if (this.galleryItems.length <= 3) {
2647
+ this.galleryItems.forEach((_element, index2) => {
2648
+ itemsToBeInsertedToDom.push(`lg-item-${this.lgId}-${index2}`);
2649
+ });
2650
+ return itemsToBeInsertedToDom;
2651
+ }
2652
+ if (index < (this.galleryItems.length - 1) / 2) {
2653
+ for (let idx = index; idx > index - possibleNumberOfItems / 2 && idx >= 0; idx--) {
2654
+ itemsToBeInsertedToDom.push(`lg-item-${this.lgId}-${idx}`);
2655
+ }
2656
+ const numberOfExistingItems = itemsToBeInsertedToDom.length;
2657
+ for (let idx = 0; idx < possibleNumberOfItems - numberOfExistingItems; idx++) {
2658
+ itemsToBeInsertedToDom.push(
2659
+ `lg-item-${this.lgId}-${index + idx + 1}`
2660
+ );
2661
+ }
2662
+ } else {
2663
+ for (let idx = index; idx <= this.galleryItems.length - 1 && idx < index + possibleNumberOfItems / 2; idx++) {
2664
+ itemsToBeInsertedToDom.push(`lg-item-${this.lgId}-${idx}`);
2665
+ }
2666
+ const numberOfExistingItems = itemsToBeInsertedToDom.length;
2667
+ for (let idx = 0; idx < possibleNumberOfItems - numberOfExistingItems; idx++) {
2668
+ itemsToBeInsertedToDom.push(
2669
+ `lg-item-${this.lgId}-${index - idx - 1}`
2670
+ );
2671
+ }
2672
+ }
2673
+ if (this.settings.loop) {
2674
+ if (index === this.galleryItems.length - 1) {
2675
+ itemsToBeInsertedToDom.push(`lg-item-${this.lgId}-${0}`);
2676
+ } else if (index === 0) {
2677
+ itemsToBeInsertedToDom.push(
2678
+ `lg-item-${this.lgId}-${this.galleryItems.length - 1}`
2679
+ );
2680
+ }
2681
+ }
2682
+ if (itemsToBeInsertedToDom.indexOf(prevIndexItem) === -1) {
2683
+ itemsToBeInsertedToDom.push(`lg-item-${this.lgId}-${prevIndex}`);
2684
+ }
2685
+ return itemsToBeInsertedToDom;
2686
+ }
2687
+ organizeSlideItems(index, prevIndex) {
2688
+ var _a, _b;
2689
+ const itemsToBeInsertedToDom = this.getItemsToBeInsertedToDom(
2690
+ index,
2691
+ prevIndex,
2692
+ (_b = (_a = this.settings.virtualization) == null ? void 0 : _a.slides) != null ? _b : this.settings.numberOfSlideItemsInDom
2693
+ );
2694
+ itemsToBeInsertedToDom.forEach((item) => {
2695
+ if (this.currentItemsInDom.indexOf(item) === -1) {
2696
+ this.$inner.append(`<div id="${item}" class="lg-item"></div>`);
2697
+ }
2698
+ });
2699
+ this.currentItemsInDom.forEach((item) => {
2700
+ if (itemsToBeInsertedToDom.indexOf(item) === -1) {
2701
+ $LG(`#${item}`).remove();
2702
+ }
2703
+ });
2704
+ return itemsToBeInsertedToDom;
2705
+ }
2706
+ /**
2707
+ * Get previous index of the slide
2708
+ */
2709
+ getPreviousSlideIndex() {
2710
+ let prevIndex = 0;
2711
+ try {
2712
+ const currentItemId = this.outer.find(".lg-current").first().attr("id");
2713
+ prevIndex = parseInt(currentItemId.split("-")[3]) || 0;
2714
+ } catch (error) {
2715
+ prevIndex = 0;
2716
+ }
2717
+ return prevIndex;
2718
+ }
2719
+ setDownloadValue(index) {
2720
+ if (this.settings.download) {
2721
+ const currentGalleryItem = this.galleryItems[index];
2722
+ const hideDownloadBtn = currentGalleryItem.downloadUrl === false || currentGalleryItem.downloadUrl === "false";
2723
+ if (hideDownloadBtn) {
2724
+ this.outer.addClass("lg-hide-download");
2725
+ } else {
2726
+ const $download = this.getElementById("lg-download");
2727
+ this.outer.removeClass("lg-hide-download");
2728
+ $download.attr(
2729
+ "href",
2730
+ currentGalleryItem.downloadUrl || currentGalleryItem.src
2731
+ );
2732
+ if (currentGalleryItem.download) {
2733
+ $download.attr("download", currentGalleryItem.download);
2734
+ }
2735
+ }
2736
+ }
2737
+ }
2738
+ makeSlideAnimation(direction, currentSlideItem, previousSlideItem) {
2739
+ if (this.lGalleryOn) {
2740
+ previousSlideItem.addClass("lg-slide-progress");
2741
+ }
2742
+ setTimeout(
2743
+ () => {
2744
+ this.outer.addClass("lg-no-trans");
2745
+ this.outer.find(".lg-item").removeClass("lg-prev-slide lg-next-slide");
2746
+ if (direction === "prev") {
2747
+ currentSlideItem.addClass("lg-prev-slide");
2748
+ previousSlideItem.addClass("lg-next-slide");
2749
+ } else {
2750
+ currentSlideItem.addClass("lg-next-slide");
2751
+ previousSlideItem.addClass("lg-prev-slide");
2752
+ }
2753
+ setTimeout(() => {
2754
+ this.outer.find(".lg-item").removeClass("lg-current");
2755
+ currentSlideItem.addClass("lg-current");
2756
+ this.outer.removeClass("lg-no-trans");
2757
+ }, 50);
2758
+ },
2759
+ this.lGalleryOn ? this.settings.slideDelay : 0
2760
+ );
2761
+ }
2762
+ /**
2763
+ * Goto a specific slide.
2764
+ * @param {Number} index - index of the slide
2765
+ * @param {Boolean} fromTouch - true if slide function called via touch event or mouse drag
2766
+ * @param {Boolean} fromThumb - true if slide function called via thumbnail click
2767
+ * @param {String} direction - Direction of the slide(next/prev)
2768
+ * @category lGPublicMethods
2769
+ * @example
2770
+ * const plugin = lightGallery();
2771
+ * // to go to 3rd slide
2772
+ * plugin.slide(2);
2773
+ *
2774
+ */
2775
+ slide(index, fromTouch, fromThumb, direction) {
2776
+ const prevIndex = this.getPreviousSlideIndex();
2777
+ this.currentItemsInDom = this.organizeSlideItems(index, prevIndex);
2778
+ if (this.lGalleryOn && prevIndex === index) {
2779
+ return;
2780
+ }
2781
+ const numberOfGalleryItems = this.galleryItems.length;
2782
+ if (!this.lgBusy) {
2783
+ if (this.settings.counter) {
2784
+ this.updateCurrentCounter(index);
2785
+ }
2786
+ this.announceSlide(index);
2787
+ const currentSlideItem = this.getSlideItem(index);
2788
+ const previousSlideItem = this.getSlideItem(prevIndex);
2789
+ const currentGalleryItem = this.galleryItems[index];
2790
+ const videoInfo = currentGalleryItem.__slideVideoInfo;
2791
+ this.outer.attr(
2792
+ "data-lg-slide-type",
2793
+ this.getSlideType(currentGalleryItem)
2794
+ );
2795
+ this.setDownloadValue(index);
2796
+ this.updateCurrentImageSize(index);
2797
+ if (videoInfo) {
2798
+ const { top, bottom } = this.mediaContainerPosition;
2799
+ const videoSize = utils.getSize(
2800
+ this.items[index],
2801
+ this.outer,
2802
+ top + bottom,
2803
+ videoInfo && this.settings.videoMaxSize
2804
+ );
2805
+ this.resizeVideoSlide(index, videoSize);
2806
+ }
2807
+ this.LGel.trigger(lGEvents.beforeSlide, {
2808
+ prevIndex,
2809
+ index,
2810
+ fromTouch: !!fromTouch,
2811
+ fromThumb: !!fromThumb
2812
+ });
2813
+ this.lgBusy = true;
2814
+ clearTimeout(this.hideBarTimeout);
2815
+ this.arrowDisable(index);
2816
+ if (!direction) {
2817
+ if (index < prevIndex) {
2818
+ direction = "prev";
2819
+ } else if (index > prevIndex) {
2820
+ direction = "next";
2821
+ }
2822
+ }
2823
+ if (!fromTouch) {
2824
+ this.makeSlideAnimation(
2825
+ direction,
2826
+ currentSlideItem,
2827
+ previousSlideItem
2828
+ );
2829
+ } else {
2830
+ this.outer.find(".lg-item").removeClass("lg-prev-slide lg-current lg-next-slide");
2831
+ let touchPrev;
2832
+ let touchNext;
2833
+ if (numberOfGalleryItems > 2) {
2834
+ touchPrev = index - 1;
2835
+ touchNext = index + 1;
2836
+ if (index === 0 && prevIndex === numberOfGalleryItems - 1) {
2837
+ touchNext = 0;
2838
+ touchPrev = numberOfGalleryItems - 1;
2839
+ } else if (index === numberOfGalleryItems - 1 && prevIndex === 0) {
2840
+ touchNext = 0;
2841
+ touchPrev = numberOfGalleryItems - 1;
2842
+ }
2843
+ } else {
2844
+ touchPrev = 0;
2845
+ touchNext = 1;
2846
+ }
2847
+ if (direction === "prev") {
2848
+ this.getSlideItem(touchNext).addClass("lg-next-slide");
2849
+ } else {
2850
+ this.getSlideItem(touchPrev).addClass("lg-prev-slide");
2851
+ }
2852
+ currentSlideItem.addClass("lg-current");
2853
+ }
2854
+ if (!this.lGalleryOn) {
2855
+ this.loadContent(index, true);
2856
+ } else {
2857
+ setTimeout(() => {
2858
+ this.loadContent(index, true);
2859
+ if (this.settings.appendSubHtmlTo !== ".lg-item") {
2860
+ this.addHtml(index);
2861
+ }
2862
+ }, this.settings.speed + 50 + (fromTouch ? 0 : this.settings.slideDelay));
2863
+ }
2864
+ setTimeout(() => {
2865
+ this.lgBusy = false;
2866
+ previousSlideItem.removeClass("lg-slide-progress");
2867
+ this.LGel.trigger(lGEvents.afterSlide, {
2868
+ prevIndex,
2869
+ index,
2870
+ fromTouch,
2871
+ fromThumb
2872
+ });
2873
+ }, (this.lGalleryOn ? this.settings.speed + 100 : 100) + (fromTouch ? 0 : this.settings.slideDelay));
2874
+ }
2875
+ this.index = index;
2876
+ }
2877
+ updateCurrentCounter(index) {
2878
+ this.getElementById("lg-counter-current").html(index + 1 + "");
2879
+ }
2880
+ /**
2881
+ * Plain-text caption of a slide for the aria-live announcer. Resolves
2882
+ * the same sources addHtml uses (inline subHtml markup or a selector)
2883
+ * and strips the markup down to readable text. Remote captions
2884
+ * (subHtmlUrl) are skipped, announcing can't wait on a fetch.
2885
+ */
2886
+ getSlideCaptionText(index) {
2887
+ const currentGalleryItem = this.galleryItems[index];
2888
+ if (!currentGalleryItem || currentGalleryItem.subHtmlUrl) {
2889
+ return "";
2890
+ }
2891
+ let subHtml = currentGalleryItem.subHtml || "";
2892
+ const firstLetter = subHtml.substring(0, 1);
2893
+ if (firstLetter === "." || firstLetter === "#") {
2894
+ try {
2895
+ if (this.settings.subHtmlSelectorRelative && !this.settings.dynamic) {
2896
+ subHtml = $LG(this.items).eq(index).find(subHtml).first().html();
2897
+ } else {
2898
+ subHtml = $LG(subHtml).first().html();
2899
+ }
2900
+ } catch (error) {
2901
+ subHtml = "";
2902
+ }
2903
+ }
2904
+ if (!subHtml) {
2905
+ return "";
2906
+ }
2907
+ const container = document.createElement("div");
2908
+ container.innerHTML = subHtml;
2909
+ return container.textContent || "";
2910
+ }
2911
+ /**
2912
+ * Update the polite live region with the shown slide's position and
2913
+ * caption ("Image X of Y, caption"). The single announcement source,
2914
+ * counter and caption bar are not live regions while this is enabled.
2915
+ */
2916
+ announceSlide(index) {
2917
+ if (!this.settings.ariaAnnouncements) {
2918
+ return;
2919
+ }
2920
+ const announcer = this.getElementById("lg-announcer").get();
2921
+ if (!announcer) {
2922
+ return;
2923
+ }
2924
+ announcer.textContent = formatSlideAnnouncement({
2925
+ template: this.settings.strings["slideAnnouncement"],
2926
+ index: index + 1,
2927
+ total: this.galleryItems.length,
2928
+ caption: this.getSlideCaptionText(index)
2929
+ });
2930
+ }
2931
+ updateCounterTotal() {
2932
+ this.getElementById("lg-counter-all").html(
2933
+ this.galleryItems.length + ""
2934
+ );
2935
+ }
2936
+ getSlideType(item) {
2937
+ if (item.__slideVideoInfo) {
2938
+ return "video";
2939
+ } else if (item.iframe) {
2940
+ return "iframe";
2941
+ } else {
2942
+ return "image";
2943
+ }
2944
+ }
2945
+ /** Stop a running release spring; visuals stay at the live frame. */
2946
+ stopSlideSpring() {
2947
+ if (this.cancelSlideSpring) {
2948
+ this.cancelSlideSpring();
2949
+ this.cancelSlideSpring = void 0;
2950
+ }
2951
+ }
2952
+ touchMove(startCoords, endCoords, e) {
2953
+ const distanceX = endCoords.pageX - startCoords.pageX;
2954
+ const distanceY = endCoords.pageY - startCoords.pageY;
2955
+ this.swipeSamples = pushVelocitySample(this.swipeSamples, {
2956
+ x: endCoords.pageX,
2957
+ y: endCoords.pageY,
2958
+ t: Date.now()
2959
+ });
2960
+ this.swipeDirection = getSwipeAxis(
2961
+ distanceX,
2962
+ distanceY,
2963
+ this.swipeDirection
2964
+ );
2965
+ if (!this.swipeDirection) {
2966
+ return;
2967
+ }
2968
+ const $currentSlide = this.getSlideItem(this.index);
2969
+ if (this.swipeDirection === "horizontal") {
2970
+ e == null ? void 0 : e.preventDefault();
2971
+ this.outer.addClass("lg-dragging");
2972
+ const transforms = getHorizontalDragTransforms(
2973
+ this.getEdgeDragDelta(distanceX),
2974
+ $currentSlide.get().offsetWidth,
2975
+ this.getDirection()
2976
+ );
2977
+ $currentSlide.css("transform", transforms.current);
2978
+ this.outer.find(".lg-prev-slide").first().css("transform", transforms.prev);
2979
+ this.outer.find(".lg-next-slide").first().css("transform", transforms.next);
2980
+ } else if (this.swipeDirection === "vertical") {
2981
+ if (this.settings.swipeToClose) {
2982
+ e == null ? void 0 : e.preventDefault();
2983
+ this.$container.addClass("lg-dragging-vertical");
2984
+ const effects = getVerticalDragEffects(
2985
+ distanceY,
2986
+ window.innerWidth,
2987
+ window.innerHeight
2988
+ );
2989
+ this.$backdrop.css("opacity", effects.backdropOpacity);
2990
+ $currentSlide.css("transform", effects.transform);
2991
+ if (effects.hideUi) {
2992
+ this.outer.addClass("lg-hide-items").removeClass("lg-components-open");
2993
+ }
2994
+ }
2995
+ }
2996
+ }
2997
+ /**
2998
+ * The horizontal delta as rendered: rubber-banded when the drag
2999
+ * points past the first/last slide with nothing there (loop counts).
3000
+ */
3001
+ getEdgeDragDelta(distanceX) {
3002
+ const count = this.galleryItems.length;
3003
+ return getEdgeFrictionedDelta(
3004
+ distanceX,
3005
+ resolveSwipeTarget(
3006
+ "prev",
3007
+ this.index,
3008
+ count,
3009
+ this.settings.loop
3010
+ ) !== null,
3011
+ resolveSwipeTarget(
3012
+ "next",
3013
+ this.index,
3014
+ count,
3015
+ this.settings.loop
3016
+ ) !== null,
3017
+ this.getDirection()
3018
+ );
3019
+ }
3020
+ /** Resolved reading direction ('auto' is resolved at init). */
3021
+ getDirection() {
3022
+ return this.settings.direction === "rtl" ? "rtl" : "ltr";
3023
+ }
3024
+ /**
3025
+ * Spring the dragged slides back to rest, seeded with the release
3026
+ * velocity. Returns false (no spring) for sub-pixel drags.
3027
+ */
3028
+ springSlidesBack(deltaX, velocityX) {
3029
+ if (Math.abs(deltaX) < 1) {
3030
+ return false;
3031
+ }
3032
+ const $currentSlide = this.getSlideItem(this.index);
3033
+ const $prev = this.outer.find(".lg-prev-slide").first();
3034
+ const $next = this.outer.find(".lg-next-slide").first();
3035
+ const width = $currentSlide.get().offsetWidth;
3036
+ this.stopSlideSpring();
3037
+ this.cancelSlideSpring = runSprings(
3038
+ [{ from: deltaX, velocity: velocityX, target: 0 }],
3039
+ ([x]) => {
3040
+ const transforms = getHorizontalDragTransforms(
3041
+ x,
3042
+ width,
3043
+ this.getDirection()
3044
+ );
3045
+ $currentSlide.css("transform", transforms.current);
3046
+ $prev.css("transform", transforms.prev);
3047
+ $next.css("transform", transforms.next);
3048
+ },
3049
+ () => {
3050
+ this.cancelSlideSpring = void 0;
3051
+ this.endDragVisuals();
3052
+ }
3053
+ );
3054
+ return true;
3055
+ }
3056
+ /**
3057
+ * Carry the release velocity into a gesture navigation: navigate
3058
+ * immediately (events, counter and busy-lock on time; fromTouch
3059
+ * classes flip underneath, inline transforms keep the visuals),
3060
+ * then spring the same drag geometry until the arriving slide lands
3061
+ * at rest. Falls back to a snap-back when navigation declines
3062
+ * (busy, or an edge without loop, the 2.x end animation plays).
3063
+ */
3064
+ springSlideNavigation(verdict, deltaX, velocityX) {
3065
+ const $current = this.getSlideItem(this.index);
3066
+ const $prev = this.outer.find(".lg-prev-slide").first();
3067
+ const $next = this.outer.find(".lg-next-slide").first();
3068
+ const width = $current.get().offsetWidth;
3069
+ if (!width) {
3070
+ return false;
3071
+ }
3072
+ const prevIndex = this.index;
3073
+ if (verdict === "next") {
3074
+ this.goToNextSlide(true);
3075
+ } else {
3076
+ this.goToPrevSlide(true);
3077
+ }
3078
+ if (this.index === prevIndex) {
3079
+ return this.springSlidesBack(deltaX, velocityX);
3080
+ }
3081
+ const target = (verdict === "next" ? -1 : 1) * (this.getDirection() === "rtl" ? -1 : 1) * (width * 115 / 110);
3082
+ this.stopSlideSpring();
3083
+ this.cancelSlideSpring = runSprings(
3084
+ [{ from: deltaX, velocity: velocityX, target }],
3085
+ ([x]) => {
3086
+ const transforms = getHorizontalDragTransforms(
3087
+ x,
3088
+ width,
3089
+ this.getDirection()
3090
+ );
3091
+ $current.css("transform", transforms.current);
3092
+ $prev.css("transform", transforms.prev);
3093
+ $next.css("transform", transforms.next);
3094
+ },
3095
+ () => {
3096
+ this.cancelSlideSpring = void 0;
3097
+ this.endDragVisuals();
3098
+ }
3099
+ );
3100
+ return true;
3101
+ }
3102
+ /**
3103
+ * Hand the slides back to CSS after a gesture. The inline transforms
3104
+ * go first, while lg-dragging still pins transition-duration to 0s,
3105
+ * so the snap from the released position to the slide's resting
3106
+ * place lands in a single frame. Dropping the class first animates
3107
+ * that snap instead, and the outgoing slide is seen travelling back
3108
+ * toward the centre while its fade is still running.
3109
+ */
3110
+ endDragVisuals() {
3111
+ this.outer.find(".lg-item").removeAttr("style");
3112
+ if (this.settings.mode !== "lg-slide") {
3113
+ this.outer.removeClass("lg-slide");
3114
+ }
3115
+ void this.outer.get().offsetHeight;
3116
+ this.outer.removeClass("lg-dragging");
3117
+ }
3118
+ /**
3119
+ * Spring a non-closing vertical drag back to rest, slide transform
3120
+ * and backdrop opacity together, seeded with the release velocity.
3121
+ */
3122
+ springVerticalRestore(deltaY, velocityY) {
3123
+ if (Math.abs(deltaY) < 1) {
3124
+ return false;
3125
+ }
3126
+ const $currentSlide = this.getSlideItem(this.index);
3127
+ this.stopSlideSpring();
3128
+ this.$container.addClass("lg-dragging-vertical");
3129
+ this.cancelSlideSpring = runSprings(
3130
+ [{ from: deltaY, velocity: velocityY, target: 0 }],
3131
+ ([y]) => {
3132
+ const effects = getVerticalDragEffects(
3133
+ y,
3134
+ window.innerWidth,
3135
+ window.innerHeight
3136
+ );
3137
+ this.$backdrop.css("opacity", effects.backdropOpacity);
3138
+ $currentSlide.css("transform", effects.transform);
3139
+ },
3140
+ () => {
3141
+ this.cancelSlideSpring = void 0;
3142
+ this.$container.removeClass("lg-dragging-vertical");
3143
+ this.endDragVisuals();
3144
+ this.$backdrop.css("opacity", 1);
3145
+ }
3146
+ );
3147
+ return true;
3148
+ }
3149
+ touchEnd(endCoords, startCoords, event) {
3150
+ const releaseVelocity = getWindowedVelocity(
3151
+ this.swipeSamples,
3152
+ Date.now()
3153
+ );
3154
+ if (this.settings.mode !== "lg-slide") {
3155
+ this.outer.addClass("lg-slide");
3156
+ }
3157
+ setTimeout(() => {
3158
+ this.$container.removeClass("lg-dragging-vertical");
3159
+ this.outer.removeClass("lg-hide-items").addClass("lg-components-open");
3160
+ let triggerClick = true;
3161
+ let springing = false;
3162
+ if (this.swipeDirection === "horizontal") {
3163
+ const verdict = getSwipeReleaseVerdict({
3164
+ deltaX: endCoords.pageX - startCoords.pageX,
3165
+ velocityX: releaseVelocity.x,
3166
+ threshold: this.settings.swipeThreshold,
3167
+ flickVelocity: this.settings.flickVelocity,
3168
+ viewportWidth: this.outer.get().offsetWidth,
3169
+ direction: this.getDirection()
3170
+ });
3171
+ const renderedDeltaX = this.getEdgeDragDelta(
3172
+ endCoords.pageX - startCoords.pageX
3173
+ );
3174
+ if (verdict === "next" || verdict === "prev") {
3175
+ triggerClick = false;
3176
+ springing = this.springSlideNavigation(
3177
+ verdict,
3178
+ renderedDeltaX,
3179
+ releaseVelocity.x
3180
+ );
3181
+ } else {
3182
+ springing = this.springSlidesBack(
3183
+ renderedDeltaX,
3184
+ releaseVelocity.x
3185
+ );
3186
+ }
3187
+ } else if (this.swipeDirection === "vertical") {
3188
+ if (shouldCloseOnVerticalDrag(
3189
+ endCoords.pageY - startCoords.pageY,
3190
+ releaseVelocity.y,
3191
+ window.innerHeight,
3192
+ {
3193
+ closable: this.settings.closable,
3194
+ swipeToClose: this.settings.swipeToClose
3195
+ }
3196
+ )) {
3197
+ this.closeGallery();
3198
+ return;
3199
+ }
3200
+ if (this.settings.swipeToClose) {
3201
+ springing = this.springVerticalRestore(
3202
+ endCoords.pageY - startCoords.pageY,
3203
+ releaseVelocity.y
3204
+ );
3205
+ }
3206
+ }
3207
+ if (!springing) {
3208
+ this.endDragVisuals();
3209
+ this.$backdrop.css("opacity", 1);
3210
+ }
3211
+ if (triggerClick && Math.abs(endCoords.pageX - startCoords.pageX) < 5) {
3212
+ const target = $LG(event.target);
3213
+ if (this.isPosterElement(target)) {
3214
+ this.LGel.trigger(lGEvents.posterClick);
3215
+ }
3216
+ }
3217
+ this.swipeDirection = void 0;
3218
+ });
3219
+ setTimeout(() => {
3220
+ if (!this.outer.hasClass("lg-dragging") && this.settings.mode !== "lg-slide") {
3221
+ this.outer.removeClass("lg-slide");
3222
+ }
3223
+ }, this.settings.speed + 100);
3224
+ }
3225
+ enableSwipe() {
3226
+ let startCoords = {};
3227
+ let endCoords = {};
3228
+ let isMoved = false;
3229
+ let isSwiping = false;
3230
+ if (this.settings.enableSwipe) {
3231
+ this.$inner.on("touchstart.lg", (e) => {
3232
+ this.dragOrSwipeEnabled = true;
3233
+ const $item = this.getSlideItem(this.index);
3234
+ if (($LG(e.target).hasClass("lg-item") || $item.get().contains(e.target)) && !this.outer.hasClass("lg-zoomed") && !this.lgBusy && e.touches.length === 1) {
3235
+ isSwiping = true;
3236
+ this.touchAction = "swipe";
3237
+ isMoved = false;
3238
+ endCoords = {};
3239
+ this.stopSlideSpring();
3240
+ this.manageSwipeClass();
3241
+ this.swipeSamples = [
3242
+ {
3243
+ x: e.touches[0].pageX,
3244
+ y: e.touches[0].pageY,
3245
+ t: Date.now()
3246
+ }
3247
+ ];
3248
+ startCoords = {
3249
+ pageX: e.touches[0].pageX,
3250
+ pageY: e.touches[0].pageY
3251
+ };
3252
+ }
3253
+ });
3254
+ this.$inner.on("touchmove.lg", (e) => {
3255
+ if (isSwiping && this.touchAction === "swipe" && e.touches.length === 1) {
3256
+ endCoords = {
3257
+ pageX: e.touches[0].pageX,
3258
+ pageY: e.touches[0].pageY
3259
+ };
3260
+ this.touchMove(startCoords, endCoords, e);
3261
+ isMoved = true;
3262
+ }
3263
+ });
3264
+ this.$inner.on("touchend.lg", (event) => {
3265
+ if (this.touchAction === "swipe") {
3266
+ if (isMoved) {
3267
+ isMoved = false;
3268
+ this.touchEnd(endCoords, startCoords, event);
3269
+ } else if (isSwiping) {
3270
+ const target = $LG(event.target);
3271
+ if (this.isPosterElement(target)) {
3272
+ this.LGel.trigger(lGEvents.posterClick);
3273
+ }
3274
+ }
3275
+ this.touchAction = void 0;
3276
+ isSwiping = false;
3277
+ }
3278
+ });
3279
+ }
3280
+ }
3281
+ enableDrag() {
3282
+ let startCoords = {};
3283
+ let endCoords = {};
3284
+ let isDraging = false;
3285
+ let isMoved = false;
3286
+ if (this.settings.enableDrag) {
3287
+ this.outer.on("mousedown.lg", (e) => {
3288
+ this.dragOrSwipeEnabled = true;
3289
+ const $item = this.getSlideItem(this.index);
3290
+ if ($LG(e.target).hasClass("lg-item") || $item.get().contains(e.target)) {
3291
+ if (!this.outer.hasClass("lg-zoomed") && !this.lgBusy) {
3292
+ e.preventDefault();
3293
+ this.stopSlideSpring();
3294
+ this.manageSwipeClass();
3295
+ this.swipeSamples = [
3296
+ { x: e.pageX, y: e.pageY, t: Date.now() }
3297
+ ];
3298
+ startCoords = {
3299
+ pageX: e.pageX,
3300
+ pageY: e.pageY
3301
+ };
3302
+ isDraging = true;
3303
+ this.outer.get().scrollLeft += 1;
3304
+ this.outer.get().scrollLeft -= 1;
3305
+ this.outer.removeClass("lg-grab").addClass("lg-grabbing");
3306
+ this.LGel.trigger(lGEvents.dragStart);
3307
+ }
3308
+ }
3309
+ });
3310
+ $LG(window).on(`mousemove.lg.global${this.lgId}`, (e) => {
3311
+ if (isDraging && this.lgOpened) {
3312
+ isMoved = true;
3313
+ endCoords = {
3314
+ pageX: e.pageX,
3315
+ pageY: e.pageY
3316
+ };
3317
+ this.touchMove(startCoords, endCoords);
3318
+ this.LGel.trigger(lGEvents.dragMove);
3319
+ }
3320
+ });
3321
+ $LG(window).on(`mouseup.lg.global${this.lgId}`, (event) => {
3322
+ if (!this.lgOpened) {
3323
+ return;
3324
+ }
3325
+ const target = $LG(event.target);
3326
+ if (isMoved) {
3327
+ isMoved = false;
3328
+ this.touchEnd(endCoords, startCoords, event);
3329
+ this.LGel.trigger(lGEvents.dragEnd);
3330
+ } else if (this.isPosterElement(target)) {
3331
+ this.LGel.trigger(lGEvents.posterClick);
3332
+ }
3333
+ if (isDraging) {
3334
+ isDraging = false;
3335
+ this.outer.removeClass("lg-grabbing").addClass("lg-grab");
3336
+ }
3337
+ });
3338
+ }
3339
+ }
3340
+ triggerPosterClick() {
3341
+ this.$inner.on("click.lg", (event) => {
3342
+ if (!this.dragOrSwipeEnabled && this.isPosterElement($LG(event.target))) {
3343
+ this.LGel.trigger(lGEvents.posterClick);
3344
+ }
3345
+ });
3346
+ }
3347
+ manageSwipeClass() {
3348
+ let _touchNext = this.index + 1;
3349
+ let _touchPrev = this.index - 1;
3350
+ if (this.settings.loop && this.galleryItems.length > 2) {
3351
+ if (this.index === 0) {
3352
+ _touchPrev = this.galleryItems.length - 1;
3353
+ } else if (this.index === this.galleryItems.length - 1) {
3354
+ _touchNext = 0;
3355
+ }
3356
+ }
3357
+ this.outer.find(".lg-item").removeClass("lg-next-slide lg-prev-slide");
3358
+ if (_touchPrev > -1) {
3359
+ this.getSlideItem(_touchPrev).addClass("lg-prev-slide");
3360
+ }
3361
+ this.getSlideItem(_touchNext).addClass("lg-next-slide");
3362
+ }
3363
+ /**
3364
+ * Go to next slide
3365
+ * @param {Boolean} fromTouch - true if slide function called via touch event
3366
+ * @category lGPublicMethods
3367
+ * @example
3368
+ * const plugin = lightGallery();
3369
+ * plugin.goToNextSlide();
3370
+ * @see <a href="/demos/methods/">Demo</a>
3371
+ */
3372
+ goToNextSlide(fromTouch) {
3373
+ let _loop = this.settings.loop;
3374
+ if (fromTouch && this.galleryItems.length < 3) {
3375
+ _loop = false;
3376
+ }
3377
+ if (!this.lgBusy) {
3378
+ if (this.index + 1 < this.galleryItems.length) {
3379
+ this.index++;
3380
+ this.LGel.trigger(lGEvents.beforeNextSlide, {
3381
+ index: this.index
3382
+ });
3383
+ this.slide(this.index, !!fromTouch, false, "next");
3384
+ } else {
3385
+ if (_loop) {
3386
+ this.index = 0;
3387
+ this.LGel.trigger(lGEvents.beforeNextSlide, {
3388
+ index: this.index
3389
+ });
3390
+ this.slide(this.index, !!fromTouch, false, "next");
3391
+ } else if (this.settings.slideEndAnimation && !fromTouch) {
3392
+ this.outer.addClass("lg-right-end");
3393
+ setTimeout(() => {
3394
+ this.outer.removeClass("lg-right-end");
3395
+ }, 400);
3396
+ }
3397
+ }
3398
+ }
3399
+ }
3400
+ /**
3401
+ * Go to previous slides
3402
+ * @param {Boolean} fromTouch - true if slide function called via touch event
3403
+ * @category lGPublicMethods
3404
+ * @example
3405
+ * const plugin = lightGallery({});
3406
+ * plugin.goToPrevSlide();
3407
+ * @see <a href="/demos/methods/">Demo</a>
3408
+ *
3409
+ */
3410
+ goToPrevSlide(fromTouch) {
3411
+ let _loop = this.settings.loop;
3412
+ if (fromTouch && this.galleryItems.length < 3) {
3413
+ _loop = false;
3414
+ }
3415
+ if (!this.lgBusy) {
3416
+ if (this.index > 0) {
3417
+ this.index--;
3418
+ this.LGel.trigger(lGEvents.beforePrevSlide, {
3419
+ index: this.index,
3420
+ fromTouch
3421
+ });
3422
+ this.slide(this.index, !!fromTouch, false, "prev");
3423
+ } else {
3424
+ if (_loop) {
3425
+ this.index = this.galleryItems.length - 1;
3426
+ this.LGel.trigger(lGEvents.beforePrevSlide, {
3427
+ index: this.index,
3428
+ fromTouch
3429
+ });
3430
+ this.slide(this.index, !!fromTouch, false, "prev");
3431
+ } else if (this.settings.slideEndAnimation && !fromTouch) {
3432
+ this.outer.addClass("lg-left-end");
3433
+ setTimeout(() => {
3434
+ this.outer.removeClass("lg-left-end");
3435
+ }, 400);
3436
+ }
3437
+ }
3438
+ }
3439
+ }
3440
+ keyPress() {
3441
+ $LG(window).on(`keydown.lg.global${this.lgId}`, (e) => {
3442
+ if (this.lgOpened && this.settings.escKey === true && e.keyCode === 27) {
3443
+ e.preventDefault();
3444
+ if (this.settings.allowMediaOverlap && this.outer.hasClass("lg-can-toggle") && this.outer.hasClass("lg-components-open")) {
3445
+ this.outer.removeClass("lg-components-open");
3446
+ } else {
3447
+ this.closeGallery();
3448
+ }
3449
+ }
3450
+ if (this.lgOpened && this.galleryItems.length > 1) {
3451
+ const rtl = this.getDirection() === "rtl";
3452
+ if (e.keyCode === 37) {
3453
+ e.preventDefault();
3454
+ if (rtl) {
3455
+ this.goToNextSlide();
3456
+ } else {
3457
+ this.goToPrevSlide();
3458
+ }
3459
+ }
3460
+ if (e.keyCode === 39) {
3461
+ e.preventDefault();
3462
+ if (rtl) {
3463
+ this.goToPrevSlide();
3464
+ } else {
3465
+ this.goToNextSlide();
3466
+ }
3467
+ }
3468
+ }
3469
+ });
3470
+ }
3471
+ arrow() {
3472
+ this.getElementById("lg-prev").on("click.lg", () => {
3473
+ this.goToPrevSlide();
3474
+ });
3475
+ this.getElementById("lg-next").on("click.lg", () => {
3476
+ this.goToNextSlide();
3477
+ });
3478
+ }
3479
+ arrowDisable(index) {
3480
+ if (!this.settings.loop && this.settings.hideControlOnEnd) {
3481
+ const $prev = this.getElementById("lg-prev");
3482
+ const $next = this.getElementById("lg-next");
3483
+ if (index + 1 === this.galleryItems.length) {
3484
+ $next.attr("disabled", "disabled").addClass("disabled");
3485
+ } else {
3486
+ $next.removeAttr("disabled").removeClass("disabled");
3487
+ }
3488
+ if (index === 0) {
3489
+ $prev.attr("disabled", "disabled").addClass("disabled");
3490
+ } else {
3491
+ $prev.removeAttr("disabled").removeClass("disabled");
3492
+ }
3493
+ }
3494
+ }
3495
+ setTranslate($el, xValue, yValue, scaleX = 1, scaleY = 1) {
3496
+ $el.css(
3497
+ "transform",
3498
+ "translate3d(" + xValue + "px, " + yValue + "px, 0px) scale3d(" + scaleX + ", " + scaleY + ", 1)"
3499
+ );
3500
+ }
3501
+ mousewheel() {
3502
+ let lastCall = 0;
3503
+ this.outer.on("wheel.lg", (e) => {
3504
+ if (!e.deltaY || this.galleryItems.length < 2) {
3505
+ return;
3506
+ }
3507
+ e.preventDefault();
3508
+ const now = (/* @__PURE__ */ new Date()).getTime();
3509
+ if (now - lastCall < 1e3) {
3510
+ return;
3511
+ }
3512
+ lastCall = now;
3513
+ if (e.deltaY > 0) {
3514
+ this.goToNextSlide();
3515
+ } else if (e.deltaY < 0) {
3516
+ this.goToPrevSlide();
3517
+ }
3518
+ });
3519
+ }
3520
+ isSlideElement(target) {
3521
+ return target.hasClass("lg-outer") || target.hasClass("lg-item") || target.hasClass("lg-img-wrap") || target.hasClass("lg-img-rotate");
3522
+ }
3523
+ isPosterElement(target) {
3524
+ const playButton = this.getSlideItem(this.index).find(".lg-video-play-button").get();
3525
+ return target.hasClass("lg-video-poster") || target.hasClass("lg-video-play-button") || playButton && playButton.contains(target.get());
3526
+ }
3527
+ /**
3528
+ * Maximize minimize inline gallery.
3529
+ * @category lGPublicMethods
3530
+ */
3531
+ toggleMaximize() {
3532
+ this.getElementById("lg-maximize").on("click.lg", () => {
3533
+ this.$container.toggleClass("lg-inline");
3534
+ this.refreshOnResize();
3535
+ });
3536
+ }
3537
+ invalidateItems() {
3538
+ for (let index = 0; index < this.items.length; index++) {
3539
+ const element = this.items[index];
3540
+ const $element = $LG(element);
3541
+ $element.off(`click.lgcustom-item-${$element.attr("data-lg-id")}`);
3542
+ }
3543
+ }
3544
+ trapFocus() {
3545
+ this.$container.get().focus({
3546
+ preventScroll: true
3547
+ });
3548
+ $LG(window).on(`keydown.lg.global${this.lgId}`, (e) => {
3549
+ if (!this.lgOpened) {
3550
+ return;
3551
+ }
3552
+ const isTabPressed = e.key === "Tab" || e.keyCode === 9;
3553
+ if (!isTabPressed) {
3554
+ return;
3555
+ }
3556
+ const focusableEls = utils.getFocusableElements(
3557
+ this.$container.get()
3558
+ );
3559
+ const firstFocusableEl = focusableEls[0];
3560
+ const lastFocusableEl = focusableEls[focusableEls.length - 1];
3561
+ if (e.shiftKey) {
3562
+ if (document.activeElement === firstFocusableEl) {
3563
+ lastFocusableEl.focus();
3564
+ e.preventDefault();
3565
+ }
3566
+ } else {
3567
+ if (document.activeElement === lastFocusableEl) {
3568
+ firstFocusableEl.focus();
3569
+ e.preventDefault();
3570
+ }
3571
+ }
3572
+ });
3573
+ }
3574
+ manageCloseGallery() {
3575
+ if (!this.settings.closable) return;
3576
+ let mousedown = false;
3577
+ this.getElementById("lg-close").on("click.lg", () => {
3578
+ this.closeGallery();
3579
+ });
3580
+ if (this.settings.closeOnTap) {
3581
+ this.outer.on("mousedown.lg", (e) => {
3582
+ const target = $LG(e.target);
3583
+ if (this.isSlideElement(target)) {
3584
+ mousedown = true;
3585
+ } else {
3586
+ mousedown = false;
3587
+ }
3588
+ });
3589
+ this.outer.on("mousemove.lg", () => {
3590
+ mousedown = false;
3591
+ });
3592
+ this.outer.on("mouseup.lg", (e) => {
3593
+ const target = $LG(e.target);
3594
+ if (this.isSlideElement(target) && mousedown) {
3595
+ if (!this.outer.hasClass("lg-dragging")) {
3596
+ this.closeGallery();
3597
+ }
3598
+ }
3599
+ });
3600
+ }
3601
+ }
3602
+ /**
3603
+ * Close lightGallery if it is opened.
3604
+ *
3605
+ * @description If closable is false in the settings, you need to pass true via closeGallery method to force close gallery
3606
+ * @return returns the estimated time to close gallery completely including the close animation duration
3607
+ * @category lGPublicMethods
3608
+ * @example
3609
+ * const plugin = lightGallery();
3610
+ * plugin.closeGallery();
3611
+ *
3612
+ */
3613
+ closeGallery(force) {
3614
+ if (!this.lgOpened || !this.settings.closable && !force) {
3615
+ return 0;
3616
+ }
3617
+ this.LGel.trigger(lGEvents.beforeClose);
3618
+ if (this.settings.resetScrollPosition && !this.settings.hideScrollbar) {
3619
+ $LG(window).scrollTop(this.prevScrollTop);
3620
+ }
3621
+ const currentItem = this.items[this.index];
3622
+ let transform;
3623
+ if (this.zoomFromOrigin && currentItem) {
3624
+ const { top, bottom } = this.mediaContainerPosition;
3625
+ const { __slideVideoInfo, poster } = this.galleryItems[this.index];
3626
+ const imageSize = utils.getSize(
3627
+ currentItem,
3628
+ this.outer,
3629
+ top + bottom,
3630
+ __slideVideoInfo && poster && this.settings.videoMaxSize
3631
+ );
3632
+ transform = this.getOriginTransform(currentItem, imageSize);
3633
+ }
3634
+ if (!transform) {
3635
+ transform = getCenterCloseTransform();
3636
+ this.outer.addClass("lg-close-to-center");
3637
+ }
3638
+ if (transform) {
3639
+ this.outer.addClass("lg-closing lg-zoom-from-image");
3640
+ this.getSlideItem(this.index).addClass("lg-start-end-progress").css(
3641
+ "transition-duration",
3642
+ this.settings.startAnimationDuration + "ms"
3643
+ ).css("transform", transform);
3644
+ } else {
3645
+ this.outer.addClass("lg-hide-items");
3646
+ this.outer.removeClass("lg-zoom-from-image");
3647
+ }
3648
+ this.destroyModules();
3649
+ this.lGalleryOn = false;
3650
+ this.isDummyImageRemoved = false;
3651
+ this.zoomFromOrigin = this.settings.zoomFromOrigin;
3652
+ clearTimeout(this.hideBarTimeout);
3653
+ this.hideBarTimeout = false;
3654
+ $LG("html").removeClass("lg-on");
3655
+ this.outer.removeClass("lg-visible lg-components-open");
3656
+ this.$backdrop.removeClass("in").css("opacity", 0);
3657
+ const removeTimeout = transform ? Math.max(
3658
+ this.settings.startAnimationDuration,
3659
+ this.settings.backdropDuration
3660
+ ) : this.settings.backdropDuration;
3661
+ this.$container.removeClass("lg-show-in");
3662
+ setTimeout(() => {
3663
+ if (transform) {
3664
+ this.outer.removeClass("lg-zoom-from-image");
3665
+ }
3666
+ this.$container.removeClass("lg-show");
3667
+ this.resetScrollBar();
3668
+ this.$backdrop.removeAttr("style").css(
3669
+ "transition-duration",
3670
+ this.settings.backdropDuration + "ms"
3671
+ );
3672
+ this.outer.removeClass(
3673
+ `lg-closing lg-close-to-center ${this.settings.startClass}`
3674
+ );
3675
+ this.getSlideItem(this.index).removeClass("lg-start-end-progress");
3676
+ this.$inner.empty();
3677
+ const announcer = this.getElementById("lg-announcer").get();
3678
+ if (announcer) {
3679
+ announcer.textContent = "";
3680
+ }
3681
+ if (this.lgOpened) {
3682
+ this.LGel.trigger(lGEvents.afterClose, {
3683
+ instance: this
3684
+ });
3685
+ }
3686
+ if (this.$container.get()) {
3687
+ this.$container.get().blur();
3688
+ }
3689
+ if (this.prevActiveElement && this.prevActiveElement.isConnected) {
3690
+ this.prevActiveElement.focus({ preventScroll: true });
3691
+ }
3692
+ this.prevActiveElement = void 0;
3693
+ this.lgOpened = false;
3694
+ }, removeTimeout + 100);
3695
+ return removeTimeout + 100;
3696
+ }
3697
+ initModules() {
3698
+ this.plugins.forEach((module) => {
3699
+ try {
3700
+ module.init();
3701
+ } catch (err) {
3702
+ console.warn(
3703
+ `lightGallery:- make sure lightGallery module is properly initiated. See https://www.lightgalleryjs.com/docs/methods/`
3704
+ );
3705
+ }
3706
+ });
3707
+ }
3708
+ destroyModules(destroy) {
3709
+ this.plugins.forEach((module) => {
3710
+ try {
3711
+ if (destroy) {
3712
+ module.destroy();
3713
+ } else {
3714
+ module.closeGallery && module.closeGallery();
3715
+ }
3716
+ } catch (err) {
3717
+ console.warn(
3718
+ `lightGallery:- make sure lightGallery module is properly destroyed. See https://www.lightgalleryjs.com/docs/methods/`
3719
+ );
3720
+ }
3721
+ });
3722
+ }
3723
+ /**
3724
+ * Refresh lightGallery with new set of children.
3725
+ *
3726
+ * @description This is useful to update the gallery when the child elements are changed without calling destroy method.
3727
+ *
3728
+ * If you are using dynamic mode, you can pass the modified array of dynamicEl as the first parameter to refresh the dynamic gallery
3729
+ * @see <a href="/demos/dynamic-mode/">Demo</a>
3730
+ * @category lGPublicMethods
3731
+ * @example
3732
+ * const plugin = lightGallery();
3733
+ * // Delete or add children, then call
3734
+ * plugin.refresh();
3735
+ *
3736
+ */
3737
+ refresh(galleryItems) {
3738
+ if (!this.settings.dynamic) {
3739
+ this.invalidateItems();
3740
+ }
3741
+ if (galleryItems) {
3742
+ this.galleryItems = galleryItems;
3743
+ } else {
3744
+ this.galleryItems = this.getItems();
3745
+ }
3746
+ this.updateControls();
3747
+ this.openGalleryOnItemClick();
3748
+ this.LGel.trigger(lGEvents.updateSlides);
3749
+ }
3750
+ updateControls() {
3751
+ this.addSlideVideoInfo(this.galleryItems);
3752
+ this.updateCounterTotal();
3753
+ this.manageSingleSlideClassName();
3754
+ }
3755
+ destroyGallery() {
3756
+ var _a;
3757
+ this.destroyModules(true);
3758
+ if (!this.settings.dynamic) {
3759
+ this.invalidateItems();
3760
+ }
3761
+ $LG(window).off(`.lg.global${this.lgId}`);
3762
+ this.LGel.off(".lg");
3763
+ (_a = this.toolbarOverflow) == null ? void 0 : _a.destroy();
3764
+ this.toolbarOverflow = void 0;
3765
+ this.$container.remove();
3766
+ }
3767
+ /**
3768
+ * Destroy lightGallery.
3769
+ * Destroy lightGallery and its plugin instances completely
3770
+ *
3771
+ * @description This method also calls CloseGallery function internally. Returns the time takes to completely close and destroy the instance.
3772
+ * In case if you want to re-initialize lightGallery right after destroying it, initialize it only once the destroy process is completed.
3773
+ * You can use refresh method most of the times.
3774
+ * @category lGPublicMethods
3775
+ * @example
3776
+ * const plugin = lightGallery();
3777
+ * plugin.destroy();
3778
+ *
3779
+ */
3780
+ destroy() {
3781
+ const closeTimeout = this.closeGallery(true);
3782
+ if (closeTimeout) {
3783
+ setTimeout(this.destroyGallery.bind(this), closeTimeout);
3784
+ } else {
3785
+ this.destroyGallery();
3786
+ }
3787
+ return closeTimeout;
3788
+ }
3789
+ }
3790
+ function lightGallery(el, options) {
3791
+ return new LightGallery(el, options);
3792
+ }
3793
+ lightGallery.setLicenseKey = setLicenseKey;
3794
+ export {
3795
+ lightGallery as default
3796
+ };
3797
+ //# sourceMappingURL=lightgallery.es5.js.map