{ "version": 3, "sources": ["../../src/js/vite/src/onDocumentReady.js", "../../../node_modules/src/lg-events.ts", "../../../node_modules/src/lg-settings.ts", "../../../node_modules/src/lgQuery.ts", "../../../node_modules/src/lg-utils.ts", "../../../node_modules/src/lightgallery.ts", "../../../node_modules/src/index.ts", "../../../node_modules/src/plugins/thumbnail/lg-thumbnail-settings.ts", "../../../node_modules/src/lg-events.ts", "../../../node_modules/src/plugins/thumbnail/lg-thumbnail.ts", "../../../node_modules/src/plugins/zoom/lg-zoom-settings.ts", "../../../node_modules/src/lg-events.ts", "../../../node_modules/src/plugins/zoom/lg-zoom.ts", "../../../node_modules/src/lg-events.ts", "../../../node_modules/src/plugins/autoplay/lg-autoplay-settings.ts", "../../../node_modules/src/plugins/autoplay/lg-autoplay.ts", "../../../node_modules/src/plugins/fullscreen/lg-fullscreen-settings.ts", "../../../node_modules/src/plugins/fullscreen/lg-fullscreen.ts", "../../src/js/app/lightGallery.js"], "sourcesContent": ["export function onDocumentReady (callback) {\n if (document.readyState === 'loading') {\n window.addEventListener('DOMContentLoaded', () => {\n callback()\n })\n } else {\n callback()\n }\n}\n", "import { LightGallery } from './lightgallery';\nimport { VideoSource } from './plugins/video/types';\n\n/**\n * List of lightGallery events\n * All events should be documented here\n * Below interfaces are used to build the website documentations\n * */\nexport const lGEvents: {\n [key: string]: string;\n} = {\n afterAppendSlide: 'lgAfterAppendSlide',\n init: 'lgInit',\n hasVideo: 'lgHasVideo',\n containerResize: 'lgContainerResize',\n updateSlides: 'lgUpdateSlides',\n afterAppendSubHtml: 'lgAfterAppendSubHtml',\n beforeOpen: 'lgBeforeOpen',\n afterOpen: 'lgAfterOpen',\n slideItemLoad: 'lgSlideItemLoad',\n beforeSlide: 'lgBeforeSlide',\n afterSlide: 'lgAfterSlide',\n posterClick: 'lgPosterClick',\n dragStart: 'lgDragStart',\n dragMove: 'lgDragMove',\n dragEnd: 'lgDragEnd',\n beforeNextSlide: 'lgBeforeNextSlide',\n beforePrevSlide: 'lgBeforePrevSlide',\n beforeClose: 'lgBeforeClose',\n afterClose: 'lgAfterClose',\n rotateLeft: 'lgRotateLeft',\n rotateRight: 'lgRotateRight',\n flipHorizontal: 'lgFlipHorizontal',\n flipVertical: 'lgFlipVertical',\n autoplay: 'lgAutoplay',\n autoplayStart: 'lgAutoplayStart',\n autoplayStop: 'lgAutoplayStop',\n};\n\n// Follow the below format for the event documentation\n// @method is the method name when event is used with Angular/React components\n\n/**\n * Fired only once when lightGallery is initialized\n * @name lgInit\n * @method onInit\n * @example\n * const lg = document.getElementById('custom-events-demo');\n * // Perform any action on lightGallery initialization.\n * // Init event returns the plugin instance that can be used to call any lightGalley public method\n * let pluginInstance = null;\n * lg.addEventListener('lgInit', (event) => {\n * pluginInstance = event.detail.instance;\n * });\n * lightGallery(lg);\n * @see Methods\n */\nexport interface InitDetail {\n /**\n * lightGallery plugin instance\n */\n instance: LightGallery;\n}\n\n/**\n * Fired when the slide content has been inserted into it's slide container.\n * @name lgAfterAppendSlide\n * @method onAfterAppendSlide\n */\nexport interface AfterAppendSlideEventDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired immediately before opening the gallery\n * @name lgBeforeOpen\n * @method onBeforeOpen\n */\nexport interface BeforeOpenDetail {}\n\n/**\n * Fired immediately after opening the gallery\n * @name lgAfterOpen\n * @method onAfterOpen\n */\nexport interface AfterOpenDetail {}\n\n/**\n * Fired once the media inside the slide has been completely loaded .\n * @name lgSlideItemLoad\n * @method onSlideItemLoad\n */\nexport interface SlideItemLoadDetail {\n /**\n * Index of the slide\n */\n index: number;\n /**\n * For the first slide, lightGallery adds some delay for displaying the loaded slide item.\n * This delay is required for the transition effect when the slide item is displayed\n * Respect the delay when you use this event\n */\n delay: number;\n\n // Will be true for the first slide\n isFirstSlide: boolean;\n}\n\n/**\n * Fired immediately before each slide transition.\n * @name lgBeforeSlide\n * @method onBeforeSlide\n * @example\n * const lg = document.getElementById('custom-events-demo');\n * // Perform any action before each slide transition\n * lg.addEventListener('lgBeforeSlide', (event) => {\n * const { index, prevIndex } = event.detail;\n * alert(index, prevIndex);\n * });\n * lightGallery(lg);\n */\nexport interface BeforeSlideDetail {\n /**\n * Index of the previous slide\n */\n prevIndex: number;\n /**\n * Index of the slide\n */\n index: number;\n /**\n * true if slide function called via touch event or mouse drag\n */\n fromTouch: boolean;\n /**\n * true if slide function called via thumbnail click\n */\n fromThumb: boolean;\n}\n\n/**\n * Fired immediately after each slide transition.\n * @name lgAfterSlide\n * @method onAfterSlide\n */\nexport interface AfterSlideDetail {\n /**\n * Index of the previous slide\n */\n prevIndex: number;\n /**\n * Index of the slide\n */\n index: number;\n /**\n * true if slide function called via touch event or mouse drag\n */\n fromTouch: boolean;\n /**\n * true if slide function called via thumbnail click\n */\n fromThumb: boolean;\n}\n\n/**\n * Fired when the video poster is clicked.\n * @name lgPosterClick\n * @method onPosterClick\n */\nexport interface PosterClickDetail {}\n\n/**\n * Fired when the drag event to move to different slide starts.\n * @name lgDragStart\n * @method onDragStart\n */\nexport interface DragStartDetail {}\n\n/**\n * Fired periodically during the drag operation.\n * @name lgDragMove\n * @method onDragMove\n */\nexport interface DragMoveDetail {}\n\n/**\n * Fired when the user has finished the drag operation\n * @name lgDragEnd\n * @method onDragEnd\n */\nexport interface DragEndDetail {}\n\n/**\n * Fired immediately before the start of the close process.\n * @name lgBeforeClose\n * @method onBeforeClose\n */\nexport interface BeforeCloseDetail {}\n\n/**\n * Fired immediately once lightGallery is closed.\n * @name lgAfterClose\n * @method onAfterClose\n */\nexport interface AfterCloseDetail {\n /**\n * lightGallery plugin instance\n */\n instance: LightGallery;\n}\n\n/**\n * Fired immediately before each \"next\" slide transition\n * @name lgBeforeNextSlide\n * @method onBeforeNextSlide\n */\nexport interface BeforeNextSlideDetail {\n /**\n * Index of the slide\n */\n index: number;\n /**\n * true if slide function called via touch event or mouse drag\n */\n fromTouch: boolean;\n}\n\n/**\n * Fired immediately before each \"prev\" slide transition\n * @name lgBeforePrevSlide\n * @method onBeforePrevSlide\n */\nexport interface BeforePrevSlideDetail {\n /**\n * Index of the slide\n */\n index: number;\n /**\n * true if slide function called via touch event or mouse drag\n */\n fromTouch: boolean;\n}\n\n/**\n * Fired when the sub-html content (ex : title/ description) has been appended into the slide.\n * @name lgAfterAppendSubHtml\n * @method onAfterAppendSubHtml\n */\nexport interface AfterAppendSubHtmlDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired when the lightGallery container has been resized.\n * @name lgContainerResize\n * @method onContainerResize\n */\nexport interface ContainerResizeDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired when lightGallery detects video slide\n * @name lgHasVideo\n * @method onHasVideo\n */\nexport interface HasVideoDetail {\n /**\n * Index of the slide,\n */\n index: number;\n /**\n * Video source\n */\n src: string;\n /**\n * HTML5 video source if available\n *

\n HTML5 video source = source: {\n src: string;\n type: string;\n }[];\n attributes: HTMLVideoElement;\n *

\n */\n html5Video: VideoSource;\n /**\n * True if video has poster\n */\n hasPoster: boolean;\n}\n\n/**\n * Fired when the image is rotated in anticlockwise direction\n * @name lgRotateLeft\n * @method onRotateLeft\n */\nexport interface RotateLeftDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired when the image is rotated in clockwise direction\n * @name lgRotateRight\n * @method onRotateRight\n */\nexport interface RotateRightDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired when the image is flipped horizontally\n * @name lgFlipHorizontal\n * @method onFlipHorizontal\n */\nexport interface FlipHorizontalDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired when the image is flipped vertically\n * @name lgFlipVertical\n * @method onFlipVertical\n */\nexport interface FlipVerticalDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n", "import { GalleryItem } from './lg-utils';\nimport { LgQuery } from './lgQuery';\nimport { LightGallery } from './lightgallery';\nimport { AutoplaySettings } from './plugins/autoplay/lg-autoplay-settings';\nimport { CommentSettings } from './plugins/comment/lg-comment-settings';\nimport { FullscreenSettings } from './plugins/fullscreen/lg-fullscreen-settings';\nimport { HashSettings } from './plugins/hash/lg-hash-settings';\nimport { PagerSettings } from './plugins/pager/lg-pager-settings';\nimport { RotateSettings } from './plugins/rotate/lg-rotate-settings';\nimport { ShareSettings } from './plugins/share/lg-share-settings';\nimport { ThumbnailsSettings } from './plugins/thumbnail/lg-thumbnail-settings';\nimport { VideoSettings } from './plugins/video/lg-video-settings';\nimport { ZoomSettings } from './plugins/zoom/lg-zoom-settings';\n\ntype LightGalleryCoreMobileSettings = Exclude<\n LightGalleryCoreSettings,\n 'mobileSettings'\n>;\n\n// @todo use separate mobile settings for plugins\nexport interface MobileSettings\n extends LightGalleryCoreMobileSettings,\n Partial,\n Partial,\n Partial,\n Partial,\n Partial,\n Partial,\n Partial,\n Partial,\n Partial,\n Partial {}\n\nexport interface LightGalleryCoreStrings {\n closeGallery: string;\n toggleMaximize: string;\n previousSlide: string;\n nextSlide: string;\n download: string;\n playVideo: string;\n}\n\nexport type LightGalleryAllSettings = LightGalleryCoreSettings &\n ZoomSettings &\n ThumbnailsSettings &\n VideoSettings &\n AutoplaySettings &\n CommentSettings &\n FullscreenSettings &\n HashSettings &\n PagerSettings &\n RotateSettings &\n ShareSettings;\n\nexport type LightGallerySettings = Partial;\n\nexport interface LightGalleryCoreSettings {\n /**\n * Type of transition between images.\n */\n mode:\n | 'lg-slide'\n | 'lg-fade'\n | 'lg-zoom-in'\n | 'lg-zoom-in-big'\n | 'lg-zoom-out'\n | 'lg-zoom-out-big'\n | 'lg-zoom-out-in'\n | 'lg-zoom-in-out'\n | 'lg-soft-zoom'\n | 'lg-scale-up'\n | 'lg-slide-circular'\n | 'lg-slide-circular-vertical'\n | 'lg-slide-vertical'\n | 'lg-slide-vertical-growth'\n | 'lg-slide-skew-only'\n | 'lg-slide-skew-only-rev'\n | 'lg-slide-skew-only-y'\n | 'lg-slide-skew-only-y-rev'\n | 'lg-slide-skew'\n | 'lg-slide-skew-rev'\n | 'lg-slide-skew-cross'\n | 'lg-slide-skew-cross-rev'\n | 'lg-slide-skew-ver'\n | 'lg-slide-skew-ver-rev'\n | 'lg-slide-skew-ver-cross'\n | 'lg-slide-skew-ver-cross-rev'\n | 'lg-lollipop'\n | 'lg-lollipop-rev'\n | 'lg-rotate'\n | 'lg-rotate-rev'\n | 'lg-tube';\n\n /**\n * Slide animation CSS easing property\n */\n easing: string;\n\n /**\n *Transition duration (in ms).\n */\n speed: number;\n\n /**\n * If you are using lightGallery for commercial projects, you need to purchase a commercial license\n * to get the license key. For projects that are compatible with GPLv3 license,\n * please contact us for getting a license key at
contact@lightgalleryjs.com.\n * If you want to test lightGallery before purchasing a commercial license, you can\n * use `0000-0000-000-0000` as a temporary license key\n */\n\n licenseKey: string;\n\n /**\n * Height of the gallery.\n * example '100%' , '300px'\n */\n height: string;\n\n /**\n * Width of the gallery.\n * example '100%' , '300px'\n */\n width: string;\n\n /**\n * Add custom class for gallery container\n * This can be used to set different style for different galleries\n */\n addClass: string;\n\n /**\n * Start animation class for the gallery.\n * @description\n * \n */\n startClass: string;\n\n /**\n * Enable zoom from origin effect.\n * @description You need to know the original image size upfront and provide it via data-lg-size attribute as data-lg-size=\"1920-1280\"\n *\n * If you don't know, the size of a few images in the list, you can skip the data-lg-size attribute for the particular slides,\n * lightGallery will show the default animation if data-lg-size is not available\n *\n * If you are using responsive images,\n * you can pass a comma separated list of sizes combined with a max-width (up to what size the particular image should be used)\n *\n * example -\n * data-lg-size=\"240-160-375, 400-267-480, 1600-1067\"\n * data-responsive=\"img-240.jpg 375, img-400.jpg 480\"\n * data-src=\"img-1600.jpg\" \n *\n * In the above example, upto 375 width img.240.jpg and lg-size 240-160 will be used.\n * Similarly, upto 480 pixel width size 400-267 and img-400.jpg will be used\n * And above 480, lg-size 1600-1067 and img-1600.jpg will be used\n *\n * \n */\n zoomFromOrigin: boolean;\n\n /**\n * Zoom from image animation duration\n */\n startAnimationDuration: number;\n\n /**\n * Backdrop transition duration.\n * Note - Do not change the value of backdrop via css.\n */\n backdropDuration: number;\n\n /**\n * Configure where the gallery should be appended.\n * Useful to create inline galleries and more\n * It is an empty string in the default settings and later assigned to document.body to avoid accessing document for SSR\n */\n container: HTMLElement | '';\n\n /**\n * Delay for hiding gallery controls in ms.\n * Pass 0 if you don't want to hide the controls\n */\n hideBarsDelay: number;\n\n /**\n * Delay in hiding controls for the first time when gallery is opened\n */\n showBarsAfter: number;\n\n /**\n * Delay slide transitions.\n * @description This is useful if you want to do any action in the current slide before moving to next slide.\n *
\n * For example, fading out the captions before going to next slide.\n * .lg-slide-progress class name is added to the current slide immediately after calling the slide method.\n * But transition begins only after the delay\n *
\n */\n slideDelay: number;\n\n /**\n * Support legacy browsers\n * @description Currently this is used only for adding support to srcset attribute via picturefill library\n * If true lightGallery will show warning message to include picturefill library\n */\n supportLegacyBrowser: boolean;\n\n /**\n * If true, toolbar, captions and thumbnails will not overlap with media element\n * This will not effect thumbnails if animateThumb is false\n * Also, toggle thumbnails button is not displayed if allowMediaOverlap is false\n *
\n * Note - Changing the position of the media on every slide transition creates a flickering effect.\n * Therefore, the height of the caption is calculated dynamically, only once based on the first slide caption.\n *
\n *
\n * if you have dynamic captions for each media,\n * you can provide an appropriate height for the captions via allowMediaOverlap option\n *
\n */\n allowMediaOverlap: boolean;\n\n /**\n * Video max size.\n * @description This can be over-written by passing specific size via data-lg-size attribute\n * Recommended video resolution and & aspect ratios https://support.google.com/youtube/answer/6375112\n */\n videoMaxSize: string;\n\n /**\n * Automatically load poster image for YouTube videos\n */\n loadYouTubePoster: boolean;\n\n /**\n * Height of the caption for calculating allowMediaOverlap positions\n * Note - this is only used to find the position of media item if allowMediaOverlap is true.\n * Not for setting height of the captions\n * Set 0 if you want to calculate the height of captions dynamically\n */\n defaultCaptionHeight: number;\n\n /**\n * aria-labelledby attribute fot gallery\n */\n ariaLabelledby: string;\n\n /**\n * aria-describedby attribute for gallery\n */\n ariaDescribedby: string;\n\n /**\n * Hide scrollbar when gallery is opened\n * @version V2.5.0\n */\n hideScrollbar: boolean;\n\n /**\n * Reset to previous scrollPosition when lightGallery is closed\n * @description By default, lightGallery doesn't hide the scrollbar for a smooth opening transition.\n * If a user changes the scroll position, lightGallery resets it to the previous value\n * @version V2.5.0\n */\n resetScrollPosition: boolean;\n\n /**\n * If false user won't be abel to close the gallery at all\n * This is useful for creating inline galleries.\n */\n closable: boolean;\n\n /**\n * allows vertical drag/swipe to close gallery\n * false if option closable is false\n */\n swipeToClose: boolean;\n /**\n * allows clicks on black area to close gallery.\n */\n closeOnTap: boolean;\n\n /**\n * If false, close button won't be displayed.\n * Useful for creating inline galleries.\n */\n showCloseIcon: boolean;\n\n /**\n * Show maximize icon.\n * Useful for creating inline galleries.\n */\n showMaximizeIcon: boolean;\n\n /**\n * If false, will disable the ability to loop back to the beginning of the gallery from the last slide.\n */\n loop: boolean;\n\n /**\n * Whether the LightGallery could be closed by pressing the \"Esc\" key.\n */\n escKey: boolean;\n\n /**\n * Enable keyboard navigation\n */\n keyPress: boolean;\n\n /**\n * Trap focus within the lightGallery\n * @version V2.5.0\n */\n trapFocus: boolean;\n\n /**\n * If false, prev/next buttons will not be displayed.\n */\n controls: boolean;\n\n /**\n * Enable slideEnd animation\n */\n slideEndAnimation: boolean;\n\n /**\n * If true, prev/next button will be hidden on first/last image.\n * @description Note - this option will be ignored if loop or slideEndAnimation is set to true\n */\n hideControlOnEnd: boolean;\n\n /**\n * ability to navigate to next/prev slides on mousewheel\n */\n mousewheel: boolean;\n\n /**\n * Option to get captions from alt or title tags.\n */\n getCaptionFromTitleOrAlt: boolean;\n\n /**\n * control where the sub-html should be appended.\n * If you choose '.lg-outer', you are responsible for placing the div at the right position.\n * '.lg-outer' is useful if you want show custom HTML outside the normal gallery\n */\n appendSubHtmlTo: '.lg-sub-html' | '.lg-item' | '.lg-outer';\n\n /**\n * Set to true if the selector in \"data-sub-html\" should use the current item as its origin.\n */\n subHtmlSelectorRelative: boolean;\n\n /**\n * number of preload slides\n * @description will exicute only after the current slide is fully loaded.\n * for example, if you click on 4th image and if preload = 1 then 3rd slide and 5th\n * slide will be loaded in the background after the 4th slide is fully loaded..\n * if preload is 2 then 2nd 3rd 5th 6th slides will be preloaded.\n */\n preload: number;\n\n /**\n * Control how many slide items should be kept in dom at a time\n * @description To improve performance by reducing number of gallery items in the dom,\n * lightGallery keeps only the lowest possible number of slides in the dom at a time.\n * This has a minimum value of 3\n */\n numberOfSlideItemsInDom: number;\n\n /**\n * Custom selector property instead of direct children.\n * @description Based on your markup structure, you can specify custom selectors to fetch media data for the gallery\n * Pass \"this\" to select same element\n * You can also pass HTMLCollection directly\n * Example - '.my-selector' | '#my-selector' | this | document.querySelectorAll('.my-selector')\n */\n selector: string | HTMLCollection[];\n\n /**\n * By default selector element relative to the current gallery.\n * Instead of that you can tell lightGallery to select element relative to another element.\n * Example - '.my-selector-container' | '#my-selector-container'\n * In the code this become selector = document.querySelector(this.s.selectWithin ).querySelectorAll(this.s.selector);\n */\n selectWithin: string;\n\n /**\n * Custom html for next control\n */\n nextHtml: string;\n\n /**\n * Custom html for prev control\n */\n prevHtml: string;\n\n /**\n * specify which slide should load initially\n */\n index: number;\n\n /**\n * Set width for iframe.\n */\n iframeWidth: string;\n\n /**\n * Set height for iframe.\n */\n iframeHeight: string;\n\n /**\n * Set max width for iframe.\n */\n iframeMaxWidth: string;\n\n /**\n * Set max height for iframe.\n */\n iframeMaxHeight: string;\n\n /**\n * Enable download button.\n * @description By default download url will be taken from data-src/href attribute but it supports only for modern browsers.\n * If you want you can provide another url for download via data-download-url.\n * pass false in data-download-url if you want to hide download button for the particular slide.\n */\n download: boolean;\n\n /**\n * Whether to show total number of images and index number of currently displayed image.\n */\n counter: boolean;\n\n /**\n * Where the counter should be appended\n */\n appendCounterTo: string;\n\n /**\n * By setting the swipeThreshold (in px) you can set how far the user must swipe for the next/prev image.\n */\n swipeThreshold: number;\n\n /**\n * Enables swipe support for touch devices\n */\n enableSwipe: boolean;\n\n /**\n * Enables desktop mouse drag support\n */\n enableDrag: boolean;\n\n /**\n * LightGallery can be instantiated and launched programmatically by setting this option to true and populating dynamicEl option (see below) with the definitions of images.\n */\n dynamic: boolean;\n\n /**\n * An array of objects (src, iframe, subHtml, thumb, poster, responsive, srcset sizes) representing gallery elements.\n */\n dynamicEl: GalleryItem[];\n\n /**\n * Fetch custom properties from the selector\n * @description this is useful for plugin development\n * By default lightGallery fetches and store all the props selectors to\n * reduce frequent dom interaction for fetching props every time.\n *\n * If you need any addition data to be fetched and stored in the galleryItems variable,\n * you can do this just by passing the prop names via extraProps\n * @example\n * HTML:\n *
\n * \n * \n *
\n * JS:\n * lightGallery(document.getElementById('lightGallery'), {\n * extraProps: ['customProp']\n * })\n * // Note - If you are using dynamic mode, you can pass any custom prop in the galleryItem\n * lightGallery(document.getElementById('lightGallery'), {\n * dynamic: true,\n * dynamicEl: [{\n * src: 'img/img1.jpg',\n * customProp:'abc',\n * }]\n * })\n *\n */\n extraProps: string[];\n\n /**\n * Option to fetch different thumbnail image other than first image\n * @description If you want to use external image for thumbnail,\n * add the path of that image inside \"data-\" attribute\n * and set value of this option to the name of your custom attribute.\n *\n * @example\n *
\n * \n *
\n *\n * lightGallery(document.getElementById('lightGallery'), {\n * exThumbImage: 'data-external-thumb-image'\n * })\n */\n exThumbImage: string;\n\n /**\n * Function to detect mobile devices\n */\n isMobile?: () => boolean;\n\n /**\n * Separate settings for mobile devices\n * @description Note - this is applied only at the time of loading\n * by default controls and close buttons are disabled on mobile devices.\n * use this options if you want to enable them or change any other settings for mobile devices\n * Note - mobileSettings does not merge default values, You need to provide all mobileSettings including default values\n */\n mobileSettings: Partial;\n\n /**\n * Aria label strings for lightGallery core modules.\n * @description This can be useful if you want to localize the lightGallery strings to other languages.\n * Use your own service to translate the strings and pass it via settings.strings\n * You can find dedicated strings option for all lightGallery modules in their respective documentation.\n */\n strings: LightGalleryCoreStrings;\n\n plugins: (new (instance: LightGallery, $LG: LgQuery) => any)[];\n}\n\nexport const lightGalleryCoreSettings: LightGalleryCoreSettings = {\n mode: 'lg-slide',\n easing: 'ease',\n speed: 400,\n licenseKey: '0000-0000-000-0000',\n height: '100%',\n width: '100%',\n addClass: '',\n startClass: 'lg-start-zoom',\n backdropDuration: 300,\n container: '',\n startAnimationDuration: 400,\n zoomFromOrigin: true,\n hideBarsDelay: 0,\n showBarsAfter: 10000,\n slideDelay: 0,\n supportLegacyBrowser: true,\n allowMediaOverlap: false,\n videoMaxSize: '1280-720',\n loadYouTubePoster: true,\n defaultCaptionHeight: 0,\n ariaLabelledby: '',\n ariaDescribedby: '',\n resetScrollPosition: true,\n hideScrollbar: false,\n closable: true,\n swipeToClose: true,\n closeOnTap: true,\n showCloseIcon: true,\n showMaximizeIcon: false,\n loop: true,\n escKey: true,\n keyPress: true,\n trapFocus: true,\n controls: true,\n slideEndAnimation: true,\n hideControlOnEnd: false,\n mousewheel: false,\n getCaptionFromTitleOrAlt: true,\n appendSubHtmlTo: '.lg-sub-html',\n subHtmlSelectorRelative: false,\n preload: 2,\n numberOfSlideItemsInDom: 10,\n selector: '',\n selectWithin: '',\n nextHtml: '',\n prevHtml: '',\n index: 0,\n iframeWidth: '100%',\n iframeHeight: '100%',\n iframeMaxWidth: '100%',\n iframeMaxHeight: '100%',\n download: true,\n counter: true,\n appendCounterTo: '.lg-toolbar',\n swipeThreshold: 50,\n enableSwipe: true,\n enableDrag: true,\n dynamic: false,\n dynamicEl: [],\n extraProps: [],\n exThumbImage: '',\n isMobile: undefined,\n mobileSettings: {\n controls: false,\n showCloseIcon: false,\n download: false,\n } as MobileSettings,\n plugins: [],\n strings: {\n closeGallery: 'Close gallery',\n toggleMaximize: 'Toggle maximize',\n previousSlide: 'Previous slide',\n nextSlide: 'Next slide',\n download: 'Download',\n playVideo: 'Play video',\n } as LightGalleryCoreStrings,\n};\n", "interface Offset {\n left: number;\n top: number;\n}\n\nfunction initLgPolyfills() {\n (function () {\n if (typeof window.CustomEvent === 'function') return false;\n\n function CustomEvent(event: string, params: any) {\n params = params || {\n bubbles: false,\n cancelable: false,\n detail: null,\n };\n const evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(\n event,\n params.bubbles,\n params.cancelable,\n params.detail,\n );\n return evt;\n }\n\n window.CustomEvent = CustomEvent as any;\n })();\n (function () {\n if (!Element.prototype.matches) {\n Element.prototype.matches =\n (Element.prototype as any).msMatchesSelector ||\n Element.prototype.webkitMatchesSelector;\n }\n })();\n}\n\nexport type LgQuery = (selector: any) => lgQuery;\nexport class lgQuery {\n static eventListeners: { [key: string]: any[] } = {};\n static generateUUID(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(\n /[xy]/g,\n function (c) {\n const r = (Math.random() * 16) | 0,\n v = c == 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n },\n );\n }\n\n private selector: any;\n private firstElement: any;\n private cssVenderPrefixes: string[] = [\n 'TransitionDuration',\n 'TransitionTimingFunction',\n 'Transform',\n 'Transition',\n ];\n constructor(selector: string | Element) {\n this.selector = this._getSelector(selector);\n this.firstElement = this._getFirstEl();\n return this;\n }\n\n private _getSelector(\n selector: string | Element,\n context: Element | Document = document,\n ): Element | null | NodeListOf {\n if (typeof selector !== 'string') {\n return selector;\n }\n context = context || document;\n const fl = selector.substring(0, 1);\n if (fl === '#') {\n return context.querySelector(selector);\n } else {\n return context.querySelectorAll(selector);\n }\n }\n\n private _each(\n func: (\n elements: Element | NodeListOf | null,\n index: number,\n ) => void,\n ): this {\n if (!this.selector) {\n return this;\n }\n if (this.selector.length !== undefined) {\n [].forEach.call(this.selector, func);\n } else {\n func(this.selector, 0);\n }\n return this;\n }\n\n private _setCssVendorPrefix(\n el: any,\n cssProperty: string,\n value?: string | number,\n ): void {\n // prettier-ignore\n const property = cssProperty.replace(/-([a-z])/gi, function (\n s,\n group1,\n ) {\n return group1.toUpperCase();\n });\n if (this.cssVenderPrefixes.indexOf(property) !== -1) {\n el.style[\n property.charAt(0).toLowerCase() + property.slice(1)\n ] = value;\n el.style['webkit' + property] = value;\n el.style['moz' + property] = value;\n el.style['ms' + property] = value;\n el.style['o' + property] = value;\n } else {\n el.style[property] = value;\n }\n }\n\n private _getFirstEl() {\n if (this.selector && this.selector.length !== undefined) {\n return this.selector[0];\n } else {\n return this.selector;\n }\n }\n\n private isEventMatched(event: string, eventName: string): boolean {\n const eventNamespace = eventName.split('.');\n return event\n .split('.')\n .filter((e) => e)\n .every((e) => {\n return eventNamespace.indexOf(e) !== -1;\n });\n }\n\n attr(attr: string): string;\n attr(attr: string, value: string | number | boolean): this;\n attr(attr: string, value?: string | number | boolean): string | this {\n if (value === undefined) {\n if (!this.firstElement) {\n return '';\n }\n return this.firstElement.getAttribute(attr);\n }\n this._each((el: any) => {\n el.setAttribute(attr, value);\n });\n return this;\n }\n\n find(selector: any): lgQuery {\n return $LG(this._getSelector(selector, this.selector));\n }\n\n first(): lgQuery {\n if (this.selector && this.selector.length !== undefined) {\n return $LG(this.selector[0]);\n } else {\n return $LG(this.selector);\n }\n }\n\n eq(index: number): lgQuery {\n return $LG(this.selector[index]);\n }\n\n parent(): lgQuery {\n return $LG(this.selector.parentElement);\n }\n\n get(): HTMLElement {\n return this._getFirstEl();\n }\n\n removeAttr(attributes: string): this {\n const attrs = attributes.split(' ');\n this._each((el: any) => {\n attrs.forEach((attr: string) => el.removeAttribute(attr));\n });\n return this;\n }\n\n wrap(className: string): this {\n if (!this.firstElement) {\n return this;\n }\n const wrapper = document.createElement('div');\n wrapper.className = className;\n this.firstElement.parentNode.insertBefore(wrapper, this.firstElement);\n this.firstElement.parentNode.removeChild(this.firstElement);\n wrapper.appendChild(this.firstElement);\n return this;\n }\n\n addClass(classNames = ''): this {\n this._each((el: any) => {\n // IE doesn't support multiple arguments\n classNames.split(' ').forEach((className) => {\n if (className) {\n el.classList.add(className);\n }\n });\n });\n return this;\n }\n\n removeClass(classNames: string): this {\n this._each((el: any) => {\n // IE doesn't support multiple arguments\n classNames.split(' ').forEach((className) => {\n if (className) {\n el.classList.remove(className);\n }\n });\n });\n return this;\n }\n\n hasClass(className: string): boolean {\n if (!this.firstElement) {\n return false;\n }\n return this.firstElement.classList.contains(className);\n }\n hasAttribute(attribute: string): boolean {\n if (!this.firstElement) {\n return false;\n }\n return this.firstElement.hasAttribute(attribute);\n }\n toggleClass(className: string): this {\n if (!this.firstElement) {\n return this;\n }\n if (this.hasClass(className)) {\n this.removeClass(className);\n } else {\n this.addClass(className);\n }\n return this;\n }\n\n css(property: string, value?: string | number): this {\n this._each((el: any) => {\n this._setCssVendorPrefix(el, property, value);\n });\n return this;\n }\n // Need to pass separate namespaces for separate elements\n on(events: string, listener: (e: any) => void): this {\n if (!this.selector) {\n return this;\n }\n events.split(' ').forEach((event: string) => {\n if (!Array.isArray(lgQuery.eventListeners[event])) {\n lgQuery.eventListeners[event] = [];\n }\n lgQuery.eventListeners[event].push(listener);\n this.selector.addEventListener(event.split('.')[0], listener);\n });\n\n return this;\n }\n // @todo - test this\n once(event: string, listener: (e: any) => void): this {\n this.on(event, () => {\n this.off(event);\n listener(event);\n });\n return this;\n }\n off(event: string): this {\n if (!this.selector) {\n return this;\n }\n Object.keys(lgQuery.eventListeners).forEach((eventName) => {\n if (this.isEventMatched(event, eventName)) {\n lgQuery.eventListeners[eventName].forEach((listener) => {\n this.selector.removeEventListener(\n eventName.split('.')[0],\n listener,\n );\n });\n lgQuery.eventListeners[eventName] = [];\n }\n });\n\n return this;\n }\n trigger(event: string, detail?: Detail): this {\n if (!this.firstElement) {\n return this;\n }\n\n const customEvent = new CustomEvent(event.split('.')[0], {\n detail: detail || null,\n });\n this.firstElement.dispatchEvent(customEvent);\n return this;\n }\n\n // Does not support IE\n load(url: string): this {\n fetch(url)\n .then((res) => res.text())\n .then((html) => {\n this.selector.innerHTML = html;\n });\n return this;\n }\n\n html(): string;\n html(html: string): this;\n html(html?: string): string | this {\n if (html === undefined) {\n if (!this.firstElement) {\n return '';\n }\n return this.firstElement.innerHTML;\n }\n this._each((el: any) => {\n el.innerHTML = html;\n });\n return this;\n }\n append(html: string | HTMLElement): this {\n this._each((el: any) => {\n if (typeof html === 'string') {\n el.insertAdjacentHTML('beforeend', html);\n } else {\n el.appendChild(html);\n }\n });\n return this;\n }\n prepend(html: string): this {\n this._each((el: any) => {\n el.insertAdjacentHTML('afterbegin', html);\n });\n return this;\n }\n remove(): this {\n this._each((el: any) => {\n el.parentNode.removeChild(el);\n });\n return this;\n }\n empty(): this {\n this._each((el: any) => {\n el.innerHTML = '';\n });\n return this;\n }\n // Supports only window\n scrollTop(): number;\n scrollTop(scrollTop: number): this;\n scrollTop(scrollTop?: number): number | this {\n if (scrollTop !== undefined) {\n document.body.scrollTop = scrollTop;\n document.documentElement.scrollTop = scrollTop;\n return this;\n } else {\n return (\n window.pageYOffset ||\n document.documentElement.scrollTop ||\n document.body.scrollTop ||\n 0\n );\n }\n }\n // Supports only window\n scrollLeft(): number;\n scrollLeft(scrollLeft?: number): this;\n scrollLeft(scrollLeft?: number): number | this {\n if (scrollLeft !== undefined) {\n document.body.scrollLeft = scrollLeft;\n document.documentElement.scrollLeft = scrollLeft;\n return this;\n } else {\n return (\n window.pageXOffset ||\n document.documentElement.scrollLeft ||\n document.body.scrollLeft ||\n 0\n );\n }\n }\n offset(): Offset {\n if (!this.firstElement) {\n return {\n left: 0,\n top: 0,\n };\n }\n const rect = this.firstElement.getBoundingClientRect();\n const bodyMarginLeft = $LG('body').style().marginLeft;\n\n // Minus body margin - https://stackoverflow.com/questions/30711548/is-getboundingclientrect-left-returning-a-wrong-value\n return {\n left: rect.left - parseFloat(bodyMarginLeft) + this.scrollLeft(),\n top: rect.top + this.scrollTop(),\n };\n }\n style(): CSSStyleDeclaration {\n if (!this.firstElement) {\n return {} as CSSStyleDeclaration;\n }\n return (\n this.firstElement.currentStyle ||\n window.getComputedStyle(this.firstElement)\n );\n }\n // Width without padding and border even if box-sizing is used.\n width(): number {\n const style = this.style();\n return (\n this.firstElement.clientWidth -\n parseFloat(style.paddingLeft) -\n parseFloat(style.paddingRight)\n );\n }\n // Height without padding and border even if box-sizing is used.\n height(): number {\n const style = this.style();\n return (\n this.firstElement.clientHeight -\n parseFloat(style.paddingTop) -\n parseFloat(style.paddingBottom)\n );\n }\n}\n\nexport function $LG(selector: any): lgQuery {\n initLgPolyfills();\n return new lgQuery(selector);\n}\n", "import { $LG, lgQuery } from './lgQuery';\nimport { VideoSource } from './plugins/video/types';\nimport { VideoInfo } from './types';\n\nexport interface ImageSize {\n width: number;\n height: number;\n}\n\nexport interface ImageSources {\n media?: string;\n srcset: string;\n sizes?: string;\n type?: string;\n}\n\nexport interface GalleryItem {\n /**\n * url of the media\n * @data-attr data-src\n */\n src?: string;\n\n /**\n * Source attributes for the picture element\n * @data-attr data-sources\n */\n sources?: ImageSources[];\n\n /**\n * Thumbnail url\n * @description By default lightGallery uses the image inside gallery selector as thumbnail.\n * But, If you want to use external image for thumbnail,\n * pass the thumbnail url via any data attribute and\n * pass the attribute name via exThumbImage option\n * @example\n *
\n * \n *
\n *\n * lightGallery(document.getElementById('lightGallery'), {\n * exThumbImage: 'data-external-thumb-image'\n * })\n * @data-attr data-*\n */\n thumb?: string;\n\n /**\n * alt attribute for the image\n * @data-attr alt\n */\n alt?: string;\n\n /**\n * Title attribute for the video\n * @data-attr title\n */\n title?: string;\n\n /**\n * Title for iframe\n * @data-attr data-iframe-title\n */\n iframeTitle?: string;\n\n /**\n * Caption for the slide\n * @description You can either pass the HTML markup or the ID or class name of the element which contains the captions\n * @data-attr data-sub-html\n */\n subHtml?: string;\n\n /**\n * url of the file which contain the sub html.\n * @description Note - Does not support Internet Explorer browser\n * @data-attr data-sub-html-url\n */\n subHtmlUrl?: string;\n\n /**\n * Video source\n * @data-attr data-video\n */\n video?: VideoSource;\n\n /**\n * Poster url\n * @data-attr data-poster\n */\n poster?: string;\n\n /**\n * Custom slide name to use in the url when hash plugin is enabled\n * @data-attr data-slide-name\n */\n slideName?: string;\n\n /**\n * List of images and viewport's max width separated by comma.\n * @description Ex?: img/1-375.jpg 375, img/1-480.jpg 480, img/1-757.jpg 757.\n * @data-attr data-responsive\n */\n responsive?: string;\n\n /**\n * srcset attribute values for the main image\n * @data-attr data-srcset\n */\n srcset?: string;\n\n /**\n * srcset sizes attribute for the main image\n * @data-attr data-sizes\n */\n sizes?: string;\n\n /**\n * Set true is you want to open your url in an iframe\n * @data-attr data-iframe\n */\n iframe?: boolean;\n\n /**\n * Download url for your image/video.\n * @description Pass false if you want to disable the download button.\n * @data-attr data-download-url\n */\n downloadUrl?: string | boolean;\n\n /**\n * Name of the file after it is downloaded.\n * @description The HTML value of the download attribute.\n * There are no restrictions on allowed values, and the browser will automatically\n * detect the correct file extension and add it to the file (.img, .pdf, .txt, .html, etc.).\n * More info\n * @data-attr data-download\n */\n download?: string | boolean;\n\n /**\n * Actual size of the image in px.\n * @description This is used in zoom plugin to see the actual size of the image when double taped on the image.\n * @data-attr data-width\n */\n width?: string;\n\n /**\n * Facebook share URL.\n * @description Specify only if you want to provide separate share URL for the specific slide. By default, current browser URL is taken.\n * @data-attr data-facebook-share-url\n */\n facebookShareUrl?: string;\n\n /**\n * Tweet text\n * @data-attr data-tweet-text\n */\n tweetText?: string;\n\n /**\n * Twitter share URL.\n * @description Specify only if you want to provide separate share URL for the specific slide. By default, current browser URL will be taken.\n * @data-attr data-twitter-share-url\n */\n twitterShareUrl?: string;\n\n /**\n * Pinterest share URL.\n * @description Specify only if you want to provide separate share URL for the specific slide. By default, current browser URL will be taken.\n * Note?: Pinterest requires absolute URL\n * @data-attr data-pinterest-share-url\n */\n pinterestShareUrl?: string;\n\n /**\n * Description for Pinterest post.\n * @data-attr data-pinterest-text\n */\n pinterestText?: string;\n\n /**\n * Facebook comments body html\n * @description Please refer facebook official documentation for generating the HTML markup\n * @example\n * \n * \n * @data-attr data-fb-html\n */\n fbHtml?: string;\n\n /**\n * Disqus page identifier\n * @description Please refer official disqus documentation for more info\n * @data-attr data-disqus-identifier\n */\n disqusIdentifier?: string;\n\n /**\n * Disqus page url\n * @description Please refer official disqus documentation for more info\n * @data-attr data-disqus-url\n */\n disqusUrl?: string;\n\n __slideVideoInfo?: VideoInfo;\n [key: string]: any;\n}\n\nconst defaultDynamicOptions = [\n 'src',\n 'sources',\n 'subHtml',\n 'subHtmlUrl',\n 'html',\n 'video',\n 'poster',\n 'slideName',\n 'responsive',\n 'srcset',\n 'sizes',\n 'iframe',\n 'downloadUrl',\n 'download',\n 'width',\n 'facebookShareUrl',\n 'tweetText',\n 'iframeTitle',\n 'twitterShareUrl',\n 'pinterestShareUrl',\n 'pinterestText',\n 'fbHtml',\n 'disqusIdentifier',\n 'disqusUrl',\n];\n\n// Convert html data-attribute to camalcase\nexport function convertToData(attr: string): string {\n // FInd a way for lgsize\n if (attr === 'href') {\n return 'src';\n }\n attr = attr.replace('data-', '');\n attr = attr.charAt(0).toLowerCase() + attr.slice(1);\n attr = attr.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\n\n return attr;\n}\n\nconst utils = {\n /**\n * get possible width and height from the lgSize attribute. Used for ZoomFromOrigin option\n */\n getSize(\n el: HTMLElement,\n container: lgQuery,\n spacing = 0,\n defaultLgSize?: string,\n ): ImageSize | undefined {\n const LGel = $LG(el);\n let lgSize = LGel.attr('data-lg-size') || defaultLgSize;\n\n if (!lgSize) {\n return;\n }\n\n const isResponsiveSizes = lgSize.split(',');\n // if at-least two viewport sizes are available\n if (isResponsiveSizes[1]) {\n const wWidth = window.innerWidth;\n for (let i = 0; i < isResponsiveSizes.length; i++) {\n const size = isResponsiveSizes[i];\n const responsiveWidth = parseInt(size.split('-')[2], 10);\n if (responsiveWidth > wWidth) {\n lgSize = size;\n break;\n }\n\n // take last item as last option\n if (i === isResponsiveSizes.length - 1) {\n lgSize = size;\n }\n }\n }\n\n const size = lgSize.split('-');\n\n const width = parseInt(size[0], 10);\n const height = parseInt(size[1], 10);\n\n const cWidth = container.width();\n const cHeight = container.height() - spacing;\n\n const maxWidth = Math.min(cWidth, width);\n const maxHeight = Math.min(cHeight, height);\n\n const ratio = Math.min(maxWidth / width, maxHeight / height);\n\n return { width: width * ratio, height: height * ratio };\n },\n\n /**\n * @desc Get transform value based on the imageSize. Used for ZoomFromOrigin option\n * @param {jQuery Element}\n * @returns {String} Transform CSS string\n */\n getTransform(\n el: HTMLElement,\n container: lgQuery,\n top: number,\n bottom: number,\n imageSize?: ImageSize,\n ): string | undefined {\n if (!imageSize) {\n return;\n }\n const LGel = $LG(el).find('img').first();\n if (!LGel.get()) {\n return;\n }\n\n const containerRect = container.get().getBoundingClientRect();\n\n const wWidth = containerRect.width;\n\n // using innerWidth to include mobile safari bottom bar\n const wHeight = container.height() - (top + bottom);\n\n const elWidth = LGel.width();\n const elHeight = LGel.height();\n\n const elStyle = LGel.style();\n let x =\n (wWidth - elWidth) / 2 -\n LGel.offset().left +\n (parseFloat(elStyle.paddingLeft) || 0) +\n (parseFloat(elStyle.borderLeft) || 0) +\n $LG(window).scrollLeft() +\n containerRect.left;\n let y =\n (wHeight - elHeight) / 2 -\n LGel.offset().top +\n (parseFloat(elStyle.paddingTop) || 0) +\n (parseFloat(elStyle.borderTop) || 0) +\n $LG(window).scrollTop() +\n top;\n\n const scX = elWidth / imageSize.width;\n const scY = elHeight / imageSize.height;\n\n const transform =\n 'translate3d(' +\n (x *= -1) +\n 'px, ' +\n (y *= -1) +\n 'px, 0) scale3d(' +\n scX +\n ', ' +\n scY +\n ', 1)';\n return transform;\n },\n\n getIframeMarkup(\n iframeWidth: string,\n iframeHeight: string,\n iframeMaxWidth: string,\n iframeMaxHeight: string,\n src?: string,\n iframeTitle?: string,\n ): string {\n const title = iframeTitle ? 'title=\"' + iframeTitle + '\"' : '';\n return `
\n \n
`;\n },\n\n getImgMarkup(\n index: number,\n src: string,\n altAttr: string,\n srcset?: string,\n sizes?: string,\n sources?: ImageSources[],\n ): string {\n const srcsetAttr = srcset ? `srcset=\"${srcset}\"` : '';\n const sizesAttr = sizes ? `sizes=\"${sizes}\"` : '';\n const imgMarkup = ``;\n let sourceTag = '';\n if (sources) {\n const sourceObj =\n typeof sources === 'string' ? JSON.parse(sources) : sources;\n\n sourceTag = sourceObj.map((source: any) => {\n let attrs = '';\n Object.keys(source).forEach((key) => {\n // Do not remove the first space as it is required to separate the attributes\n attrs += ` ${key}=\"${source[key]}\"`;\n });\n return ``;\n });\n }\n return `${sourceTag}${imgMarkup}`;\n },\n\n // Get src from responsive src\n getResponsiveSrc(srcItms: string[]): string {\n const rsWidth = [];\n const rsSrc = [];\n let src = '';\n for (let i = 0; i < srcItms.length; i++) {\n const _src = srcItms[i].split(' ');\n\n // Manage empty space\n if (_src[0] === '') {\n _src.splice(0, 1);\n }\n\n rsSrc.push(_src[0]);\n rsWidth.push(_src[1]);\n }\n\n const wWidth = window.innerWidth;\n for (let j = 0; j < rsWidth.length; j++) {\n if (parseInt(rsWidth[j], 10) > wWidth) {\n src = rsSrc[j];\n break;\n }\n }\n return src;\n },\n\n isImageLoaded(img: HTMLImageElement): boolean {\n if (!img) return false;\n // During the onload event, IE correctly identifies any images that\n // weren’t downloaded as not complete. Others should too. Gecko-based\n // browsers act like NS4 in that they report this incorrectly.\n if (!img.complete) {\n return false;\n }\n\n // However, they do have two very useful properties: naturalWidth and\n // naturalHeight. These give the true size of the image. If it failed\n // to load, either of these should be zero.\n if (img.naturalWidth === 0) {\n return false;\n }\n\n // No other way of checking: assume it’s ok.\n return true;\n },\n\n getVideoPosterMarkup(\n _poster: string,\n dummyImg: string,\n videoContStyle: string,\n playVideoString: string,\n _isVideo?: VideoInfo,\n ): string {\n let videoClass = '';\n if (_isVideo && _isVideo.youtube) {\n videoClass = 'lg-has-youtube';\n } else if (_isVideo && _isVideo.vimeo) {\n videoClass = 'lg-has-vimeo';\n } else {\n videoClass = 'lg-has-html5';\n }\n\n return `
\n
\n \n ${playVideoString}\n \n \n \n \n \n \n \n
\n ${dummyImg || ''}\n \n
`;\n },\n\n getFocusableElements(container: HTMLElement): NodeListOf {\n const elements = container.querySelectorAll(\n '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])',\n );\n const visibleElements = [].filter.call(elements, (element) => {\n const style = window.getComputedStyle(element);\n return style.display !== 'none' && style.visibility !== 'hidden';\n });\n return (visibleElements as unknown) as NodeListOf;\n },\n\n /**\n * @desc Create dynamic elements array from gallery items when dynamic option is false\n * It helps to avoid frequent DOM interaction\n * and avoid multiple checks for dynamic elments\n *\n * @returns {Array} dynamicEl\n */\n getDynamicOptions(\n items: any,\n extraProps: string[],\n getCaptionFromTitleOrAlt: boolean,\n exThumbImage: string,\n ): GalleryItem[] {\n const dynamicElements: GalleryItem[] = [];\n const availableDynamicOptions = [\n ...defaultDynamicOptions,\n ...extraProps,\n ];\n [].forEach.call(items, (item: HTMLElement) => {\n const dynamicEl: GalleryItem = {} as GalleryItem;\n for (let i = 0; i < item.attributes.length; i++) {\n const attr = item.attributes[i];\n if (attr.specified) {\n const dynamicAttr = convertToData(attr.name);\n let label = '';\n if (availableDynamicOptions.indexOf(dynamicAttr) > -1) {\n label = dynamicAttr;\n }\n if (label) {\n (dynamicEl as any)[label] = attr.value;\n }\n }\n }\n const currentItem = $LG(item);\n const alt = currentItem.find('img').first().attr('alt');\n const title = currentItem.attr('title');\n\n const thumb = exThumbImage\n ? currentItem.attr(exThumbImage)\n : currentItem.find('img').first().attr('src');\n dynamicEl.thumb = thumb;\n\n if (getCaptionFromTitleOrAlt && !dynamicEl.subHtml) {\n dynamicEl.subHtml = title || alt || '';\n }\n dynamicEl.alt = alt || title || '';\n dynamicElements.push(dynamicEl);\n });\n return dynamicElements;\n },\n isMobile(): boolean {\n return /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);\n },\n /**\n * @desc Check the given src is video\n * @param {String} src\n * @return {Object} video type\n * Ex:{ youtube : [\"//www.youtube.com/watch?v=c0asJgSyxcY\", \"c0asJgSyxcY\"] }\n *\n * @todo - this information can be moved to dynamicEl to avoid frequent calls\n */\n\n isVideo(\n src: string,\n isHTML5VIdeo: boolean,\n index: number,\n ): VideoInfo | undefined {\n if (!src) {\n if (isHTML5VIdeo) {\n return {\n html5: true,\n };\n } else {\n console.error(\n 'lightGallery :- data-src is not provided on slide item ' +\n (index + 1) +\n '. Please make sure the selector property is properly configured. More info - https://www.lightgalleryjs.com/demos/html-markup/',\n );\n return;\n }\n }\n\n const youtube = src.match(\n /\\/\\/(?:www\\.)?youtu(?:\\.be|be\\.com|be-nocookie\\.com)\\/(?:watch\\?v=|embed\\/)?([a-z0-9\\-\\_\\%]+)([\\&|?][\\S]*)*/i,\n );\n const vimeo = src.match(\n /\\/\\/(?:www\\.)?(?:player\\.)?vimeo.com\\/(?:video\\/)?([0-9a-z\\-_]+)(.*)?/i,\n );\n const wistia = src.match(\n /https?:\\/\\/(.+)?(wistia\\.com|wi\\.st)\\/(medias|embed)\\/([0-9a-z\\-_]+)(.*)/,\n );\n\n if (youtube) {\n return {\n youtube,\n };\n } else if (vimeo) {\n return {\n vimeo,\n };\n } else if (wistia) {\n return {\n wistia,\n };\n }\n },\n};\n\nexport default utils;\n", "import {\n AfterAppendSlideEventDetail,\n AfterAppendSubHtmlDetail,\n BeforeSlideDetail,\n lGEvents,\n SlideItemLoadDetail,\n} from './lg-events';\nimport {\n LightGalleryAllSettings,\n lightGalleryCoreSettings,\n LightGallerySettings,\n} from './lg-settings';\nimport utils, { GalleryItem, ImageSize } from './lg-utils';\nimport { $LG, lgQuery } from './lgQuery';\nimport {\n Coords,\n MediaContainerPosition,\n SlideDirection,\n VideoInfo,\n} from './types';\n\ndeclare let picturefill: any;\n\n// @ref - https://stackoverflow.com/questions/3971841/how-to-resize-images-proportionally-keeping-the-aspect-ratio\n// @ref - https://2ality.com/2017/04/setting-up-multi-platform-packages.html\n\n// Unique id for each gallery\nlet lgId = 0;\n\nexport class LightGallery {\n public settings!: LightGalleryAllSettings;\n public galleryItems!: GalleryItem[];\n\n // Current gallery item\n public lgId!: number;\n\n public el!: HTMLElement;\n public LGel!: lgQuery;\n public lgOpened = false;\n\n public index = 0;\n\n // lightGallery modules\n public plugins: any[] = [];\n\n // false when lightGallery load first slide content;\n public lGalleryOn = false;\n\n // True when a slide animation is in progress\n public lgBusy = false;\n\n // Type of touch action - {swipe, zoomSwipe, pinch}\n public touchAction?: 'swipe' | 'zoomSwipe' | 'pinch';\n\n // Direction of swipe/drag - {horizontal, vertical}\n public swipeDirection?: 'horizontal' | 'vertical';\n\n // Timeout function for hiding controls;\n public hideBarTimeout: any;\n\n public currentItemsInDom: string[] = [];\n\n public outer!: lgQuery;\n\n public items: any;\n\n public $backdrop!: lgQuery;\n public $lgComponents!: lgQuery;\n\n public $container!: lgQuery;\n\n public $inner!: lgQuery;\n public $content!: lgQuery;\n public $toolbar!: lgQuery;\n\n // Scroll top value before lightGallery is opened\n public prevScrollTop = 0;\n\n public bodyPaddingRight = 0;\n\n private zoomFromOrigin!: boolean;\n\n private currentImageSize?: ImageSize;\n\n private isDummyImageRemoved = false;\n\n private dragOrSwipeEnabled = false;\n\n public mediaContainerPosition = {\n top: 0,\n bottom: 0,\n };\n\n constructor(element: HTMLElement, options?: LightGallerySettings) {\n if (!element) {\n return this;\n }\n lgId++;\n this.lgId = lgId;\n\n this.el = element;\n this.LGel = $LG(element);\n\n this.generateSettings(options);\n\n this.buildModules();\n\n // When using dynamic mode, ensure dynamicEl is an array\n if (\n this.settings.dynamic &&\n this.settings.dynamicEl !== undefined &&\n !Array.isArray(this.settings.dynamicEl)\n ) {\n throw 'When using dynamic mode, you must also define dynamicEl as an Array.';\n }\n\n this.galleryItems = this.getItems();\n this.normalizeSettings();\n\n // Gallery items\n\n this.init();\n\n this.validateLicense();\n\n return this;\n }\n\n private generateSettings(options?: LightGallerySettings) {\n // lightGallery settings\n this.settings = {\n ...lightGalleryCoreSettings,\n ...options,\n } as LightGalleryAllSettings;\n if (\n this.settings.isMobile &&\n typeof this.settings.isMobile === 'function'\n ? this.settings.isMobile()\n : utils.isMobile()\n ) {\n const mobileSettings = {\n ...this.settings.mobileSettings,\n ...this.settings.mobileSettings,\n };\n this.settings = { ...this.settings, ...mobileSettings };\n }\n }\n\n private normalizeSettings() {\n if (this.settings.slideEndAnimation) {\n this.settings.hideControlOnEnd = false;\n }\n if (!this.settings.closable) {\n this.settings.swipeToClose = false;\n }\n\n // And reset it on close to get the correct value next time\n this.zoomFromOrigin = this.settings.zoomFromOrigin;\n\n // At the moment, Zoom from image doesn't support dynamic options\n // @todo add zoomFromOrigin support for dynamic images\n if (this.settings.dynamic) {\n this.zoomFromOrigin = false;\n }\n\n if (!this.settings.container) {\n this.settings.container = document.body;\n }\n\n // settings.preload should not be grater than $item.length\n this.settings.preload = Math.min(\n this.settings.preload,\n this.galleryItems.length,\n );\n }\n\n init(): void {\n this.addSlideVideoInfo(this.galleryItems);\n\n this.buildStructure();\n\n this.LGel.trigger(lGEvents.init, {\n instance: this,\n });\n\n if (this.settings.keyPress) {\n this.keyPress();\n }\n\n setTimeout(() => {\n this.enableDrag();\n this.enableSwipe();\n this.triggerPosterClick();\n }, 50);\n\n this.arrow();\n if (this.settings.mousewheel) {\n this.mousewheel();\n }\n\n if (!this.settings.dynamic) {\n this.openGalleryOnItemClick();\n }\n }\n\n openGalleryOnItemClick(): void {\n // Using for loop instead of using bubbling as the items can be any html element.\n for (let index = 0; index < this.items.length; index++) {\n const element = this.items[index];\n const $element = $LG(element);\n // Using different namespace for click because click event should not unbind if selector is same object('this')\n // @todo manage all event listners - should have namespace that represent element\n const uuid = lgQuery.generateUUID();\n $element\n .attr('data-lg-id', uuid)\n .on(`click.lgcustom-item-${uuid}`, (e) => {\n e.preventDefault();\n const currentItemIndex = this.settings.index || index;\n this.openGallery(currentItemIndex, element);\n });\n }\n }\n\n /**\n * Module constructor\n * Modules are build incrementally.\n * Gallery should be opened only once all the modules are initialized.\n * use moduleBuildTimeout to make sure this\n */\n buildModules(): void {\n this.settings.plugins.forEach((plugin) => {\n this.plugins.push(new plugin(this, $LG));\n });\n }\n\n validateLicense(): void {\n if (!this.settings.licenseKey) {\n console.error('Please provide a valid license key');\n } else if (this.settings.licenseKey === '0000-0000-000-0000') {\n console.warn(\n `lightGallery: ${this.settings.licenseKey} license key is not valid for production use`,\n );\n }\n }\n\n getSlideItem(index: number): lgQuery {\n return $LG(this.getSlideItemId(index));\n }\n\n getSlideItemId(index: number): string {\n return `#lg-item-${this.lgId}-${index}`;\n }\n\n getIdName(id: string): string {\n return `${id}-${this.lgId}`;\n }\n getElementById(id: string): lgQuery {\n return $LG(`#${this.getIdName(id)}`);\n }\n\n manageSingleSlideClassName(): void {\n if (this.galleryItems.length < 2) {\n this.outer.addClass('lg-single-item');\n } else {\n this.outer.removeClass('lg-single-item');\n }\n }\n\n buildStructure(): void {\n const container = this.$container && this.$container.get();\n if (container) {\n return;\n }\n let controls = '';\n let subHtmlCont = '';\n\n // Create controls\n if (this.settings.controls) {\n controls = `\n `;\n }\n\n if (this.settings.appendSubHtmlTo !== '.lg-item') {\n subHtmlCont =\n '
';\n }\n\n let addClasses = '';\n\n if (this.settings.allowMediaOverlap) {\n // Do not remove space before last single quote\n addClasses += 'lg-media-overlap ';\n }\n\n const ariaLabelledby = this.settings.ariaLabelledby\n ? 'aria-labelledby=\"' + this.settings.ariaLabelledby + '\"'\n : '';\n const ariaDescribedby = this.settings.ariaDescribedby\n ? 'aria-describedby=\"' + this.settings.ariaDescribedby + '\"'\n : '';\n\n const containerClassName = `lg-container ${this.settings.addClass} ${\n document.body !== this.settings.container ? 'lg-inline' : ''\n }`;\n const closeIcon =\n this.settings.closable && this.settings.showCloseIcon\n ? ``\n : '';\n const maximizeIcon = this.settings.showMaximizeIcon\n ? ``\n : '';\n const template = `\n
\n
\n\n
\n\n
\n
\n
\n ${controls}\n
\n
\n ${maximizeIcon}\n ${closeIcon}\n
\n ${\n this.settings.appendSubHtmlTo === '.lg-outer'\n ? subHtmlCont\n : ''\n }\n
\n ${\n this.settings.appendSubHtmlTo === '.lg-sub-html'\n ? subHtmlCont\n : ''\n }\n
\n
\n
\n `;\n\n $LG(this.settings.container).append(template);\n\n if (document.body !== this.settings.container) {\n $LG(this.settings.container).css('position', 'relative');\n }\n\n this.outer = this.getElementById('lg-outer');\n this.$lgComponents = this.getElementById('lg-components');\n this.$backdrop = this.getElementById('lg-backdrop');\n this.$container = this.getElementById('lg-container');\n this.$inner = this.getElementById('lg-inner');\n this.$content = this.getElementById('lg-content');\n this.$toolbar = this.getElementById('lg-toolbar');\n\n this.$backdrop.css(\n 'transition-duration',\n this.settings.backdropDuration + 'ms',\n );\n\n let outerClassNames = `${this.settings.mode} `;\n\n this.manageSingleSlideClassName();\n\n if (this.settings.enableDrag) {\n outerClassNames += 'lg-grab ';\n }\n\n this.outer.addClass(outerClassNames);\n\n this.$inner.css('transition-timing-function', this.settings.easing);\n this.$inner.css('transition-duration', this.settings.speed + 'ms');\n\n if (this.settings.download) {\n this.$toolbar.append(\n ``,\n );\n }\n\n this.counter();\n\n $LG(window).on(\n `resize.lg.global${this.lgId} orientationchange.lg.global${this.lgId}`,\n () => {\n this.refreshOnResize();\n },\n );\n\n this.hideBars();\n\n this.manageCloseGallery();\n this.toggleMaximize();\n\n this.initModules();\n }\n\n refreshOnResize(): void {\n if (this.lgOpened) {\n const currentGalleryItem = this.galleryItems[this.index];\n const { __slideVideoInfo } = currentGalleryItem;\n\n this.mediaContainerPosition = this.getMediaContainerPosition();\n const { top, bottom } = this.mediaContainerPosition;\n this.currentImageSize = utils.getSize(\n this.items[this.index],\n this.outer,\n top + bottom,\n __slideVideoInfo && this.settings.videoMaxSize,\n );\n if (__slideVideoInfo) {\n this.resizeVideoSlide(this.index, this.currentImageSize);\n }\n if (this.zoomFromOrigin && !this.isDummyImageRemoved) {\n const imgStyle = this.getDummyImgStyles(this.currentImageSize);\n this.outer\n .find('.lg-current .lg-dummy-img')\n .first()\n .attr('style', imgStyle);\n }\n this.LGel.trigger(lGEvents.containerResize);\n }\n }\n\n resizeVideoSlide(index: number, imageSize?: ImageSize): void {\n const lgVideoStyle = this.getVideoContStyle(imageSize);\n const currentSlide = this.getSlideItem(index);\n currentSlide.find('.lg-video-cont').attr('style', lgVideoStyle);\n }\n\n /**\n * Update slides dynamically.\n * Add, edit or delete slides dynamically when lightGallery is opened.\n * Modify the current gallery items and pass it via updateSlides method\n * @note\n * - Do not mutate existing lightGallery items directly.\n * - Always pass new list of gallery items\n * - You need to take care of thumbnails outside the gallery if any\n * - user this method only if you want to update slides when the gallery is opened. Otherwise, use `refresh()` method.\n * @param items Gallery items\n * @param index After the update operation, which slide gallery should navigate to\n * @category lGPublicMethods\n * @example\n * const plugin = lightGallery();\n *\n * // Adding slides dynamically\n * let galleryItems = [\n * // Access existing lightGallery items\n * // galleryItems are automatically generated internally from the gallery HTML markup\n * // or directly from galleryItems when dynamic gallery is used\n * ...plugin.galleryItems,\n * ...[\n * {\n * src: 'img/img-1.png',\n * thumb: 'img/thumb1.png',\n * },\n * ],\n * ];\n * plugin.updateSlides(\n * galleryItems,\n * plugin.index,\n * );\n *\n *\n * // Remove slides dynamically\n * galleryItems = JSON.parse(\n * JSON.stringify(updateSlideInstance.galleryItems),\n * );\n * galleryItems.shift();\n * updateSlideInstance.updateSlides(galleryItems, 1);\n * @see Demo\n */\n updateSlides(items: GalleryItem[], index: number): void {\n if (this.index > items.length - 1) {\n this.index = items.length - 1;\n }\n if (items.length === 1) {\n this.index = 0;\n }\n if (!items.length) {\n this.closeGallery();\n return;\n }\n const currentSrc = this.galleryItems[index].src;\n this.galleryItems = items;\n this.updateControls();\n this.$inner.empty();\n this.currentItemsInDom = [];\n\n let _index = 0;\n // Find the current index based on source value of the slide\n this.galleryItems.some((galleryItem, itemIndex) => {\n if (galleryItem.src === currentSrc) {\n _index = itemIndex;\n return true;\n }\n return false;\n });\n\n this.currentItemsInDom = this.organizeSlideItems(_index, -1);\n this.loadContent(_index, true);\n this.getSlideItem(_index).addClass('lg-current');\n\n this.index = _index;\n this.updateCurrentCounter(_index);\n this.LGel.trigger(lGEvents.updateSlides);\n }\n\n // Get gallery items based on multiple conditions\n getItems(): GalleryItem[] {\n // Gallery items\n this.items = [];\n if (!this.settings.dynamic) {\n if (this.settings.selector === 'this') {\n this.items.push(this.el);\n } else if (this.settings.selector) {\n if (typeof this.settings.selector === 'string') {\n if (this.settings.selectWithin) {\n const selectWithin = $LG(this.settings.selectWithin);\n this.items = selectWithin\n .find(this.settings.selector)\n .get();\n } else {\n this.items = this.el.querySelectorAll(\n this.settings.selector,\n );\n }\n } else {\n this.items = this.settings.selector;\n }\n } else {\n this.items = this.el.children;\n }\n return utils.getDynamicOptions(\n this.items,\n this.settings.extraProps,\n this.settings.getCaptionFromTitleOrAlt,\n this.settings.exThumbImage,\n );\n } else {\n return this.settings.dynamicEl || [];\n }\n }\n\n shouldHideScrollbar(): boolean {\n return (\n this.settings.hideScrollbar &&\n document.body === this.settings.container\n );\n }\n\n hideScrollbar(): void {\n if (!this.shouldHideScrollbar()) {\n return;\n }\n this.bodyPaddingRight = parseFloat($LG('body').style().paddingRight);\n const bodyRect = document.documentElement.getBoundingClientRect();\n const scrollbarWidth = window.innerWidth - bodyRect.width;\n\n $LG(document.body).css(\n 'padding-right',\n scrollbarWidth + this.bodyPaddingRight + 'px',\n );\n $LG(document.body).addClass('lg-overlay-open');\n }\n\n resetScrollBar(): void {\n if (!this.shouldHideScrollbar()) {\n return;\n }\n $LG(document.body).css('padding-right', this.bodyPaddingRight + 'px');\n $LG(document.body).removeClass('lg-overlay-open');\n }\n\n /**\n * Open lightGallery.\n * Open gallery with specific slide by passing index of the slide as parameter.\n * @category lGPublicMethods\n * @param {Number} index - index of the slide\n * @param {HTMLElement} element - Which image lightGallery should zoom from\n *\n * @example\n * const $dynamicGallery = document.getElementById('dynamic-gallery-demo');\n * const dynamicGallery = lightGallery($dynamicGallery, {\n * dynamic: true,\n * dynamicEl: [\n * {\n * src: 'img/1.jpg',\n * thumb: 'img/thumb-1.jpg',\n * subHtml: '

Image 1 title

Image 1 descriptions.

',\n * },\n * ...\n * ],\n * });\n * $dynamicGallery.addEventListener('click', function () {\n * // Starts with third item.(Optional).\n * // This is useful if you want use dynamic mode with\n * // custom thumbnails (thumbnails outside gallery),\n * dynamicGallery.openGallery(2);\n * });\n *\n */\n openGallery(index = this.settings.index, element?: HTMLElement): void {\n // prevent accidental double execution\n if (this.lgOpened) return;\n this.lgOpened = true;\n this.outer.removeClass('lg-hide-items');\n\n this.hideScrollbar();\n\n // Add display block, but still has opacity 0\n this.$container.addClass('lg-show');\n\n const itemsToBeInsertedToDom = this.getItemsToBeInsertedToDom(\n index,\n index,\n );\n this.currentItemsInDom = itemsToBeInsertedToDom;\n\n let items = '';\n itemsToBeInsertedToDom.forEach((item) => {\n items = items + `
`;\n });\n\n this.$inner.append(items);\n this.addHtml(index);\n let transform: string | undefined = '';\n this.mediaContainerPosition = this.getMediaContainerPosition();\n const { top, bottom } = this.mediaContainerPosition;\n if (!this.settings.allowMediaOverlap) {\n this.setMediaContainerPosition(top, bottom);\n }\n const { __slideVideoInfo } = this.galleryItems[index];\n if (this.zoomFromOrigin && element) {\n this.currentImageSize = utils.getSize(\n element,\n this.outer,\n top + bottom,\n __slideVideoInfo && this.settings.videoMaxSize,\n );\n transform = utils.getTransform(\n element,\n this.outer,\n top,\n bottom,\n this.currentImageSize,\n );\n }\n if (!this.zoomFromOrigin || !transform) {\n this.outer.addClass(this.settings.startClass);\n this.getSlideItem(index).removeClass('lg-complete');\n }\n const timeout = this.settings.zoomFromOrigin\n ? 100\n : this.settings.backdropDuration;\n setTimeout(() => {\n this.outer.addClass('lg-components-open');\n }, timeout);\n this.index = index;\n this.LGel.trigger(lGEvents.beforeOpen);\n\n // add class lg-current to remove initial transition\n this.getSlideItem(index).addClass('lg-current');\n\n this.lGalleryOn = false;\n // Store the current scroll top value to scroll back after closing the gallery..\n this.prevScrollTop = $LG(window).scrollTop();\n\n setTimeout(() => {\n // Need to check both zoomFromOrigin and transform values as we need to set set the\n // default opening animation if user missed to add the lg-size attribute\n\n if (this.zoomFromOrigin && transform) {\n const currentSlide = this.getSlideItem(index);\n currentSlide.css('transform', transform);\n setTimeout(() => {\n currentSlide\n .addClass('lg-start-progress lg-start-end-progress')\n .css(\n 'transition-duration',\n this.settings.startAnimationDuration + 'ms',\n );\n this.outer.addClass('lg-zoom-from-image');\n });\n setTimeout(() => {\n currentSlide.css('transform', 'translate3d(0, 0, 0)');\n }, 100);\n }\n\n setTimeout(() => {\n this.$backdrop.addClass('in');\n this.$container.addClass('lg-show-in');\n }, 10);\n\n setTimeout(() => {\n if (\n this.settings.trapFocus &&\n document.body === this.settings.container\n ) {\n this.trapFocus();\n }\n }, this.settings.backdropDuration + 50);\n\n // lg-visible class resets gallery opacity to 1\n if (!this.zoomFromOrigin || !transform) {\n setTimeout(() => {\n this.outer.addClass('lg-visible');\n }, this.settings.backdropDuration);\n }\n\n // initiate slide function\n this.slide(index, false, false, false);\n\n this.LGel.trigger(lGEvents.afterOpen);\n });\n\n if (document.body === this.settings.container) {\n $LG('html').addClass('lg-on');\n }\n }\n\n /**\n * Note - Changing the position of the media on every slide transition creates a flickering effect.\n * Therefore, The height of the caption is calculated dynamically, only once based on the first slide caption.\n * if you have dynamic captions for each media,\n * you can provide an appropriate height for the captions via allowMediaOverlap option\n */\n public getMediaContainerPosition(): MediaContainerPosition {\n if (this.settings.allowMediaOverlap) {\n return {\n top: 0,\n bottom: 0,\n };\n }\n const top = this.$toolbar.get().clientHeight || 0;\n const subHtml = this.outer.find('.lg-components .lg-sub-html').get();\n const captionHeight =\n this.settings.defaultCaptionHeight ||\n (subHtml && subHtml.clientHeight) ||\n 0;\n const thumbContainer = this.outer.find('.lg-thumb-outer').get();\n const thumbHeight = thumbContainer ? thumbContainer.clientHeight : 0;\n const bottom = thumbHeight + captionHeight;\n return {\n top,\n bottom,\n };\n }\n\n private setMediaContainerPosition(top = 0, bottom = 0): void {\n this.$content.css('top', top + 'px').css('bottom', bottom + 'px');\n }\n\n hideBars(): void {\n // Hide controllers if mouse doesn't move for some period\n setTimeout(() => {\n this.outer.removeClass('lg-hide-items');\n if (this.settings.hideBarsDelay > 0) {\n this.outer.on('mousemove.lg click.lg touchstart.lg', () => {\n this.outer.removeClass('lg-hide-items');\n\n clearTimeout(this.hideBarTimeout);\n\n // Timeout will be cleared on each slide movement also\n this.hideBarTimeout = setTimeout(() => {\n this.outer.addClass('lg-hide-items');\n }, this.settings.hideBarsDelay);\n });\n this.outer.trigger('mousemove.lg');\n }\n }, this.settings.showBarsAfter);\n }\n\n initPictureFill($img: lgQuery): void {\n if (this.settings.supportLegacyBrowser) {\n try {\n picturefill({\n elements: [$img.get()],\n });\n } catch (e) {\n console.warn(\n 'lightGallery :- If you want srcset or picture tag to be supported for older browser please include picturefil javascript library in your document.',\n );\n }\n }\n }\n\n /**\n * @desc Create image counter\n * Ex: 1/10\n */\n counter(): void {\n if (this.settings.counter) {\n const counterHtml = `
\n ${this.index + 1} /\n ${\n this.galleryItems.length\n }
`;\n this.outer.find(this.settings.appendCounterTo).append(counterHtml);\n }\n }\n\n /**\n * @desc add sub-html into the slide\n * @param {Number} index - index of the slide\n */\n addHtml(index: number): void {\n let subHtml;\n let subHtmlUrl;\n if (this.galleryItems[index].subHtmlUrl) {\n subHtmlUrl = this.galleryItems[index].subHtmlUrl;\n } else {\n subHtml = this.galleryItems[index].subHtml;\n }\n\n if (!subHtmlUrl) {\n if (subHtml) {\n // get first letter of sub-html\n // if first letter starts with . or # get the html form the jQuery object\n const fL = subHtml.substring(0, 1);\n if (fL === '.' || fL === '#') {\n if (\n this.settings.subHtmlSelectorRelative &&\n !this.settings.dynamic\n ) {\n subHtml = $LG(this.items)\n .eq(index)\n .find(subHtml)\n .first()\n .html();\n } else {\n subHtml = $LG(subHtml).first().html();\n }\n }\n } else {\n subHtml = '';\n }\n }\n\n if (this.settings.appendSubHtmlTo !== '.lg-item') {\n if (subHtmlUrl) {\n this.outer.find('.lg-sub-html').load(subHtmlUrl);\n } else {\n this.outer.find('.lg-sub-html').html(subHtml as string);\n }\n } else {\n const currentSlide = $LG(this.getSlideItemId(index));\n if (subHtmlUrl) {\n currentSlide.load(subHtmlUrl);\n } else {\n currentSlide.append(\n `
${subHtml}
`,\n );\n }\n }\n\n // Add lg-empty-html class if title doesn't exist\n if (typeof subHtml !== 'undefined' && subHtml !== null) {\n if (subHtml === '') {\n this.outer\n .find(this.settings.appendSubHtmlTo)\n .addClass('lg-empty-html');\n } else {\n this.outer\n .find(this.settings.appendSubHtmlTo)\n .removeClass('lg-empty-html');\n }\n }\n\n this.LGel.trigger(\n lGEvents.afterAppendSubHtml,\n {\n index,\n },\n );\n }\n\n /**\n * @desc Preload slides\n * @param {Number} index - index of the slide\n * @todo preload not working for the first slide, Also, should work for the first and last slide as well\n */\n preload(index: number): void {\n for (let i = 1; i <= this.settings.preload; i++) {\n if (i >= this.galleryItems.length - index) {\n break;\n }\n\n this.loadContent(index + i, false);\n }\n\n for (let j = 1; j <= this.settings.preload; j++) {\n if (index - j < 0) {\n break;\n }\n\n this.loadContent(index - j, false);\n }\n }\n\n getDummyImgStyles(imageSize?: ImageSize): string {\n if (!imageSize) return '';\n return `width:${imageSize.width}px;\n margin-left: -${imageSize.width / 2}px;\n margin-top: -${imageSize.height / 2}px;\n height:${imageSize.height}px`;\n }\n getVideoContStyle(imageSize?: ImageSize): string {\n if (!imageSize) return '';\n return `width:${imageSize.width}px;\n height:${imageSize.height}px`;\n }\n\n getDummyImageContent(\n $currentSlide: lgQuery,\n index: number,\n alt: string,\n ): string {\n let $currentItem;\n if (!this.settings.dynamic) {\n $currentItem = $LG(this.items).eq(index);\n }\n if ($currentItem) {\n let _dummyImgSrc;\n if (!this.settings.exThumbImage) {\n _dummyImgSrc = $currentItem.find('img').first().attr('src');\n } else {\n _dummyImgSrc = $currentItem.attr(this.settings.exThumbImage);\n }\n if (!_dummyImgSrc) return '';\n const imgStyle = this.getDummyImgStyles(this.currentImageSize);\n const dummyImgContent = ``;\n\n $currentSlide.addClass('lg-first-slide');\n this.outer.addClass('lg-first-slide-loading');\n\n return dummyImgContent;\n }\n return '';\n }\n\n setImgMarkup(src: string, $currentSlide: lgQuery, index: number): void {\n const currentGalleryItem = this.galleryItems[index];\n const { alt, srcset, sizes, sources } = currentGalleryItem;\n\n // Use the thumbnail as dummy image which will be resized to actual image size and\n // displayed on top of actual image\n let imgContent = '';\n const altAttr = alt ? 'alt=\"' + alt + '\"' : '';\n\n if (this.isFirstSlideWithZoomAnimation()) {\n imgContent = this.getDummyImageContent(\n $currentSlide,\n index,\n altAttr,\n );\n } else {\n imgContent = utils.getImgMarkup(\n index,\n src,\n altAttr,\n srcset,\n sizes,\n sources,\n );\n }\n const imgMarkup = ` ${imgContent}`;\n $currentSlide.prepend(imgMarkup);\n }\n\n onSlideObjectLoad(\n $slide: lgQuery,\n isHTML5VideoWithoutPoster: boolean,\n onLoad: () => void,\n onError: () => void,\n ): void {\n const mediaObject = $slide.find('.lg-object').first();\n if (\n utils.isImageLoaded(mediaObject.get() as HTMLImageElement) ||\n isHTML5VideoWithoutPoster\n ) {\n onLoad();\n } else {\n mediaObject.on('load.lg error.lg', () => {\n onLoad && onLoad();\n });\n mediaObject.on('error.lg', () => {\n onError && onError();\n });\n }\n }\n\n /**\n *\n * @param $el Current slide item\n * @param index\n * @param delay Delay is 0 except first time\n * @param speed Speed is same as delay, except it is 0 if gallery is opened via hash plugin\n * @param isFirstSlide\n */\n onLgObjectLoad(\n currentSlide: lgQuery,\n index: number,\n delay: number,\n speed: number,\n isFirstSlide: boolean,\n isHTML5VideoWithoutPoster: boolean,\n ): void {\n this.onSlideObjectLoad(\n currentSlide,\n isHTML5VideoWithoutPoster,\n () => {\n this.triggerSlideItemLoad(\n currentSlide,\n index,\n delay,\n speed,\n isFirstSlide,\n );\n },\n () => {\n currentSlide.addClass('lg-complete lg-complete_');\n currentSlide.html(\n 'Oops... Failed to load content...',\n );\n },\n );\n }\n\n triggerSlideItemLoad(\n $currentSlide: lgQuery,\n index: number,\n delay: number,\n speed: number,\n isFirstSlide: boolean,\n ): void {\n const currentGalleryItem = this.galleryItems[index];\n\n // Adding delay for video slides without poster for better performance and user experience\n // Videos should start playing once once the gallery is completely loaded\n const _speed =\n isFirstSlide &&\n this.getSlideType(currentGalleryItem) === 'video' &&\n !currentGalleryItem.poster\n ? speed\n : 0;\n setTimeout(() => {\n $currentSlide.addClass('lg-complete lg-complete_');\n this.LGel.trigger(lGEvents.slideItemLoad, {\n index,\n delay: delay || 0,\n isFirstSlide,\n });\n }, _speed);\n }\n\n isFirstSlideWithZoomAnimation(): boolean {\n return !!(\n !this.lGalleryOn &&\n this.zoomFromOrigin &&\n this.currentImageSize\n );\n }\n\n // Add video slideInfo\n addSlideVideoInfo(items: GalleryItem[]): void {\n items.forEach((element, index) => {\n element.__slideVideoInfo = utils.isVideo(\n element.src as string,\n !!element.video,\n index,\n );\n if (\n element.__slideVideoInfo &&\n this.settings.loadYouTubePoster &&\n !element.poster &&\n element.__slideVideoInfo.youtube\n ) {\n element.poster = `//img.youtube.com/vi/${element.__slideVideoInfo.youtube[1]}/maxresdefault.jpg`;\n }\n });\n }\n\n /**\n * Load slide content into slide.\n * This is used to load content into slides that is not visible too\n * @param {Number} index - index of the slide.\n * @param {Boolean} rec - if true call loadcontent() function again.\n */\n loadContent(index: number, rec: boolean): void {\n const currentGalleryItem = this.galleryItems[index];\n const $currentSlide = $LG(this.getSlideItemId(index));\n\n const { poster, srcset, sizes, sources } = currentGalleryItem;\n let { src } = currentGalleryItem;\n\n const video = currentGalleryItem.video;\n\n const _html5Video =\n video && typeof video === 'string' ? JSON.parse(video) : video;\n\n if (currentGalleryItem.responsive) {\n const srcDyItms = currentGalleryItem.responsive.split(',');\n src = utils.getResponsiveSrc(srcDyItms) || src;\n }\n\n const videoInfo = currentGalleryItem.__slideVideoInfo;\n let lgVideoStyle = '';\n\n const iframe = !!currentGalleryItem.iframe;\n\n const isFirstSlide = !this.lGalleryOn;\n\n // delay for adding complete class. it is 0 except first time.\n let delay = 0;\n if (isFirstSlide) {\n if (this.zoomFromOrigin && this.currentImageSize) {\n delay = this.settings.startAnimationDuration + 10;\n } else {\n delay = this.settings.backdropDuration + 10;\n }\n }\n\n if (!$currentSlide.hasClass('lg-loaded')) {\n if (videoInfo) {\n const { top, bottom } = this.mediaContainerPosition;\n const videoSize = utils.getSize(\n this.items[index],\n this.outer,\n top + bottom,\n videoInfo && this.settings.videoMaxSize,\n );\n lgVideoStyle = this.getVideoContStyle(videoSize);\n }\n if (iframe) {\n const markup = utils.getIframeMarkup(\n this.settings.iframeWidth,\n this.settings.iframeHeight,\n this.settings.iframeMaxWidth,\n this.settings.iframeMaxHeight,\n src,\n currentGalleryItem.iframeTitle,\n );\n $currentSlide.prepend(markup);\n } else if (poster) {\n let dummyImg = '';\n const hasStartAnimation =\n isFirstSlide &&\n this.zoomFromOrigin &&\n this.currentImageSize;\n if (hasStartAnimation) {\n dummyImg = this.getDummyImageContent(\n $currentSlide,\n index,\n '',\n );\n }\n\n const markup = utils.getVideoPosterMarkup(\n poster,\n dummyImg || '',\n lgVideoStyle,\n this.settings.strings['playVideo'],\n videoInfo,\n );\n $currentSlide.prepend(markup);\n } else if (videoInfo) {\n const markup = `
`;\n $currentSlide.prepend(markup);\n } else {\n this.setImgMarkup(src as string, $currentSlide, index);\n if (srcset || sources) {\n const $img = $currentSlide.find('.lg-object');\n this.initPictureFill($img);\n }\n }\n if (poster || videoInfo) {\n this.LGel.trigger(lGEvents.hasVideo, {\n index,\n src: src,\n html5Video: _html5Video,\n hasPoster: !!poster,\n });\n }\n\n this.LGel.trigger(\n lGEvents.afterAppendSlide,\n { index },\n );\n\n if (\n this.lGalleryOn &&\n this.settings.appendSubHtmlTo === '.lg-item'\n ) {\n this.addHtml(index);\n }\n }\n\n // For first time add some delay for displaying the start animation.\n let _speed = 0;\n\n // Do not change the delay value because it is required for zoom plugin.\n // If gallery opened from direct url (hash) speed value should be 0\n if (delay && !$LG(document.body).hasClass('lg-from-hash')) {\n _speed = delay;\n }\n\n // Only for first slide and zoomFromOrigin is enabled\n if (this.isFirstSlideWithZoomAnimation()) {\n setTimeout(() => {\n $currentSlide\n .removeClass('lg-start-end-progress lg-start-progress')\n .removeAttr('style');\n }, this.settings.startAnimationDuration + 100);\n if (!$currentSlide.hasClass('lg-loaded')) {\n setTimeout(() => {\n if (this.getSlideType(currentGalleryItem) === 'image') {\n const { alt } = currentGalleryItem;\n const altAttr = alt ? 'alt=\"' + alt + '\"' : '';\n\n $currentSlide\n .find('.lg-img-wrap')\n .append(\n utils.getImgMarkup(\n index,\n src as string,\n altAttr,\n srcset,\n sizes,\n currentGalleryItem.sources,\n ),\n );\n if (srcset || sources) {\n const $img = $currentSlide.find('.lg-object');\n this.initPictureFill($img);\n }\n }\n if (\n this.getSlideType(currentGalleryItem) === 'image' ||\n (this.getSlideType(currentGalleryItem) === 'video' &&\n poster)\n ) {\n this.onLgObjectLoad(\n $currentSlide,\n index,\n delay,\n _speed,\n true,\n false,\n );\n\n // load remaining slides once the slide is completely loaded\n this.onSlideObjectLoad(\n $currentSlide,\n !!(videoInfo && videoInfo.html5 && !poster),\n () => {\n this.loadContentOnFirstSlideLoad(\n index,\n $currentSlide,\n _speed,\n );\n },\n () => {\n this.loadContentOnFirstSlideLoad(\n index,\n $currentSlide,\n _speed,\n );\n },\n );\n }\n }, this.settings.startAnimationDuration + 100);\n }\n }\n\n // SLide content has been added to dom\n $currentSlide.addClass('lg-loaded');\n\n if (\n !this.isFirstSlideWithZoomAnimation() ||\n (this.getSlideType(currentGalleryItem) === 'video' && !poster)\n ) {\n this.onLgObjectLoad(\n $currentSlide,\n index,\n delay,\n _speed,\n isFirstSlide,\n !!(videoInfo && videoInfo.html5 && !poster),\n );\n }\n\n // When gallery is opened once content is loaded (second time) need to add lg-complete class for css styling\n if (\n (!this.zoomFromOrigin || !this.currentImageSize) &&\n $currentSlide.hasClass('lg-complete_') &&\n !this.lGalleryOn\n ) {\n setTimeout(() => {\n $currentSlide.addClass('lg-complete');\n }, this.settings.backdropDuration);\n }\n\n // Content loaded\n // Need to set lGalleryOn before calling preload function\n this.lGalleryOn = true;\n\n if (rec === true) {\n if (!$currentSlide.hasClass('lg-complete_')) {\n $currentSlide\n .find('.lg-object')\n .first()\n .on('load.lg error.lg', () => {\n this.preload(index);\n });\n } else {\n this.preload(index);\n }\n }\n }\n\n /**\n * @desc Remove dummy image content and load next slides\n * Called only for the first time if zoomFromOrigin animation is enabled\n * @param index\n * @param $currentSlide\n * @param speed\n */\n loadContentOnFirstSlideLoad(\n index: number,\n $currentSlide: lgQuery,\n speed: number,\n ): void {\n setTimeout(() => {\n $currentSlide.find('.lg-dummy-img').remove();\n $currentSlide.removeClass('lg-first-slide');\n this.outer.removeClass('lg-first-slide-loading');\n this.isDummyImageRemoved = true;\n this.preload(index);\n }, speed + 300);\n }\n\n getItemsToBeInsertedToDom(\n index: number,\n prevIndex: number,\n numberOfItems = 0,\n ): string[] {\n const itemsToBeInsertedToDom: string[] = [];\n // Minimum 2 items should be there\n let possibleNumberOfItems = Math.max(numberOfItems, 3);\n possibleNumberOfItems = Math.min(\n possibleNumberOfItems,\n this.galleryItems.length,\n );\n const prevIndexItem = `lg-item-${this.lgId}-${prevIndex}`;\n if (this.galleryItems.length <= 3) {\n this.galleryItems.forEach((_element, index) => {\n itemsToBeInsertedToDom.push(`lg-item-${this.lgId}-${index}`);\n });\n return itemsToBeInsertedToDom;\n }\n\n if (index < (this.galleryItems.length - 1) / 2) {\n for (\n let idx = index;\n idx > index - possibleNumberOfItems / 2 && idx >= 0;\n idx--\n ) {\n itemsToBeInsertedToDom.push(`lg-item-${this.lgId}-${idx}`);\n }\n const numberOfExistingItems = itemsToBeInsertedToDom.length;\n for (\n let idx = 0;\n idx < possibleNumberOfItems - numberOfExistingItems;\n idx++\n ) {\n itemsToBeInsertedToDom.push(\n `lg-item-${this.lgId}-${index + idx + 1}`,\n );\n }\n } else {\n for (\n let idx = index;\n idx <= this.galleryItems.length - 1 &&\n idx < index + possibleNumberOfItems / 2;\n idx++\n ) {\n itemsToBeInsertedToDom.push(`lg-item-${this.lgId}-${idx}`);\n }\n const numberOfExistingItems = itemsToBeInsertedToDom.length;\n for (\n let idx = 0;\n idx < possibleNumberOfItems - numberOfExistingItems;\n idx++\n ) {\n itemsToBeInsertedToDom.push(\n `lg-item-${this.lgId}-${index - idx - 1}`,\n );\n }\n }\n if (this.settings.loop) {\n if (index === this.galleryItems.length - 1) {\n itemsToBeInsertedToDom.push(`lg-item-${this.lgId}-${0}`);\n } else if (index === 0) {\n itemsToBeInsertedToDom.push(\n `lg-item-${this.lgId}-${this.galleryItems.length - 1}`,\n );\n }\n }\n if (itemsToBeInsertedToDom.indexOf(prevIndexItem) === -1) {\n itemsToBeInsertedToDom.push(`lg-item-${this.lgId}-${prevIndex}`);\n }\n\n return itemsToBeInsertedToDom;\n }\n\n organizeSlideItems(index: number, prevIndex: number): string[] {\n const itemsToBeInsertedToDom = this.getItemsToBeInsertedToDom(\n index,\n prevIndex,\n this.settings.numberOfSlideItemsInDom,\n );\n\n itemsToBeInsertedToDom.forEach((item) => {\n if (this.currentItemsInDom.indexOf(item) === -1) {\n this.$inner.append(`
`);\n }\n });\n\n this.currentItemsInDom.forEach((item) => {\n if (itemsToBeInsertedToDom.indexOf(item) === -1) {\n $LG(`#${item}`).remove();\n }\n });\n return itemsToBeInsertedToDom;\n }\n\n /**\n * Get previous index of the slide\n */\n getPreviousSlideIndex(): number {\n let prevIndex = 0;\n try {\n const currentItemId = this.outer\n .find('.lg-current')\n .first()\n .attr('id');\n prevIndex = parseInt(currentItemId.split('-')[3]) || 0;\n } catch (error) {\n prevIndex = 0;\n }\n return prevIndex;\n }\n\n setDownloadValue(index: number): void {\n if (this.settings.download) {\n const currentGalleryItem = this.galleryItems[index];\n const hideDownloadBtn =\n currentGalleryItem.downloadUrl === false ||\n currentGalleryItem.downloadUrl === 'false';\n if (hideDownloadBtn) {\n this.outer.addClass('lg-hide-download');\n } else {\n const $download = this.getElementById('lg-download');\n this.outer.removeClass('lg-hide-download');\n $download.attr(\n 'href',\n currentGalleryItem.downloadUrl ||\n (currentGalleryItem.src as string),\n );\n if (currentGalleryItem.download) {\n $download.attr('download', currentGalleryItem.download);\n }\n }\n }\n }\n\n makeSlideAnimation(\n direction: 'next' | 'prev',\n currentSlideItem: lgQuery,\n previousSlideItem: lgQuery,\n ): void {\n if (this.lGalleryOn) {\n previousSlideItem.addClass('lg-slide-progress');\n }\n setTimeout(\n () => {\n // remove all transitions\n this.outer.addClass('lg-no-trans');\n\n this.outer\n .find('.lg-item')\n .removeClass('lg-prev-slide lg-next-slide');\n\n if (direction === 'prev') {\n //prevslide\n currentSlideItem.addClass('lg-prev-slide');\n previousSlideItem.addClass('lg-next-slide');\n } else {\n // next slide\n currentSlideItem.addClass('lg-next-slide');\n previousSlideItem.addClass('lg-prev-slide');\n }\n\n // give 50 ms for browser to add/remove class\n setTimeout(() => {\n this.outer.find('.lg-item').removeClass('lg-current');\n\n currentSlideItem.addClass('lg-current');\n\n // reset all transitions\n this.outer.removeClass('lg-no-trans');\n }, 50);\n },\n this.lGalleryOn ? this.settings.slideDelay : 0,\n );\n }\n\n /**\n * Goto a specific slide.\n * @param {Number} index - index of the slide\n * @param {Boolean} fromTouch - true if slide function called via touch event or mouse drag\n * @param {Boolean} fromThumb - true if slide function called via thumbnail click\n * @param {String} direction - Direction of the slide(next/prev)\n * @category lGPublicMethods\n * @example\n * const plugin = lightGallery();\n * // to go to 3rd slide\n * plugin.slide(2);\n *\n */\n slide(\n index: number,\n fromTouch?: boolean,\n fromThumb?: boolean,\n direction?: SlideDirection | false,\n ): void {\n const prevIndex = this.getPreviousSlideIndex();\n this.currentItemsInDom = this.organizeSlideItems(index, prevIndex);\n\n // Prevent multiple call, Required for hsh plugin\n if (this.lGalleryOn && prevIndex === index) {\n return;\n }\n\n const numberOfGalleryItems = this.galleryItems.length;\n\n if (!this.lgBusy) {\n if (this.settings.counter) {\n this.updateCurrentCounter(index);\n }\n\n const currentSlideItem = this.getSlideItem(index);\n const previousSlideItem = this.getSlideItem(prevIndex);\n\n const currentGalleryItem = this.galleryItems[index];\n const videoInfo = currentGalleryItem.__slideVideoInfo;\n\n this.outer.attr(\n 'data-lg-slide-type',\n this.getSlideType(currentGalleryItem),\n );\n this.setDownloadValue(index);\n\n if (videoInfo) {\n const { top, bottom } = this.mediaContainerPosition;\n const videoSize = utils.getSize(\n this.items[index],\n this.outer,\n top + bottom,\n videoInfo && this.settings.videoMaxSize,\n );\n this.resizeVideoSlide(index, videoSize);\n }\n\n this.LGel.trigger(lGEvents.beforeSlide, {\n prevIndex,\n index,\n fromTouch: !!fromTouch,\n fromThumb: !!fromThumb,\n });\n\n this.lgBusy = true;\n\n clearTimeout(this.hideBarTimeout);\n\n this.arrowDisable(index);\n\n if (!direction) {\n if (index < prevIndex) {\n direction = 'prev';\n } else if (index > prevIndex) {\n direction = 'next';\n }\n }\n\n if (!fromTouch) {\n this.makeSlideAnimation(\n direction as SlideDirection,\n currentSlideItem,\n previousSlideItem,\n );\n } else {\n this.outer\n .find('.lg-item')\n .removeClass('lg-prev-slide lg-current lg-next-slide');\n let touchPrev;\n let touchNext;\n if (numberOfGalleryItems > 2) {\n touchPrev = index - 1;\n touchNext = index + 1;\n\n if (index === 0 && prevIndex === numberOfGalleryItems - 1) {\n // next slide\n touchNext = 0;\n touchPrev = numberOfGalleryItems - 1;\n } else if (\n index === numberOfGalleryItems - 1 &&\n prevIndex === 0\n ) {\n // prev slide\n touchNext = 0;\n touchPrev = numberOfGalleryItems - 1;\n }\n } else {\n touchPrev = 0;\n touchNext = 1;\n }\n\n if (direction === 'prev') {\n this.getSlideItem(touchNext).addClass('lg-next-slide');\n } else {\n this.getSlideItem(touchPrev).addClass('lg-prev-slide');\n }\n\n currentSlideItem.addClass('lg-current');\n }\n\n // Do not put load content in set timeout as it needs to load immediately when the gallery is opened\n if (!this.lGalleryOn) {\n this.loadContent(index, true);\n } else {\n setTimeout(() => {\n this.loadContent(index, true);\n // Add title if this.settings.appendSubHtmlTo === lg-sub-html\n if (this.settings.appendSubHtmlTo !== '.lg-item') {\n this.addHtml(index);\n }\n }, this.settings.speed + 50 + (fromTouch ? 0 : this.settings.slideDelay));\n }\n\n setTimeout(() => {\n this.lgBusy = false;\n previousSlideItem.removeClass('lg-slide-progress');\n this.LGel.trigger(lGEvents.afterSlide, {\n prevIndex: prevIndex,\n index,\n fromTouch,\n fromThumb,\n });\n }, (this.lGalleryOn ? this.settings.speed + 100 : 100) + (fromTouch ? 0 : this.settings.slideDelay));\n }\n\n this.index = index;\n }\n\n updateCurrentCounter(index: number): void {\n this.getElementById('lg-counter-current').html(index + 1 + '');\n }\n\n updateCounterTotal(): void {\n this.getElementById('lg-counter-all').html(\n this.galleryItems.length + '',\n );\n }\n\n getSlideType(item: GalleryItem): 'video' | 'iframe' | 'image' {\n if (item.__slideVideoInfo) {\n return 'video';\n } else if (item.iframe) {\n return 'iframe';\n } else {\n return 'image';\n }\n }\n\n touchMove(startCoords: Coords, endCoords: Coords, e?: TouchEvent): void {\n const distanceX = endCoords.pageX - startCoords.pageX;\n const distanceY = endCoords.pageY - startCoords.pageY;\n let allowSwipe = false;\n\n if (this.swipeDirection) {\n allowSwipe = true;\n } else {\n if (Math.abs(distanceX) > 15) {\n this.swipeDirection = 'horizontal';\n allowSwipe = true;\n } else if (Math.abs(distanceY) > 15) {\n this.swipeDirection = 'vertical';\n allowSwipe = true;\n }\n }\n\n if (!allowSwipe) {\n return;\n }\n\n const $currentSlide = this.getSlideItem(this.index);\n\n if (this.swipeDirection === 'horizontal') {\n e?.preventDefault();\n // reset opacity and transition duration\n this.outer.addClass('lg-dragging');\n\n // move current slide\n this.setTranslate($currentSlide, distanceX, 0);\n\n // move next and prev slide with current slide\n const width = $currentSlide.get().offsetWidth;\n const slideWidthAmount = (width * 15) / 100;\n const gutter = slideWidthAmount - Math.abs((distanceX * 10) / 100);\n this.setTranslate(\n this.outer.find('.lg-prev-slide').first(),\n -width + distanceX - gutter,\n 0,\n );\n\n this.setTranslate(\n this.outer.find('.lg-next-slide').first(),\n width + distanceX + gutter,\n 0,\n );\n } else if (this.swipeDirection === 'vertical') {\n if (this.settings.swipeToClose) {\n e?.preventDefault();\n this.$container.addClass('lg-dragging-vertical');\n\n const opacity = 1 - Math.abs(distanceY) / window.innerHeight;\n this.$backdrop.css('opacity', opacity);\n\n const scale = 1 - Math.abs(distanceY) / (window.innerWidth * 2);\n this.setTranslate($currentSlide, 0, distanceY, scale, scale);\n if (Math.abs(distanceY) > 100) {\n this.outer\n .addClass('lg-hide-items')\n .removeClass('lg-components-open');\n }\n }\n }\n }\n\n touchEnd(endCoords: Coords, startCoords: Coords, event: TouchEvent): void {\n let distance;\n\n // keep slide animation for any mode while dragg/swipe\n if (this.settings.mode !== 'lg-slide') {\n this.outer.addClass('lg-slide');\n }\n\n // set transition duration\n setTimeout(() => {\n this.$container.removeClass('lg-dragging-vertical');\n this.outer\n .removeClass('lg-dragging lg-hide-items')\n .addClass('lg-components-open');\n\n let triggerClick = true;\n\n if (this.swipeDirection === 'horizontal') {\n distance = endCoords.pageX - startCoords.pageX;\n const distanceAbs = Math.abs(\n endCoords.pageX - startCoords.pageX,\n );\n if (\n distance < 0 &&\n distanceAbs > this.settings.swipeThreshold\n ) {\n this.goToNextSlide(true);\n triggerClick = false;\n } else if (\n distance > 0 &&\n distanceAbs > this.settings.swipeThreshold\n ) {\n this.goToPrevSlide(true);\n triggerClick = false;\n }\n } else if (this.swipeDirection === 'vertical') {\n distance = Math.abs(endCoords.pageY - startCoords.pageY);\n if (\n this.settings.closable &&\n this.settings.swipeToClose &&\n distance > 100\n ) {\n this.closeGallery();\n return;\n } else {\n this.$backdrop.css('opacity', 1);\n }\n }\n this.outer.find('.lg-item').removeAttr('style');\n\n if (\n triggerClick &&\n Math.abs(endCoords.pageX - startCoords.pageX) < 5\n ) {\n // Trigger click if distance is less than 5 pix\n const target = $LG(event.target);\n if (this.isPosterElement(target)) {\n this.LGel.trigger(lGEvents.posterClick);\n }\n }\n\n this.swipeDirection = undefined;\n });\n\n // remove slide class once drag/swipe is completed if mode is not slide\n setTimeout(() => {\n if (\n !this.outer.hasClass('lg-dragging') &&\n this.settings.mode !== 'lg-slide'\n ) {\n this.outer.removeClass('lg-slide');\n }\n }, this.settings.speed + 100);\n }\n\n enableSwipe(): void {\n let startCoords: Coords = {} as Coords;\n let endCoords: Coords = {} as Coords;\n let isMoved = false;\n let isSwiping = false;\n\n if (this.settings.enableSwipe) {\n this.$inner.on('touchstart.lg', (e) => {\n this.dragOrSwipeEnabled = true;\n const $item = this.getSlideItem(this.index);\n if (\n ($LG(e.target).hasClass('lg-item') ||\n $item.get().contains(e.target)) &&\n !this.outer.hasClass('lg-zoomed') &&\n !this.lgBusy &&\n e.touches.length === 1\n ) {\n isSwiping = true;\n this.touchAction = 'swipe';\n this.manageSwipeClass();\n startCoords = {\n pageX: e.touches[0].pageX,\n pageY: e.touches[0].pageY,\n };\n }\n });\n\n this.$inner.on('touchmove.lg', (e) => {\n if (\n isSwiping &&\n this.touchAction === 'swipe' &&\n e.touches.length === 1\n ) {\n endCoords = {\n pageX: e.touches[0].pageX,\n pageY: e.touches[0].pageY,\n };\n this.touchMove(startCoords, endCoords, e);\n isMoved = true;\n }\n });\n\n this.$inner.on('touchend.lg', (event: TouchEvent) => {\n if (this.touchAction === 'swipe') {\n if (isMoved) {\n isMoved = false;\n this.touchEnd(endCoords, startCoords, event);\n } else if (isSwiping) {\n const target = $LG(event.target);\n if (this.isPosterElement(target)) {\n this.LGel.trigger(lGEvents.posterClick);\n }\n }\n this.touchAction = undefined;\n isSwiping = false;\n }\n });\n }\n }\n\n enableDrag(): void {\n let startCoords: Coords = {} as Coords;\n let endCoords: Coords = {} as Coords;\n let isDraging = false;\n let isMoved = false;\n if (this.settings.enableDrag) {\n this.outer.on('mousedown.lg', (e) => {\n this.dragOrSwipeEnabled = true;\n const $item = this.getSlideItem(this.index);\n if (\n $LG(e.target).hasClass('lg-item') ||\n $item.get().contains(e.target)\n ) {\n if (!this.outer.hasClass('lg-zoomed') && !this.lgBusy) {\n e.preventDefault();\n if (!this.lgBusy) {\n this.manageSwipeClass();\n startCoords = {\n pageX: e.pageX,\n pageY: e.pageY,\n };\n isDraging = true;\n\n // ** Fix for webkit cursor issue https://code.google.com/p/chromium/issues/detail?id=26723\n this.outer.get().scrollLeft += 1;\n this.outer.get().scrollLeft -= 1;\n\n // *\n\n this.outer\n .removeClass('lg-grab')\n .addClass('lg-grabbing');\n\n this.LGel.trigger(lGEvents.dragStart);\n }\n }\n }\n });\n\n $LG(window).on(`mousemove.lg.global${this.lgId}`, (e) => {\n if (isDraging && this.lgOpened) {\n isMoved = true;\n endCoords = {\n pageX: e.pageX,\n pageY: e.pageY,\n };\n this.touchMove(startCoords, endCoords);\n this.LGel.trigger(lGEvents.dragMove);\n }\n });\n\n $LG(window).on(`mouseup.lg.global${this.lgId}`, (event) => {\n if (!this.lgOpened) {\n return;\n }\n const target = $LG(event.target);\n if (isMoved) {\n isMoved = false;\n this.touchEnd(endCoords, startCoords, event);\n this.LGel.trigger(lGEvents.dragEnd);\n } else if (this.isPosterElement(target)) {\n this.LGel.trigger(lGEvents.posterClick);\n }\n\n // Prevent execution on click\n if (isDraging) {\n isDraging = false;\n this.outer.removeClass('lg-grabbing').addClass('lg-grab');\n }\n });\n }\n }\n\n triggerPosterClick(): void {\n this.$inner.on('click.lg', (event) => {\n if (\n !this.dragOrSwipeEnabled &&\n this.isPosterElement($LG(event.target))\n ) {\n this.LGel.trigger(lGEvents.posterClick);\n }\n });\n }\n\n manageSwipeClass(): void {\n let _touchNext = this.index + 1;\n let _touchPrev = this.index - 1;\n if (this.settings.loop && this.galleryItems.length > 2) {\n if (this.index === 0) {\n _touchPrev = this.galleryItems.length - 1;\n } else if (this.index === this.galleryItems.length - 1) {\n _touchNext = 0;\n }\n }\n\n this.outer.find('.lg-item').removeClass('lg-next-slide lg-prev-slide');\n if (_touchPrev > -1) {\n this.getSlideItem(_touchPrev).addClass('lg-prev-slide');\n }\n\n this.getSlideItem(_touchNext).addClass('lg-next-slide');\n }\n\n /**\n * Go to next slide\n * @param {Boolean} fromTouch - true if slide function called via touch event\n * @category lGPublicMethods\n * @example\n * const plugin = lightGallery();\n * plugin.goToNextSlide();\n * @see Demo\n */\n goToNextSlide(fromTouch?: boolean): void {\n let _loop = this.settings.loop;\n if (fromTouch && this.galleryItems.length < 3) {\n _loop = false;\n }\n\n if (!this.lgBusy) {\n if (this.index + 1 < this.galleryItems.length) {\n this.index++;\n this.LGel.trigger(lGEvents.beforeNextSlide, {\n index: this.index,\n });\n this.slide(this.index, !!fromTouch, false, 'next');\n } else {\n if (_loop) {\n this.index = 0;\n this.LGel.trigger(lGEvents.beforeNextSlide, {\n index: this.index,\n });\n this.slide(this.index, !!fromTouch, false, 'next');\n } else if (this.settings.slideEndAnimation && !fromTouch) {\n this.outer.addClass('lg-right-end');\n setTimeout(() => {\n this.outer.removeClass('lg-right-end');\n }, 400);\n }\n }\n }\n }\n\n /**\n * Go to previous slides\n * @param {Boolean} fromTouch - true if slide function called via touch event\n * @category lGPublicMethods\n * @example\n * const plugin = lightGallery({});\n * plugin.goToPrevSlide();\n * @see Demo\n *\n */\n goToPrevSlide(fromTouch?: boolean): void {\n let _loop = this.settings.loop;\n if (fromTouch && this.galleryItems.length < 3) {\n _loop = false;\n }\n\n if (!this.lgBusy) {\n if (this.index > 0) {\n this.index--;\n this.LGel.trigger(lGEvents.beforePrevSlide, {\n index: this.index,\n fromTouch,\n });\n this.slide(this.index, !!fromTouch, false, 'prev');\n } else {\n if (_loop) {\n this.index = this.galleryItems.length - 1;\n this.LGel.trigger(lGEvents.beforePrevSlide, {\n index: this.index,\n fromTouch,\n });\n this.slide(this.index, !!fromTouch, false, 'prev');\n } else if (this.settings.slideEndAnimation && !fromTouch) {\n this.outer.addClass('lg-left-end');\n setTimeout(() => {\n this.outer.removeClass('lg-left-end');\n }, 400);\n }\n }\n }\n }\n\n keyPress(): void {\n $LG(window).on(`keydown.lg.global${this.lgId}`, (e) => {\n if (\n this.lgOpened &&\n this.settings.escKey === true &&\n e.keyCode === 27\n ) {\n e.preventDefault();\n if (\n this.settings.allowMediaOverlap &&\n this.outer.hasClass('lg-can-toggle') &&\n this.outer.hasClass('lg-components-open')\n ) {\n this.outer.removeClass('lg-components-open');\n } else {\n this.closeGallery();\n }\n }\n if (this.lgOpened && this.galleryItems.length > 1) {\n if (e.keyCode === 37) {\n e.preventDefault();\n this.goToPrevSlide();\n }\n\n if (e.keyCode === 39) {\n e.preventDefault();\n this.goToNextSlide();\n }\n }\n });\n }\n\n arrow(): void {\n this.getElementById('lg-prev').on('click.lg', () => {\n this.goToPrevSlide();\n });\n this.getElementById('lg-next').on('click.lg', () => {\n this.goToNextSlide();\n });\n }\n\n arrowDisable(index: number): void {\n // Disable arrows if settings.hideControlOnEnd is true\n if (!this.settings.loop && this.settings.hideControlOnEnd) {\n const $prev = this.getElementById('lg-prev');\n const $next = this.getElementById('lg-next');\n if (index + 1 === this.galleryItems.length) {\n $next.attr('disabled', 'disabled').addClass('disabled');\n } else {\n $next.removeAttr('disabled').removeClass('disabled');\n }\n\n if (index === 0) {\n $prev.attr('disabled', 'disabled').addClass('disabled');\n } else {\n $prev.removeAttr('disabled').removeClass('disabled');\n }\n }\n }\n\n setTranslate(\n $el: lgQuery,\n xValue: number,\n yValue: number,\n scaleX = 1,\n scaleY = 1,\n ): void {\n $el.css(\n 'transform',\n 'translate3d(' +\n xValue +\n 'px, ' +\n yValue +\n 'px, 0px) scale3d(' +\n scaleX +\n ', ' +\n scaleY +\n ', 1)',\n );\n }\n\n mousewheel(): void {\n let lastCall = 0;\n this.outer.on('wheel.lg', (e) => {\n if (!e.deltaY || this.galleryItems.length < 2) {\n return;\n }\n e.preventDefault();\n const now = new Date().getTime();\n if (now - lastCall < 1000) {\n return;\n }\n lastCall = now;\n if (e.deltaY > 0) {\n this.goToNextSlide();\n } else if (e.deltaY < 0) {\n this.goToPrevSlide();\n }\n });\n }\n\n isSlideElement(target: lgQuery): boolean {\n return (\n target.hasClass('lg-outer') ||\n target.hasClass('lg-item') ||\n target.hasClass('lg-img-wrap')\n );\n }\n\n isPosterElement(target: lgQuery): boolean {\n const playButton = this.getSlideItem(this.index)\n .find('.lg-video-play-button')\n .get();\n return (\n target.hasClass('lg-video-poster') ||\n target.hasClass('lg-video-play-button') ||\n (playButton && playButton.contains(target.get()))\n );\n }\n\n /**\n * Maximize minimize inline gallery.\n * @category lGPublicMethods\n */\n toggleMaximize(): void {\n this.getElementById('lg-maximize').on('click.lg', () => {\n this.$container.toggleClass('lg-inline');\n this.refreshOnResize();\n });\n }\n\n invalidateItems(): void {\n for (let index = 0; index < this.items.length; index++) {\n const element = this.items[index];\n const $element = $LG(element);\n $element.off(`click.lgcustom-item-${$element.attr('data-lg-id')}`);\n }\n }\n\n trapFocus(): void {\n this.$container.get().focus({\n preventScroll: true,\n });\n $LG(window).on(`keydown.lg.global${this.lgId}`, (e) => {\n if (!this.lgOpened) {\n return;\n }\n\n const isTabPressed = e.key === 'Tab' || e.keyCode === 9;\n if (!isTabPressed) {\n return;\n }\n const focusableEls = utils.getFocusableElements(\n this.$container.get(),\n );\n const firstFocusableEl = focusableEls[0];\n const lastFocusableEl = focusableEls[focusableEls.length - 1];\n\n if (e.shiftKey) {\n if (document.activeElement === firstFocusableEl) {\n (lastFocusableEl as HTMLElement).focus();\n e.preventDefault();\n }\n } else {\n if (document.activeElement === lastFocusableEl) {\n (firstFocusableEl as HTMLElement).focus();\n e.preventDefault();\n }\n }\n });\n }\n\n manageCloseGallery(): void {\n if (!this.settings.closable) return;\n let mousedown = false;\n this.getElementById('lg-close').on('click.lg', () => {\n this.closeGallery();\n });\n\n if (this.settings.closeOnTap) {\n // If you drag the slide and release outside gallery gets close on chrome\n // for preventing this check mousedown and mouseup happened on .lg-item or lg-outer\n this.outer.on('mousedown.lg', (e) => {\n const target = $LG(e.target);\n if (this.isSlideElement(target)) {\n mousedown = true;\n } else {\n mousedown = false;\n }\n });\n\n this.outer.on('mousemove.lg', () => {\n mousedown = false;\n });\n\n this.outer.on('mouseup.lg', (e) => {\n const target = $LG(e.target);\n if (this.isSlideElement(target) && mousedown) {\n if (!this.outer.hasClass('lg-dragging')) {\n this.closeGallery();\n }\n }\n });\n }\n }\n\n /**\n * Close lightGallery if it is opened.\n *\n * @description If closable is false in the settings, you need to pass true via closeGallery method to force close gallery\n * @return returns the estimated time to close gallery completely including the close animation duration\n * @category lGPublicMethods\n * @example\n * const plugin = lightGallery();\n * plugin.closeGallery();\n *\n */\n closeGallery(force?: boolean): number {\n if (!this.lgOpened || (!this.settings.closable && !force)) {\n return 0;\n }\n this.LGel.trigger(lGEvents.beforeClose);\n\n if (this.settings.resetScrollPosition && !this.settings.hideScrollbar) {\n $LG(window).scrollTop(this.prevScrollTop);\n }\n\n const currentItem = this.items[this.index];\n let transform: string | undefined;\n if (this.zoomFromOrigin && currentItem) {\n const { top, bottom } = this.mediaContainerPosition;\n const { __slideVideoInfo, poster } = this.galleryItems[this.index];\n const imageSize = utils.getSize(\n currentItem,\n this.outer,\n top + bottom,\n __slideVideoInfo && poster && this.settings.videoMaxSize,\n );\n transform = utils.getTransform(\n currentItem,\n this.outer,\n top,\n bottom,\n imageSize,\n );\n }\n if (this.zoomFromOrigin && transform) {\n this.outer.addClass('lg-closing lg-zoom-from-image');\n this.getSlideItem(this.index)\n .addClass('lg-start-end-progress')\n .css(\n 'transition-duration',\n this.settings.startAnimationDuration + 'ms',\n )\n .css('transform', transform);\n } else {\n this.outer.addClass('lg-hide-items');\n // lg-zoom-from-image is used for setting the opacity to 1 if zoomFromOrigin is true\n // If the closing item doesn't have the lg-size attribute, remove this class to avoid the closing css conflicts\n this.outer.removeClass('lg-zoom-from-image');\n }\n\n // Unbind all events added by lightGallery\n // @todo\n //this.$el.off('.lg.tm');\n\n this.destroyModules();\n\n this.lGalleryOn = false;\n this.isDummyImageRemoved = false;\n this.zoomFromOrigin = this.settings.zoomFromOrigin;\n\n clearTimeout(this.hideBarTimeout);\n this.hideBarTimeout = false;\n $LG('html').removeClass('lg-on');\n\n this.outer.removeClass('lg-visible lg-components-open');\n\n // Resetting opacity to 0 isd required as vertical swipe to close function adds inline opacity.\n this.$backdrop.removeClass('in').css('opacity', 0);\n\n const removeTimeout =\n this.zoomFromOrigin && transform\n ? Math.max(\n this.settings.startAnimationDuration,\n this.settings.backdropDuration,\n )\n : this.settings.backdropDuration;\n this.$container.removeClass('lg-show-in');\n\n // Once the closign animation is completed and gallery is invisible\n setTimeout(() => {\n if (this.zoomFromOrigin && transform) {\n this.outer.removeClass('lg-zoom-from-image');\n }\n this.$container.removeClass('lg-show');\n\n // Reset scrollbar\n this.resetScrollBar();\n\n // Need to remove inline opacity as it is used in the stylesheet as well\n this.$backdrop\n .removeAttr('style')\n .css(\n 'transition-duration',\n this.settings.backdropDuration + 'ms',\n );\n\n this.outer.removeClass(`lg-closing ${this.settings.startClass}`);\n\n this.getSlideItem(this.index).removeClass('lg-start-end-progress');\n this.$inner.empty();\n if (this.lgOpened) {\n this.LGel.trigger(lGEvents.afterClose, {\n instance: this,\n });\n }\n if (this.$container.get()) {\n this.$container.get().blur();\n }\n\n this.lgOpened = false;\n }, removeTimeout + 100);\n return removeTimeout + 100;\n }\n\n initModules(): void {\n this.plugins.forEach((module) => {\n try {\n module.init();\n } catch (err) {\n console.warn(\n `lightGallery:- make sure lightGallery module is properly initiated`,\n );\n }\n });\n }\n\n destroyModules(destroy?: true): void {\n this.plugins.forEach((module) => {\n try {\n if (destroy) {\n module.destroy();\n } else {\n module.closeGallery && module.closeGallery();\n }\n } catch (err) {\n console.warn(\n `lightGallery:- make sure lightGallery module is properly destroyed`,\n );\n }\n });\n }\n\n /**\n * Refresh lightGallery with new set of children.\n *\n * @description This is useful to update the gallery when the child elements are changed without calling destroy method.\n *\n * If you are using dynamic mode, you can pass the modified array of dynamicEl as the first parameter to refresh the dynamic gallery\n * @see Demo\n * @category lGPublicMethods\n * @example\n * const plugin = lightGallery();\n * // Delete or add children, then call\n * plugin.refresh();\n *\n */\n refresh(galleryItems?: GalleryItem[]): void {\n if (!this.settings.dynamic) {\n this.invalidateItems();\n }\n if (galleryItems) {\n this.galleryItems = galleryItems;\n } else {\n this.galleryItems = this.getItems();\n }\n this.updateControls();\n this.openGalleryOnItemClick();\n this.LGel.trigger(lGEvents.updateSlides);\n }\n\n updateControls(): void {\n this.addSlideVideoInfo(this.galleryItems);\n this.updateCounterTotal();\n this.manageSingleSlideClassName();\n }\n\n private destroyGallery(): void {\n this.destroyModules(true);\n if (!this.settings.dynamic) {\n this.invalidateItems();\n }\n $LG(window).off(`.lg.global${this.lgId}`);\n this.LGel.off('.lg');\n this.$container.remove();\n }\n\n /**\n * Destroy lightGallery.\n * Destroy lightGallery and its plugin instances completely\n *\n * @description This method also calls CloseGallery function internally. Returns the time takes to completely close and destroy the instance.\n * In case if you want to re-initialize lightGallery right after destroying it, initialize it only once the destroy process is completed.\n * You can use refresh method most of the times.\n * @category lGPublicMethods\n * @example\n * const plugin = lightGallery();\n * plugin.destroy();\n *\n */\n destroy(): number {\n const closeTimeout = this.closeGallery(true);\n if (closeTimeout) {\n setTimeout(this.destroyGallery.bind(this), closeTimeout);\n } else {\n this.destroyGallery();\n }\n return closeTimeout;\n }\n}\n", "import { LightGallerySettings } from './lg-settings';\nimport { LightGallery } from './lightgallery';\n\nfunction lightGallery(\n el: HTMLElement,\n options?: LightGallerySettings,\n): LightGallery {\n return new LightGallery(el, options);\n}\nexport default lightGallery;\n", "interface ThumbnailStrings {\n toggleThumbnails: string;\n}\n\nexport interface ThumbnailsSettings {\n /**\n * Enable thumbnails for the gallery\n */\n thumbnail: boolean;\n\n /*\n * Enable thumbnail animation.\n */\n animateThumb: boolean;\n\n /**\n * Position of selected thumbnail.\n */\n currentPagerPosition: 'left' | 'middle' | 'right';\n\n /**\n * Position of thumbnails when the width of all thumbnails combined is less than the gallery's width.\n *\n */\n alignThumbnails: 'left' | 'middle' | 'right';\n\n /**\n * Width of each thumbnails.\n */\n thumbWidth: number;\n\n /**\n * Height of each thumbnails.\n */\n thumbHeight: string;\n\n /**\n * Spacing between each thumbnails\n */\n thumbMargin: number;\n\n /**\n * control where the thumbnails should be appended.\n * By default, thumbnails are appended to '.lg-components' which has inbuilt open close transitions\n * If you don't want initial thumbnails transitions, or want to do more customization,\n * you can append thumbnails to the lightGalley outer div -\n * Demo\n */\n appendThumbnailsTo: '.lg-outer' | '.lg-components';\n\n /**\n * Enable toggle captions and thumbnails.\n * @description not applicable if allowMediaOverlap is false\n */\n toggleThumb: boolean;\n\n /**\n * Enables desktop mouse drag support for thumbnails.\n */\n enableThumbDrag: boolean;\n\n /**\n * Enables thumbnail touch/swipe support for touch devices\n */\n enableThumbSwipe: boolean;\n\n /**\n * By setting the thumbnailSwipeThreshold (in px) you can set how far the user must swipe for the next/prev slide.\n */\n thumbnailSwipeThreshold: number;\n\n /**\n * You can automatically load thumbnails for YouTube videos from YouTube by setting loadYouTubeThumbnail true\n */\n loadYouTubeThumbnail: boolean;\n\n /**\n * You can specify the thumbnail size by setting respective number.\n */\n //@todo add demo\n youTubeThumbSize: number;\n\n /**\n * Custom translation strings for aria-labels\n */\n thumbnailPluginStrings: ThumbnailStrings;\n}\n\nexport const thumbnailsSettings: ThumbnailsSettings = {\n thumbnail: true,\n\n animateThumb: true,\n currentPagerPosition: 'middle',\n alignThumbnails: 'middle',\n\n thumbWidth: 100,\n thumbHeight: '80px',\n thumbMargin: 5,\n\n appendThumbnailsTo: '.lg-components',\n toggleThumb: false,\n\n enableThumbDrag: true,\n enableThumbSwipe: true,\n thumbnailSwipeThreshold: 10,\n\n loadYouTubeThumbnail: true,\n youTubeThumbSize: 1,\n\n thumbnailPluginStrings: {\n toggleThumbnails: 'Toggle thumbnails',\n } as ThumbnailStrings,\n};\n", "import { LightGallery } from './lightgallery';\nimport { VideoSource } from './plugins/video/types';\n\n/**\n * List of lightGallery events\n * All events should be documented here\n * Below interfaces are used to build the website documentations\n * */\nexport const lGEvents: {\n [key: string]: string;\n} = {\n afterAppendSlide: 'lgAfterAppendSlide',\n init: 'lgInit',\n hasVideo: 'lgHasVideo',\n containerResize: 'lgContainerResize',\n updateSlides: 'lgUpdateSlides',\n afterAppendSubHtml: 'lgAfterAppendSubHtml',\n beforeOpen: 'lgBeforeOpen',\n afterOpen: 'lgAfterOpen',\n slideItemLoad: 'lgSlideItemLoad',\n beforeSlide: 'lgBeforeSlide',\n afterSlide: 'lgAfterSlide',\n posterClick: 'lgPosterClick',\n dragStart: 'lgDragStart',\n dragMove: 'lgDragMove',\n dragEnd: 'lgDragEnd',\n beforeNextSlide: 'lgBeforeNextSlide',\n beforePrevSlide: 'lgBeforePrevSlide',\n beforeClose: 'lgBeforeClose',\n afterClose: 'lgAfterClose',\n rotateLeft: 'lgRotateLeft',\n rotateRight: 'lgRotateRight',\n flipHorizontal: 'lgFlipHorizontal',\n flipVertical: 'lgFlipVertical',\n autoplay: 'lgAutoplay',\n autoplayStart: 'lgAutoplayStart',\n autoplayStop: 'lgAutoplayStop',\n};\n\n// Follow the below format for the event documentation\n// @method is the method name when event is used with Angular/React components\n\n/**\n * Fired only once when lightGallery is initialized\n * @name lgInit\n * @method onInit\n * @example\n * const lg = document.getElementById('custom-events-demo');\n * // Perform any action on lightGallery initialization.\n * // Init event returns the plugin instance that can be used to call any lightGalley public method\n * let pluginInstance = null;\n * lg.addEventListener('lgInit', (event) => {\n * pluginInstance = event.detail.instance;\n * });\n * lightGallery(lg);\n * @see Methods\n */\nexport interface InitDetail {\n /**\n * lightGallery plugin instance\n */\n instance: LightGallery;\n}\n\n/**\n * Fired when the slide content has been inserted into it's slide container.\n * @name lgAfterAppendSlide\n * @method onAfterAppendSlide\n */\nexport interface AfterAppendSlideEventDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired immediately before opening the gallery\n * @name lgBeforeOpen\n * @method onBeforeOpen\n */\nexport interface BeforeOpenDetail {}\n\n/**\n * Fired immediately after opening the gallery\n * @name lgAfterOpen\n * @method onAfterOpen\n */\nexport interface AfterOpenDetail {}\n\n/**\n * Fired once the media inside the slide has been completely loaded .\n * @name lgSlideItemLoad\n * @method onSlideItemLoad\n */\nexport interface SlideItemLoadDetail {\n /**\n * Index of the slide\n */\n index: number;\n /**\n * For the first slide, lightGallery adds some delay for displaying the loaded slide item.\n * This delay is required for the transition effect when the slide item is displayed\n * Respect the delay when you use this event\n */\n delay: number;\n\n // Will be true for the first slide\n isFirstSlide: boolean;\n}\n\n/**\n * Fired immediately before each slide transition.\n * @name lgBeforeSlide\n * @method onBeforeSlide\n * @example\n * const lg = document.getElementById('custom-events-demo');\n * // Perform any action before each slide transition\n * lg.addEventListener('lgBeforeSlide', (event) => {\n * const { index, prevIndex } = event.detail;\n * alert(index, prevIndex);\n * });\n * lightGallery(lg);\n */\nexport interface BeforeSlideDetail {\n /**\n * Index of the previous slide\n */\n prevIndex: number;\n /**\n * Index of the slide\n */\n index: number;\n /**\n * true if slide function called via touch event or mouse drag\n */\n fromTouch: boolean;\n /**\n * true if slide function called via thumbnail click\n */\n fromThumb: boolean;\n}\n\n/**\n * Fired immediately after each slide transition.\n * @name lgAfterSlide\n * @method onAfterSlide\n */\nexport interface AfterSlideDetail {\n /**\n * Index of the previous slide\n */\n prevIndex: number;\n /**\n * Index of the slide\n */\n index: number;\n /**\n * true if slide function called via touch event or mouse drag\n */\n fromTouch: boolean;\n /**\n * true if slide function called via thumbnail click\n */\n fromThumb: boolean;\n}\n\n/**\n * Fired when the video poster is clicked.\n * @name lgPosterClick\n * @method onPosterClick\n */\nexport interface PosterClickDetail {}\n\n/**\n * Fired when the drag event to move to different slide starts.\n * @name lgDragStart\n * @method onDragStart\n */\nexport interface DragStartDetail {}\n\n/**\n * Fired periodically during the drag operation.\n * @name lgDragMove\n * @method onDragMove\n */\nexport interface DragMoveDetail {}\n\n/**\n * Fired when the user has finished the drag operation\n * @name lgDragEnd\n * @method onDragEnd\n */\nexport interface DragEndDetail {}\n\n/**\n * Fired immediately before the start of the close process.\n * @name lgBeforeClose\n * @method onBeforeClose\n */\nexport interface BeforeCloseDetail {}\n\n/**\n * Fired immediately once lightGallery is closed.\n * @name lgAfterClose\n * @method onAfterClose\n */\nexport interface AfterCloseDetail {\n /**\n * lightGallery plugin instance\n */\n instance: LightGallery;\n}\n\n/**\n * Fired immediately before each \"next\" slide transition\n * @name lgBeforeNextSlide\n * @method onBeforeNextSlide\n */\nexport interface BeforeNextSlideDetail {\n /**\n * Index of the slide\n */\n index: number;\n /**\n * true if slide function called via touch event or mouse drag\n */\n fromTouch: boolean;\n}\n\n/**\n * Fired immediately before each \"prev\" slide transition\n * @name lgBeforePrevSlide\n * @method onBeforePrevSlide\n */\nexport interface BeforePrevSlideDetail {\n /**\n * Index of the slide\n */\n index: number;\n /**\n * true if slide function called via touch event or mouse drag\n */\n fromTouch: boolean;\n}\n\n/**\n * Fired when the sub-html content (ex : title/ description) has been appended into the slide.\n * @name lgAfterAppendSubHtml\n * @method onAfterAppendSubHtml\n */\nexport interface AfterAppendSubHtmlDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired when the lightGallery container has been resized.\n * @name lgContainerResize\n * @method onContainerResize\n */\nexport interface ContainerResizeDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired when lightGallery detects video slide\n * @name lgHasVideo\n * @method onHasVideo\n */\nexport interface HasVideoDetail {\n /**\n * Index of the slide,\n */\n index: number;\n /**\n * Video source\n */\n src: string;\n /**\n * HTML5 video source if available\n *

\n HTML5 video source = source: {\n src: string;\n type: string;\n }[];\n attributes: HTMLVideoElement;\n *

\n */\n html5Video: VideoSource;\n /**\n * True if video has poster\n */\n hasPoster: boolean;\n}\n\n/**\n * Fired when the image is rotated in anticlockwise direction\n * @name lgRotateLeft\n * @method onRotateLeft\n */\nexport interface RotateLeftDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired when the image is rotated in clockwise direction\n * @name lgRotateRight\n * @method onRotateRight\n */\nexport interface RotateRightDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired when the image is flipped horizontally\n * @name lgFlipHorizontal\n * @method onFlipHorizontal\n */\nexport interface FlipHorizontalDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired when the image is flipped vertically\n * @name lgFlipVertical\n * @method onFlipVertical\n */\nexport interface FlipVerticalDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n", "import {\n ThumbnailsSettings,\n thumbnailsSettings,\n} from './lg-thumbnail-settings';\nimport { LgQuery, lgQuery } from '../../lgQuery';\nimport { LightGallery } from '../../lightgallery';\nimport { GalleryItem } from '../../lg-utils';\nimport { lGEvents } from '../../lg-events';\n\ninterface ThumbDragUtils {\n cords: {\n startX: number;\n endX: number;\n };\n isMoved: boolean;\n newTranslateX: number;\n startTime: Date;\n endTime: Date;\n touchMoveTime: number;\n}\ninterface ThumbnailGalleryItem extends GalleryItem {\n thumb: string;\n}\nexport default class Thumbnail {\n private core: LightGallery;\n private $thumbOuter!: lgQuery;\n private $lgThumb!: lgQuery;\n private thumbOuterWidth = 0;\n private thumbTotalWidth = 0;\n private translateX = 0;\n private thumbClickable = false;\n private settings!: ThumbnailsSettings;\n private $LG!: LgQuery;\n constructor(instance: LightGallery, $LG: LgQuery) {\n // get lightGallery core plugin instance\n this.core = instance;\n this.$LG = $LG;\n\n return this;\n }\n\n init(): void {\n // extend module default settings with lightGallery core settings\n this.settings = {\n ...thumbnailsSettings,\n ...this.core.settings,\n };\n this.thumbOuterWidth = 0;\n this.thumbTotalWidth =\n this.core.galleryItems.length *\n (this.settings.thumbWidth + this.settings.thumbMargin);\n\n // Thumbnail animation value\n this.translateX = 0;\n\n this.setAnimateThumbStyles();\n\n if (!this.core.settings.allowMediaOverlap) {\n this.settings.toggleThumb = false;\n }\n\n if (this.settings.thumbnail) {\n this.build();\n if (this.settings.animateThumb) {\n if (this.settings.enableThumbDrag) {\n this.enableThumbDrag();\n }\n\n if (this.settings.enableThumbSwipe) {\n this.enableThumbSwipe();\n }\n\n this.thumbClickable = false;\n } else {\n this.thumbClickable = true;\n }\n\n this.toggleThumbBar();\n this.thumbKeyPress();\n }\n }\n\n build(): void {\n this.setThumbMarkup();\n this.manageActiveClassOnSlideChange();\n this.$lgThumb.first().on('click.lg touchend.lg', (e: CustomEvent) => {\n const $target = this.$LG(e.target);\n if (!$target.hasAttribute('data-lg-item-id')) {\n return;\n }\n setTimeout(() => {\n // In IE9 and bellow touch does not support\n // Go to slide if browser does not support css transitions\n if (this.thumbClickable && !this.core.lgBusy) {\n const index = parseInt($target.attr('data-lg-item-id'));\n this.core.slide(index, false, true, false);\n }\n }, 50);\n });\n\n this.core.LGel.on(`${lGEvents.beforeSlide}.thumb`, (event) => {\n const { index } = event.detail;\n this.animateThumb(index);\n });\n this.core.LGel.on(`${lGEvents.beforeOpen}.thumb`, () => {\n this.thumbOuterWidth = this.core.outer.get().offsetWidth;\n });\n\n this.core.LGel.on(`${lGEvents.updateSlides}.thumb`, () => {\n this.rebuildThumbnails();\n });\n this.core.LGel.on(`${lGEvents.containerResize}.thumb`, () => {\n if (!this.core.lgOpened) return;\n setTimeout(() => {\n this.thumbOuterWidth = this.core.outer.get().offsetWidth;\n this.animateThumb(this.core.index);\n this.thumbOuterWidth = this.core.outer.get().offsetWidth;\n }, 50);\n });\n }\n\n setThumbMarkup(): void {\n let thumbOuterClassNames = 'lg-thumb-outer ';\n\n if (this.settings.alignThumbnails) {\n thumbOuterClassNames += `lg-thumb-align-${this.settings.alignThumbnails}`;\n }\n\n const html = `
\n
\n
\n
`;\n\n this.core.outer.addClass('lg-has-thumb');\n\n if (this.settings.appendThumbnailsTo === '.lg-components') {\n this.core.$lgComponents.append(html);\n } else {\n this.core.outer.append(html);\n }\n\n this.$thumbOuter = this.core.outer.find('.lg-thumb-outer').first();\n this.$lgThumb = this.core.outer.find('.lg-thumb').first();\n\n if (this.settings.animateThumb) {\n this.core.outer\n .find('.lg-thumb')\n .css('transition-duration', this.core.settings.speed + 'ms')\n .css('width', this.thumbTotalWidth + 'px')\n .css('position', 'relative');\n }\n\n this.setThumbItemHtml(\n (this.core.galleryItems as unknown) as ThumbnailGalleryItem[],\n );\n }\n\n enableThumbDrag(): void {\n let thumbDragUtils: ThumbDragUtils = {\n cords: {\n startX: 0,\n endX: 0,\n },\n isMoved: false,\n newTranslateX: 0,\n startTime: new Date(),\n endTime: new Date(),\n touchMoveTime: 0,\n };\n\n let isDragging = false;\n\n this.$thumbOuter.addClass('lg-grab');\n\n this.core.outer\n .find('.lg-thumb')\n .first()\n .on('mousedown.lg.thumb', (e) => {\n if (this.thumbTotalWidth > this.thumbOuterWidth) {\n // execute only on .lg-object\n e.preventDefault();\n thumbDragUtils.cords.startX = e.pageX;\n\n thumbDragUtils.startTime = new Date();\n this.thumbClickable = false;\n\n isDragging = true;\n\n // ** Fix for webkit cursor issue https://code.google.com/p/chromium/issues/detail?id=26723\n this.core.outer.get().scrollLeft += 1;\n this.core.outer.get().scrollLeft -= 1;\n\n // *\n this.$thumbOuter\n .removeClass('lg-grab')\n .addClass('lg-grabbing');\n }\n });\n\n this.$LG(window).on(\n `mousemove.lg.thumb.global${this.core.lgId}`,\n (e) => {\n if (!this.core.lgOpened) return;\n if (isDragging) {\n thumbDragUtils.cords.endX = e.pageX;\n\n thumbDragUtils = this.onThumbTouchMove(thumbDragUtils);\n }\n },\n );\n\n this.$LG(window).on(`mouseup.lg.thumb.global${this.core.lgId}`, () => {\n if (!this.core.lgOpened) return;\n if (thumbDragUtils.isMoved) {\n thumbDragUtils = this.onThumbTouchEnd(thumbDragUtils);\n } else {\n this.thumbClickable = true;\n }\n\n if (isDragging) {\n isDragging = false;\n this.$thumbOuter.removeClass('lg-grabbing').addClass('lg-grab');\n }\n });\n }\n\n enableThumbSwipe(): void {\n let thumbDragUtils: ThumbDragUtils = {\n cords: {\n startX: 0,\n endX: 0,\n },\n isMoved: false,\n newTranslateX: 0,\n startTime: new Date(),\n endTime: new Date(),\n touchMoveTime: 0,\n };\n\n this.$lgThumb.on('touchstart.lg', (e: TouchEvent) => {\n if (this.thumbTotalWidth > this.thumbOuterWidth) {\n e.preventDefault();\n thumbDragUtils.cords.startX = e.targetTouches[0].pageX;\n this.thumbClickable = false;\n thumbDragUtils.startTime = new Date();\n }\n });\n\n this.$lgThumb.on('touchmove.lg', (e: TouchEvent) => {\n if (this.thumbTotalWidth > this.thumbOuterWidth) {\n e.preventDefault();\n thumbDragUtils.cords.endX = e.targetTouches[0].pageX;\n thumbDragUtils = this.onThumbTouchMove(thumbDragUtils);\n }\n });\n\n this.$lgThumb.on('touchend.lg', () => {\n if (thumbDragUtils.isMoved) {\n thumbDragUtils = this.onThumbTouchEnd(thumbDragUtils);\n } else {\n this.thumbClickable = true;\n }\n });\n }\n\n // Rebuild thumbnails\n rebuildThumbnails(): void {\n // Remove transitions\n this.$thumbOuter.addClass('lg-rebuilding-thumbnails');\n setTimeout(() => {\n this.thumbTotalWidth =\n this.core.galleryItems.length *\n (this.settings.thumbWidth + this.settings.thumbMargin);\n this.$lgThumb.css('width', this.thumbTotalWidth + 'px');\n this.$lgThumb.empty();\n this.setThumbItemHtml(\n (this.core.galleryItems as unknown) as ThumbnailGalleryItem[],\n );\n this.animateThumb(this.core.index);\n }, 50);\n setTimeout(() => {\n this.$thumbOuter.removeClass('lg-rebuilding-thumbnails');\n }, 200);\n }\n\n // @ts-check\n\n setTranslate(value: number): void {\n this.$lgThumb.css(\n 'transform',\n 'translate3d(-' + value + 'px, 0px, 0px)',\n );\n }\n\n getPossibleTransformX(left: number): number {\n if (left > this.thumbTotalWidth - this.thumbOuterWidth) {\n left = this.thumbTotalWidth - this.thumbOuterWidth;\n }\n\n if (left < 0) {\n left = 0;\n }\n return left;\n }\n\n animateThumb(index: number): void {\n this.$lgThumb.css(\n 'transition-duration',\n this.core.settings.speed + 'ms',\n );\n if (this.settings.animateThumb) {\n let position = 0;\n switch (this.settings.currentPagerPosition) {\n case 'left':\n position = 0;\n break;\n case 'middle':\n position =\n this.thumbOuterWidth / 2 - this.settings.thumbWidth / 2;\n break;\n case 'right':\n position = this.thumbOuterWidth - this.settings.thumbWidth;\n }\n this.translateX =\n (this.settings.thumbWidth + this.settings.thumbMargin) * index -\n 1 -\n position;\n if (this.translateX > this.thumbTotalWidth - this.thumbOuterWidth) {\n this.translateX = this.thumbTotalWidth - this.thumbOuterWidth;\n }\n\n if (this.translateX < 0) {\n this.translateX = 0;\n }\n\n this.setTranslate(this.translateX);\n }\n }\n\n onThumbTouchMove(thumbDragUtils: ThumbDragUtils): ThumbDragUtils {\n thumbDragUtils.newTranslateX = this.translateX;\n thumbDragUtils.isMoved = true;\n\n thumbDragUtils.touchMoveTime = new Date().valueOf();\n\n thumbDragUtils.newTranslateX -=\n thumbDragUtils.cords.endX - thumbDragUtils.cords.startX;\n\n thumbDragUtils.newTranslateX = this.getPossibleTransformX(\n thumbDragUtils.newTranslateX,\n );\n\n // move current slide\n this.setTranslate(thumbDragUtils.newTranslateX);\n this.$thumbOuter.addClass('lg-dragging');\n\n return thumbDragUtils;\n }\n\n onThumbTouchEnd(thumbDragUtils: ThumbDragUtils): ThumbDragUtils {\n thumbDragUtils.isMoved = false;\n thumbDragUtils.endTime = new Date();\n this.$thumbOuter.removeClass('lg-dragging');\n\n const touchDuration =\n thumbDragUtils.endTime.valueOf() -\n thumbDragUtils.startTime.valueOf();\n let distanceXnew =\n thumbDragUtils.cords.endX - thumbDragUtils.cords.startX;\n let speedX = Math.abs(distanceXnew) / touchDuration;\n // Some magical numbers\n // Can be improved\n if (\n speedX > 0.15 &&\n thumbDragUtils.endTime.valueOf() - thumbDragUtils.touchMoveTime < 30\n ) {\n speedX += 1;\n\n if (speedX > 2) {\n speedX += 1;\n }\n speedX =\n speedX +\n speedX * (Math.abs(distanceXnew) / this.thumbOuterWidth);\n this.$lgThumb.css(\n 'transition-duration',\n Math.min(speedX - 1, 2) + 'settings',\n );\n\n distanceXnew = distanceXnew * speedX;\n\n this.translateX = this.getPossibleTransformX(\n this.translateX - distanceXnew,\n );\n this.setTranslate(this.translateX);\n } else {\n this.translateX = thumbDragUtils.newTranslateX;\n }\n if (\n Math.abs(thumbDragUtils.cords.endX - thumbDragUtils.cords.startX) <\n this.settings.thumbnailSwipeThreshold\n ) {\n this.thumbClickable = true;\n }\n\n return thumbDragUtils;\n }\n\n getThumbHtml(thumb: string, index: number): string {\n const slideVideoInfo =\n this.core.galleryItems[index].__slideVideoInfo || {};\n let thumbImg;\n\n if (slideVideoInfo.youtube) {\n if (this.settings.loadYouTubeThumbnail) {\n thumbImg =\n '//img.youtube.com/vi/' +\n slideVideoInfo.youtube[1] +\n '/' +\n this.settings.youTubeThumbSize +\n '.jpg';\n } else {\n thumbImg = thumb;\n }\n } else {\n thumbImg = thumb;\n }\n\n return `
\n \n
`;\n }\n\n getThumbItemHtml(items: ThumbnailGalleryItem[]): string {\n let thumbList = '';\n for (let i = 0; i < items.length; i++) {\n thumbList += this.getThumbHtml(items[i].thumb, i);\n }\n\n return thumbList;\n }\n\n setThumbItemHtml(items: ThumbnailGalleryItem[]): void {\n const thumbList = this.getThumbItemHtml(items);\n this.$lgThumb.html(thumbList);\n }\n\n setAnimateThumbStyles(): void {\n if (this.settings.animateThumb) {\n this.core.outer.addClass('lg-animate-thumb');\n }\n }\n\n // Manage thumbnail active calss\n manageActiveClassOnSlideChange(): void {\n // manage active class for thumbnail\n this.core.LGel.on(\n `${lGEvents.beforeSlide}.thumb`,\n (event: CustomEvent) => {\n const $thumb = this.core.outer.find('.lg-thumb-item');\n const { index } = event.detail;\n $thumb.removeClass('active');\n $thumb.eq(index).addClass('active');\n },\n );\n }\n\n // Toggle thumbnail bar\n toggleThumbBar(): void {\n if (this.settings.toggleThumb) {\n this.core.outer.addClass('lg-can-toggle');\n this.core.$toolbar.append(\n '',\n );\n this.core.outer\n .find('.lg-toggle-thumb')\n .first()\n .on('click.lg', () => {\n this.core.outer.toggleClass('lg-components-open');\n });\n }\n }\n\n thumbKeyPress(): void {\n this.$LG(window).on(`keydown.lg.thumb.global${this.core.lgId}`, (e) => {\n if (!this.core.lgOpened || !this.settings.toggleThumb) return;\n\n if (e.keyCode === 38) {\n e.preventDefault();\n this.core.outer.addClass('lg-components-open');\n } else if (e.keyCode === 40) {\n e.preventDefault();\n this.core.outer.removeClass('lg-components-open');\n }\n });\n }\n\n destroy(): void {\n if (this.settings.thumbnail) {\n this.$LG(window).off(`.lg.thumb.global${this.core.lgId}`);\n this.core.LGel.off('.lg.thumb');\n this.core.LGel.off('.thumb');\n this.$thumbOuter.remove();\n this.core.outer.removeClass('lg-has-thumb');\n }\n }\n}\n", "export interface ActualSizeIcons {\n zoomIn: 'lg-zoom-in' | 'lg-actual-size';\n zoomOut: 'lg-zoom-out' | 'lg-actual-size';\n}\n\nexport interface ZoomStrings {\n zoomIn: string;\n zoomOut: string;\n viewActualSize: string;\n}\n\nexport interface ZoomSettings {\n /**\n * Value of zoom should be incremented/decremented\n */\n scale: number;\n\n /**\n * Enable/Disable zoom option\n */\n zoom: boolean;\n\n /**\n * Enable actual size icon.\n */\n actualSize: boolean;\n\n /**\n * Once the slide transition is completed, how much time should take zoom plugin to activate\n * @description Some css styles will be added to the images if zoom is enabled.\n * So it might conflict if you add any custom styles to the images such as the initial transition while opening the gallery.\n * So you can delay adding zoom related styles to the images by changing the value of enableZoomAfter.\n */\n enableZoomAfter: number;\n\n /**\n * Show zoom in, zoom out icons\n */\n showZoomInOutIcons: boolean;\n\n /**\n * Actual size icons classnames.\n * Specify classnames for both ZoomIn and ZoomOut states\n * You can use `actualSizeIcons: { zoomIn: 'lg-actual-size', zoomOut: 'lg-zoom-out' }`\n * to show actual size icons instead of zoom in and zoom out icons.\n */\n actualSizeIcons: ActualSizeIcons;\n\n /**\n * Custom translation strings for aria-labels\n */\n zoomPluginStrings: ZoomStrings;\n}\n\nexport const zoomSettings: ZoomSettings = {\n scale: 1,\n zoom: true,\n actualSize: true,\n showZoomInOutIcons: false,\n actualSizeIcons: {\n zoomIn: 'lg-zoom-in',\n zoomOut: 'lg-zoom-out',\n } as ActualSizeIcons,\n enableZoomAfter: 300,\n zoomPluginStrings: {\n zoomIn: 'Zoom in',\n zoomOut: 'Zoom out',\n viewActualSize: 'View actual size',\n } as ZoomStrings,\n};\n", "import { LightGallery } from './lightgallery';\nimport { VideoSource } from './plugins/video/types';\n\n/**\n * List of lightGallery events\n * All events should be documented here\n * Below interfaces are used to build the website documentations\n * */\nexport const lGEvents: {\n [key: string]: string;\n} = {\n afterAppendSlide: 'lgAfterAppendSlide',\n init: 'lgInit',\n hasVideo: 'lgHasVideo',\n containerResize: 'lgContainerResize',\n updateSlides: 'lgUpdateSlides',\n afterAppendSubHtml: 'lgAfterAppendSubHtml',\n beforeOpen: 'lgBeforeOpen',\n afterOpen: 'lgAfterOpen',\n slideItemLoad: 'lgSlideItemLoad',\n beforeSlide: 'lgBeforeSlide',\n afterSlide: 'lgAfterSlide',\n posterClick: 'lgPosterClick',\n dragStart: 'lgDragStart',\n dragMove: 'lgDragMove',\n dragEnd: 'lgDragEnd',\n beforeNextSlide: 'lgBeforeNextSlide',\n beforePrevSlide: 'lgBeforePrevSlide',\n beforeClose: 'lgBeforeClose',\n afterClose: 'lgAfterClose',\n rotateLeft: 'lgRotateLeft',\n rotateRight: 'lgRotateRight',\n flipHorizontal: 'lgFlipHorizontal',\n flipVertical: 'lgFlipVertical',\n autoplay: 'lgAutoplay',\n autoplayStart: 'lgAutoplayStart',\n autoplayStop: 'lgAutoplayStop',\n};\n\n// Follow the below format for the event documentation\n// @method is the method name when event is used with Angular/React components\n\n/**\n * Fired only once when lightGallery is initialized\n * @name lgInit\n * @method onInit\n * @example\n * const lg = document.getElementById('custom-events-demo');\n * // Perform any action on lightGallery initialization.\n * // Init event returns the plugin instance that can be used to call any lightGalley public method\n * let pluginInstance = null;\n * lg.addEventListener('lgInit', (event) => {\n * pluginInstance = event.detail.instance;\n * });\n * lightGallery(lg);\n * @see
Methods\n */\nexport interface InitDetail {\n /**\n * lightGallery plugin instance\n */\n instance: LightGallery;\n}\n\n/**\n * Fired when the slide content has been inserted into it's slide container.\n * @name lgAfterAppendSlide\n * @method onAfterAppendSlide\n */\nexport interface AfterAppendSlideEventDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired immediately before opening the gallery\n * @name lgBeforeOpen\n * @method onBeforeOpen\n */\nexport interface BeforeOpenDetail {}\n\n/**\n * Fired immediately after opening the gallery\n * @name lgAfterOpen\n * @method onAfterOpen\n */\nexport interface AfterOpenDetail {}\n\n/**\n * Fired once the media inside the slide has been completely loaded .\n * @name lgSlideItemLoad\n * @method onSlideItemLoad\n */\nexport interface SlideItemLoadDetail {\n /**\n * Index of the slide\n */\n index: number;\n /**\n * For the first slide, lightGallery adds some delay for displaying the loaded slide item.\n * This delay is required for the transition effect when the slide item is displayed\n * Respect the delay when you use this event\n */\n delay: number;\n\n // Will be true for the first slide\n isFirstSlide: boolean;\n}\n\n/**\n * Fired immediately before each slide transition.\n * @name lgBeforeSlide\n * @method onBeforeSlide\n * @example\n * const lg = document.getElementById('custom-events-demo');\n * // Perform any action before each slide transition\n * lg.addEventListener('lgBeforeSlide', (event) => {\n * const { index, prevIndex } = event.detail;\n * alert(index, prevIndex);\n * });\n * lightGallery(lg);\n */\nexport interface BeforeSlideDetail {\n /**\n * Index of the previous slide\n */\n prevIndex: number;\n /**\n * Index of the slide\n */\n index: number;\n /**\n * true if slide function called via touch event or mouse drag\n */\n fromTouch: boolean;\n /**\n * true if slide function called via thumbnail click\n */\n fromThumb: boolean;\n}\n\n/**\n * Fired immediately after each slide transition.\n * @name lgAfterSlide\n * @method onAfterSlide\n */\nexport interface AfterSlideDetail {\n /**\n * Index of the previous slide\n */\n prevIndex: number;\n /**\n * Index of the slide\n */\n index: number;\n /**\n * true if slide function called via touch event or mouse drag\n */\n fromTouch: boolean;\n /**\n * true if slide function called via thumbnail click\n */\n fromThumb: boolean;\n}\n\n/**\n * Fired when the video poster is clicked.\n * @name lgPosterClick\n * @method onPosterClick\n */\nexport interface PosterClickDetail {}\n\n/**\n * Fired when the drag event to move to different slide starts.\n * @name lgDragStart\n * @method onDragStart\n */\nexport interface DragStartDetail {}\n\n/**\n * Fired periodically during the drag operation.\n * @name lgDragMove\n * @method onDragMove\n */\nexport interface DragMoveDetail {}\n\n/**\n * Fired when the user has finished the drag operation\n * @name lgDragEnd\n * @method onDragEnd\n */\nexport interface DragEndDetail {}\n\n/**\n * Fired immediately before the start of the close process.\n * @name lgBeforeClose\n * @method onBeforeClose\n */\nexport interface BeforeCloseDetail {}\n\n/**\n * Fired immediately once lightGallery is closed.\n * @name lgAfterClose\n * @method onAfterClose\n */\nexport interface AfterCloseDetail {\n /**\n * lightGallery plugin instance\n */\n instance: LightGallery;\n}\n\n/**\n * Fired immediately before each \"next\" slide transition\n * @name lgBeforeNextSlide\n * @method onBeforeNextSlide\n */\nexport interface BeforeNextSlideDetail {\n /**\n * Index of the slide\n */\n index: number;\n /**\n * true if slide function called via touch event or mouse drag\n */\n fromTouch: boolean;\n}\n\n/**\n * Fired immediately before each \"prev\" slide transition\n * @name lgBeforePrevSlide\n * @method onBeforePrevSlide\n */\nexport interface BeforePrevSlideDetail {\n /**\n * Index of the slide\n */\n index: number;\n /**\n * true if slide function called via touch event or mouse drag\n */\n fromTouch: boolean;\n}\n\n/**\n * Fired when the sub-html content (ex : title/ description) has been appended into the slide.\n * @name lgAfterAppendSubHtml\n * @method onAfterAppendSubHtml\n */\nexport interface AfterAppendSubHtmlDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired when the lightGallery container has been resized.\n * @name lgContainerResize\n * @method onContainerResize\n */\nexport interface ContainerResizeDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired when lightGallery detects video slide\n * @name lgHasVideo\n * @method onHasVideo\n */\nexport interface HasVideoDetail {\n /**\n * Index of the slide,\n */\n index: number;\n /**\n * Video source\n */\n src: string;\n /**\n * HTML5 video source if available\n *

\n HTML5 video source = source: {\n src: string;\n type: string;\n }[];\n attributes: HTMLVideoElement;\n *

\n */\n html5Video: VideoSource;\n /**\n * True if video has poster\n */\n hasPoster: boolean;\n}\n\n/**\n * Fired when the image is rotated in anticlockwise direction\n * @name lgRotateLeft\n * @method onRotateLeft\n */\nexport interface RotateLeftDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired when the image is rotated in clockwise direction\n * @name lgRotateRight\n * @method onRotateRight\n */\nexport interface RotateRightDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired when the image is flipped horizontally\n * @name lgFlipHorizontal\n * @method onFlipHorizontal\n */\nexport interface FlipHorizontalDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired when the image is flipped vertically\n * @name lgFlipVertical\n * @method onFlipVertical\n */\nexport interface FlipVerticalDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n", "import { ZoomSettings, zoomSettings } from './lg-zoom-settings';\nimport { LgQuery, lgQuery } from '../../lgQuery';\nimport { LightGallery } from '../../lightgallery';\nimport { lGEvents } from '../../lg-events';\n\ninterface Coords {\n x: number;\n y: number;\n}\n\ninterface DragAllowedAxises {\n allowX: boolean;\n allowY: boolean;\n}\ninterface ZoomTouchEvent {\n pageX: number;\n touches: { pageY: number; pageX: number }[];\n pageY: number;\n}\ninterface PossibleCords {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nconst ZOOM_TRANSITION_DURATION = 500;\n\nexport default class Zoom {\n private core: LightGallery;\n private settings: ZoomSettings;\n private $LG!: LgQuery;\n private imageReset!: number | boolean;\n zoomableTimeout: any;\n positionChanged!: boolean;\n pageX!: number;\n pageY!: number;\n scale!: number;\n\n containerRect!: ClientRect;\n dragAllowedAxises!: DragAllowedAxises;\n top!: number;\n left!: number;\n scrollTop!: number;\n constructor(instance: LightGallery, $LG: LgQuery) {\n // get lightGallery core plugin instance\n this.core = instance;\n this.$LG = $LG;\n\n this.settings = { ...zoomSettings, ...this.core.settings };\n\n return this;\n }\n\n // Append Zoom controls. Actual size, Zoom-in, Zoom-out\n buildTemplates(): void {\n let zoomIcons = this.settings.showZoomInOutIcons\n ? ``\n : '';\n\n if (this.settings.actualSize) {\n zoomIcons += ``;\n }\n\n this.core.outer.addClass('lg-use-transition-for-zoom');\n\n this.core.$toolbar.first().append(zoomIcons);\n }\n\n /**\n * @desc Enable zoom option only once the image is completely loaded\n * If zoomFromOrigin is true, Zoom is enabled once the dummy image has been inserted\n *\n * Zoom styles are defined under lg-zoomable CSS class.\n */\n enableZoom(event: CustomEvent): void {\n // delay will be 0 except first time\n let _speed = this.settings.enableZoomAfter + event.detail.delay;\n\n // set _speed value 0 if gallery opened from direct url and if it is first slide\n if (\n this.$LG('body').first().hasClass('lg-from-hash') &&\n event.detail.delay\n ) {\n // will execute only once\n _speed = 0;\n } else {\n // Remove lg-from-hash to enable starting animation.\n this.$LG('body').first().removeClass('lg-from-hash');\n }\n\n this.zoomableTimeout = setTimeout(() => {\n if (!this.isImageSlide(this.core.index)) {\n return;\n }\n this.core.getSlideItem(event.detail.index).addClass('lg-zoomable');\n if (event.detail.index === this.core.index) {\n this.setZoomEssentials();\n }\n }, _speed + 30);\n }\n\n enableZoomOnSlideItemLoad(): void {\n // Add zoomable class\n this.core.LGel.on(\n `${lGEvents.slideItemLoad}.zoom`,\n this.enableZoom.bind(this),\n );\n }\n\n getDragCords(e: MouseEvent): Coords {\n return {\n x: e.pageX,\n y: e.pageY,\n };\n }\n getSwipeCords(e: TouchEvent): Coords {\n const x = e.touches[0].pageX;\n const y = e.touches[0].pageY;\n return {\n x,\n y,\n };\n }\n\n getDragAllowedAxises(scale: number, scaleDiff?: number): DragAllowedAxises {\n const $image = this.core\n .getSlideItem(this.core.index)\n .find('.lg-image')\n .first()\n .get();\n\n let height = 0;\n let width = 0;\n const rect = $image.getBoundingClientRect();\n if (scale) {\n height = $image.offsetHeight * scale;\n width = $image.offsetWidth * scale;\n } else if (scaleDiff) {\n height = rect.height + scaleDiff * rect.height;\n width = rect.width + scaleDiff * rect.width;\n } else {\n height = rect.height;\n width = rect.width;\n }\n const allowY = height > this.containerRect.height;\n const allowX = width > this.containerRect.width;\n return {\n allowX,\n allowY,\n };\n }\n\n setZoomEssentials(): void {\n this.containerRect = this.core.$content.get().getBoundingClientRect();\n }\n\n /**\n * @desc Image zoom\n * Translate the wrap and scale the image to get better user experience\n *\n * @param {String} scale - Zoom decrement/increment value\n */\n zoomImage(\n scale: number,\n scaleDiff: number,\n reposition: boolean,\n resetToMax: boolean,\n ): void {\n if (Math.abs(scaleDiff) <= 0) return;\n\n const offsetX = this.containerRect.width / 2 + this.containerRect.left;\n\n const offsetY =\n this.containerRect.height / 2 +\n this.containerRect.top +\n this.scrollTop;\n\n let originalX;\n let originalY;\n\n if (scale === 1) {\n this.positionChanged = false;\n }\n\n const dragAllowedAxises = this.getDragAllowedAxises(0, scaleDiff);\n\n const { allowY, allowX } = dragAllowedAxises;\n if (this.positionChanged) {\n originalX = this.left / (this.scale - scaleDiff);\n originalY = this.top / (this.scale - scaleDiff);\n this.pageX = offsetX - originalX;\n this.pageY = offsetY - originalY;\n\n this.positionChanged = false;\n }\n\n const possibleSwipeCords = this.getPossibleSwipeDragCords(scaleDiff);\n\n let x;\n let y;\n let _x = offsetX - this.pageX;\n let _y = offsetY - this.pageY;\n\n if (scale - scaleDiff > 1) {\n const scaleVal = (scale - scaleDiff) / Math.abs(scaleDiff);\n _x =\n (scaleDiff < 0 ? -_x : _x) +\n this.left * (scaleVal + (scaleDiff < 0 ? -1 : 1));\n _y =\n (scaleDiff < 0 ? -_y : _y) +\n this.top * (scaleVal + (scaleDiff < 0 ? -1 : 1));\n x = _x / scaleVal;\n y = _y / scaleVal;\n } else {\n const scaleVal = (scale - scaleDiff) * scaleDiff;\n x = _x * scaleVal;\n y = _y * scaleVal;\n }\n\n if (reposition) {\n if (allowX) {\n if (this.isBeyondPossibleLeft(x, possibleSwipeCords.minX)) {\n x = possibleSwipeCords.minX;\n } else if (\n this.isBeyondPossibleRight(x, possibleSwipeCords.maxX)\n ) {\n x = possibleSwipeCords.maxX;\n }\n } else {\n if (scale > 1) {\n if (x < possibleSwipeCords.minX) {\n x = possibleSwipeCords.minX;\n } else if (x > possibleSwipeCords.maxX) {\n x = possibleSwipeCords.maxX;\n }\n }\n }\n // @todo fix this\n if (allowY) {\n if (this.isBeyondPossibleTop(y, possibleSwipeCords.minY)) {\n y = possibleSwipeCords.minY;\n } else if (\n this.isBeyondPossibleBottom(y, possibleSwipeCords.maxY)\n ) {\n y = possibleSwipeCords.maxY;\n }\n } else {\n // If the translate value based on index of beyond the viewport, utilize the available space to prevent image being cut out\n if (scale > 1) {\n //If image goes beyond viewport top, use the minim possible translate value\n if (y < possibleSwipeCords.minY) {\n y = possibleSwipeCords.minY;\n } else if (y > possibleSwipeCords.maxY) {\n y = possibleSwipeCords.maxY;\n }\n }\n }\n }\n\n this.setZoomStyles({\n x: x,\n y: y,\n scale,\n });\n\n this.left = x;\n this.top = y;\n\n if (resetToMax) {\n this.setZoomImageSize();\n }\n }\n\n resetImageTranslate(index: number): void {\n if (!this.isImageSlide(index)) {\n return;\n }\n const $image = this.core.getSlideItem(index).find('.lg-image').first();\n this.imageReset = false;\n $image.removeClass(\n 'reset-transition reset-transition-y reset-transition-x',\n );\n this.core.outer.removeClass('lg-actual-size');\n $image.css('width', 'auto').css('height', 'auto');\n setTimeout(() => {\n $image.removeClass('no-transition');\n }, 10);\n }\n\n setZoomImageSize(): void {\n const $image = this.core\n .getSlideItem(this.core.index)\n .find('.lg-image')\n .first();\n\n setTimeout(() => {\n const actualSizeScale = this.getCurrentImageActualSizeScale();\n\n if (this.scale >= actualSizeScale) {\n $image.addClass('no-transition');\n this.imageReset = true;\n }\n }, ZOOM_TRANSITION_DURATION);\n\n setTimeout(() => {\n const actualSizeScale = this.getCurrentImageActualSizeScale();\n\n if (this.scale >= actualSizeScale) {\n const dragAllowedAxises = this.getDragAllowedAxises(this.scale);\n\n $image\n .css(\n 'width',\n ($image.get() as HTMLImageElement).naturalWidth + 'px',\n )\n .css(\n 'height',\n ($image.get() as HTMLImageElement).naturalHeight + 'px',\n );\n\n this.core.outer.addClass('lg-actual-size');\n\n if (dragAllowedAxises.allowX && dragAllowedAxises.allowY) {\n $image.addClass('reset-transition');\n } else if (\n dragAllowedAxises.allowX &&\n !dragAllowedAxises.allowY\n ) {\n $image.addClass('reset-transition-x');\n } else if (\n !dragAllowedAxises.allowX &&\n dragAllowedAxises.allowY\n ) {\n $image.addClass('reset-transition-y');\n }\n }\n }, ZOOM_TRANSITION_DURATION + 50);\n }\n\n /**\n * @desc apply scale3d to image and translate to image wrap\n * @param {style} X,Y and scale\n */\n setZoomStyles(style: { x: number; y: number; scale: number }): void {\n const $imageWrap = this.core\n .getSlideItem(this.core.index)\n .find('.lg-img-wrap')\n .first();\n const $image = this.core\n .getSlideItem(this.core.index)\n .find('.lg-image')\n .first();\n const $dummyImage = this.core.outer\n .find('.lg-current .lg-dummy-img')\n .first();\n this.scale = style.scale;\n $image.css(\n 'transform',\n 'scale3d(' + style.scale + ', ' + style.scale + ', 1)',\n );\n\n $dummyImage.css(\n 'transform',\n 'scale3d(' + style.scale + ', ' + style.scale + ', 1)',\n );\n\n const transform =\n 'translate3d(' + style.x + 'px, ' + style.y + 'px, 0)';\n $imageWrap.css('transform', transform);\n }\n\n /**\n * @param index - Index of the current slide\n * @param event - event will be available only if the function is called on clicking/taping the imags\n */\n setActualSize(index: number, event?: ZoomTouchEvent): void {\n const currentItem = this.core.galleryItems[this.core.index];\n this.resetImageTranslate(index);\n setTimeout(() => {\n // Allow zoom only on image\n if (\n !currentItem.src ||\n this.core.outer.hasClass('lg-first-slide-loading')\n ) {\n return;\n }\n const scale = this.getCurrentImageActualSizeScale();\n const prevScale = this.scale;\n if (this.core.outer.hasClass('lg-zoomed')) {\n this.scale = 1;\n } else {\n this.scale = this.getScale(scale);\n }\n this.setPageCords(event);\n\n this.beginZoom(this.scale);\n this.zoomImage(this.scale, this.scale - prevScale, true, true);\n\n setTimeout(() => {\n this.core.outer.removeClass('lg-grabbing').addClass('lg-grab');\n }, 10);\n }, 50);\n }\n\n getNaturalWidth(index: number): number {\n const $image = this.core.getSlideItem(index).find('.lg-image').first();\n\n const naturalWidth = this.core.galleryItems[index].width;\n return naturalWidth\n ? parseFloat(naturalWidth)\n : undefined || ($image.get() as any).naturalWidth;\n }\n\n getActualSizeScale(naturalWidth: number, width: number): number {\n let _scale;\n let scale;\n if (naturalWidth >= width) {\n _scale = naturalWidth / width;\n scale = _scale || 2;\n } else {\n scale = 1;\n }\n return scale;\n }\n\n getCurrentImageActualSizeScale(): number {\n const $image = this.core\n .getSlideItem(this.core.index)\n .find('.lg-image')\n .first();\n const width = $image.get().offsetWidth;\n const naturalWidth = this.getNaturalWidth(this.core.index) || width;\n return this.getActualSizeScale(naturalWidth, width);\n }\n\n getPageCords(event?: ZoomTouchEvent): Coords {\n const cords: Coords = {} as Coords;\n if (event) {\n cords.x = event.pageX || event.touches[0].pageX;\n cords.y = event.pageY || event.touches[0].pageY;\n } else {\n const containerRect = this.core.$content\n .get()\n .getBoundingClientRect();\n cords.x = containerRect.width / 2 + containerRect.left;\n cords.y =\n containerRect.height / 2 + this.scrollTop + containerRect.top;\n }\n return cords;\n }\n\n setPageCords(event?: ZoomTouchEvent): void {\n const pageCords = this.getPageCords(event);\n\n this.pageX = pageCords.x;\n this.pageY = pageCords.y;\n }\n\n manageActualPixelClassNames(): void {\n const $actualSize = this.core.getElementById('lg-actual-size');\n $actualSize\n .removeClass(this.settings.actualSizeIcons.zoomIn)\n .addClass(this.settings.actualSizeIcons.zoomOut);\n }\n\n // If true, zoomed - in else zoomed out\n beginZoom(scale: number): boolean {\n this.core.outer.removeClass('lg-zoom-drag-transition lg-zoom-dragging');\n if (scale > 1) {\n this.core.outer.addClass('lg-zoomed');\n this.manageActualPixelClassNames();\n } else {\n this.resetZoom();\n }\n return scale > 1;\n }\n\n getScale(scale: number): number {\n const actualSizeScale = this.getCurrentImageActualSizeScale();\n if (scale < 1) {\n scale = 1;\n } else if (scale > actualSizeScale) {\n scale = actualSizeScale;\n }\n return scale;\n }\n\n init(): void {\n if (!this.settings.zoom) {\n return;\n }\n this.buildTemplates();\n this.enableZoomOnSlideItemLoad();\n\n let tapped: ReturnType | null = null;\n\n this.core.outer.on('dblclick.lg', (event) => {\n if (!this.$LG(event.target).hasClass('lg-image')) {\n return;\n }\n this.setActualSize(this.core.index, event);\n });\n\n this.core.outer.on('touchstart.lg', (event) => {\n const $target = this.$LG(event.target);\n if (event.touches.length === 1 && $target.hasClass('lg-image')) {\n if (!tapped) {\n tapped = setTimeout(() => {\n tapped = null;\n }, 300);\n } else {\n clearTimeout(tapped);\n tapped = null;\n event.preventDefault();\n this.setActualSize(this.core.index, event);\n }\n }\n });\n\n this.core.LGel.on(\n `${lGEvents.containerResize}.zoom ${lGEvents.rotateRight}.zoom ${lGEvents.rotateLeft}.zoom ${lGEvents.flipHorizontal}.zoom ${lGEvents.flipVertical}.zoom`,\n () => {\n if (\n !this.core.lgOpened ||\n !this.isImageSlide(this.core.index) ||\n this.core.touchAction\n ) {\n return;\n }\n const _LGel = this.core\n .getSlideItem(this.core.index)\n .find('.lg-img-wrap')\n .first();\n this.top = 0;\n this.left = 0;\n this.setZoomEssentials();\n this.setZoomSwipeStyles(_LGel, { x: 0, y: 0 });\n this.positionChanged = true;\n },\n );\n // Update zoom on resize and orientationchange\n this.$LG(window).on(`scroll.lg.zoom.global${this.core.lgId}`, () => {\n if (!this.core.lgOpened) return;\n this.scrollTop = this.$LG(window).scrollTop();\n });\n\n this.core.getElementById('lg-zoom-out').on('click.lg', () => {\n // Allow zoom only on image\n if (!this.isImageSlide(this.core.index)) {\n return;\n }\n\n let timeout = 0;\n if (this.imageReset) {\n this.resetImageTranslate(this.core.index);\n timeout = 50;\n }\n setTimeout(() => {\n let scale = this.scale - this.settings.scale;\n\n if (scale < 1) {\n scale = 1;\n }\n this.beginZoom(scale);\n this.zoomImage(scale, -this.settings.scale, true, true);\n }, timeout);\n });\n\n this.core.getElementById('lg-zoom-in').on('click.lg', () => {\n this.zoomIn();\n });\n\n this.core.getElementById('lg-actual-size').on('click.lg', () => {\n this.setActualSize(this.core.index);\n });\n\n this.core.LGel.on(`${lGEvents.beforeOpen}.zoom`, () => {\n this.core.outer.find('.lg-item').removeClass('lg-zoomable');\n });\n this.core.LGel.on(`${lGEvents.afterOpen}.zoom`, () => {\n this.scrollTop = this.$LG(window).scrollTop();\n\n // Set the initial value center\n this.pageX = this.core.outer.width() / 2;\n this.pageY = this.core.outer.height() / 2 + this.scrollTop;\n\n this.scale = 1;\n });\n\n // Reset zoom on slide change\n this.core.LGel.on(\n `${lGEvents.afterSlide}.zoom`,\n (event: CustomEvent) => {\n const { prevIndex } = event.detail;\n this.scale = 1;\n this.positionChanged = false;\n this.resetZoom(prevIndex);\n this.resetImageTranslate(prevIndex);\n if (this.isImageSlide(this.core.index)) {\n this.setZoomEssentials();\n }\n },\n );\n\n // Drag option after zoom\n this.zoomDrag();\n\n this.pinchZoom();\n\n this.zoomSwipe();\n\n // Store the zoomable timeout value just to clear it while closing\n this.zoomableTimeout = false;\n this.positionChanged = false;\n }\n\n zoomIn(): void {\n // Allow zoom only on image\n if (!this.isImageSlide(this.core.index)) {\n return;\n }\n\n let scale = this.scale + this.settings.scale;\n\n scale = this.getScale(scale);\n this.beginZoom(scale);\n this.zoomImage(\n scale,\n Math.min(this.settings.scale, scale - this.scale),\n true,\n true,\n );\n }\n\n // Reset zoom effect\n resetZoom(index?: number): void {\n this.core.outer.removeClass('lg-zoomed lg-zoom-drag-transition');\n const $actualSize = this.core.getElementById('lg-actual-size');\n const $item = this.core.getSlideItem(\n index !== undefined ? index : this.core.index,\n );\n $actualSize\n .removeClass(this.settings.actualSizeIcons.zoomOut)\n .addClass(this.settings.actualSizeIcons.zoomIn);\n $item.find('.lg-img-wrap').first().removeAttr('style');\n $item.find('.lg-image').first().removeAttr('style');\n this.scale = 1;\n this.left = 0;\n this.top = 0;\n\n // Reset pagx pagy values to center\n this.setPageCords();\n }\n\n getTouchDistance(e: TouchEvent): number {\n return Math.sqrt(\n (e.touches[0].pageX - e.touches[1].pageX) *\n (e.touches[0].pageX - e.touches[1].pageX) +\n (e.touches[0].pageY - e.touches[1].pageY) *\n (e.touches[0].pageY - e.touches[1].pageY),\n );\n }\n\n pinchZoom(): void {\n let startDist = 0;\n let pinchStarted = false;\n let initScale = 1;\n let prevScale = 0;\n\n let $item = this.core.getSlideItem(this.core.index);\n\n this.core.outer.on('touchstart.lg', (e) => {\n $item = this.core.getSlideItem(this.core.index);\n if (!this.isImageSlide(this.core.index)) {\n return;\n }\n if (e.touches.length === 2) {\n e.preventDefault();\n if (this.core.outer.hasClass('lg-first-slide-loading')) {\n return;\n }\n initScale = this.scale || 1;\n this.core.outer.removeClass(\n 'lg-zoom-drag-transition lg-zoom-dragging',\n );\n\n this.setPageCords(e);\n this.resetImageTranslate(this.core.index);\n\n this.core.touchAction = 'pinch';\n\n startDist = this.getTouchDistance(e);\n }\n });\n\n this.core.$inner.on('touchmove.lg', (e) => {\n if (\n e.touches.length === 2 &&\n this.core.touchAction === 'pinch' &&\n (this.$LG(e.target).hasClass('lg-item') ||\n $item.get().contains(e.target))\n ) {\n e.preventDefault();\n const endDist = this.getTouchDistance(e);\n\n const distance = startDist - endDist;\n if (!pinchStarted && Math.abs(distance) > 5) {\n pinchStarted = true;\n }\n if (pinchStarted) {\n prevScale = this.scale;\n const _scale = Math.max(1, initScale + -distance * 0.02);\n this.scale =\n Math.round((_scale + Number.EPSILON) * 100) / 100;\n const diff = this.scale - prevScale;\n this.zoomImage(\n this.scale,\n Math.round((diff + Number.EPSILON) * 100) / 100,\n false,\n false,\n );\n }\n }\n });\n\n this.core.$inner.on('touchend.lg', (e) => {\n if (\n this.core.touchAction === 'pinch' &&\n (this.$LG(e.target).hasClass('lg-item') ||\n $item.get().contains(e.target))\n ) {\n pinchStarted = false;\n startDist = 0;\n if (this.scale <= 1) {\n this.resetZoom();\n } else {\n const actualSizeScale = this.getCurrentImageActualSizeScale();\n\n if (this.scale >= actualSizeScale) {\n let scaleDiff = actualSizeScale - this.scale;\n if (scaleDiff === 0) {\n scaleDiff = 0.01;\n }\n this.zoomImage(actualSizeScale, scaleDiff, false, true);\n }\n this.manageActualPixelClassNames();\n\n this.core.outer.addClass('lg-zoomed');\n }\n this.core.touchAction = undefined;\n }\n });\n }\n\n touchendZoom(\n startCoords: Coords,\n endCoords: Coords,\n allowX: boolean,\n allowY: boolean,\n touchDuration: number,\n ): void {\n let distanceXnew = endCoords.x - startCoords.x;\n let distanceYnew = endCoords.y - startCoords.y;\n\n let speedX = Math.abs(distanceXnew) / touchDuration + 1;\n let speedY = Math.abs(distanceYnew) / touchDuration + 1;\n\n if (speedX > 2) {\n speedX += 1;\n }\n\n if (speedY > 2) {\n speedY += 1;\n }\n\n distanceXnew = distanceXnew * speedX;\n distanceYnew = distanceYnew * speedY;\n\n const _LGel = this.core\n .getSlideItem(this.core.index)\n .find('.lg-img-wrap')\n .first();\n const distance: Coords = {} as Coords;\n\n distance.x = this.left + distanceXnew;\n distance.y = this.top + distanceYnew;\n\n const possibleSwipeCords = this.getPossibleSwipeDragCords();\n\n if (Math.abs(distanceXnew) > 15 || Math.abs(distanceYnew) > 15) {\n if (allowY) {\n if (\n this.isBeyondPossibleTop(\n distance.y,\n possibleSwipeCords.minY,\n )\n ) {\n distance.y = possibleSwipeCords.minY;\n } else if (\n this.isBeyondPossibleBottom(\n distance.y,\n possibleSwipeCords.maxY,\n )\n ) {\n distance.y = possibleSwipeCords.maxY;\n }\n }\n\n if (allowX) {\n if (\n this.isBeyondPossibleLeft(\n distance.x,\n possibleSwipeCords.minX,\n )\n ) {\n distance.x = possibleSwipeCords.minX;\n } else if (\n this.isBeyondPossibleRight(\n distance.x,\n possibleSwipeCords.maxX,\n )\n ) {\n distance.x = possibleSwipeCords.maxX;\n }\n }\n\n if (allowY) {\n this.top = distance.y;\n } else {\n distance.y = this.top;\n }\n\n if (allowX) {\n this.left = distance.x;\n } else {\n distance.x = this.left;\n }\n\n this.setZoomSwipeStyles(_LGel, distance);\n\n this.positionChanged = true;\n }\n }\n\n getZoomSwipeCords(\n startCoords: Coords,\n endCoords: Coords,\n allowX: boolean,\n allowY: boolean,\n possibleSwipeCords: PossibleCords,\n ): Coords {\n const distance: Coords = {} as Coords;\n if (allowY) {\n distance.y = this.top + (endCoords.y - startCoords.y);\n if (this.isBeyondPossibleTop(distance.y, possibleSwipeCords.minY)) {\n const diffMinY = possibleSwipeCords.minY - distance.y;\n distance.y = possibleSwipeCords.minY - diffMinY / 6;\n } else if (\n this.isBeyondPossibleBottom(distance.y, possibleSwipeCords.maxY)\n ) {\n const diffMaxY = distance.y - possibleSwipeCords.maxY;\n distance.y = possibleSwipeCords.maxY + diffMaxY / 6;\n }\n } else {\n distance.y = this.top;\n }\n\n if (allowX) {\n distance.x = this.left + (endCoords.x - startCoords.x);\n if (\n this.isBeyondPossibleLeft(distance.x, possibleSwipeCords.minX)\n ) {\n const diffMinX = possibleSwipeCords.minX - distance.x;\n distance.x = possibleSwipeCords.minX - diffMinX / 6;\n } else if (\n this.isBeyondPossibleRight(distance.x, possibleSwipeCords.maxX)\n ) {\n const difMaxX = distance.x - possibleSwipeCords.maxX;\n distance.x = possibleSwipeCords.maxX + difMaxX / 6;\n }\n } else {\n distance.x = this.left;\n }\n\n return distance;\n }\n\n private isBeyondPossibleLeft(x: number, minX: number) {\n return x >= minX;\n }\n private isBeyondPossibleRight(x: number, maxX: number) {\n return x <= maxX;\n }\n private isBeyondPossibleTop(y: number, minY: number) {\n return y >= minY;\n }\n private isBeyondPossibleBottom(y: number, maxY: number) {\n return y <= maxY;\n }\n\n isImageSlide(index: number): boolean {\n const currentItem = this.core.galleryItems[index];\n return this.core.getSlideType(currentItem) === 'image';\n }\n\n getPossibleSwipeDragCords(scale?: number): PossibleCords {\n const $image = this.core\n .getSlideItem(this.core.index)\n .find('.lg-image')\n .first();\n\n const { bottom } = this.core.mediaContainerPosition;\n\n const imgRect = $image.get().getBoundingClientRect();\n\n let imageHeight = imgRect.height;\n let imageWidth = imgRect.width;\n\n if (scale) {\n imageHeight = imageHeight + scale * imageHeight;\n imageWidth = imageWidth + scale * imageWidth;\n }\n\n const minY = (imageHeight - this.containerRect.height) / 2;\n const maxY = (this.containerRect.height - imageHeight) / 2 + bottom;\n\n const minX = (imageWidth - this.containerRect.width) / 2;\n\n const maxX = (this.containerRect.width - imageWidth) / 2;\n\n const possibleSwipeCords = {\n minY: minY,\n maxY: maxY,\n minX: minX,\n maxX: maxX,\n };\n return possibleSwipeCords;\n }\n\n setZoomSwipeStyles(\n LGel: lgQuery,\n distance: { x: number; y: number },\n ): void {\n LGel.css(\n 'transform',\n 'translate3d(' + distance.x + 'px, ' + distance.y + 'px, 0)',\n );\n }\n\n zoomSwipe(): void {\n let startCoords = {} as Coords;\n let endCoords = {} as Coords;\n let isMoved = false;\n\n // Allow x direction drag\n let allowX = false;\n\n // Allow Y direction drag\n let allowY = false;\n\n let startTime: Date = new Date();\n let endTime: Date = new Date();\n let possibleSwipeCords: PossibleCords;\n\n let _LGel: lgQuery;\n\n let $item = this.core.getSlideItem(this.core.index);\n\n this.core.$inner.on('touchstart.lg', (e) => {\n // Allow zoom only on image\n if (!this.isImageSlide(this.core.index)) {\n return;\n }\n $item = this.core.getSlideItem(this.core.index);\n if (\n (this.$LG(e.target).hasClass('lg-item') ||\n $item.get().contains(e.target)) &&\n e.touches.length === 1 &&\n this.core.outer.hasClass('lg-zoomed')\n ) {\n e.preventDefault();\n startTime = new Date();\n this.core.touchAction = 'zoomSwipe';\n _LGel = this.core\n .getSlideItem(this.core.index)\n .find('.lg-img-wrap')\n .first();\n\n const dragAllowedAxises = this.getDragAllowedAxises(0);\n\n allowY = dragAllowedAxises.allowY;\n allowX = dragAllowedAxises.allowX;\n if (allowX || allowY) {\n startCoords = this.getSwipeCords(e);\n }\n\n possibleSwipeCords = this.getPossibleSwipeDragCords();\n\n // reset opacity and transition duration\n this.core.outer.addClass(\n 'lg-zoom-dragging lg-zoom-drag-transition',\n );\n }\n });\n\n this.core.$inner.on('touchmove.lg', (e) => {\n if (\n e.touches.length === 1 &&\n this.core.touchAction === 'zoomSwipe' &&\n (this.$LG(e.target).hasClass('lg-item') ||\n $item.get().contains(e.target))\n ) {\n e.preventDefault();\n this.core.touchAction = 'zoomSwipe';\n\n endCoords = this.getSwipeCords(e);\n\n const distance = this.getZoomSwipeCords(\n startCoords,\n endCoords,\n allowX,\n allowY,\n possibleSwipeCords,\n );\n\n if (\n Math.abs(endCoords.x - startCoords.x) > 15 ||\n Math.abs(endCoords.y - startCoords.y) > 15\n ) {\n isMoved = true;\n this.setZoomSwipeStyles(_LGel, distance);\n }\n }\n });\n\n this.core.$inner.on('touchend.lg', (e) => {\n if (\n this.core.touchAction === 'zoomSwipe' &&\n (this.$LG(e.target).hasClass('lg-item') ||\n $item.get().contains(e.target))\n ) {\n e.preventDefault();\n this.core.touchAction = undefined;\n this.core.outer.removeClass('lg-zoom-dragging');\n if (!isMoved) {\n return;\n }\n isMoved = false;\n endTime = new Date();\n const touchDuration = endTime.valueOf() - startTime.valueOf();\n this.touchendZoom(\n startCoords,\n endCoords,\n allowX,\n allowY,\n touchDuration,\n );\n }\n });\n }\n\n zoomDrag(): void {\n let startCoords: Coords = {} as Coords;\n let endCoords: Coords = {} as Coords;\n let isDragging = false;\n let isMoved = false;\n\n // Allow x direction drag\n let allowX = false;\n\n // Allow Y direction drag\n let allowY = false;\n\n let startTime: number | Date;\n let endTime;\n\n let possibleSwipeCords: PossibleCords;\n\n let _LGel: lgQuery;\n\n this.core.outer.on('mousedown.lg.zoom', (e) => {\n // Allow zoom only on image\n if (!this.isImageSlide(this.core.index)) {\n return;\n }\n const $item = this.core.getSlideItem(this.core.index);\n if (\n this.$LG(e.target).hasClass('lg-item') ||\n $item.get().contains(e.target)\n ) {\n startTime = new Date();\n _LGel = this.core\n .getSlideItem(this.core.index)\n .find('.lg-img-wrap')\n .first();\n\n const dragAllowedAxises = this.getDragAllowedAxises(0);\n\n allowY = dragAllowedAxises.allowY;\n allowX = dragAllowedAxises.allowX;\n\n if (this.core.outer.hasClass('lg-zoomed')) {\n if (\n this.$LG(e.target).hasClass('lg-object') &&\n (allowX || allowY)\n ) {\n e.preventDefault();\n startCoords = this.getDragCords(e);\n\n possibleSwipeCords = this.getPossibleSwipeDragCords();\n\n isDragging = true;\n\n this.core.outer\n .removeClass('lg-grab')\n .addClass(\n 'lg-grabbing lg-zoom-drag-transition lg-zoom-dragging',\n );\n // reset opacity and transition duration\n }\n }\n }\n });\n\n this.$LG(window).on(\n `mousemove.lg.zoom.global${this.core.lgId}`,\n (e) => {\n if (isDragging) {\n isMoved = true;\n endCoords = this.getDragCords(e);\n\n const distance = this.getZoomSwipeCords(\n startCoords,\n endCoords,\n allowX,\n allowY,\n possibleSwipeCords,\n );\n\n this.setZoomSwipeStyles(_LGel, distance);\n }\n },\n );\n\n this.$LG(window).on(`mouseup.lg.zoom.global${this.core.lgId}`, (e) => {\n if (isDragging) {\n endTime = new Date();\n isDragging = false;\n this.core.outer.removeClass('lg-zoom-dragging');\n\n // Fix for chrome mouse move on click\n if (\n isMoved &&\n (startCoords.x !== endCoords.x ||\n startCoords.y !== endCoords.y)\n ) {\n endCoords = this.getDragCords(e);\n\n const touchDuration =\n endTime.valueOf() - startTime.valueOf();\n this.touchendZoom(\n startCoords,\n endCoords,\n allowX,\n allowY,\n touchDuration,\n );\n }\n\n isMoved = false;\n }\n\n this.core.outer.removeClass('lg-grabbing').addClass('lg-grab');\n });\n }\n\n closeGallery(): void {\n this.resetZoom();\n }\n\n destroy(): void {\n // Unbind all events added by lightGallery zoom plugin\n this.$LG(window).off(`.lg.zoom.global${this.core.lgId}`);\n this.core.LGel.off('.lg.zoom');\n this.core.LGel.off('.zoom');\n clearTimeout(this.zoomableTimeout);\n this.zoomableTimeout = false;\n }\n}\n", "import { LightGallery } from './lightgallery';\nimport { VideoSource } from './plugins/video/types';\n\n/**\n * List of lightGallery events\n * All events should be documented here\n * Below interfaces are used to build the website documentations\n * */\nexport const lGEvents: {\n [key: string]: string;\n} = {\n afterAppendSlide: 'lgAfterAppendSlide',\n init: 'lgInit',\n hasVideo: 'lgHasVideo',\n containerResize: 'lgContainerResize',\n updateSlides: 'lgUpdateSlides',\n afterAppendSubHtml: 'lgAfterAppendSubHtml',\n beforeOpen: 'lgBeforeOpen',\n afterOpen: 'lgAfterOpen',\n slideItemLoad: 'lgSlideItemLoad',\n beforeSlide: 'lgBeforeSlide',\n afterSlide: 'lgAfterSlide',\n posterClick: 'lgPosterClick',\n dragStart: 'lgDragStart',\n dragMove: 'lgDragMove',\n dragEnd: 'lgDragEnd',\n beforeNextSlide: 'lgBeforeNextSlide',\n beforePrevSlide: 'lgBeforePrevSlide',\n beforeClose: 'lgBeforeClose',\n afterClose: 'lgAfterClose',\n rotateLeft: 'lgRotateLeft',\n rotateRight: 'lgRotateRight',\n flipHorizontal: 'lgFlipHorizontal',\n flipVertical: 'lgFlipVertical',\n autoplay: 'lgAutoplay',\n autoplayStart: 'lgAutoplayStart',\n autoplayStop: 'lgAutoplayStop',\n};\n\n// Follow the below format for the event documentation\n// @method is the method name when event is used with Angular/React components\n\n/**\n * Fired only once when lightGallery is initialized\n * @name lgInit\n * @method onInit\n * @example\n * const lg = document.getElementById('custom-events-demo');\n * // Perform any action on lightGallery initialization.\n * // Init event returns the plugin instance that can be used to call any lightGalley public method\n * let pluginInstance = null;\n * lg.addEventListener('lgInit', (event) => {\n * pluginInstance = event.detail.instance;\n * });\n * lightGallery(lg);\n * @see
Methods\n */\nexport interface InitDetail {\n /**\n * lightGallery plugin instance\n */\n instance: LightGallery;\n}\n\n/**\n * Fired when the slide content has been inserted into it's slide container.\n * @name lgAfterAppendSlide\n * @method onAfterAppendSlide\n */\nexport interface AfterAppendSlideEventDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired immediately before opening the gallery\n * @name lgBeforeOpen\n * @method onBeforeOpen\n */\nexport interface BeforeOpenDetail {}\n\n/**\n * Fired immediately after opening the gallery\n * @name lgAfterOpen\n * @method onAfterOpen\n */\nexport interface AfterOpenDetail {}\n\n/**\n * Fired once the media inside the slide has been completely loaded .\n * @name lgSlideItemLoad\n * @method onSlideItemLoad\n */\nexport interface SlideItemLoadDetail {\n /**\n * Index of the slide\n */\n index: number;\n /**\n * For the first slide, lightGallery adds some delay for displaying the loaded slide item.\n * This delay is required for the transition effect when the slide item is displayed\n * Respect the delay when you use this event\n */\n delay: number;\n\n // Will be true for the first slide\n isFirstSlide: boolean;\n}\n\n/**\n * Fired immediately before each slide transition.\n * @name lgBeforeSlide\n * @method onBeforeSlide\n * @example\n * const lg = document.getElementById('custom-events-demo');\n * // Perform any action before each slide transition\n * lg.addEventListener('lgBeforeSlide', (event) => {\n * const { index, prevIndex } = event.detail;\n * alert(index, prevIndex);\n * });\n * lightGallery(lg);\n */\nexport interface BeforeSlideDetail {\n /**\n * Index of the previous slide\n */\n prevIndex: number;\n /**\n * Index of the slide\n */\n index: number;\n /**\n * true if slide function called via touch event or mouse drag\n */\n fromTouch: boolean;\n /**\n * true if slide function called via thumbnail click\n */\n fromThumb: boolean;\n}\n\n/**\n * Fired immediately after each slide transition.\n * @name lgAfterSlide\n * @method onAfterSlide\n */\nexport interface AfterSlideDetail {\n /**\n * Index of the previous slide\n */\n prevIndex: number;\n /**\n * Index of the slide\n */\n index: number;\n /**\n * true if slide function called via touch event or mouse drag\n */\n fromTouch: boolean;\n /**\n * true if slide function called via thumbnail click\n */\n fromThumb: boolean;\n}\n\n/**\n * Fired when the video poster is clicked.\n * @name lgPosterClick\n * @method onPosterClick\n */\nexport interface PosterClickDetail {}\n\n/**\n * Fired when the drag event to move to different slide starts.\n * @name lgDragStart\n * @method onDragStart\n */\nexport interface DragStartDetail {}\n\n/**\n * Fired periodically during the drag operation.\n * @name lgDragMove\n * @method onDragMove\n */\nexport interface DragMoveDetail {}\n\n/**\n * Fired when the user has finished the drag operation\n * @name lgDragEnd\n * @method onDragEnd\n */\nexport interface DragEndDetail {}\n\n/**\n * Fired immediately before the start of the close process.\n * @name lgBeforeClose\n * @method onBeforeClose\n */\nexport interface BeforeCloseDetail {}\n\n/**\n * Fired immediately once lightGallery is closed.\n * @name lgAfterClose\n * @method onAfterClose\n */\nexport interface AfterCloseDetail {\n /**\n * lightGallery plugin instance\n */\n instance: LightGallery;\n}\n\n/**\n * Fired immediately before each \"next\" slide transition\n * @name lgBeforeNextSlide\n * @method onBeforeNextSlide\n */\nexport interface BeforeNextSlideDetail {\n /**\n * Index of the slide\n */\n index: number;\n /**\n * true if slide function called via touch event or mouse drag\n */\n fromTouch: boolean;\n}\n\n/**\n * Fired immediately before each \"prev\" slide transition\n * @name lgBeforePrevSlide\n * @method onBeforePrevSlide\n */\nexport interface BeforePrevSlideDetail {\n /**\n * Index of the slide\n */\n index: number;\n /**\n * true if slide function called via touch event or mouse drag\n */\n fromTouch: boolean;\n}\n\n/**\n * Fired when the sub-html content (ex : title/ description) has been appended into the slide.\n * @name lgAfterAppendSubHtml\n * @method onAfterAppendSubHtml\n */\nexport interface AfterAppendSubHtmlDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired when the lightGallery container has been resized.\n * @name lgContainerResize\n * @method onContainerResize\n */\nexport interface ContainerResizeDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired when lightGallery detects video slide\n * @name lgHasVideo\n * @method onHasVideo\n */\nexport interface HasVideoDetail {\n /**\n * Index of the slide,\n */\n index: number;\n /**\n * Video source\n */\n src: string;\n /**\n * HTML5 video source if available\n *

\n HTML5 video source = source: {\n src: string;\n type: string;\n }[];\n attributes: HTMLVideoElement;\n *

\n */\n html5Video: VideoSource;\n /**\n * True if video has poster\n */\n hasPoster: boolean;\n}\n\n/**\n * Fired when the image is rotated in anticlockwise direction\n * @name lgRotateLeft\n * @method onRotateLeft\n */\nexport interface RotateLeftDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired when the image is rotated in clockwise direction\n * @name lgRotateRight\n * @method onRotateRight\n */\nexport interface RotateRightDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired when the image is flipped horizontally\n * @name lgFlipHorizontal\n * @method onFlipHorizontal\n */\nexport interface FlipHorizontalDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n\n/**\n * Fired when the image is flipped vertically\n * @name lgFlipVertical\n * @method onFlipVertical\n */\nexport interface FlipVerticalDetail {\n /**\n * Index of the slide\n */\n index: number;\n}\n", "export interface AutoplayStrings {\n toggleAutoplay: string;\n}\n\nexport interface AutoplaySettings {\n /**\n * Enable autoplay plugin\n */\n autoplay: boolean;\n\n /**\n * Enable slideshow autoplay\n */\n slideShowAutoplay: boolean;\n\n /**\n * The time (in ms) between each auto transition.\n */\n slideShowInterval: number;\n\n /**\n * Show autoplay progressBar\n */\n progressBar: boolean;\n\n /**\n * If false autoplay will be stopped after first user action\n */\n forceSlideShowAutoplay: boolean;\n\n /**\n * Show/hide autoplay controls.\n */\n autoplayControls: boolean;\n\n /**\n * Specify where the autoplay controls should be appended.\n */\n appendAutoplayControlsTo: string;\n\n /**\n * Custom translation strings for aria-labels\n */\n autoplayPluginStrings: AutoplayStrings;\n}\nexport const autoplaySettings: AutoplaySettings = {\n autoplay: true,\n slideShowAutoplay: false,\n slideShowInterval: 5000,\n progressBar: true,\n forceSlideShowAutoplay: false,\n autoplayControls: true,\n appendAutoplayControlsTo: '.lg-toolbar',\n autoplayPluginStrings: {\n toggleAutoplay: 'Toggle Autoplay',\n } as AutoplayStrings,\n};\n", "import { lGEvents } from '../../lg-events';\nimport { LightGallery } from '../../lightgallery';\nimport { AutoplaySettings, autoplaySettings } from './lg-autoplay-settings';\n\n/**\n * Creates the autoplay plugin.\n * @param {object} element - lightGallery element\n */\nexport default class Autoplay {\n core: LightGallery;\n settings: AutoplaySettings;\n interval!: any;\n fromAuto!: boolean;\n pausedOnTouchDrag!: boolean;\n pausedOnSlideChange!: boolean;\n\n constructor(instance: LightGallery) {\n this.core = instance;\n\n // extend module default settings with lightGallery core settings\n this.settings = { ...autoplaySettings, ...this.core.settings };\n\n return this;\n }\n\n public init(): void {\n if (!this.settings.autoplay) {\n return;\n }\n\n this.interval = false;\n\n // Identify if slide happened from autoplay\n this.fromAuto = true;\n\n // Identify if autoplay canceled from touch/drag\n this.pausedOnTouchDrag = false;\n\n this.pausedOnSlideChange = false;\n\n // append autoplay controls\n if (this.settings.autoplayControls) {\n this.controls();\n }\n\n // Create progress bar\n if (this.settings.progressBar) {\n this.core.outer.append(\n '
',\n );\n }\n\n // Start autoplay\n if (this.settings.slideShowAutoplay) {\n this.core.LGel.once(`${lGEvents.slideItemLoad}.autoplay`, () => {\n this.startAutoPlay();\n });\n }\n\n // cancel interval on touchstart and dragstart\n this.core.LGel.on(\n `${lGEvents.dragStart}.autoplay touchstart.lg.autoplay`,\n () => {\n if (this.interval) {\n this.stopAutoPlay();\n this.pausedOnTouchDrag = true;\n }\n },\n );\n\n // restore autoplay if autoplay canceled from touchstart / dragstart\n this.core.LGel.on(\n `${lGEvents.dragEnd}.autoplay touchend.lg.autoplay`,\n () => {\n if (!this.interval && this.pausedOnTouchDrag) {\n this.startAutoPlay();\n this.pausedOnTouchDrag = false;\n }\n },\n );\n\n this.core.LGel.on(`${lGEvents.beforeSlide}.autoplay`, () => {\n this.showProgressBar();\n if (!this.fromAuto && this.interval) {\n this.stopAutoPlay();\n this.pausedOnSlideChange = true;\n } else {\n this.pausedOnSlideChange = false;\n }\n this.fromAuto = false;\n });\n\n // restore autoplay if autoplay canceled from touchstart / dragstart\n this.core.LGel.on(`${lGEvents.afterSlide}.autoplay`, () => {\n if (\n this.pausedOnSlideChange &&\n !this.interval &&\n this.settings.forceSlideShowAutoplay\n ) {\n this.startAutoPlay();\n this.pausedOnSlideChange = false;\n }\n });\n\n // set progress\n this.showProgressBar();\n }\n\n private showProgressBar() {\n if (this.settings.progressBar && this.fromAuto) {\n const _$progressBar = this.core.outer.find('.lg-progress-bar');\n const _$progress = this.core.outer.find('.lg-progress');\n if (this.interval) {\n _$progress.removeAttr('style');\n _$progressBar.removeClass('lg-start');\n setTimeout(() => {\n _$progress.css(\n 'transition',\n 'width ' +\n (this.core.settings.speed +\n this.settings.slideShowInterval) +\n 'ms ease 0s',\n );\n _$progressBar.addClass('lg-start');\n }, 20);\n }\n }\n }\n\n // Manage autoplay via play/stop buttons\n private controls() {\n const _html = ``;\n\n // Append autoplay controls\n this.core.outer\n .find(this.settings.appendAutoplayControlsTo)\n .append(_html);\n\n this.core.outer\n .find('.lg-autoplay-button')\n .first()\n .on('click.lg.autoplay', () => {\n if (this.core.outer.hasClass('lg-show-autoplay')) {\n this.stopAutoPlay();\n } else {\n if (!this.interval) {\n this.startAutoPlay();\n }\n }\n });\n }\n\n // Autostart gallery\n public startAutoPlay(): void {\n this.core.outer\n .find('.lg-progress')\n .css(\n 'transition',\n 'width ' +\n (this.core.settings.speed +\n this.settings.slideShowInterval) +\n 'ms ease 0s',\n );\n this.core.outer.addClass('lg-show-autoplay');\n this.core.outer.find('.lg-progress-bar').addClass('lg-start');\n this.core.LGel.trigger(lGEvents.autoplayStart, {\n index: this.core.index,\n });\n\n this.interval = setInterval(() => {\n if (this.core.index + 1 < this.core.galleryItems.length) {\n this.core.index++;\n } else {\n this.core.index = 0;\n }\n\n this.core.LGel.trigger(lGEvents.autoplay, {\n index: this.core.index,\n });\n\n this.fromAuto = true;\n this.core.slide(this.core.index, false, false, 'next');\n }, this.core.settings.speed + this.settings.slideShowInterval);\n }\n\n // cancel Autostart\n public stopAutoPlay(): void {\n if (this.interval) {\n this.core.LGel.trigger(lGEvents.autoplayStop, {\n index: this.core.index,\n });\n this.core.outer.find('.lg-progress').removeAttr('style');\n this.core.outer.removeClass('lg-show-autoplay');\n this.core.outer.find('.lg-progress-bar').removeClass('lg-start');\n }\n clearInterval(this.interval);\n this.interval = false;\n }\n\n public closeGallery(): void {\n this.stopAutoPlay();\n }\n public destroy(): void {\n if (this.settings.autoplay) {\n this.core.outer.find('.lg-progress-bar').remove();\n }\n // Remove all event listeners added by autoplay plugin\n this.core.LGel.off('.lg.autoplay');\n this.core.LGel.off('.autoplay');\n }\n}\n", "export interface FullscreenStrings {\n toggleFullscreen: string;\n}\nexport interface FullscreenSettings {\n /**\n * Enable/Disable fullscreen option\n */\n fullScreen: boolean;\n\n /**\n * Custom translation strings for aria-labels\n */\n fullscreenPluginStrings: FullscreenStrings;\n}\n\nexport const fullscreenSettings: FullscreenSettings = {\n fullScreen: true,\n fullscreenPluginStrings: {\n toggleFullscreen: 'Toggle Fullscreen',\n } as FullscreenStrings,\n};\n", "import { LgQuery } from '../../lgQuery';\nimport { LightGallery } from '../../lightgallery';\nimport {\n FullscreenSettings,\n fullscreenSettings,\n} from './lg-fullscreen-settings';\n\ndeclare let document: any;\n\nexport default class FullScreen {\n core: LightGallery;\n settings: FullscreenSettings;\n private $LG!: LgQuery;\n constructor(instance: LightGallery, $LG: LgQuery) {\n // get lightGallery core plugin instance\n this.core = instance;\n this.$LG = $LG;\n\n // extend module default settings with lightGallery core settings\n this.settings = { ...fullscreenSettings, ...this.core.settings };\n\n return this;\n }\n\n public init(): void {\n let fullScreen = '';\n if (this.settings.fullScreen) {\n // check for fullscreen browser support\n if (\n !document.fullscreenEnabled &&\n !document.webkitFullscreenEnabled &&\n !document.mozFullScreenEnabled &&\n !document.msFullscreenEnabled\n ) {\n return;\n } else {\n fullScreen = ``;\n this.core.$toolbar.append(fullScreen);\n this.fullScreen();\n }\n }\n }\n\n private isFullScreen(): boolean {\n return (\n document.fullscreenElement ||\n document.mozFullScreenElement ||\n document.webkitFullscreenElement ||\n document.msFullscreenElement\n );\n }\n\n private requestFullscreen(): void {\n const el = document.documentElement;\n if (el.requestFullscreen) {\n el.requestFullscreen();\n } else if (el.msRequestFullscreen) {\n el.msRequestFullscreen();\n } else if (el.mozRequestFullScreen) {\n el.mozRequestFullScreen();\n } else if (el.webkitRequestFullscreen) {\n el.webkitRequestFullscreen();\n }\n }\n\n private exitFullscreen(): void {\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.msExitFullscreen) {\n document.msExitFullscreen();\n } else if (document.mozCancelFullScreen) {\n document.mozCancelFullScreen();\n } else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n }\n }\n\n // https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Using_full_screen_mode\n private fullScreen(): void {\n this.$LG(document).on(\n `fullscreenchange.lg.global${this.core.lgId} \n webkitfullscreenchange.lg.global${this.core.lgId} \n mozfullscreenchange.lg.global${this.core.lgId} \n MSFullscreenChange.lg.global${this.core.lgId}`,\n () => {\n if (!this.core.lgOpened) return;\n this.core.outer.toggleClass('lg-fullscreen-on');\n },\n );\n\n this.core.outer\n .find('.lg-fullscreen')\n .first()\n .on('click.lg', () => {\n if (this.isFullScreen()) {\n this.exitFullscreen();\n } else {\n this.requestFullscreen();\n }\n });\n }\n\n closeGallery(): void {\n // exit from fullscreen if activated\n if (this.isFullScreen()) {\n this.exitFullscreen();\n }\n }\n\n destroy(): void {\n this.$LG(document).off(\n `fullscreenchange.lg.global${this.core.lgId} \n webkitfullscreenchange.lg.global${this.core.lgId} \n mozfullscreenchange.lg.global${this.core.lgId} \n MSFullscreenChange.lg.global${this.core.lgId}`,\n );\n }\n}\n", "import { onDocumentReady } from '../vite/src/onDocumentReady'\nimport lightGallery from 'lightgallery'\n\nimport lgThumbnail from 'lightgallery/plugins/thumbnail'\nimport lgZoom from 'lightgallery/plugins/zoom'\nimport lgAutoplay from 'lightgallery/plugins/autoplay'\nimport lgFullscreen from 'lightgallery/plugins/fullscreen'\n\nonDocumentReady(() => {\n const galleries = document.querySelectorAll('[data-gallery]')\n if (galleries.length > 0) {\n galleries.forEach((gallery) => {\n const options = typeof gallery.dataset.gallery === 'string' ? JSON.parse(gallery.dataset.gallery) : gallery.dataset.gallery\n lightGallery(\n gallery,\n {\n plugins: [\n lgThumbnail,\n lgZoom,\n lgAutoplay,\n lgFullscreen\n ],\n licenseKey: 'D1EE52BE-E569-4684-A5D8-09D5AE0E84E0',\n ...(options || {})\n }\n )\n })\n }\n})\n"], "mappings": "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", "names": ["onDocumentReady", "callback", "lGEvents", "lightGalleryCoreSettings", "initLgPolyfills", "CustomEvent", "event", "params", "evt", "lgQuery", "selector", "c", "r", "v", "context", "fl", "func", "el", "cssProperty", "value", "property", "s", "group1", "eventName", "eventNamespace", "e", "attr", "$LG", "index", "attributes", "attrs", "className", "wrapper", "classNames", "attribute", "_this", "events", "listener", "detail", "customEvent", "url", "res", "html", "scrollTop", "scrollLeft", "rect", "bodyMarginLeft", "style", "defaultDynamicOptions", "convertToData", "g", "utils", "container", "spacing", "defaultLgSize", "LGel", "lgSize", "isResponsiveSizes", "wWidth", "i", "size_1", "responsiveWidth", "size", "width", "height", "cWidth", "cHeight", "maxWidth", "maxHeight", "ratio", "top", "bottom", "imageSize", "containerRect", "wHeight", "elWidth", "elHeight", "elStyle", "x", "y", "scX", "scY", "transform", "iframeWidth", "iframeHeight", "iframeMaxWidth", "iframeMaxHeight", "src", "iframeTitle", "title", "altAttr", "srcset", "sizes", "sources", "srcsetAttr", "sizesAttr", "imgMarkup", "sourceTag", "sourceObj", "source", "key", "srcItms", "rsWidth", "rsSrc", "_src", "j", "img", "_poster", "dummyImg", "videoContStyle", "playVideoString", "_isVideo", "videoClass", "elements", "visibleElements", "element", "items", "extraProps", "getCaptionFromTitleOrAlt", "exThumbImage", "dynamicElements", "availableDynamicOptions", "__spreadArrays", "item", "dynamicEl", "dynamicAttr", "label", "currentItem", "alt", "thumb", "isHTML5VIdeo", "youtube", "vimeo", "wistia", "lgId", "LightGallery", "options", "__assign", "mobileSettings", "this_1", "$element", "uuid", "currentItemIndex", "plugin", "id", "controls", "subHtmlCont", "addClasses", "ariaLabelledby", "ariaDescribedby", "containerClassName", "closeIcon", "maximizeIcon", "template", "outerClassNames", "currentGalleryItem", "__slideVideoInfo", "_a", "top_1", "imgStyle", "lgVideoStyle", "currentSlide", "currentSrc", "_index", "galleryItem", "itemIndex", "selectWithin", "bodyRect", "scrollbarWidth", "itemsToBeInsertedToDom", "timeout", "currentSlide_1", "subHtml", "captionHeight", "thumbContainer", "thumbHeight", "$img", "counterHtml", "subHtmlUrl", "fL", "$currentSlide", "$currentItem", "_dummyImgSrc", "dummyImgContent", "imgContent", "$slide", "isHTML5VideoWithoutPoster", "onLoad", "onError", "mediaObject", "delay", "speed", "isFirstSlide", "_speed", "rec", "poster", "video", "_html5Video", "srcDyItms", "videoInfo", "iframe", "top_2", "videoSize", "markup", "hasStartAnimation", "prevIndex", "numberOfItems", "possibleNumberOfItems", "prevIndexItem", "_element", "idx", "numberOfExistingItems", "currentItemId", "hideDownloadBtn", "$download", "direction", "currentSlideItem", "previousSlideItem", "fromTouch", "fromThumb", "numberOfGalleryItems", "previousSlideItem_1", "top_3", "touchPrev", "touchNext", "startCoords", "endCoords", "distanceX", "distanceY", "allowSwipe", "slideWidthAmount", "gutter", "opacity", "scale", "distance", "triggerClick", "distanceAbs", "target", "isMoved", "isSwiping", "$item", "isDraging", "_touchNext", "_touchPrev", "_loop", "$prev", "$next", "$el", "xValue", "yValue", "scaleX", "scaleY", "lastCall", "now", "playButton", "isTabPressed", "focusableEls", "firstFocusableEl", "lastFocusableEl", "mousedown", "force", "top_4", "_b", "removeTimeout", "module", "destroy", "galleryItems", "closeTimeout", "lightGallery", "thumbnailsSettings", "lGEvents", "Thumbnail", "instance", "$LG", "__assign", "_this", "$target", "index", "event", "thumbOuterClassNames", "html", "thumbDragUtils", "isDragging", "e", "value", "left", "position", "touchDuration", "distanceXnew", "speedX", "thumb", "slideVideoInfo", "thumbImg", "items", "thumbList", "$thumb", "zoomSettings", "lGEvents", "ZOOM_TRANSITION_DURATION", "Zoom", "instance", "$LG", "__assign", "zoomIcons", "event", "_this", "_speed", "e", "x", "y", "scale", "scaleDiff", "$image", "height", "width", "rect", "allowY", "allowX", "reposition", "resetToMax", "offsetX", "offsetY", "originalX", "originalY", "dragAllowedAxises", "possibleSwipeCords", "_x", "_y", "scaleVal", "index", "actualSizeScale", "style", "$imageWrap", "$dummyImage", "transform", "currentItem", "prevScale", "naturalWidth", "_scale", "cords", "containerRect", "pageCords", "$actualSize", "tapped", "$target", "_LGel", "timeout", "prevIndex", "$item", "startDist", "pinchStarted", "initScale", "endDist", "distance", "diff", "startCoords", "endCoords", "touchDuration", "distanceXnew", "distanceYnew", "speedX", "speedY", "diffMinY", "diffMaxY", "diffMinX", "difMaxX", "minX", "maxX", "minY", "maxY", "bottom", "imgRect", "imageHeight", "imageWidth", "LGel", "isMoved", "startTime", "endTime", "isDragging", "lGEvents", "autoplaySettings", "Autoplay", "instance", "__assign", "_this", "_$progressBar_1", "_$progress_1", "_html", "fullscreenSettings", "FullScreen", "instance", "$LG", "__assign", "fullScreen", "el", "_this", "onDocumentReady", "galleries", "gallery", "options", "lightgallery_es5_default", "lg_thumbnail_es5_default", "lg_zoom_es5_default", "lg_autoplay_es5_default", "lg_fullscreen_es5_default"] }