@redot-src/glare 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glare.esm.js","sources":["../src/icons.ts","../src/defaults.ts","../src/utils.ts","../src/gestures.ts","../src/fullscreen.ts","../src/hash.ts","../src/media.ts","../src/share.ts","../src/slideshow.ts","../src/thumbs.ts","../src/wheel.ts","../src/instance.ts"],"sourcesContent":["export const icons = {\n close: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/></svg>`,\n next: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m9 18 6-6-6-6\"/></svg>`,\n prev: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m15 18-6-6 6-6\"/></svg>`,\n zoomIn: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.3-4.3\"/><path d=\"M11 8v6\"/><path d=\"M8 11h6\"/></svg>`,\n zoomOut: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.3-4.3\"/><path d=\"M8 11h6\"/></svg>`,\n download: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><polyline points=\"7 10 12 15 17 10\"/><line x1=\"12\" x2=\"12\" y1=\"15\" y2=\"3\"/></svg>`,\n share: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"18\" cy=\"5\" r=\"3\"/><circle cx=\"6\" cy=\"12\" r=\"3\"/><circle cx=\"18\" cy=\"19\" r=\"3\"/><line x1=\"8.59\" x2=\"15.42\" y1=\"13.51\" y2=\"17.49\"/><line x1=\"15.41\" x2=\"8.59\" y1=\"6.51\" y2=\"10.49\"/></svg>`,\n thumbs: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/><path d=\"M3 9h18\"/><path d=\"M9 21V9\"/></svg>`,\n play: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polygon points=\"6 3 20 12 6 21 6 3\"/></svg>`,\n pause: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect width=\"4\" height=\"16\" x=\"6\" y=\"4\"/><rect width=\"4\" height=\"16\" x=\"14\" y=\"4\"/></svg>`,\n fullscreen: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M8 3H5a2 2 0 0 0-2 2v3\"/><path d=\"M21 8V5a2 2 0 0 0-2-2h-3\"/><path d=\"M3 16v3a2 2 0 0 0 2 2h3\"/><path d=\"M16 21h3a2 2 0 0 0 2-2v-3\"/></svg>`,\n fullscreenExit: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M8 3v3a2 2 0 0 1-2 2H3\"/><path d=\"M21 8h-3a2 2 0 0 1-2-2V3\"/><path d=\"M3 16h3a2 2 0 0 1 2 2v3\"/><path d=\"M16 21v-3a2 2 0 0 1 2-2h3\"/></svg>`,\n} as const\n","import type { I18nDict, MediaProvider, GlareOptions } from './types'\nimport { icons } from './icons'\n\nexport const i18nEn: I18nDict = {\n CLOSE: 'Close',\n NEXT: 'Next',\n PREV: 'Previous',\n ERROR: 'The requested content cannot be loaded.<br/>Please try again later.',\n PLAY_START: 'Start slideshow',\n PLAY_STOP: 'Pause slideshow',\n FULL_SCREEN: 'Full screen',\n THUMBS: 'Thumbnails',\n DOWNLOAD: 'Download',\n SHARE: 'Share',\n ZOOM: 'Zoom',\n}\n\nexport const defaultMedia: Record<string, MediaProvider> = {\n youtube: {\n matcher:\n /(?:youtube\\.com|youtu\\.be|youtube-nocookie\\.com)\\/(?:watch\\?(?:.*&)?v=|v\\/|u\\/\\w\\/|embed\\/|shorts\\/)?([\\w-]{11})/i,\n type: 'iframe',\n url: (_m, _url) => {\n const id = _m[1]\n return `https://www.youtube-nocookie.com/embed/${id}`\n },\n thumb: (m) => `https://img.youtube.com/vi/${m[1]}/hqdefault.jpg`,\n params: {\n autoplay: 1,\n rel: 0,\n modestbranding: 1,\n playsinline: 1,\n },\n },\n vimeo: {\n matcher: /(?:vimeo\\.com)\\/(?:video\\/)?(\\d+)/i,\n type: 'iframe',\n url: (m) => `https://player.vimeo.com/video/${m[1]}`,\n params: {\n autoplay: 1,\n title: 0,\n byline: 0,\n portrait: 0,\n },\n },\n gmap: {\n matcher:\n /(?:maps\\.)?google\\.([a-z]{2,3}(?:\\.[a-z]{2})?)\\/(?:maps\\/(?:place\\/[^/]+\\/)?@([^/]+)|maps\\?q=([^&]+)|maps\\/search\\/([^/?]+))/i,\n type: 'iframe',\n url: (m) => {\n const tld = m[1]\n if (m[2]) {\n const parts = m[2].split(',')\n const lat = parts[0]\n const lng = parts[1]\n const zoom = parts[2] ? Math.floor(parseFloat(parts[2])) : 14\n return `https://maps.google.${tld}/maps?ll=${lat},${lng}&z=${zoom}&output=embed`\n }\n const query = decodeURIComponent(m[3] || m[4] || '')\n return `https://maps.google.${tld}/maps?q=${encodeURIComponent(query)}&output=embed`\n },\n },\n}\n\nexport const defaults: GlareOptions = {\n closeExisting: false,\n loop: false,\n gutter: 50,\n keyboard: true,\n preventCaptionOverlap: true,\n arrows: true,\n infobar: true,\n smallBtn: 'auto',\n toolbar: 'auto',\n buttons: ['zoom', 'slideshow', 'thumbs', 'share', 'download', 'fullscreen', 'close'],\n idleTime: 3,\n protect: false,\n modal: false,\n image: {\n preload: false,\n },\n ajax: {\n settings: {\n headers: {\n 'X-Requested-With': 'XMLHttpRequest',\n },\n },\n },\n iframe: {\n preload: true,\n css: {},\n attr: {\n allowfullscreen: 'true',\n allow: 'autoplay; fullscreen; picture-in-picture',\n },\n tpl: '<iframe class=\"glare-iframe\" allowfullscreen allow=\"autoplay; fullscreen; picture-in-picture\" src=\"\"></iframe>',\n },\n video: {\n tpl:\n '<video class=\"glare-video\" controls playsinline controlsList=\"nodownload\" poster=\"{{poster}}\">' +\n '<source src=\"{{src}}\" type=\"{{format}}\"/>' +\n 'Your browser does not support HTML5 video.' +\n '</video>',\n format: '',\n autoStart: true,\n },\n defaultType: 'image',\n animationEffect: 'zoom',\n animationDuration: 366,\n zoomOpacity: 'auto',\n transitionEffect: 'fade',\n transitionDuration: 366,\n slideClass: '',\n baseClass: '',\n parentEl: 'body',\n hideScrollbar: true,\n autoFocus: true,\n backFocus: true,\n trapFocus: true,\n fullScreen: {\n autoStart: false,\n },\n touch: {\n vertical: true,\n momentum: true,\n },\n hash: true,\n media: defaultMedia,\n slideShow: {\n autoStart: false,\n speed: 3000,\n },\n thumbs: {\n autoStart: false,\n hideOnClose: true,\n parentEl: '.glare-container',\n axis: 'y',\n },\n share: true,\n wheel: 'auto',\n clickContent: function (current) {\n return current.type === 'image' ? 'zoom' : false\n },\n clickSlide: 'close',\n clickOutside: 'close',\n dblclickContent: false,\n dblclickSlide: false,\n dblclickOutside: false,\n mobile: {\n preventCaptionOverlap: false,\n idleTime: false,\n clickContent: function (current) {\n return current.type === 'image' ? 'toggleControls' : false\n },\n clickSlide: function (current) {\n return current.type === 'image' ? 'toggleControls' : 'close'\n },\n dblclickContent: function (current) {\n return current.type === 'image' ? 'zoom' : false\n },\n dblclickSlide: function (current) {\n return current.type === 'image' ? 'zoom' : false\n },\n },\n lang: 'en',\n i18n: {\n en: i18nEn,\n },\n spinnerTpl: '<div class=\"glare-spinner\" role=\"status\" aria-label=\"Loading\"></div>',\n errorTpl: '<div class=\"glare-error\"><p>{{ERROR}}</p></div>',\n baseTpl: `\n <div class=\"glare-container\" role=\"dialog\" aria-modal=\"true\" tabindex=\"-1\">\n <div class=\"glare-bg\"></div>\n <div class=\"glare-inner\">\n <div class=\"glare-infobar\"><span class=\"glare-infobar-index\"></span></div>\n <div class=\"glare-toolbar\"></div>\n <div class=\"glare-navigation\">\n <button type=\"button\" class=\"glare-button glare-button--prev\" data-glare-prev title=\"{{PREV}}\" aria-label=\"{{PREV}}\">${icons.prev}</button>\n <button type=\"button\" class=\"glare-button glare-button--next\" data-glare-next title=\"{{NEXT}}\" aria-label=\"{{NEXT}}\">${icons.next}</button>\n </div>\n <div class=\"glare-stage\"></div>\n <div class=\"glare-caption\"></div>\n </div>\n </div>\n `,\n btnTpl: {\n download: `<a class=\"glare-button glare-button--download\" data-glare-download download title=\"{{DOWNLOAD}}\" aria-label=\"{{DOWNLOAD}}\" href=\"javascript:;\">${icons.download}</a>`,\n zoom: `<button type=\"button\" class=\"glare-button glare-button--zoom\" data-glare-zoom title=\"{{ZOOM}}\" aria-label=\"{{ZOOM}}\">${icons.zoomIn}</button>`,\n close: `<button type=\"button\" class=\"glare-button glare-button--close\" data-glare-close title=\"{{CLOSE}}\" aria-label=\"{{CLOSE}}\">${icons.close}</button>`,\n share: `<button type=\"button\" class=\"glare-button glare-button--share\" data-glare-share title=\"{{SHARE}}\" aria-label=\"{{SHARE}}\">${icons.share}</button>`,\n thumbs: `<button type=\"button\" class=\"glare-button glare-button--thumbs\" data-glare-thumbs title=\"{{THUMBS}}\" aria-label=\"{{THUMBS}}\">${icons.thumbs}</button>`,\n slideshow: `<button type=\"button\" class=\"glare-button glare-button--slideshow\" data-glare-slideshow title=\"{{PLAY_START}}\" aria-label=\"{{PLAY_START}}\">${icons.play}</button>`,\n fullscreen: `<button type=\"button\" class=\"glare-button glare-button--fullscreen\" data-glare-fullscreen title=\"{{FULL_SCREEN}}\" aria-label=\"{{FULL_SCREEN}}\">${icons.fullscreen}</button>`,\n smallBtn: `<button type=\"button\" class=\"glare-button glare-close-small\" data-glare-close title=\"{{CLOSE}}\" aria-label=\"{{CLOSE}}\">${icons.close}</button>`,\n },\n}\n","export function isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nexport function deepMerge<T extends Record<string, unknown>>(\n target: T,\n ...sources: Array<Partial<T> | Record<string, unknown> | undefined | null | false>\n): T {\n const result: Record<string, unknown> = { ...target }\n\n for (const source of sources) {\n if (!source || typeof source !== 'object') continue\n for (const [key, value] of Object.entries(source)) {\n if (value === undefined) continue\n const existing = result[key]\n if (isObject(existing) && isObject(value) && !Array.isArray(value)) {\n result[key] = deepMerge(\n existing as Record<string, unknown>,\n value as Record<string, unknown>,\n )\n } else {\n result[key] = value\n }\n }\n }\n\n return result as T\n}\n\nexport function $(\n selector: string,\n context: ParentNode = document,\n): HTMLElement | null {\n return context.querySelector(selector)\n}\n\nexport function $$(\n selector: string,\n context: ParentNode = document,\n): HTMLElement[] {\n return Array.from(context.querySelectorAll(selector))\n}\n\nexport function createEl<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n className?: string,\n html?: string,\n): HTMLElementTagNameMap[K] {\n const el = document.createElement(tag)\n if (className) el.className = className\n if (html !== undefined) el.innerHTML = html\n return el\n}\n\nexport function setAttributes(\n el: HTMLElement,\n attrs: Record<string, string | number | boolean | null | undefined>,\n): void {\n for (const [key, value] of Object.entries(attrs)) {\n if (value === null || value === undefined || value === false) {\n el.removeAttribute(key)\n } else if (value === true) {\n el.setAttribute(key, '')\n } else {\n el.setAttribute(key, String(value))\n }\n }\n}\n\nexport function on<K extends keyof HTMLElementEventMap>(\n el: EventTarget,\n type: K,\n handler: (event: HTMLElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n): () => void\nexport function on(\n el: EventTarget,\n type: string,\n handler: EventListener,\n options?: boolean | AddEventListenerOptions,\n): () => void\nexport function on(\n el: EventTarget,\n type: string,\n handler: EventListener,\n options?: boolean | AddEventListenerOptions,\n): () => void {\n el.addEventListener(type, handler, options)\n return () => el.removeEventListener(type, handler, options)\n}\n\nexport function once(\n el: EventTarget,\n type: string,\n handler: EventListener,\n options?: boolean | AddEventListenerOptions,\n): () => void {\n const wrapped: EventListener = (event) => {\n off()\n handler(event)\n }\n const off = on(el, type, wrapped, options)\n return off\n}\n\nexport function css(\n el: HTMLElement,\n styles: Partial<CSSStyleDeclaration> | Record<string, string | number | null>,\n): void {\n for (const [key, value] of Object.entries(styles)) {\n if (value === null || value === undefined) {\n el.style.removeProperty(kebab(key))\n } else {\n ;(el.style as unknown as Record<string, string>)[key] = String(value)\n }\n }\n}\n\nexport function kebab(str: string): string {\n return str.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`)\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\nexport function isMobile(): boolean {\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent,\n ) || (navigator.maxTouchPoints > 1 && window.matchMedia('(pointer: coarse)').matches)\n}\n\nexport function getScrollbarWidth(): number {\n return window.innerWidth - document.documentElement.clientWidth\n}\n\nexport function lockScroll(lock: boolean): void {\n const html = document.documentElement\n if (lock) {\n const width = getScrollbarWidth()\n html.classList.add('glare-lock')\n if (width > 0) html.style.marginRight = `${width}px`\n } else if (!document.querySelector('.glare-container')) {\n html.classList.remove('glare-lock')\n html.style.marginRight = ''\n }\n}\n\nexport function translate(\n template: string,\n dict: Record<string, string>,\n): string {\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key: string) => dict[key] ?? '')\n}\n\nexport function getOffset(el: HTMLElement): DOMRect {\n return el.getBoundingClientRect()\n}\n\nexport function getCenter(el: HTMLElement): { x: number; y: number } {\n const rect = getOffset(el)\n return {\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2,\n }\n}\n\nexport function requestAnimFrame(cb: FrameRequestCallback): number {\n return window.requestAnimationFrame(cb)\n}\n\nexport function nextFrame(cb: () => void): void {\n requestAnimFrame(() => requestAnimFrame(cb))\n}\n\nexport function parseDataOptions(el: HTMLElement): Record<string, unknown> {\n const raw = el.getAttribute('data-options') || el.getAttribute('data-glare-options')\n if (!raw) return {}\n try {\n return JSON.parse(raw) as Record<string, unknown>\n } catch {\n return {}\n }\n}\n\nexport function getAttr(\n el: HTMLElement,\n names: string[],\n): string | null {\n for (const name of names) {\n const value = el.getAttribute(name)\n if (value !== null && value !== '') return value\n }\n return null\n}\n\nexport function toArray<T>(value: T | T[] | null | undefined): T[] {\n if (value == null) return []\n return Array.isArray(value) ? value : [value]\n}\n\nexport function uniqueId(prefix = 'glare'): string {\n return `${prefix}-${Math.random().toString(36).slice(2, 9)}`\n}\n\nexport function prefersReducedMotion(): boolean {\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n\nexport function loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image()\n img.onload = () => resolve(img)\n img.onerror = () => reject(new Error(`Failed to load image: ${src}`))\n img.src = src\n })\n}\n\nexport function buildQuery(params: Record<string, string | number | boolean>): string {\n return Object.entries(params)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join('&')\n}\n","import type { GlareInstance, SlideItem } from './types'\nimport { clamp, on } from './utils'\n\ninterface Point {\n x: number\n y: number\n}\n\ninterface GestureState {\n isPanning: boolean\n isSwiping: boolean\n isZooming: boolean\n startPoints: Point[]\n lastPoints: Point[]\n startDistance: number\n startScale: number\n startTranslate: Point\n currentTranslate: Point\n scale: number\n startTime: number\n moved: boolean\n}\n\nfunction distance(a: Point, b: Point): number {\n const dx = a.x - b.x\n const dy = a.y - b.y\n return Math.hypot(dx, dy)\n}\n\nfunction midpoint(a: Point, b: Point): Point {\n return { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 }\n}\n\nfunction getPoints(event: TouchEvent | MouseEvent): Point[] {\n if ('touches' in event) {\n return Array.from(event.touches).map((t) => ({ x: t.clientX, y: t.clientY }))\n }\n return [{ x: event.clientX, y: event.clientY }]\n}\n\nexport class Gestures {\n private instance: GlareInstance & {\n getContentEl: () => HTMLElement | null\n getImageWrap: () => HTMLElement | null\n applyZoom: (scale: number, x: number, y: number, animate?: boolean) => void\n getZoomState: () => { scale: number; x: number; y: number; min: number; max: number }\n onSwipe: (dx: number, dy: number, done: boolean, velocity?: Point) => void\n opts: { touch?: false | { vertical?: boolean; momentum?: boolean } }\n }\n\n private state: GestureState = {\n isPanning: false,\n isSwiping: false,\n isZooming: false,\n startPoints: [],\n lastPoints: [],\n startDistance: 0,\n startScale: 1,\n startTranslate: { x: 0, y: 0 },\n currentTranslate: { x: 0, y: 0 },\n scale: 1,\n startTime: 0,\n moved: false,\n }\n\n private cleanups: Array<() => void> = []\n private pointerId: number | null = null\n\n constructor(instance: Gestures['instance']) {\n this.instance = instance\n }\n\n attach(stage: HTMLElement): void {\n this.detach()\n\n this.cleanups.push(\n on(stage, 'pointerdown', (e) => this.onPointerDown(e as PointerEvent), { passive: false }),\n on(window, 'pointermove', (e) => this.onPointerMove(e as PointerEvent), { passive: false }),\n on(window, 'pointerup', (e) => this.onPointerUp(e as PointerEvent)),\n on(window, 'pointercancel', (e) => this.onPointerUp(e as PointerEvent)),\n on(stage, 'touchstart', (e) => this.onTouchStart(e as TouchEvent), { passive: false }),\n on(stage, 'touchmove', (e) => this.onTouchMove(e as TouchEvent), { passive: false }),\n on(stage, 'touchend', (e) => this.onTouchEnd(e as TouchEvent)),\n on(stage, 'touchcancel', (e) => this.onTouchEnd(e as TouchEvent)),\n )\n }\n\n detach(): void {\n this.cleanups.forEach((fn) => fn())\n this.cleanups = []\n }\n\n private touchEnabled(): boolean {\n return this.instance.opts.touch !== false\n }\n\n private onPointerDown(event: PointerEvent): void {\n if (!this.touchEnabled()) return\n if (event.pointerType === 'touch') return // handled by touch events for multi-touch\n if (event.button !== 0) return\n\n const target = event.target as HTMLElement\n if (target.closest('a, button, input, textarea, select, .glare-thumbs')) return\n\n this.pointerId = event.pointerId\n const points = [{ x: event.clientX, y: event.clientY }]\n this.begin(points)\n }\n\n private onPointerMove(event: PointerEvent): void {\n if (this.pointerId !== event.pointerId) return\n this.move([{ x: event.clientX, y: event.clientY }], event)\n }\n\n private onPointerUp(event: PointerEvent): void {\n if (this.pointerId !== event.pointerId) return\n this.pointerId = null\n this.end([{ x: event.clientX, y: event.clientY }])\n }\n\n private onTouchStart(event: TouchEvent): void {\n if (!this.touchEnabled()) return\n const target = event.target as HTMLElement\n if (target.closest('a, button, input, textarea, select, .glare-thumbs')) return\n this.begin(getPoints(event))\n }\n\n private onTouchMove(event: TouchEvent): void {\n this.move(getPoints(event), event)\n }\n\n private onTouchEnd(event: TouchEvent): void {\n this.end(getPoints(event))\n }\n\n private begin(points: Point[]): void {\n const zoom = this.instance.getZoomState()\n this.state = {\n isPanning: false,\n isSwiping: false,\n isZooming: points.length >= 2,\n startPoints: points,\n lastPoints: points,\n startDistance: points.length >= 2 ? distance(points[0], points[1]) : 0,\n startScale: zoom.scale,\n startTranslate: { x: zoom.x, y: zoom.y },\n currentTranslate: { x: zoom.x, y: zoom.y },\n scale: zoom.scale,\n startTime: performance.now(),\n moved: false,\n }\n }\n\n private move(points: Point[], event: Event): void {\n if (!this.state.startPoints.length) return\n const current = this.instance.current\n if (!current) return\n\n if (points.length >= 2 && this.state.startPoints.length >= 2) {\n event.preventDefault()\n this.state.isZooming = true\n this.state.moved = true\n const dist = distance(points[0], points[1])\n const scale = clamp(\n (dist / (this.state.startDistance || dist)) * this.state.startScale,\n 1,\n 5,\n )\n const mid = midpoint(points[0], points[1])\n this.state.scale = scale\n this.instance.applyZoom(scale, mid.x, mid.y, false)\n this.state.lastPoints = points\n return\n }\n\n if (!points.length || !this.state.startPoints.length) return\n\n const dx = points[0].x - this.state.startPoints[0].x\n const dy = points[0].y - this.state.startPoints[0].y\n const absX = Math.abs(dx)\n const absY = Math.abs(dy)\n\n if (!this.state.moved && absX < 6 && absY < 6) return\n this.state.moved = true\n\n const zoom = this.instance.getZoomState()\n const canPan = zoom.scale > 1.01 && current.type === 'image'\n\n if (canPan || this.state.isPanning) {\n event.preventDefault()\n this.state.isPanning = true\n const x = this.state.startTranslate.x + dx\n const y = this.state.startTranslate.y + dy\n this.state.currentTranslate = { x, y }\n this.instance.applyZoom(zoom.scale, x, y, false)\n } else {\n const touchOpts = this.instance.opts.touch\n const allowVertical = touchOpts && typeof touchOpts === 'object' ? touchOpts.vertical !== false : true\n if (!allowVertical && absY > absX) return\n event.preventDefault()\n this.state.isSwiping = true\n this.instance.onSwipe(dx, dy, false)\n }\n\n this.state.lastPoints = points\n }\n\n private end(points: Point[]): void {\n if (!this.state.startPoints.length) return\n\n const elapsed = Math.max(performance.now() - this.state.startTime, 1)\n const last = points[0] || this.state.lastPoints[0] || this.state.startPoints[0]\n const start = this.state.startPoints[0]\n const dx = last.x - start.x\n const dy = last.y - start.y\n const velocity = { x: dx / elapsed, y: dy / elapsed }\n\n if (this.state.isSwiping) {\n this.instance.onSwipe(dx, dy, true, velocity)\n } else if (this.state.isPanning) {\n const touchOpts = this.instance.opts.touch\n const momentum = touchOpts && typeof touchOpts === 'object' ? touchOpts.momentum !== false : true\n if (momentum) {\n const zoom = this.instance.getZoomState()\n this.instance.applyZoom(\n zoom.scale,\n this.state.currentTranslate.x + velocity.x * 120,\n this.state.currentTranslate.y + velocity.y * 120,\n true,\n )\n }\n }\n\n this.state.startPoints = []\n this.state.isPanning = false\n this.state.isSwiping = false\n this.state.isZooming = false\n }\n\n wasMoved(): boolean {\n return this.state.moved\n }\n\n resetMoved(): void {\n this.state.moved = false\n }\n}\n\nexport type { SlideItem }\n","import type { GlareInstance } from './types'\nimport { icons } from './icons'\nimport { on } from './utils'\n\ntype FsDoc = Document & {\n webkitFullscreenElement?: Element\n mozFullScreenElement?: Element\n msFullscreenElement?: Element\n webkitExitFullscreen?: () => Promise<void>\n mozCancelFullScreen?: () => Promise<void>\n msExitFullscreen?: () => Promise<void>\n}\n\ntype FsEl = HTMLElement & {\n webkitRequestFullscreen?: () => Promise<void>\n mozRequestFullScreen?: () => Promise<void>\n msRequestFullscreen?: () => Promise<void>\n}\n\nexport class FullScreen {\n private instance: GlareInstance\n private cleanups: Array<() => void> = []\n\n constructor(instance: GlareInstance) {\n this.instance = instance\n }\n\n init(): void {\n this.cleanups.push(\n on(document, 'fullscreenchange', () => this.sync()),\n on(document, 'webkitfullscreenchange', () => this.sync()),\n )\n }\n\n isFullscreen(): boolean {\n const doc = document as FsDoc\n return !!(\n document.fullscreenElement ||\n doc.webkitFullscreenElement ||\n doc.mozFullScreenElement ||\n doc.msFullscreenElement\n )\n }\n\n request(): void {\n const el = (this.instance.$refs.container || document.documentElement) as FsEl\n const req =\n el.requestFullscreen ||\n el.webkitRequestFullscreen ||\n el.mozRequestFullScreen ||\n el.msRequestFullscreen\n void req?.call(el)\n }\n\n exit(): void {\n const doc = document as FsDoc\n const exit =\n document.exitFullscreen ||\n doc.webkitExitFullscreen ||\n doc.mozCancelFullScreen ||\n doc.msExitFullscreen\n if (this.isFullscreen()) void exit?.call(document)\n }\n\n toggle(): void {\n if (this.isFullscreen()) this.exit()\n else this.request()\n }\n\n private sync(): void {\n const active = this.isFullscreen()\n this.instance.$refs.container?.classList.toggle('glare-is-fullscreen', active)\n const btn = this.instance.$refs.container?.querySelector(\n '[data-glare-fullscreen]',\n ) as HTMLElement | null\n if (btn) {\n btn.innerHTML = active ? icons.fullscreenExit : icons.fullscreen\n btn.classList.toggle('is-active', active)\n }\n }\n\n destroy(): void {\n if (this.isFullscreen()) this.exit()\n this.cleanups.forEach((fn) => fn())\n this.cleanups = []\n }\n}\n","import type { GlareInstance } from './types'\nimport { on } from './utils'\n\nfunction parseHash(): { gallery: string; index: number } | null {\n const hash = window.location.hash.replace(/^#/, '')\n if (!hash) return null\n // Formats: gallery-1 | gallery/2 | glare-gallery-1\n const match = hash.match(/^(?:glare-)?(.+?)(?:-|\\/)(\\d+)$/)\n if (!match) return null\n return { gallery: match[1], index: Math.max(0, parseInt(match[2], 10) - 1) }\n}\n\nexport function getGalleryHash(gallery: string, index: number): string {\n return `${gallery}-${index + 1}`\n}\n\nexport class Hash {\n private instance: GlareInstance\n private gallery: string\n private cleanups: Array<() => void> = []\n private skipping = false\n\n constructor(instance: GlareInstance, gallery: string) {\n this.instance = instance\n this.gallery = gallery || 'gallery'\n }\n\n static parse = parseHash\n\n init(): void {\n this.cleanups.push(\n on(window, 'hashchange', () => {\n if (this.skipping) return\n const parsed = parseHash()\n if (!parsed || parsed.gallery !== this.gallery) {\n if (this.instance.isActive) this.instance.close()\n return\n }\n if (parsed.index !== this.instance.currIndex) {\n this.instance.jumpTo(parsed.index)\n }\n }),\n )\n this.update()\n }\n\n update(index = this.instance.currIndex): void {\n if (!this.gallery) return\n const next = getGalleryHash(this.gallery, index)\n if (window.location.hash.replace(/^#/, '') === next) return\n this.skipping = true\n const url = `${window.location.pathname}${window.location.search}#${next}`\n window.history.replaceState(null, '', url)\n queueMicrotask(() => {\n this.skipping = false\n })\n }\n\n clear(): void {\n const parsed = parseHash()\n if (parsed && parsed.gallery === this.gallery) {\n this.skipping = true\n const url = `${window.location.pathname}${window.location.search}`\n window.history.replaceState(null, '', url)\n queueMicrotask(() => {\n this.skipping = false\n })\n }\n }\n\n destroy(): void {\n this.clear()\n this.cleanups.forEach((fn) => fn())\n this.cleanups = []\n }\n}\n","import type { ContentType, MediaProvider, GlareOptions, SlideItem, SlideSource } from './types'\nimport { buildQuery, deepMerge } from './utils'\n\nconst IMAGE_EXT = /\\.(avif|bmp|gif|jpe?g|png|svg|webp|ico)(\\?.*)?$/i\nconst VIDEO_EXT = /\\.(mp4|webm|ogg|ogv|mov|m4v)(\\?.*)?$/i\nconst PDF_EXT = /\\.pdf(\\?.*)?$/i\n\nexport function detectType(src: string, explicit?: ContentType): ContentType {\n if (explicit) return explicit\n if (!src) return 'html'\n if (src.startsWith('#') || src.startsWith('.')) return 'inline'\n if (IMAGE_EXT.test(src)) return 'image'\n if (VIDEO_EXT.test(src)) return 'video'\n if (PDF_EXT.test(src)) return 'iframe'\n if (/^https?:\\/\\//i.test(src) || src.startsWith('//') || src.startsWith('/')) {\n return 'iframe'\n }\n return 'html'\n}\n\nfunction applyMediaProvider(\n src: string,\n media: Record<string, MediaProvider> | undefined,\n): Partial<SlideSource> | null {\n if (!media) return null\n for (const provider of Object.values(media)) {\n const match = src.match(provider.matcher)\n if (!match) continue\n\n let url = src\n if (typeof provider.url === 'function') {\n url = provider.url(match, src)\n } else if (typeof provider.url === 'string') {\n url = provider.url.replace(/\\$(\\d+)/g, (_, n) => match[Number(n)] || '')\n }\n\n if (provider.params) {\n const sep = url.includes('?') ? '&' : '?'\n url += sep + buildQuery(provider.params)\n }\n\n let thumb: string | undefined\n if (typeof provider.thumb === 'function') {\n thumb = provider.thumb(match, src)\n } else if (typeof provider.thumb === 'string') {\n thumb = provider.thumb.replace(/\\$(\\d+)/g, (_, n) => match[Number(n)] || '')\n }\n\n return {\n src: url,\n type: (provider.type as ContentType) || 'iframe',\n thumb,\n }\n }\n return null\n}\n\nexport function normalizeItem(\n source: SlideSource | string,\n index: number,\n opts: GlareOptions,\n): SlideItem {\n const raw: SlideSource =\n typeof source === 'string' ? { src: source } : { ...source }\n\n let src = raw.src || ''\n let type = raw.type\n let thumb = raw.thumb\n\n if (raw.html && !src) {\n type = 'html'\n src = ''\n }\n\n const mediaHit = src ? applyMediaProvider(src, opts.media) : null\n if (mediaHit) {\n src = mediaHit.src || src\n type = (mediaHit.type as ContentType) || type\n thumb = thumb || mediaHit.thumb\n }\n\n if (!type) {\n if (raw.content || raw.html) type = 'html'\n else type = detectType(src, opts.defaultType)\n }\n\n // Treat unknown remote URLs that look like pages as iframe;\n // images/videos already caught by extension.\n if (type === 'iframe' && IMAGE_EXT.test(src)) type = 'image'\n if (type === 'iframe' && VIDEO_EXT.test(src)) type = 'video'\n\n const item: SlideItem = {\n ...raw,\n index,\n src,\n type,\n thumb,\n caption: raw.caption ?? raw.title ?? '',\n isLoaded: false,\n isComplete: false,\n hasError: false,\n canZoomIn: false,\n canZoomOut: false,\n }\n\n if (raw.opts) {\n item.opts = deepMerge({}, opts, raw.opts) as GlareOptions\n }\n\n return item\n}\n\nexport function itemsFromElements(\n elements: HTMLElement[],\n opts: GlareOptions,\n): SlideItem[] {\n return elements.map((el, index) => {\n const href =\n el.getAttribute('data-src') ||\n el.getAttribute('data-glare-src') ||\n el.getAttribute('href') ||\n ''\n\n const typeAttr = (el.getAttribute('data-type') ||\n el.getAttribute('data-glare-type') ||\n undefined) as ContentType | undefined\n\n const caption =\n el.getAttribute('data-caption') ||\n el.getAttribute('data-glare-caption') ||\n el.getAttribute('title') ||\n ''\n\n const thumb =\n el.getAttribute('data-thumb') ||\n el.getAttribute('data-glare-thumb') ||\n el.querySelector('img')?.getAttribute('src') ||\n undefined\n\n const width = el.getAttribute('data-width') || undefined\n const height = el.getAttribute('data-height') || undefined\n const poster = el.getAttribute('data-poster') || undefined\n const downloadSrc =\n el.getAttribute('data-download-src') ||\n el.getAttribute('data-glare-download') ||\n undefined\n\n let html: string | undefined\n const srcHtml = el.getAttribute('data-html') || el.getAttribute('data-glare-html')\n if (srcHtml) html = srcHtml\n\n const item = normalizeItem(\n {\n src: href,\n type: typeAttr,\n caption,\n thumb,\n width,\n height,\n poster,\n downloadSrc,\n html,\n alt: el.querySelector('img')?.getAttribute('alt') || caption || '',\n $trigger: el,\n },\n index,\n opts,\n )\n\n return item\n })\n}\n","import type { GlareInstance, ShareOptions, SlideItem } from './types'\nimport { createEl, on, translate } from './utils'\n\nconst DEFAULT_TPL = `\n<div class=\"glare-share\">\n <h4 class=\"glare-share-title\">{{SHARE}}</h4>\n <p><a class=\"glare-share-link\" href=\"{{url_facebook}}\" target=\"_blank\" rel=\"noopener\">Facebook</a></p>\n <p><a class=\"glare-share-link\" href=\"{{url_twitter}}\" target=\"_blank\" rel=\"noopener\">X / Twitter</a></p>\n <p><a class=\"glare-share-link\" href=\"{{url_pinterest}}\" target=\"_blank\" rel=\"noopener\">Pinterest</a></p>\n <p><input class=\"glare-share-input\" type=\"text\" value=\"{{url_direct}}\" readonly /></p>\n</div>\n`\n\nexport class Share {\n private instance: GlareInstance\n private opts: ShareOptions\n private $overlay: HTMLElement | null = null\n private cleanups: Array<() => void> = []\n\n constructor(instance: GlareInstance, opts: ShareOptions | true) {\n this.instance = instance\n this.opts = opts === true ? {} : opts\n }\n\n open(): void {\n const current = this.instance.current\n if (!current || !this.instance.$refs.container) return\n\n this.close()\n\n const url = this.resolveUrl(current)\n const encoded = encodeURIComponent(url)\n const media = encodeURIComponent(current.thumb || current.src || url)\n const caption = encodeURIComponent(current.caption || '')\n\n const lang = this.instance.opts.lang || 'en'\n const dict = {\n ...(this.instance.opts.i18n?.en || {}),\n ...(this.instance.opts.i18n?.[lang] || {}),\n url_direct: url,\n url_facebook: `https://www.facebook.com/sharer/sharer.php?u=${encoded}`,\n url_twitter: `https://twitter.com/intent/tweet?url=${encoded}&text=${caption}`,\n url_pinterest: `https://pinterest.com/pin/create/button/?url=${encoded}&media=${media}&description=${caption}`,\n } as Record<string, string>\n\n const html = translate(this.opts.tpl || DEFAULT_TPL, dict)\n this.$overlay = createEl('div', 'glare-share-overlay', html)\n this.instance.$refs.container.appendChild(this.$overlay)\n\n const input = this.$overlay.querySelector('.glare-share-input') as HTMLInputElement | null\n input?.select()\n\n this.cleanups.push(\n on(this.$overlay, 'click', (event) => {\n if (event.target === this.$overlay) this.close()\n }),\n )\n }\n\n close(): void {\n this.cleanups.forEach((fn) => fn())\n this.cleanups = []\n this.$overlay?.remove()\n this.$overlay = null\n }\n\n private resolveUrl(item: SlideItem): string {\n if (typeof this.opts.url === 'function') return this.opts.url(item)\n if (typeof this.opts.url === 'string') return this.opts.url\n if (item.src && /^https?:\\/\\//i.test(item.src)) return item.src\n return window.location.href\n }\n\n destroy(): void {\n this.close()\n }\n}\n","import type { GlareInstance, SlideshowOptions } from './types'\nimport { icons } from './icons'\n\nexport class Slideshow {\n private instance: GlareInstance\n private opts: SlideshowOptions\n private timer: ReturnType<typeof setTimeout> | null = null\n private active = false\n\n constructor(instance: GlareInstance, opts: SlideshowOptions) {\n this.instance = instance\n this.opts = opts\n }\n\n init(): void {\n if (this.opts.autoStart) this.start()\n }\n\n isActive(): boolean {\n return this.active\n }\n\n start(): void {\n if (this.instance.group.length < 2) return\n this.active = true\n this.instance.$refs.container?.classList.add('glare-is-slideshow')\n this.updateButton()\n this.queue()\n }\n\n stop(): void {\n this.active = false\n this.clear()\n this.instance.$refs.container?.classList.remove('glare-is-slideshow')\n this.updateButton()\n }\n\n toggle(): void {\n if (this.active) this.stop()\n else this.start()\n }\n\n private queue(): void {\n this.clear()\n if (!this.active) return\n this.timer = setTimeout(() => {\n if (!this.active) return\n this.instance.next()\n this.queue()\n }, this.opts.speed || 3000)\n }\n\n private clear(): void {\n if (this.timer) {\n clearTimeout(this.timer)\n this.timer = null\n }\n }\n\n private updateButton(): void {\n const btn = this.instance.$refs.container?.querySelector(\n '[data-glare-slideshow]',\n ) as HTMLElement | null\n if (!btn) return\n const label = this.active\n ? this.getLabel('PLAY_STOP')\n : this.getLabel('PLAY_START')\n btn.setAttribute('title', label)\n btn.setAttribute('aria-label', label)\n btn.innerHTML = this.active ? icons.pause : icons.play\n btn.classList.toggle('is-active', this.active)\n }\n\n private getLabel(key: string): string {\n const lang = this.instance.opts.lang || 'en'\n const dict = {\n ...(this.instance.opts.i18n?.en || {}),\n ...(this.instance.opts.i18n?.[lang] || {}),\n } as Record<string, string>\n return dict[key] || key\n }\n\n destroy(): void {\n this.stop()\n }\n}\n","import type { GlareInstance, ThumbsOptions } from './types'\nimport { $, $$, createEl, on } from './utils'\n\nexport class Thumbs {\n isActive = false\n private instance: GlareInstance\n private opts: ThumbsOptions\n private $container: HTMLElement | null = null\n private $list: HTMLElement | null = null\n private cleanups: Array<() => void> = []\n\n constructor(instance: GlareInstance, opts: ThumbsOptions) {\n this.instance = instance\n this.opts = opts\n }\n\n init(): void {\n if (this.instance.group.length < 2) return\n\n const parent =\n typeof this.opts.parentEl === 'string'\n ? $(this.opts.parentEl) || this.instance.$refs.container\n : this.opts.parentEl || this.instance.$refs.container\n\n if (!parent) return\n\n this.$container = createEl('div', `glare-thumbs glare-thumbs--${this.opts.axis || 'y'}`)\n this.$list = createEl('div', 'glare-thumbs-list')\n this.$container.appendChild(this.$list)\n\n for (const item of this.instance.group) {\n const btn = createEl('button', 'glare-thumbs-item') as HTMLButtonElement\n btn.type = 'button'\n btn.setAttribute('aria-label', `Go to slide ${item.index + 1}`)\n btn.dataset.index = String(item.index)\n\n if (item.thumb || (item.type === 'image' && item.src)) {\n const img = createEl('img') as HTMLImageElement\n img.src = item.thumb || item.src\n img.alt = item.alt || item.caption || ''\n img.loading = 'lazy'\n btn.appendChild(img)\n } else {\n btn.textContent = String(item.index + 1)\n }\n\n this.$list.appendChild(btn)\n this.cleanups.push(\n on(btn, 'click', () => {\n this.instance.jumpTo(item.index)\n }),\n )\n }\n\n parent.appendChild(this.$container)\n\n if (this.opts.autoStart) this.show()\n this.focus(this.instance.currIndex)\n }\n\n show(): void {\n if (!this.$container) return\n this.isActive = true\n this.$container.classList.add('glare-thumbs--active')\n this.instance.$refs.container?.classList.add('glare-show-thumbs')\n }\n\n hide(): void {\n if (!this.$container) return\n this.isActive = false\n this.$container.classList.remove('glare-thumbs--active')\n this.instance.$refs.container?.classList.remove('glare-show-thumbs')\n }\n\n toggle(): void {\n if (this.isActive) this.hide()\n else this.show()\n }\n\n focus(index = this.instance.currIndex): void {\n if (!this.$list) return\n $$('.glare-thumbs-item', this.$list).forEach((el) => {\n el.classList.toggle('is-active', Number(el.dataset.index) === index)\n })\n const active = this.$list.querySelector('.is-active') as HTMLElement | null\n active?.scrollIntoView({ block: 'nearest', inline: 'nearest', behavior: 'smooth' })\n }\n\n destroy(): void {\n if (this.opts.hideOnClose !== false) this.hide()\n this.cleanups.forEach((fn) => fn())\n this.cleanups = []\n this.$container?.remove()\n this.$container = null\n this.$list = null\n }\n}\n","import type { GlareInstance } from './types'\nimport { on } from './utils'\n\nexport class WheelNav {\n private instance: GlareInstance\n private mode: boolean | 'auto' | 'slide'\n private cleanups: Array<() => void> = []\n private locked = false\n\n constructor(instance: GlareInstance, mode: boolean | 'auto' | 'slide') {\n this.instance = instance\n this.mode = mode\n }\n\n init(stage: HTMLElement): void {\n if (this.mode === false) return\n this.cleanups.push(\n on(\n stage,\n 'wheel',\n (event) => {\n const e = event as WheelEvent\n if (this.locked) return\n\n const current = this.instance.current\n if (!current) return\n\n if (this.mode === 'auto' && current.type !== 'image') return\n if (current.type === 'image') {\n const zoomed = this.instance.$refs.container?.classList.contains('glare-can-zoom-out')\n if (zoomed) return\n }\n\n e.preventDefault()\n this.locked = true\n if (e.deltaY > 0) this.instance.next()\n else this.instance.prev()\n setTimeout(() => {\n this.locked = false\n }, 350)\n },\n { passive: false },\n ),\n )\n }\n\n destroy(): void {\n this.cleanups.forEach((fn) => fn())\n this.cleanups = []\n }\n}\n","import type {\n ClickAction,\n EventHandler,\n EventName,\n I18nDict,\n GlareInstance,\n GlareOptions,\n SlideItem,\n SlideSource,\n} from './types'\nimport { defaults } from './defaults'\nimport { Gestures } from './gestures'\nimport { FullScreen } from './fullscreen'\nimport { Hash } from './hash'\nimport { icons } from './icons'\nimport { itemsFromElements, normalizeItem } from './media'\nimport { Share } from './share'\nimport { Slideshow } from './slideshow'\nimport { Thumbs } from './thumbs'\nimport {\n $,\n $$,\n clamp,\n createEl,\n css,\n deepMerge,\n getOffset,\n isMobile,\n lockScroll,\n nextFrame,\n on,\n prefersReducedMotion,\n translate,\n} from './utils'\nimport { WheelNav } from './wheel'\n\nlet instanceId = 0\nconst activeStack: Glare[] = []\n\nfunction resolveParent(parentEl: string | HTMLElement | undefined): HTMLElement {\n if (!parentEl) return document.body\n if (typeof parentEl === 'string') return $(parentEl) || document.body\n return parentEl\n}\n\nexport class Glare implements GlareInstance {\n id: number\n group: SlideItem[] = []\n opts: GlareOptions\n current: SlideItem | null = null\n currIndex = 0\n prevIndex = 0\n isActive = false\n isClosing = false\n isAnimating = false\n isIdle = false\n\n $refs: GlareInstance['$refs'] = {\n container: null,\n stage: null,\n bg: null,\n inner: null,\n caption: null,\n toolbar: null,\n infobar: null,\n navigation: null,\n }\n\n SlideShow?: Slideshow\n Thumbs?: Thumbs\n FullScreen?: FullScreen\n\n private galleryName = ''\n private cleanups: Array<() => void> = []\n private idleTimer: ReturnType<typeof setTimeout> | null = null\n private gestures: Gestures | null = null\n private hash: Hash | null = null\n private wheel: WheelNav | null = null\n private share: Share | null = null\n private zoom = { scale: 1, x: 0, y: 0, min: 1, max: 5 }\n private previouslyFocused: HTMLElement | null = null\n private openedFrom: HTMLElement | null = null\n\n constructor(\n items: Array<SlideSource | string> | HTMLElement[],\n options: GlareOptions = {},\n index = 0,\n galleryName = '',\n ) {\n this.id = ++instanceId\n this.galleryName = galleryName\n\n const merged = deepMerge(\n {},\n defaults as Record<string, unknown>,\n options as Record<string, unknown>,\n ) as GlareOptions\n\n if (isMobile() && merged.mobile) {\n this.opts = deepMerge(\n {},\n merged as Record<string, unknown>,\n merged.mobile as Record<string, unknown>,\n ) as GlareOptions\n } else {\n this.opts = merged\n }\n\n if (items.length && items[0] instanceof HTMLElement) {\n this.group = itemsFromElements(items as HTMLElement[], this.opts)\n } else {\n this.group = (items as Array<SlideSource | string>).map((item, i) =>\n normalizeItem(item, i, this.opts),\n )\n }\n\n this.currIndex = clamp(index, 0, Math.max(0, this.group.length - 1))\n }\n\n open(index = this.currIndex): void {\n if (this.isActive) {\n this.jumpTo(index)\n return\n }\n\n if (this.opts.closeExisting) {\n Glare.close(true)\n }\n\n this.currIndex = clamp(index, 0, Math.max(0, this.group.length - 1))\n this.current = this.group[this.currIndex] || null\n this.openedFrom = (this.current?.$trigger as HTMLElement) || null\n this.previouslyFocused = document.activeElement as HTMLElement | null\n\n this.trigger('onInit')\n this.build()\n this.isActive = true\n activeStack.push(this)\n\n if (this.opts.hideScrollbar) lockScroll(true)\n\n this.trigger('onActivate')\n this.trigger('beforeShow', this.current || undefined)\n\n nextFrame(() => {\n this.$refs.container?.classList.add('glare-is-open', 'glare-is-animated')\n this.loadSlide(this.currIndex, true)\n this.bindEvents()\n this.initModules()\n if (this.opts.autoFocus) this.focus()\n this.resetIdle()\n })\n }\n\n close(_event?: Event | null, duration?: number): void {\n if (!this.isActive || this.isClosing) return\n if (this.trigger('beforeClose', this.current || undefined) === false) return\n\n this.isClosing = true\n this.SlideShow?.stop()\n this.clearIdle()\n\n const container = this.$refs.container\n const dur =\n duration ??\n (prefersReducedMotion() ? 0 : this.opts.animationDuration || 0)\n\n container?.classList.add('glare-is-closing')\n container?.classList.remove('glare-is-open')\n\n const finish = () => {\n this.teardown()\n }\n\n if (dur > 0 && container) {\n const onEnd = (e: Event) => {\n if (e.target !== container) return\n container.removeEventListener('transitionend', onEnd)\n finish()\n }\n container.addEventListener('transitionend', onEnd)\n setTimeout(finish, dur + 50)\n } else {\n finish()\n }\n }\n\n next(duration?: number): void {\n this.jumpTo(this.currIndex + 1, duration)\n }\n\n previous(duration?: number): void {\n this.jumpTo(this.currIndex - 1, duration)\n }\n\n prev(duration?: number): void {\n this.previous(duration)\n }\n\n jumpTo(index: number, duration?: number): void {\n if (!this.isActive || this.isClosing) return\n\n const len = this.group.length\n if (!len) return\n\n let nextIndex = index\n if (this.opts.loop) {\n nextIndex = ((index % len) + len) % len\n } else {\n nextIndex = clamp(index, 0, len - 1)\n if (nextIndex === this.currIndex && index !== this.currIndex) return\n }\n\n if (nextIndex === this.currIndex) return\n\n this.prevIndex = this.currIndex\n this.currIndex = nextIndex\n this.current = this.group[nextIndex]\n this.resetZoom()\n this.loadSlide(nextIndex, false, duration)\n this.updateChrome()\n this.Thumbs?.focus(nextIndex)\n this.hash?.update(nextIndex)\n this.trigger('onUpdate', this.current)\n }\n\n scaleToFit(duration = 300): void {\n this.animateZoom(1, 0, 0, duration)\n this.$refs.container?.classList.remove('glare-can-zoom-out')\n this.$refs.container?.classList.add('glare-can-zoom-in')\n this.updateZoomButton()\n }\n\n scaleToActual(x?: number, y?: number, duration = 300): void {\n const wrap = this.getImageWrap()\n if (!wrap) return\n const rect = getOffset(wrap)\n const cx = x ?? rect.left + rect.width / 2\n const cy = y ?? rect.top + rect.height / 2\n const scale = Math.min(this.zoom.max, 2.5)\n const dx = (rect.left + rect.width / 2 - cx) * (scale - 1)\n const dy = (rect.top + rect.height / 2 - cy) * (scale - 1)\n this.animateZoom(scale, dx, dy, duration)\n this.$refs.container?.classList.add('glare-can-zoom-out')\n this.$refs.container?.classList.remove('glare-can-zoom-in')\n this.updateZoomButton()\n }\n\n update(): void {\n this.updateChrome()\n this.positionContent()\n }\n\n focus(): void {\n this.$refs.container?.focus({ preventScroll: true })\n }\n\n toggleControls(force?: boolean): void {\n const container = this.$refs.container\n if (!container) return\n const hide = force === undefined ? !container.classList.contains('glare-is-idle') : force\n container.classList.toggle('glare-is-idle', hide)\n this.isIdle = hide\n }\n\n getContentEl(): HTMLElement | null {\n return this.current?.$content || null\n }\n\n getImageWrap(): HTMLElement | null {\n return this.current?.$slide?.querySelector('.glare-content') as HTMLElement | null\n }\n\n getZoomState() {\n return { ...this.zoom }\n }\n\n applyZoom(scale: number, x: number, y: number, animate = false): void {\n this.animateZoom(scale, x, y, animate ? 250 : 0)\n const zoomed = scale > 1.01\n this.$refs.container?.classList.toggle('glare-can-zoom-out', zoomed)\n this.$refs.container?.classList.toggle('glare-can-zoom-in', !zoomed)\n this.updateZoomButton()\n }\n\n onSwipe(dx: number, dy: number, done: boolean, velocity?: { x: number; y: number }): void {\n const stage = this.$refs.stage\n if (!stage) return\n\n if (!done) {\n css(stage, {\n transform: `translate3d(${dx}px, ${dy}px, 0)`,\n transitionDuration: '0ms',\n })\n if (this.$refs.bg) {\n const opacity = clamp(1 - Math.abs(dy) / 400, 0.35, 1)\n css(this.$refs.bg, { opacity: String(opacity) })\n }\n return\n }\n\n const absX = Math.abs(dx)\n const absY = Math.abs(dy)\n const vx = velocity?.x || 0\n const vy = velocity?.y || 0\n\n css(stage, { transitionDuration: '' })\n if (this.$refs.bg) css(this.$refs.bg, { opacity: '' })\n\n if (absY > 100 || Math.abs(vy) > 0.5) {\n if (absY > absX) {\n this.close()\n return\n }\n }\n\n if (absX > 80 || Math.abs(vx) > 0.4) {\n if (dx < 0) this.next()\n else this.prev()\n }\n\n css(stage, { transform: '' })\n }\n\n /* -------------------- private -------------------- */\n\n private build(): void {\n const dict = this.dict()\n const tpl = translate(this.opts.baseTpl || '', dict)\n const wrapper = createEl('div', '', tpl)\n const container = wrapper.firstElementChild as HTMLElement\n container.dataset.glareId = String(this.id)\n if (this.opts.baseClass) container.classList.add(this.opts.baseClass)\n if (this.opts.modal) container.classList.add('glare-is-modal')\n\n this.$refs.container = container\n this.$refs.bg = $('.glare-bg', container)\n this.$refs.inner = $('.glare-inner', container)\n this.$refs.stage = $('.glare-stage', container)\n this.$refs.caption = $('.glare-caption', container)\n this.$refs.toolbar = $('.glare-toolbar', container)\n this.$refs.infobar = $('.glare-infobar', container)\n this.$refs.navigation = $('.glare-navigation', container)\n\n this.buildToolbar()\n this.updateChrome()\n\n if (!this.opts.arrows || this.group.length < 2) {\n this.$refs.navigation?.classList.add('glare-hidden')\n }\n if (!this.opts.infobar || this.group.length < 2) {\n this.$refs.infobar?.classList.add('glare-hidden')\n }\n\n resolveParent(this.opts.parentEl).appendChild(container)\n }\n\n private buildToolbar(): void {\n const toolbar = this.$refs.toolbar\n if (!toolbar) return\n\n const showToolbar = this.opts.toolbar === true || this.opts.toolbar === 'auto'\n if (!showToolbar) {\n toolbar.classList.add('glare-hidden')\n return\n }\n\n const dict = this.dict()\n const buttons = this.opts.buttons || []\n toolbar.innerHTML = ''\n\n for (const name of buttons) {\n if (name === 'thumbs' && this.group.length < 2) continue\n if (name === 'slideshow' && this.group.length < 2) continue\n const tpl = this.opts.btnTpl?.[name]\n if (!tpl) continue\n toolbar.insertAdjacentHTML('beforeend', translate(tpl, dict))\n }\n }\n\n private initModules(): void {\n const thumbsOpts = this.opts.thumbs\n if (thumbsOpts) {\n const opts =\n thumbsOpts === true\n ? { ...(defaults.thumbs as object) }\n : thumbsOpts\n this.Thumbs = new Thumbs(this, opts)\n this.Thumbs.init()\n }\n\n const slideShowOpts = this.opts.slideShow\n if (slideShowOpts) {\n const opts =\n slideShowOpts === true\n ? { ...(defaults.slideShow as object) }\n : slideShowOpts\n this.SlideShow = new Slideshow(this, opts)\n this.SlideShow.init()\n }\n\n if (this.opts.fullScreen !== false) {\n this.FullScreen = new FullScreen(this)\n this.FullScreen.init()\n const fsOpts = this.opts.fullScreen\n if (fsOpts && typeof fsOpts === 'object' && fsOpts.autoStart) {\n this.FullScreen.request()\n }\n }\n\n if (this.opts.share) {\n this.share = new Share(this, this.opts.share)\n }\n\n if (this.opts.hash && this.galleryName) {\n this.hash = new Hash(this, this.galleryName)\n this.hash.init()\n }\n\n if (this.opts.wheel !== false && this.$refs.stage) {\n this.wheel = new WheelNav(this, this.opts.wheel || 'auto')\n this.wheel.init(this.$refs.stage)\n }\n\n if (this.opts.touch !== false && this.$refs.stage) {\n this.gestures = new Gestures(this as unknown as ConstructorParameters<typeof Gestures>[0])\n this.gestures.attach(this.$refs.stage)\n }\n }\n\n private bindEvents(): void {\n const container = this.$refs.container\n if (!container) return\n\n this.cleanups.push(\n on(container, 'click', (event) => this.onClick(event as MouseEvent)),\n on(container, 'dblclick', (event) => this.onDblClick(event as MouseEvent)),\n on(document, 'keydown', (event) => this.onKeydown(event as KeyboardEvent)),\n on(window, 'resize', () => this.positionContent()),\n on(window, 'orientationchange', () => this.positionContent()),\n on(document, 'mousemove', () => this.resetIdle()),\n on(document, 'touchstart', () => this.resetIdle(), { passive: true }),\n )\n\n if (this.opts.trapFocus) {\n this.cleanups.push(\n on(container, 'keydown', (event) => {\n const e = event as KeyboardEvent\n if (e.key !== 'Tab') return\n const focusables = $$('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])', container)\n .filter((el) => !el.hasAttribute('disabled') && el.offsetParent !== null)\n if (!focusables.length) return\n const first = focusables[0]\n const last = focusables[focusables.length - 1]\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault()\n last.focus()\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault()\n first.focus()\n }\n }),\n )\n }\n\n if (this.opts.protect) {\n this.cleanups.push(\n on(container, 'contextmenu', (e) => {\n e.preventDefault()\n }),\n on(container, 'dragstart', (e) => {\n if ((e.target as HTMLElement).tagName === 'IMG') e.preventDefault()\n }),\n )\n }\n }\n\n private onClick(event: MouseEvent): void {\n if (this.gestures?.wasMoved()) {\n this.gestures.resetMoved()\n return\n }\n\n const target = event.target as HTMLElement\n\n if (target.closest('[data-glare-close]')) {\n this.close(event)\n return\n }\n if (target.closest('[data-glare-next]')) {\n this.next()\n return\n }\n if (target.closest('[data-glare-prev]')) {\n this.prev()\n return\n }\n if (target.closest('[data-glare-zoom]')) {\n this.toggleZoom(event)\n return\n }\n if (target.closest('[data-glare-slideshow]')) {\n this.SlideShow?.toggle()\n return\n }\n if (target.closest('[data-glare-thumbs]')) {\n this.Thumbs?.toggle()\n return\n }\n if (target.closest('[data-glare-fullscreen]')) {\n this.FullScreen?.toggle()\n return\n }\n if (target.closest('[data-glare-share]')) {\n this.share?.open()\n return\n }\n if (target.closest('[data-glare-download]')) {\n return\n }\n\n if (target.closest('.glare-content') || target.closest('.glare-space')) {\n this.handleClickAction(this.opts.clickContent, event)\n return\n }\n if (target.closest('.glare-slide')) {\n this.handleClickAction(this.opts.clickSlide, event)\n return\n }\n if (target.classList.contains('glare-bg') || target.classList.contains('glare-stage')) {\n this.handleClickAction(this.opts.clickOutside, event)\n }\n }\n\n private onDblClick(event: MouseEvent): void {\n const target = event.target as HTMLElement\n if (target.closest('.glare-content') || target.closest('.glare-space')) {\n this.handleClickAction(this.opts.dblclickContent, event)\n } else if (target.closest('.glare-slide')) {\n this.handleClickAction(this.opts.dblclickSlide, event)\n } else {\n this.handleClickAction(this.opts.dblclickOutside, event)\n }\n }\n\n private handleClickAction(action: ClickAction | undefined, event: Event): void {\n if (!action || !this.current) return\n let resolved: ClickAction | void = action\n if (typeof action === 'function') {\n resolved = action(this.current, event)\n }\n switch (resolved) {\n case 'close':\n this.close(event)\n break\n case 'next':\n this.next()\n break\n case 'nextOrClose':\n if (this.currIndex === this.group.length - 1 && !this.opts.loop) this.close(event)\n else this.next()\n break\n case 'toggleControls':\n this.toggleControls()\n break\n case 'zoom':\n this.toggleZoom(event as MouseEvent)\n break\n default:\n break\n }\n }\n\n private onKeydown(event: KeyboardEvent): void {\n if (!this.isActive || !this.opts.keyboard || this.opts.modal) return\n if (activeStack[activeStack.length - 1] !== this) return\n\n const tag = (event.target as HTMLElement)?.tagName\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return\n\n switch (event.key) {\n case 'Escape':\n event.preventDefault()\n this.close(event)\n break\n case 'ArrowRight':\n case 'ArrowDown':\n event.preventDefault()\n this.next()\n break\n case 'ArrowLeft':\n case 'ArrowUp':\n event.preventDefault()\n this.prev()\n break\n case ' ':\n case 'Spacebar':\n event.preventDefault()\n this.SlideShow?.toggle()\n break\n case 'f':\n case 'F':\n this.FullScreen?.toggle()\n break\n default:\n break\n }\n }\n\n private loadSlide(index: number, isOpening: boolean, _duration?: number): void {\n const stage = this.$refs.stage\n if (!stage) return\n\n const item = this.group[index]\n if (!item) return\n\n // Remove old slides except keeping adjacent for transition\n $$('.glare-slide', stage).forEach((slide) => {\n const idx = Number(slide.dataset.index)\n if (idx !== index) {\n slide.classList.add('glare-slide--out')\n setTimeout(() => slide.remove(), this.opts.transitionDuration || 366)\n }\n })\n\n let slide = stage.querySelector(`.glare-slide[data-index=\"${index}\"]`) as HTMLElement | null\n if (!slide) {\n slide = createEl('div', `glare-slide${this.opts.slideClass ? ` ${this.opts.slideClass}` : ''}`)\n slide.dataset.index = String(index)\n slide.innerHTML = `\n <div class=\"glare-space\">\n <div class=\"glare-content\"></div>\n </div>\n `\n stage.appendChild(slide)\n }\n\n item.$slide = slide\n item.$content = $('.glare-content', slide)\n item.pos = index\n\n slide.classList.add('glare-slide--current')\n slide.classList.remove('glare-slide--out')\n\n if (this.shouldSmallBtn(item)) {\n const dict = this.dict()\n if (!slide.querySelector('.glare-close-small')) {\n slide.insertAdjacentHTML(\n 'beforeend',\n translate(this.opts.btnTpl?.smallBtn || '', dict),\n )\n }\n }\n\n this.showSpinner(slide)\n this.trigger('beforeLoad', item)\n\n void this.resolveContent(item).then(() => {\n if (!this.isActive || this.currIndex !== index) return\n this.hideSpinner(slide!)\n this.trigger('afterLoad', item)\n this.positionContent()\n this.updateChrome()\n this.updateDownload(item)\n\n if (isOpening) {\n this.playOpenAnimation(item)\n } else {\n this.playTransition()\n }\n\n this.trigger('afterShow', item)\n this.trigger('onReveal', item)\n }).catch(() => {\n if (!this.isActive || this.currIndex !== index) return\n this.hideSpinner(slide!)\n this.showError(item)\n })\n\n // Preload neighbors\n if (this.opts.image?.preload) {\n ;[index - 1, index + 1].forEach((i) => {\n const neighbor = this.group[i]\n if (neighbor?.type === 'image' && neighbor.src) {\n const img = new Image()\n img.src = neighbor.src\n }\n })\n }\n }\n\n private shouldSmallBtn(item: SlideItem): boolean {\n if (this.opts.smallBtn === true) return true\n if (this.opts.smallBtn === false) return false\n return item.type !== 'image'\n }\n\n private async resolveContent(item: SlideItem): Promise<void> {\n const content = item.$content\n if (!content) throw new Error('Missing content node')\n content.innerHTML = ''\n content.className = `glare-content glare-content--${item.type}`\n\n switch (item.type) {\n case 'image':\n await this.loadImage(item, content)\n break\n case 'video':\n this.loadVideo(item, content)\n break\n case 'iframe':\n await this.loadIframe(item, content)\n break\n case 'inline':\n this.loadInline(item, content)\n break\n case 'ajax':\n await this.loadAjax(item, content)\n break\n case 'html':\n default:\n this.loadHtml(item, content)\n break\n }\n\n item.isLoaded = true\n item.isComplete = true\n }\n\n private loadImage(item: SlideItem, content: HTMLElement): Promise<void> {\n return new Promise((resolve, reject) => {\n const img = createEl('img', 'glare-image') as HTMLImageElement\n img.alt = item.alt || item.caption || ''\n img.decoding = 'async'\n img.draggable = false\n if (this.opts.protect) img.style.pointerEvents = 'none'\n\n img.onload = () => {\n item.$image = img\n item.contentWidth = img.naturalWidth\n item.contentHeight = img.naturalHeight\n item.canZoomIn = true\n content.appendChild(img)\n this.$refs.container?.classList.add('glare-can-zoom-in')\n resolve()\n }\n img.onerror = () => {\n item.hasError = true\n reject(new Error('image error'))\n }\n img.src = item.src\n })\n }\n\n private loadVideo(item: SlideItem, content: HTMLElement): void {\n const format =\n item.format ||\n this.opts.video?.format ||\n (item.src.match(/\\.(\\w+)(?:\\?|$)/)?.[1]\n ? `video/${item.src.match(/\\.(\\w+)(?:\\?|$)/)?.[1]?.replace('ogv', 'ogg')}`\n : 'video/mp4')\n\n const tpl = translate(this.opts.video?.tpl || '', {\n src: item.src,\n format,\n poster: item.poster || '',\n })\n content.innerHTML = tpl\n const video = content.querySelector('video') as HTMLVideoElement | null\n item.$content = content\n if (video && (item.autoStart ?? this.opts.video?.autoStart)) {\n void video.play().catch(() => undefined)\n }\n }\n\n private loadIframe(item: SlideItem, content: HTMLElement): Promise<void> {\n return new Promise((resolve) => {\n const wrap = createEl('div', 'glare-iframe-wrap')\n wrap.innerHTML = this.opts.iframe?.tpl || '<iframe class=\"glare-iframe\"></iframe>'\n const iframe = wrap.querySelector('iframe') as HTMLIFrameElement\n const attrs = this.opts.iframe?.attr || {}\n for (const [k, v] of Object.entries(attrs)) iframe.setAttribute(k, v)\n if (this.opts.iframe?.css) css(iframe, this.opts.iframe.css)\n if (item.width) css(wrap, { width: typeof item.width === 'number' ? `${item.width}px` : String(item.width) })\n if (item.height) css(wrap, { height: typeof item.height === 'number' ? `${item.height}px` : String(item.height) })\n\n content.appendChild(wrap)\n\n if (this.opts.iframe?.preload === false) {\n iframe.src = item.src\n resolve()\n return\n }\n\n iframe.onload = () => resolve()\n iframe.src = item.src\n // Fallback if onload never fires (cross-origin quirks)\n setTimeout(() => resolve(), 1200)\n })\n }\n\n private loadInline(item: SlideItem, content: HTMLElement): void {\n const target = item.src ? $(item.src) : null\n if (!target) {\n item.hasError = true\n throw new Error('inline target missing')\n }\n const clone = target.cloneNode(true) as HTMLElement\n clone.id = ''\n clone.classList.remove('glare-hidden')\n clone.hidden = false\n clone.style.display = ''\n content.appendChild(clone)\n }\n\n private async loadAjax(item: SlideItem, content: HTMLElement): Promise<void> {\n const settings = this.opts.ajax?.settings || {}\n const response = await fetch(item.src, settings)\n if (!response.ok) throw new Error('ajax failed')\n const html = await response.text()\n content.innerHTML = html\n }\n\n private loadHtml(item: SlideItem, content: HTMLElement): void {\n if (item.content instanceof HTMLElement) {\n content.appendChild(item.content)\n } else {\n content.innerHTML = item.html || item.content || item.src || ''\n }\n }\n\n private showSpinner(slide: HTMLElement): void {\n if (slide.querySelector('.glare-spinner')) return\n slide.insertAdjacentHTML('beforeend', this.opts.spinnerTpl || '')\n }\n\n private hideSpinner(slide: HTMLElement): void {\n slide.querySelector('.glare-spinner')?.remove()\n }\n\n private showError(item: SlideItem): void {\n item.hasError = true\n const content = item.$content\n if (!content) return\n content.className = 'glare-content glare-content--error'\n content.innerHTML = translate(this.opts.errorTpl || '', this.dict())\n }\n\n private playOpenAnimation(item: SlideItem): void {\n const container = this.$refs.container\n if (!container) return\n const effect = prefersReducedMotion() ? false : this.opts.animationEffect\n container.dataset.animation = effect ? String(effect) : 'none'\n container.style.setProperty('--glare-duration', `${this.opts.animationDuration || 0}ms`)\n\n if (effect === 'zoom' && item.$trigger && item.type === 'image' && item.$image) {\n const from = getOffset(item.$trigger)\n const to = getOffset(item.$image)\n const sx = from.width / Math.max(to.width, 1)\n const sy = from.height / Math.max(to.height, 1)\n const dx = from.left + from.width / 2 - (to.left + to.width / 2)\n const dy = from.top + from.height / 2 - (to.top + to.height / 2)\n css(item.$image, {\n transform: `translate3d(${dx}px, ${dy}px, 0) scale(${Math.max(sx, sy)})`,\n opacity: this.opts.zoomOpacity === false ? '1' : '0.2',\n transitionDuration: '0ms',\n })\n nextFrame(() => {\n if (!item.$image) return\n css(item.$image, {\n transform: '',\n opacity: '',\n transitionDuration: `${this.opts.animationDuration || 366}ms`,\n })\n })\n }\n\n nextFrame(() => container.classList.add('glare-is-ready'))\n }\n\n private playTransition(): void {\n const container = this.$refs.container\n if (!container) return\n const effect = prefersReducedMotion() ? false : this.opts.transitionEffect\n container.dataset.transition = effect ? String(effect) : 'none'\n container.style.setProperty(\n '--glare-transition-duration',\n `${this.opts.transitionDuration || 0}ms`,\n )\n }\n\n private positionContent(): void {\n // Layout is mostly CSS; update caption overlap / zoom affordance\n const item = this.current\n if (!item?.$image || !item.contentWidth || !item.contentHeight) return\n const slide = item.$slide\n if (!slide) return\n const space = $('.glare-space', slide)\n if (!space) return\n const rect = getOffset(space)\n const fit = Math.min(rect.width / item.contentWidth, rect.height / item.contentHeight, 1)\n item.canZoomIn = fit < 0.98 || item.contentWidth > rect.width || item.contentHeight > rect.height\n this.$refs.container?.classList.toggle('glare-can-zoom-in', !!item.canZoomIn && this.zoom.scale <= 1.01)\n }\n\n private updateChrome(): void {\n const item = this.current\n if (!item) return\n\n if (this.$refs.infobar) {\n const el = $('.glare-infobar-index', this.$refs.infobar)\n if (el) el.textContent = `${this.currIndex + 1} / ${this.group.length}`\n }\n\n if (this.$refs.caption) {\n let caption = item.caption || ''\n if (typeof this.opts.caption === 'function') {\n caption = this.opts.caption(this, item)\n } else if (typeof this.opts.caption === 'string') {\n caption = this.opts.caption\n }\n this.$refs.caption.innerHTML = caption\n this.$refs.caption.classList.toggle('glare-hidden', !caption)\n this.$refs.container?.classList.toggle('glare-show-caption', !!caption)\n }\n\n const atStart = this.currIndex === 0 && !this.opts.loop\n const atEnd = this.currIndex === this.group.length - 1 && !this.opts.loop\n this.$refs.container?.querySelector('[data-glare-prev]')?.classList.toggle('glare-disabled', atStart)\n this.$refs.container?.querySelector('[data-glare-next]')?.classList.toggle('glare-disabled', atEnd)\n this.$refs.container?.setAttribute('aria-label', captionLabel(item, this.currIndex, this.group.length))\n }\n\n private updateDownload(item: SlideItem): void {\n const link = this.$refs.container?.querySelector('[data-glare-download]') as HTMLAnchorElement | null\n if (!link) return\n const href = item.downloadSrc || (item.type === 'image' ? item.src : '')\n if (href) {\n link.href = href\n link.classList.remove('glare-hidden')\n } else {\n link.classList.add('glare-hidden')\n }\n }\n\n private toggleZoom(event?: MouseEvent): void {\n if (!this.current || this.current.type !== 'image') return\n if (this.zoom.scale > 1.01) {\n this.scaleToFit()\n } else {\n const point = event ? { x: event.clientX, y: event.clientY } : undefined\n this.scaleToActual(point?.x, point?.y)\n }\n }\n\n private animateZoom(scale: number, x: number, y: number, duration = 0): void {\n const content = this.getImageWrap()\n const img = this.current?.$image\n if (!content || !img) return\n\n this.zoom.scale = clamp(scale, this.zoom.min, this.zoom.max)\n this.zoom.x = x\n this.zoom.y = y\n\n css(img, {\n transform: `translate3d(${x}px, ${y}px, 0) scale(${this.zoom.scale})`,\n transitionDuration: `${duration}ms`,\n })\n }\n\n private resetZoom(): void {\n this.zoom = { scale: 1, x: 0, y: 0, min: 1, max: 5 }\n this.$refs.container?.classList.remove('glare-can-zoom-out')\n }\n\n private updateZoomButton(): void {\n const btn = this.$refs.container?.querySelector('[data-glare-zoom]') as HTMLElement | null\n if (!btn) return\n btn.innerHTML = this.zoom.scale > 1.01 ? icons.zoomOut : icons.zoomIn\n btn.classList.toggle('is-active', this.zoom.scale > 1.01)\n }\n\n private resetIdle(): void {\n this.clearIdle()\n if (this.isIdle) this.toggleControls(false)\n const time = this.opts.idleTime\n if (!time || this.opts.modal) return\n this.idleTimer = setTimeout(() => {\n this.toggleControls(true)\n }, time * 1000)\n }\n\n private clearIdle(): void {\n if (this.idleTimer) {\n clearTimeout(this.idleTimer)\n this.idleTimer = null\n }\n }\n\n private dict(): I18nDict & Record<string, string> {\n const lang = this.opts.lang || 'en'\n return {\n ...i18nFallback,\n ...(this.opts.i18n?.en || {}),\n ...(this.opts.i18n?.[lang] || {}),\n } as I18nDict & Record<string, string>\n }\n\n private trigger(name: EventName, current?: SlideItem, ...args: unknown[]): unknown {\n const handler = this.opts[name] as EventHandler | undefined\n if (typeof handler === 'function') {\n return handler(this, current, ...args)\n }\n return undefined\n }\n\n private teardown(): void {\n this.gestures?.detach()\n this.wheel?.destroy()\n this.hash?.destroy()\n this.share?.destroy()\n this.Thumbs?.destroy()\n this.SlideShow?.destroy()\n this.FullScreen?.destroy()\n\n this.cleanups.forEach((fn) => fn())\n this.cleanups = []\n\n this.$refs.container?.remove()\n this.$refs = {\n container: null,\n stage: null,\n bg: null,\n inner: null,\n caption: null,\n toolbar: null,\n infobar: null,\n navigation: null,\n }\n\n const idx = activeStack.indexOf(this)\n if (idx >= 0) activeStack.splice(idx, 1)\n\n if (this.opts.hideScrollbar) lockScroll(false)\n\n if (this.opts.backFocus) {\n const el = this.openedFrom || this.previouslyFocused\n el?.focus?.({ preventScroll: true })\n }\n\n this.isActive = false\n this.isClosing = false\n this.trigger('afterClose', this.current || undefined)\n this.trigger('onDeactivate')\n this.trigger('onDestroy')\n }\n\n /* -------------------- static API -------------------- */\n\n static defaults = defaults\n\n static getInstance(id?: number): Glare | null {\n if (id != null) return activeStack.find((i) => i.id === id) || null\n return activeStack[activeStack.length - 1] || null\n }\n\n static getInstances(): Glare[] {\n return [...activeStack]\n }\n\n static open(\n items: Array<SlideSource | string> | HTMLElement[],\n options: GlareOptions = {},\n index = 0,\n ): Glare {\n const instance = new Glare(items, options, index)\n instance.open(index)\n return instance\n }\n\n static close(all = false): void {\n if (all) {\n ;[...activeStack].reverse().forEach((i) => i.close())\n return\n }\n activeStack[activeStack.length - 1]?.close()\n }\n\n static destroy(): void {\n Glare.close(true)\n boundGroups.forEach((g) => g.destroy())\n boundGroups.length = 0\n }\n\n static bind(\n selector: string | HTMLElement | HTMLElement[] | NodeListOf<HTMLElement>,\n options: GlareOptions = {},\n ): { destroy: () => void } {\n const elements =\n typeof selector === 'string'\n ? $$(selector)\n : selector instanceof HTMLElement\n ? [selector]\n : Array.from(selector as ArrayLike<HTMLElement>)\n\n const onClick = (event: Event) => {\n const eventTarget = event.target as HTMLElement | null\n if (!eventTarget) return\n\n const target = elements.find((el) => el === eventTarget || el.contains(eventTarget))\n if (!target) return\n event.preventDefault()\n\n const groupName =\n target.getAttribute('data-glare') ||\n target.getAttribute('data-glare') ||\n ''\n\n const groupEls = groupName\n ? elements.filter(\n (el) =>\n (el.getAttribute('data-glare') || el.getAttribute('data-glare') || '') ===\n groupName,\n )\n : [target]\n\n const index = Math.max(0, groupEls.indexOf(target))\n const instance = new Glare(groupEls, options, index, groupName || 'gallery')\n instance.open(index)\n }\n\n const cleanups = elements.map((el) => on(el, 'click', onClick))\n\n const group = {\n selector: typeof selector === 'string' ? selector : '',\n options,\n elements,\n destroy: () => {\n cleanups.forEach((fn) => fn())\n const i = boundGroups.indexOf(group)\n if (i >= 0) boundGroups.splice(i, 1)\n },\n }\n boundGroups.push(group)\n return group\n }\n\n static fromSelector(\n selector: string,\n options: GlareOptions = {},\n ): Glare | null {\n const els = $$(selector)\n if (!els.length) return null\n const instance = new Glare(els, options, 0, 'gallery')\n instance.open(0)\n return instance\n }\n}\n\nconst boundGroups: Array<{\n selector: string\n options: GlareOptions\n elements: HTMLElement[]\n destroy: () => void\n}> = []\n\nconst i18nFallback: I18nDict = {\n CLOSE: 'Close',\n NEXT: 'Next',\n PREV: 'Previous',\n ERROR: 'The requested content cannot be loaded.<br/>Please try again later.',\n PLAY_START: 'Start slideshow',\n PLAY_STOP: 'Pause slideshow',\n FULL_SCREEN: 'Full screen',\n THUMBS: 'Thumbnails',\n DOWNLOAD: 'Download',\n SHARE: 'Share',\n ZOOM: 'Zoom',\n}\n\nfunction captionLabel(item: SlideItem, index: number, total: number): string {\n const base = item.caption || item.alt || 'Media lightbox'\n return total > 1 ? `${base} (${index + 1} of ${total})` : base\n}\n\n// Auto-bind data-glare on DOM ready\nfunction autoBind(): void {\n if (typeof document === 'undefined') return\n const run = () => {\n const els = $$('[data-glare], [data-glare]')\n if (!els.length) return\n // Group by attribute value; bind once via delegation on document\n Glare.bind('[data-glare], [data-glare]')\n }\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', run, { once: true })\n } else {\n run()\n }\n}\n\nexport { autoBind }\n"],"names":["icons","i18nEn","defaultMedia","_m","_url","m","tld","parts","lat","lng","zoom","query","defaults","current","isObject","value","deepMerge","target","sources","result","source","key","existing","$","selector","context","$$","createEl","tag","className","html","el","on","type","handler","options","css","styles","kebab","str","clamp","min","max","isMobile","getScrollbarWidth","lockScroll","lock","width","translate","template","dict","_","getOffset","requestAnimFrame","cb","nextFrame","prefersReducedMotion","buildQuery","params","k","v","distance","a","b","dx","dy","midpoint","getPoints","event","Gestures","instance","stage","fn","points","dist","scale","mid","absX","absY","x","y","touchOpts","elapsed","last","start","velocity","FullScreen","doc","exit","active","btn","parseHash","hash","match","getGalleryHash","gallery","index","_Hash","parsed","next","url","Hash","IMAGE_EXT","VIDEO_EXT","PDF_EXT","detectType","src","explicit","applyMediaProvider","media","provider","n","sep","thumb","normalizeItem","opts","raw","mediaHit","item","itemsFromElements","elements","href","typeAttr","caption","height","poster","downloadSrc","srcHtml","DEFAULT_TPL","Share","encoded","lang","Slideshow","label","Thumbs","parent","img","WheelNav","mode","e","instanceId","activeStack","resolveParent","parentEl","_Glare","items","galleryName","merged","i","_event","duration","container","dur","finish","onEnd","len","nextIndex","wrap","rect","cx","cy","force","hide","animate","zoomed","done","opacity","vx","vy","tpl","toolbar","buttons","name","thumbsOpts","slideShowOpts","fsOpts","focusables","first","action","resolved","isOpening","_duration","slide","neighbor","content","resolve","reject","format","video","iframe","attrs","clone","settings","response","effect","from","to","sx","sy","space","fit","atStart","atEnd","captionLabel","link","point","time","i18nFallback","args","idx","id","all","boundGroups","g","onClick","eventTarget","groupName","groupEls","cleanups","group","els","Glare","total","base","autoBind","run"],"mappings":"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"}
package/dist/glare.js ADDED
@@ -0,0 +1,28 @@
1
+ (function(p,u){typeof exports=="object"&&typeof module<"u"?u(exports):typeof define=="function"&&define.amd?define(["exports"],u):(p=typeof globalThis<"u"?globalThis:p||self,u(p.Glare={}))})(this,(function(p){"use strict";const u={close:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></svg>',next:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 18 6-6-6-6"/></svg>',prev:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m15 18-6-6 6-6"/></svg>',zoomIn:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/><path d="M11 8v6"/><path d="M8 11h6"/></svg>',zoomOut:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/><path d="M8 11h6"/></svg>',download:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" x2="12" y1="15" y2="3"/></svg>',share:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="18" cy="5" r="3"/><circle cx="6" cy="12" r="3"/><circle cx="18" cy="19" r="3"/><line x1="8.59" x2="15.42" y1="13.51" y2="17.49"/><line x1="15.41" x2="8.59" y1="6.51" y2="10.49"/></svg>',thumbs:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="18" height="18" x="3" y="3" rx="2"/><path d="M3 9h18"/><path d="M9 21V9"/></svg>',play:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polygon points="6 3 20 12 6 21 6 3"/></svg>',pause:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="4" height="16" x="6" y="4"/><rect width="4" height="16" x="14" y="4"/></svg>',fullscreen:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 3H5a2 2 0 0 0-2 2v3"/><path d="M21 8V5a2 2 0 0 0-2-2h-3"/><path d="M3 16v3a2 2 0 0 0 2 2h3"/><path d="M16 21h3a2 2 0 0 0 2-2v-3"/></svg>',fullscreenExit:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 3v3a2 2 0 0 1-2 2H3"/><path d="M21 8h-3a2 2 0 0 1-2-2V3"/><path d="M3 16h3a2 2 0 0 1 2 2v3"/><path d="M16 21v-3a2 2 0 0 1 2-2h3"/></svg>'},j={CLOSE:"Close",NEXT:"Next",PREV:"Previous",ERROR:"The requested content cannot be loaded.<br/>Please try again later.",PLAY_START:"Start slideshow",PLAY_STOP:"Pause slideshow",FULL_SCREEN:"Full screen",THUMBS:"Thumbnails",DOWNLOAD:"Download",SHARE:"Share",ZOOM:"Zoom"},q={youtube:{matcher:/(?:youtube\.com|youtu\.be|youtube-nocookie\.com)\/(?:watch\?(?:.*&)?v=|v\/|u\/\w\/|embed\/|shorts\/)?([\w-]{11})/i,type:"iframe",url:(r,t)=>`https://www.youtube-nocookie.com/embed/${r[1]}`,thumb:r=>`https://img.youtube.com/vi/${r[1]}/hqdefault.jpg`,params:{autoplay:1,rel:0,modestbranding:1,playsinline:1}},vimeo:{matcher:/(?:vimeo\.com)\/(?:video\/)?(\d+)/i,type:"iframe",url:r=>`https://player.vimeo.com/video/${r[1]}`,params:{autoplay:1,title:0,byline:0,portrait:0}},gmap:{matcher:/(?:maps\.)?google\.([a-z]{2,3}(?:\.[a-z]{2})?)\/(?:maps\/(?:place\/[^/]+\/)?@([^/]+)|maps\?q=([^&]+)|maps\/search\/([^/?]+))/i,type:"iframe",url:r=>{const t=r[1];if(r[2]){const s=r[2].split(","),i=s[0],n=s[1],o=s[2]?Math.floor(parseFloat(s[2])):14;return`https://maps.google.${t}/maps?ll=${i},${n}&z=${o}&output=embed`}const e=decodeURIComponent(r[3]||r[4]||"");return`https://maps.google.${t}/maps?q=${encodeURIComponent(e)}&output=embed`}}},T={closeExisting:!1,loop:!1,gutter:50,keyboard:!0,preventCaptionOverlap:!0,arrows:!0,infobar:!0,smallBtn:"auto",toolbar:"auto",buttons:["zoom","slideshow","thumbs","share","download","fullscreen","close"],idleTime:3,protect:!1,modal:!1,image:{preload:!1},ajax:{settings:{headers:{"X-Requested-With":"XMLHttpRequest"}}},iframe:{preload:!0,css:{},attr:{allowfullscreen:"true",allow:"autoplay; fullscreen; picture-in-picture"},tpl:'<iframe class="glare-iframe" allowfullscreen allow="autoplay; fullscreen; picture-in-picture" src=""></iframe>'},video:{tpl:'<video class="glare-video" controls playsinline controlsList="nodownload" poster="{{poster}}"><source src="{{src}}" type="{{format}}"/>Your browser does not support HTML5 video.</video>',format:"",autoStart:!0},defaultType:"image",animationEffect:"zoom",animationDuration:366,zoomOpacity:"auto",transitionEffect:"fade",transitionDuration:366,slideClass:"",baseClass:"",parentEl:"body",hideScrollbar:!0,autoFocus:!0,backFocus:!0,trapFocus:!0,fullScreen:{autoStart:!1},touch:{vertical:!0,momentum:!0},hash:!0,media:q,slideShow:{autoStart:!1,speed:3e3},thumbs:{autoStart:!1,hideOnClose:!0,parentEl:".glare-container",axis:"y"},share:!0,wheel:"auto",clickContent:function(r){return r.type==="image"?"zoom":!1},clickSlide:"close",clickOutside:"close",dblclickContent:!1,dblclickSlide:!1,dblclickOutside:!1,mobile:{preventCaptionOverlap:!1,idleTime:!1,clickContent:function(r){return r.type==="image"?"toggleControls":!1},clickSlide:function(r){return r.type==="image"?"toggleControls":"close"},dblclickContent:function(r){return r.type==="image"?"zoom":!1},dblclickSlide:function(r){return r.type==="image"?"zoom":!1}},lang:"en",i18n:{en:j},spinnerTpl:'<div class="glare-spinner" role="status" aria-label="Loading"></div>',errorTpl:'<div class="glare-error"><p>{{ERROR}}</p></div>',baseTpl:`
2
+ <div class="glare-container" role="dialog" aria-modal="true" tabindex="-1">
3
+ <div class="glare-bg"></div>
4
+ <div class="glare-inner">
5
+ <div class="glare-infobar"><span class="glare-infobar-index"></span></div>
6
+ <div class="glare-toolbar"></div>
7
+ <div class="glare-navigation">
8
+ <button type="button" class="glare-button glare-button--prev" data-glare-prev title="{{PREV}}" aria-label="{{PREV}}">${u.prev}</button>
9
+ <button type="button" class="glare-button glare-button--next" data-glare-next title="{{NEXT}}" aria-label="{{NEXT}}">${u.next}</button>
10
+ </div>
11
+ <div class="glare-stage"></div>
12
+ <div class="glare-caption"></div>
13
+ </div>
14
+ </div>
15
+ `,btnTpl:{download:`<a class="glare-button glare-button--download" data-glare-download download title="{{DOWNLOAD}}" aria-label="{{DOWNLOAD}}" href="javascript:;">${u.download}</a>`,zoom:`<button type="button" class="glare-button glare-button--zoom" data-glare-zoom title="{{ZOOM}}" aria-label="{{ZOOM}}">${u.zoomIn}</button>`,close:`<button type="button" class="glare-button glare-button--close" data-glare-close title="{{CLOSE}}" aria-label="{{CLOSE}}">${u.close}</button>`,share:`<button type="button" class="glare-button glare-button--share" data-glare-share title="{{SHARE}}" aria-label="{{SHARE}}">${u.share}</button>`,thumbs:`<button type="button" class="glare-button glare-button--thumbs" data-glare-thumbs title="{{THUMBS}}" aria-label="{{THUMBS}}">${u.thumbs}</button>`,slideshow:`<button type="button" class="glare-button glare-button--slideshow" data-glare-slideshow title="{{PLAY_START}}" aria-label="{{PLAY_START}}">${u.play}</button>`,fullscreen:`<button type="button" class="glare-button glare-button--fullscreen" data-glare-fullscreen title="{{FULL_SCREEN}}" aria-label="{{FULL_SCREEN}}">${u.fullscreen}</button>`,smallBtn:`<button type="button" class="glare-button glare-close-small" data-glare-close title="{{CLOSE}}" aria-label="{{CLOSE}}">${u.close}</button>`}};function H(r){return typeof r=="object"&&r!==null&&!Array.isArray(r)}function C(r,...t){const e={...r};for(const s of t)if(!(!s||typeof s!="object"))for(const[i,n]of Object.entries(s)){if(n===void 0)continue;const o=e[i];H(o)&&H(n)&&!Array.isArray(n)?e[i]=C(o,n):e[i]=n}return e}function g(r,t=document){return t.querySelector(r)}function $(r,t=document){return Array.from(t.querySelectorAll(r))}function w(r,t,e){const s=document.createElement(r);return t&&(s.className=t),e!==void 0&&(s.innerHTML=e),s}function c(r,t,e,s){return r.addEventListener(t,e,s),()=>r.removeEventListener(t,e,s)}function m(r,t){for(const[e,s]of Object.entries(t))s==null?r.style.removeProperty(Y(e)):r.style[e]=String(s)}function Y(r){return r.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}function x(r,t,e){return Math.min(e,Math.max(t,r))}function V(){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||navigator.maxTouchPoints>1&&window.matchMedia("(pointer: coarse)").matches}function G(){return window.innerWidth-document.documentElement.clientWidth}function Z(r){const t=document.documentElement;if(r){const e=G();t.classList.add("glare-lock"),e>0&&(t.style.marginRight=`${e}px`)}else document.querySelector(".glare-container")||(t.classList.remove("glare-lock"),t.style.marginRight="")}function S(r,t){return r.replace(/\{\{(\w+)\}\}/g,(e,s)=>t[s]??"")}function A(r){return r.getBoundingClientRect()}function B(r){return window.requestAnimationFrame(r)}function M(r){B(()=>B(r))}function I(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}function K(r){return Object.entries(r).map(([t,e])=>`${encodeURIComponent(t)}=${encodeURIComponent(String(e))}`).join("&")}function N(r,t){const e=r.x-t.x,s=r.y-t.y;return Math.hypot(e,s)}function Q(r,t){return{x:(r.x+t.x)/2,y:(r.y+t.y)/2}}function P(r){return"touches"in r?Array.from(r.touches).map(t=>({x:t.clientX,y:t.clientY})):[{x:r.clientX,y:r.clientY}]}class J{constructor(t){this.state={isPanning:!1,isSwiping:!1,isZooming:!1,startPoints:[],lastPoints:[],startDistance:0,startScale:1,startTranslate:{x:0,y:0},currentTranslate:{x:0,y:0},scale:1,startTime:0,moved:!1},this.cleanups=[],this.pointerId=null,this.instance=t}attach(t){this.detach(),this.cleanups.push(c(t,"pointerdown",e=>this.onPointerDown(e),{passive:!1}),c(window,"pointermove",e=>this.onPointerMove(e),{passive:!1}),c(window,"pointerup",e=>this.onPointerUp(e)),c(window,"pointercancel",e=>this.onPointerUp(e)),c(t,"touchstart",e=>this.onTouchStart(e),{passive:!1}),c(t,"touchmove",e=>this.onTouchMove(e),{passive:!1}),c(t,"touchend",e=>this.onTouchEnd(e)),c(t,"touchcancel",e=>this.onTouchEnd(e)))}detach(){this.cleanups.forEach(t=>t()),this.cleanups=[]}touchEnabled(){return this.instance.opts.touch!==!1}onPointerDown(t){if(!this.touchEnabled()||t.pointerType==="touch"||t.button!==0||t.target.closest("a, button, input, textarea, select, .glare-thumbs"))return;this.pointerId=t.pointerId;const s=[{x:t.clientX,y:t.clientY}];this.begin(s)}onPointerMove(t){this.pointerId===t.pointerId&&this.move([{x:t.clientX,y:t.clientY}],t)}onPointerUp(t){this.pointerId===t.pointerId&&(this.pointerId=null,this.end([{x:t.clientX,y:t.clientY}]))}onTouchStart(t){!this.touchEnabled()||t.target.closest("a, button, input, textarea, select, .glare-thumbs")||this.begin(P(t))}onTouchMove(t){this.move(P(t),t)}onTouchEnd(t){this.end(P(t))}begin(t){const e=this.instance.getZoomState();this.state={isPanning:!1,isSwiping:!1,isZooming:t.length>=2,startPoints:t,lastPoints:t,startDistance:t.length>=2?N(t[0],t[1]):0,startScale:e.scale,startTranslate:{x:e.x,y:e.y},currentTranslate:{x:e.x,y:e.y},scale:e.scale,startTime:performance.now(),moved:!1}}move(t,e){if(!this.state.startPoints.length)return;const s=this.instance.current;if(!s)return;if(t.length>=2&&this.state.startPoints.length>=2){e.preventDefault(),this.state.isZooming=!0,this.state.moved=!0;const h=N(t[0],t[1]),b=x(h/(this.state.startDistance||h)*this.state.startScale,1,5),y=Q(t[0],t[1]);this.state.scale=b,this.instance.applyZoom(b,y.x,y.y,!1),this.state.lastPoints=t;return}if(!t.length||!this.state.startPoints.length)return;const i=t[0].x-this.state.startPoints[0].x,n=t[0].y-this.state.startPoints[0].y,o=Math.abs(i),a=Math.abs(n);if(!this.state.moved&&o<6&&a<6)return;this.state.moved=!0;const l=this.instance.getZoomState();if(l.scale>1.01&&s.type==="image"||this.state.isPanning){e.preventDefault(),this.state.isPanning=!0;const h=this.state.startTranslate.x+i,b=this.state.startTranslate.y+n;this.state.currentTranslate={x:h,y:b},this.instance.applyZoom(l.scale,h,b,!1)}else{const h=this.instance.opts.touch;if(!(h&&typeof h=="object"?h.vertical!==!1:!0)&&a>o)return;e.preventDefault(),this.state.isSwiping=!0,this.instance.onSwipe(i,n,!1)}this.state.lastPoints=t}end(t){if(!this.state.startPoints.length)return;const e=Math.max(performance.now()-this.state.startTime,1),s=t[0]||this.state.lastPoints[0]||this.state.startPoints[0],i=this.state.startPoints[0],n=s.x-i.x,o=s.y-i.y,a={x:n/e,y:o/e};if(this.state.isSwiping)this.instance.onSwipe(n,o,!0,a);else if(this.state.isPanning){const l=this.instance.opts.touch;if(l&&typeof l=="object"?l.momentum!==!1:!0){const h=this.instance.getZoomState();this.instance.applyZoom(h.scale,this.state.currentTranslate.x+a.x*120,this.state.currentTranslate.y+a.y*120,!0)}}this.state.startPoints=[],this.state.isPanning=!1,this.state.isSwiping=!1,this.state.isZooming=!1}wasMoved(){return this.state.moved}resetMoved(){this.state.moved=!1}}class tt{constructor(t){this.cleanups=[],this.instance=t}init(){this.cleanups.push(c(document,"fullscreenchange",()=>this.sync()),c(document,"webkitfullscreenchange",()=>this.sync()))}isFullscreen(){const t=document;return!!(document.fullscreenElement||t.webkitFullscreenElement||t.mozFullScreenElement||t.msFullscreenElement)}request(){const t=this.instance.$refs.container||document.documentElement;(t.requestFullscreen||t.webkitRequestFullscreen||t.mozRequestFullScreen||t.msRequestFullscreen)?.call(t)}exit(){const t=document,e=document.exitFullscreen||t.webkitExitFullscreen||t.mozCancelFullScreen||t.msExitFullscreen;this.isFullscreen()&&e?.call(document)}toggle(){this.isFullscreen()?this.exit():this.request()}sync(){const t=this.isFullscreen();this.instance.$refs.container?.classList.toggle("glare-is-fullscreen",t);const e=this.instance.$refs.container?.querySelector("[data-glare-fullscreen]");e&&(e.innerHTML=t?u.fullscreenExit:u.fullscreen,e.classList.toggle("is-active",t))}destroy(){this.isFullscreen()&&this.exit(),this.cleanups.forEach(t=>t()),this.cleanups=[]}}function O(){const r=window.location.hash.replace(/^#/,"");if(!r)return null;const t=r.match(/^(?:glare-)?(.+?)(?:-|\/)(\d+)$/);return t?{gallery:t[1],index:Math.max(0,parseInt(t[2],10)-1)}:null}function et(r,t){return`${r}-${t+1}`}const D=class D{constructor(t,e){this.cleanups=[],this.skipping=!1,this.instance=t,this.gallery=e||"gallery"}init(){this.cleanups.push(c(window,"hashchange",()=>{if(this.skipping)return;const t=O();if(!t||t.gallery!==this.gallery){this.instance.isActive&&this.instance.close();return}t.index!==this.instance.currIndex&&this.instance.jumpTo(t.index)})),this.update()}update(t=this.instance.currIndex){if(!this.gallery)return;const e=et(this.gallery,t);if(window.location.hash.replace(/^#/,"")===e)return;this.skipping=!0;const s=`${window.location.pathname}${window.location.search}#${e}`;window.history.replaceState(null,"",s),queueMicrotask(()=>{this.skipping=!1})}clear(){const t=O();if(t&&t.gallery===this.gallery){this.skipping=!0;const e=`${window.location.pathname}${window.location.search}`;window.history.replaceState(null,"",e),queueMicrotask(()=>{this.skipping=!1})}}destroy(){this.clear(),this.cleanups.forEach(t=>t()),this.cleanups=[]}};D.parse=O;let z=D;const _=/\.(avif|bmp|gif|jpe?g|png|svg|webp|ico)(\?.*)?$/i,U=/\.(mp4|webm|ogg|ogv|mov|m4v)(\?.*)?$/i,st=/\.pdf(\?.*)?$/i;function W(r,t){return t||(r?r.startsWith("#")||r.startsWith(".")?"inline":_.test(r)?"image":U.test(r)?"video":st.test(r)||/^https?:\/\//i.test(r)||r.startsWith("//")||r.startsWith("/")?"iframe":"html":"html")}function it(r,t){if(!t)return null;for(const e of Object.values(t)){const s=r.match(e.matcher);if(!s)continue;let i=r;if(typeof e.url=="function"?i=e.url(s,r):typeof e.url=="string"&&(i=e.url.replace(/\$(\d+)/g,(o,a)=>s[Number(a)]||"")),e.params){const o=i.includes("?")?"&":"?";i+=o+K(e.params)}let n;return typeof e.thumb=="function"?n=e.thumb(s,r):typeof e.thumb=="string"&&(n=e.thumb.replace(/\$(\d+)/g,(o,a)=>s[Number(a)]||"")),{src:i,type:e.type||"iframe",thumb:n}}return null}function F(r,t,e){const s=typeof r=="string"?{src:r}:{...r};let i=s.src||"",n=s.type,o=s.thumb;s.html&&!i&&(n="html",i="");const a=i?it(i,e.media):null;a&&(i=a.src||i,n=a.type||n,o=o||a.thumb),n||(s.content||s.html?n="html":n=W(i,e.defaultType)),n==="iframe"&&_.test(i)&&(n="image"),n==="iframe"&&U.test(i)&&(n="video");const l={...s,index:t,src:i,type:n,thumb:o,caption:s.caption??s.title??"",isLoaded:!1,isComplete:!1,hasError:!1,canZoomIn:!1,canZoomOut:!1};return s.opts&&(l.opts=C({},e,s.opts)),l}function X(r,t){return r.map((e,s)=>{const i=e.getAttribute("data-src")||e.getAttribute("data-glare-src")||e.getAttribute("href")||"",n=e.getAttribute("data-type")||e.getAttribute("data-glare-type")||void 0,o=e.getAttribute("data-caption")||e.getAttribute("data-glare-caption")||e.getAttribute("title")||"",a=e.getAttribute("data-thumb")||e.getAttribute("data-glare-thumb")||e.querySelector("img")?.getAttribute("src")||void 0,l=e.getAttribute("data-width")||void 0,d=e.getAttribute("data-height")||void 0,h=e.getAttribute("data-poster")||void 0,b=e.getAttribute("data-download-src")||e.getAttribute("data-glare-download")||void 0;let y;const R=e.getAttribute("data-html")||e.getAttribute("data-glare-html");return R&&(y=R),F({src:i,type:n,caption:o,thumb:a,width:l,height:d,poster:h,downloadSrc:b,html:y,alt:e.querySelector("img")?.getAttribute("alt")||o||"",$trigger:e},s,t)})}const nt=`
16
+ <div class="glare-share">
17
+ <h4 class="glare-share-title">{{SHARE}}</h4>
18
+ <p><a class="glare-share-link" href="{{url_facebook}}" target="_blank" rel="noopener">Facebook</a></p>
19
+ <p><a class="glare-share-link" href="{{url_twitter}}" target="_blank" rel="noopener">X / Twitter</a></p>
20
+ <p><a class="glare-share-link" href="{{url_pinterest}}" target="_blank" rel="noopener">Pinterest</a></p>
21
+ <p><input class="glare-share-input" type="text" value="{{url_direct}}" readonly /></p>
22
+ </div>
23
+ `;class rt{constructor(t,e){this.$overlay=null,this.cleanups=[],this.instance=t,this.opts=e===!0?{}:e}open(){const t=this.instance.current;if(!t||!this.instance.$refs.container)return;this.close();const e=this.resolveUrl(t),s=encodeURIComponent(e),i=encodeURIComponent(t.thumb||t.src||e),n=encodeURIComponent(t.caption||""),o=this.instance.opts.lang||"en",a={...this.instance.opts.i18n?.en||{},...this.instance.opts.i18n?.[o]||{},url_direct:e,url_facebook:`https://www.facebook.com/sharer/sharer.php?u=${s}`,url_twitter:`https://twitter.com/intent/tweet?url=${s}&text=${n}`,url_pinterest:`https://pinterest.com/pin/create/button/?url=${s}&media=${i}&description=${n}`},l=S(this.opts.tpl||nt,a);this.$overlay=w("div","glare-share-overlay",l),this.instance.$refs.container.appendChild(this.$overlay),this.$overlay.querySelector(".glare-share-input")?.select(),this.cleanups.push(c(this.$overlay,"click",h=>{h.target===this.$overlay&&this.close()}))}close(){this.cleanups.forEach(t=>t()),this.cleanups=[],this.$overlay?.remove(),this.$overlay=null}resolveUrl(t){return typeof this.opts.url=="function"?this.opts.url(t):typeof this.opts.url=="string"?this.opts.url:t.src&&/^https?:\/\//i.test(t.src)?t.src:window.location.href}destroy(){this.close()}}class ot{constructor(t,e){this.timer=null,this.active=!1,this.instance=t,this.opts=e}init(){this.opts.autoStart&&this.start()}isActive(){return this.active}start(){this.instance.group.length<2||(this.active=!0,this.instance.$refs.container?.classList.add("glare-is-slideshow"),this.updateButton(),this.queue())}stop(){this.active=!1,this.clear(),this.instance.$refs.container?.classList.remove("glare-is-slideshow"),this.updateButton()}toggle(){this.active?this.stop():this.start()}queue(){this.clear(),this.active&&(this.timer=setTimeout(()=>{this.active&&(this.instance.next(),this.queue())},this.opts.speed||3e3))}clear(){this.timer&&(clearTimeout(this.timer),this.timer=null)}updateButton(){const t=this.instance.$refs.container?.querySelector("[data-glare-slideshow]");if(!t)return;const e=this.active?this.getLabel("PLAY_STOP"):this.getLabel("PLAY_START");t.setAttribute("title",e),t.setAttribute("aria-label",e),t.innerHTML=this.active?u.pause:u.play,t.classList.toggle("is-active",this.active)}getLabel(t){const e=this.instance.opts.lang||"en";return{...this.instance.opts.i18n?.en||{},...this.instance.opts.i18n?.[e]||{}}[t]||t}destroy(){this.stop()}}class at{constructor(t,e){this.isActive=!1,this.$container=null,this.$list=null,this.cleanups=[],this.instance=t,this.opts=e}init(){if(this.instance.group.length<2)return;const t=typeof this.opts.parentEl=="string"?g(this.opts.parentEl)||this.instance.$refs.container:this.opts.parentEl||this.instance.$refs.container;if(t){this.$container=w("div",`glare-thumbs glare-thumbs--${this.opts.axis||"y"}`),this.$list=w("div","glare-thumbs-list"),this.$container.appendChild(this.$list);for(const e of this.instance.group){const s=w("button","glare-thumbs-item");if(s.type="button",s.setAttribute("aria-label",`Go to slide ${e.index+1}`),s.dataset.index=String(e.index),e.thumb||e.type==="image"&&e.src){const i=w("img");i.src=e.thumb||e.src,i.alt=e.alt||e.caption||"",i.loading="lazy",s.appendChild(i)}else s.textContent=String(e.index+1);this.$list.appendChild(s),this.cleanups.push(c(s,"click",()=>{this.instance.jumpTo(e.index)}))}t.appendChild(this.$container),this.opts.autoStart&&this.show(),this.focus(this.instance.currIndex)}}show(){this.$container&&(this.isActive=!0,this.$container.classList.add("glare-thumbs--active"),this.instance.$refs.container?.classList.add("glare-show-thumbs"))}hide(){this.$container&&(this.isActive=!1,this.$container.classList.remove("glare-thumbs--active"),this.instance.$refs.container?.classList.remove("glare-show-thumbs"))}toggle(){this.isActive?this.hide():this.show()}focus(t=this.instance.currIndex){if(!this.$list)return;$(".glare-thumbs-item",this.$list).forEach(s=>{s.classList.toggle("is-active",Number(s.dataset.index)===t)}),this.$list.querySelector(".is-active")?.scrollIntoView({block:"nearest",inline:"nearest",behavior:"smooth"})}destroy(){this.opts.hideOnClose!==!1&&this.hide(),this.cleanups.forEach(t=>t()),this.cleanups=[],this.$container?.remove(),this.$container=null,this.$list=null}}class lt{constructor(t,e){this.cleanups=[],this.locked=!1,this.instance=t,this.mode=e}init(t){this.mode!==!1&&this.cleanups.push(c(t,"wheel",e=>{const s=e;if(this.locked)return;const i=this.instance.current;i&&(this.mode==="auto"&&i.type!=="image"||i.type==="image"&&this.instance.$refs.container?.classList.contains("glare-can-zoom-out")||(s.preventDefault(),this.locked=!0,s.deltaY>0?this.instance.next():this.instance.prev(),setTimeout(()=>{this.locked=!1},350)))},{passive:!1}))}destroy(){this.cleanups.forEach(t=>t()),this.cleanups=[]}}let ct=0;const f=[];function ht(r){return r?typeof r=="string"?g(r)||document.body:r:document.body}const v=class v{constructor(t,e={},s=0,i=""){this.group=[],this.current=null,this.currIndex=0,this.prevIndex=0,this.isActive=!1,this.isClosing=!1,this.isAnimating=!1,this.isIdle=!1,this.$refs={container:null,stage:null,bg:null,inner:null,caption:null,toolbar:null,infobar:null,navigation:null},this.galleryName="",this.cleanups=[],this.idleTimer=null,this.gestures=null,this.hash=null,this.wheel=null,this.share=null,this.zoom={scale:1,x:0,y:0,min:1,max:5},this.previouslyFocused=null,this.openedFrom=null,this.id=++ct,this.galleryName=i;const n=C({},T,e);V()&&n.mobile?this.opts=C({},n,n.mobile):this.opts=n,t.length&&t[0]instanceof HTMLElement?this.group=X(t,this.opts):this.group=t.map((o,a)=>F(o,a,this.opts)),this.currIndex=x(s,0,Math.max(0,this.group.length-1))}open(t=this.currIndex){if(this.isActive){this.jumpTo(t);return}this.opts.closeExisting&&v.close(!0),this.currIndex=x(t,0,Math.max(0,this.group.length-1)),this.current=this.group[this.currIndex]||null,this.openedFrom=this.current?.$trigger||null,this.previouslyFocused=document.activeElement,this.trigger("onInit"),this.build(),this.isActive=!0,f.push(this),this.opts.hideScrollbar&&Z(!0),this.trigger("onActivate"),this.trigger("beforeShow",this.current||void 0),M(()=>{this.$refs.container?.classList.add("glare-is-open","glare-is-animated"),this.loadSlide(this.currIndex,!0),this.bindEvents(),this.initModules(),this.opts.autoFocus&&this.focus(),this.resetIdle()})}close(t,e){if(!this.isActive||this.isClosing||this.trigger("beforeClose",this.current||void 0)===!1)return;this.isClosing=!0,this.SlideShow?.stop(),this.clearIdle();const s=this.$refs.container,i=e??(I()?0:this.opts.animationDuration||0);s?.classList.add("glare-is-closing"),s?.classList.remove("glare-is-open");const n=()=>{this.teardown()};if(i>0&&s){const o=a=>{a.target===s&&(s.removeEventListener("transitionend",o),n())};s.addEventListener("transitionend",o),setTimeout(n,i+50)}else n()}next(t){this.jumpTo(this.currIndex+1,t)}previous(t){this.jumpTo(this.currIndex-1,t)}prev(t){this.previous(t)}jumpTo(t,e){if(!this.isActive||this.isClosing)return;const s=this.group.length;if(!s)return;let i=t;if(this.opts.loop)i=(t%s+s)%s;else if(i=x(t,0,s-1),i===this.currIndex&&t!==this.currIndex)return;i!==this.currIndex&&(this.prevIndex=this.currIndex,this.currIndex=i,this.current=this.group[i],this.resetZoom(),this.loadSlide(i,!1,e),this.updateChrome(),this.Thumbs?.focus(i),this.hash?.update(i),this.trigger("onUpdate",this.current))}scaleToFit(t=300){this.animateZoom(1,0,0,t),this.$refs.container?.classList.remove("glare-can-zoom-out"),this.$refs.container?.classList.add("glare-can-zoom-in"),this.updateZoomButton()}scaleToActual(t,e,s=300){const i=this.getImageWrap();if(!i)return;const n=A(i),o=t??n.left+n.width/2,a=e??n.top+n.height/2,l=Math.min(this.zoom.max,2.5),d=(n.left+n.width/2-o)*(l-1),h=(n.top+n.height/2-a)*(l-1);this.animateZoom(l,d,h,s),this.$refs.container?.classList.add("glare-can-zoom-out"),this.$refs.container?.classList.remove("glare-can-zoom-in"),this.updateZoomButton()}update(){this.updateChrome(),this.positionContent()}focus(){this.$refs.container?.focus({preventScroll:!0})}toggleControls(t){const e=this.$refs.container;if(!e)return;const s=t===void 0?!e.classList.contains("glare-is-idle"):t;e.classList.toggle("glare-is-idle",s),this.isIdle=s}getContentEl(){return this.current?.$content||null}getImageWrap(){return this.current?.$slide?.querySelector(".glare-content")}getZoomState(){return{...this.zoom}}applyZoom(t,e,s,i=!1){this.animateZoom(t,e,s,i?250:0);const n=t>1.01;this.$refs.container?.classList.toggle("glare-can-zoom-out",n),this.$refs.container?.classList.toggle("glare-can-zoom-in",!n),this.updateZoomButton()}onSwipe(t,e,s,i){const n=this.$refs.stage;if(!n)return;if(!s){if(m(n,{transform:`translate3d(${t}px, ${e}px, 0)`,transitionDuration:"0ms"}),this.$refs.bg){const h=x(1-Math.abs(e)/400,.35,1);m(this.$refs.bg,{opacity:String(h)})}return}const o=Math.abs(t),a=Math.abs(e),l=i?.x||0,d=i?.y||0;if(m(n,{transitionDuration:""}),this.$refs.bg&&m(this.$refs.bg,{opacity:""}),(a>100||Math.abs(d)>.5)&&a>o){this.close();return}(o>80||Math.abs(l)>.4)&&(t<0?this.next():this.prev()),m(n,{transform:""})}build(){const t=this.dict(),e=S(this.opts.baseTpl||"",t),i=w("div","",e).firstElementChild;i.dataset.glareId=String(this.id),this.opts.baseClass&&i.classList.add(this.opts.baseClass),this.opts.modal&&i.classList.add("glare-is-modal"),this.$refs.container=i,this.$refs.bg=g(".glare-bg",i),this.$refs.inner=g(".glare-inner",i),this.$refs.stage=g(".glare-stage",i),this.$refs.caption=g(".glare-caption",i),this.$refs.toolbar=g(".glare-toolbar",i),this.$refs.infobar=g(".glare-infobar",i),this.$refs.navigation=g(".glare-navigation",i),this.buildToolbar(),this.updateChrome(),(!this.opts.arrows||this.group.length<2)&&this.$refs.navigation?.classList.add("glare-hidden"),(!this.opts.infobar||this.group.length<2)&&this.$refs.infobar?.classList.add("glare-hidden"),ht(this.opts.parentEl).appendChild(i)}buildToolbar(){const t=this.$refs.toolbar;if(!t)return;if(!(this.opts.toolbar===!0||this.opts.toolbar==="auto")){t.classList.add("glare-hidden");return}const s=this.dict(),i=this.opts.buttons||[];t.innerHTML="";for(const n of i){if(n==="thumbs"&&this.group.length<2||n==="slideshow"&&this.group.length<2)continue;const o=this.opts.btnTpl?.[n];o&&t.insertAdjacentHTML("beforeend",S(o,s))}}initModules(){const t=this.opts.thumbs;if(t){const s=t===!0?{...T.thumbs}:t;this.Thumbs=new at(this,s),this.Thumbs.init()}const e=this.opts.slideShow;if(e){const s=e===!0?{...T.slideShow}:e;this.SlideShow=new ot(this,s),this.SlideShow.init()}if(this.opts.fullScreen!==!1){this.FullScreen=new tt(this),this.FullScreen.init();const s=this.opts.fullScreen;s&&typeof s=="object"&&s.autoStart&&this.FullScreen.request()}this.opts.share&&(this.share=new rt(this,this.opts.share)),this.opts.hash&&this.galleryName&&(this.hash=new z(this,this.galleryName),this.hash.init()),this.opts.wheel!==!1&&this.$refs.stage&&(this.wheel=new lt(this,this.opts.wheel||"auto"),this.wheel.init(this.$refs.stage)),this.opts.touch!==!1&&this.$refs.stage&&(this.gestures=new J(this),this.gestures.attach(this.$refs.stage))}bindEvents(){const t=this.$refs.container;t&&(this.cleanups.push(c(t,"click",e=>this.onClick(e)),c(t,"dblclick",e=>this.onDblClick(e)),c(document,"keydown",e=>this.onKeydown(e)),c(window,"resize",()=>this.positionContent()),c(window,"orientationchange",()=>this.positionContent()),c(document,"mousemove",()=>this.resetIdle()),c(document,"touchstart",()=>this.resetIdle(),{passive:!0})),this.opts.trapFocus&&this.cleanups.push(c(t,"keydown",e=>{const s=e;if(s.key!=="Tab")return;const i=$('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])',t).filter(a=>!a.hasAttribute("disabled")&&a.offsetParent!==null);if(!i.length)return;const n=i[0],o=i[i.length-1];s.shiftKey&&document.activeElement===n?(s.preventDefault(),o.focus()):!s.shiftKey&&document.activeElement===o&&(s.preventDefault(),n.focus())})),this.opts.protect&&this.cleanups.push(c(t,"contextmenu",e=>{e.preventDefault()}),c(t,"dragstart",e=>{e.target.tagName==="IMG"&&e.preventDefault()})))}onClick(t){if(this.gestures?.wasMoved()){this.gestures.resetMoved();return}const e=t.target;if(e.closest("[data-glare-close]")){this.close(t);return}if(e.closest("[data-glare-next]")){this.next();return}if(e.closest("[data-glare-prev]")){this.prev();return}if(e.closest("[data-glare-zoom]")){this.toggleZoom(t);return}if(e.closest("[data-glare-slideshow]")){this.SlideShow?.toggle();return}if(e.closest("[data-glare-thumbs]")){this.Thumbs?.toggle();return}if(e.closest("[data-glare-fullscreen]")){this.FullScreen?.toggle();return}if(e.closest("[data-glare-share]")){this.share?.open();return}if(!e.closest("[data-glare-download]")){if(e.closest(".glare-content")||e.closest(".glare-space")){this.handleClickAction(this.opts.clickContent,t);return}if(e.closest(".glare-slide")){this.handleClickAction(this.opts.clickSlide,t);return}(e.classList.contains("glare-bg")||e.classList.contains("glare-stage"))&&this.handleClickAction(this.opts.clickOutside,t)}}onDblClick(t){const e=t.target;e.closest(".glare-content")||e.closest(".glare-space")?this.handleClickAction(this.opts.dblclickContent,t):e.closest(".glare-slide")?this.handleClickAction(this.opts.dblclickSlide,t):this.handleClickAction(this.opts.dblclickOutside,t)}handleClickAction(t,e){if(!t||!this.current)return;let s=t;switch(typeof t=="function"&&(s=t(this.current,e)),s){case"close":this.close(e);break;case"next":this.next();break;case"nextOrClose":this.currIndex===this.group.length-1&&!this.opts.loop?this.close(e):this.next();break;case"toggleControls":this.toggleControls();break;case"zoom":this.toggleZoom(e);break}}onKeydown(t){if(!this.isActive||!this.opts.keyboard||this.opts.modal||f[f.length-1]!==this)return;const e=t.target?.tagName;if(!(e==="INPUT"||e==="TEXTAREA"||e==="SELECT"))switch(t.key){case"Escape":t.preventDefault(),this.close(t);break;case"ArrowRight":case"ArrowDown":t.preventDefault(),this.next();break;case"ArrowLeft":case"ArrowUp":t.preventDefault(),this.prev();break;case" ":case"Spacebar":t.preventDefault(),this.SlideShow?.toggle();break;case"f":case"F":this.FullScreen?.toggle();break}}loadSlide(t,e,s){const i=this.$refs.stage;if(!i)return;const n=this.group[t];if(!n)return;$(".glare-slide",i).forEach(a=>{Number(a.dataset.index)!==t&&(a.classList.add("glare-slide--out"),setTimeout(()=>a.remove(),this.opts.transitionDuration||366))});let o=i.querySelector(`.glare-slide[data-index="${t}"]`);if(o||(o=w("div",`glare-slide${this.opts.slideClass?` ${this.opts.slideClass}`:""}`),o.dataset.index=String(t),o.innerHTML=`
24
+ <div class="glare-space">
25
+ <div class="glare-content"></div>
26
+ </div>
27
+ `,i.appendChild(o)),n.$slide=o,n.$content=g(".glare-content",o),n.pos=t,o.classList.add("glare-slide--current"),o.classList.remove("glare-slide--out"),this.shouldSmallBtn(n)){const a=this.dict();o.querySelector(".glare-close-small")||o.insertAdjacentHTML("beforeend",S(this.opts.btnTpl?.smallBtn||"",a))}this.showSpinner(o),this.trigger("beforeLoad",n),this.resolveContent(n).then(()=>{!this.isActive||this.currIndex!==t||(this.hideSpinner(o),this.trigger("afterLoad",n),this.positionContent(),this.updateChrome(),this.updateDownload(n),e?this.playOpenAnimation(n):this.playTransition(),this.trigger("afterShow",n),this.trigger("onReveal",n))}).catch(()=>{!this.isActive||this.currIndex!==t||(this.hideSpinner(o),this.showError(n))}),this.opts.image?.preload&&[t-1,t+1].forEach(a=>{const l=this.group[a];if(l?.type==="image"&&l.src){const d=new Image;d.src=l.src}})}shouldSmallBtn(t){return this.opts.smallBtn===!0?!0:this.opts.smallBtn===!1?!1:t.type!=="image"}async resolveContent(t){const e=t.$content;if(!e)throw new Error("Missing content node");switch(e.innerHTML="",e.className=`glare-content glare-content--${t.type}`,t.type){case"image":await this.loadImage(t,e);break;case"video":this.loadVideo(t,e);break;case"iframe":await this.loadIframe(t,e);break;case"inline":this.loadInline(t,e);break;case"ajax":await this.loadAjax(t,e);break;default:this.loadHtml(t,e);break}t.isLoaded=!0,t.isComplete=!0}loadImage(t,e){return new Promise((s,i)=>{const n=w("img","glare-image");n.alt=t.alt||t.caption||"",n.decoding="async",n.draggable=!1,this.opts.protect&&(n.style.pointerEvents="none"),n.onload=()=>{t.$image=n,t.contentWidth=n.naturalWidth,t.contentHeight=n.naturalHeight,t.canZoomIn=!0,e.appendChild(n),this.$refs.container?.classList.add("glare-can-zoom-in"),s()},n.onerror=()=>{t.hasError=!0,i(new Error("image error"))},n.src=t.src})}loadVideo(t,e){const s=t.format||this.opts.video?.format||(t.src.match(/\.(\w+)(?:\?|$)/)?.[1]?`video/${t.src.match(/\.(\w+)(?:\?|$)/)?.[1]?.replace("ogv","ogg")}`:"video/mp4"),i=S(this.opts.video?.tpl||"",{src:t.src,format:s,poster:t.poster||""});e.innerHTML=i;const n=e.querySelector("video");t.$content=e,n&&(t.autoStart??this.opts.video?.autoStart)&&n.play().catch(()=>{})}loadIframe(t,e){return new Promise(s=>{const i=w("div","glare-iframe-wrap");i.innerHTML=this.opts.iframe?.tpl||'<iframe class="glare-iframe"></iframe>';const n=i.querySelector("iframe"),o=this.opts.iframe?.attr||{};for(const[a,l]of Object.entries(o))n.setAttribute(a,l);if(this.opts.iframe?.css&&m(n,this.opts.iframe.css),t.width&&m(i,{width:typeof t.width=="number"?`${t.width}px`:String(t.width)}),t.height&&m(i,{height:typeof t.height=="number"?`${t.height}px`:String(t.height)}),e.appendChild(i),this.opts.iframe?.preload===!1){n.src=t.src,s();return}n.onload=()=>s(),n.src=t.src,setTimeout(()=>s(),1200)})}loadInline(t,e){const s=t.src?g(t.src):null;if(!s)throw t.hasError=!0,new Error("inline target missing");const i=s.cloneNode(!0);i.id="",i.classList.remove("glare-hidden"),i.hidden=!1,i.style.display="",e.appendChild(i)}async loadAjax(t,e){const s=this.opts.ajax?.settings||{},i=await fetch(t.src,s);if(!i.ok)throw new Error("ajax failed");const n=await i.text();e.innerHTML=n}loadHtml(t,e){t.content instanceof HTMLElement?e.appendChild(t.content):e.innerHTML=t.html||t.content||t.src||""}showSpinner(t){t.querySelector(".glare-spinner")||t.insertAdjacentHTML("beforeend",this.opts.spinnerTpl||"")}hideSpinner(t){t.querySelector(".glare-spinner")?.remove()}showError(t){t.hasError=!0;const e=t.$content;e&&(e.className="glare-content glare-content--error",e.innerHTML=S(this.opts.errorTpl||"",this.dict()))}playOpenAnimation(t){const e=this.$refs.container;if(!e)return;const s=I()?!1:this.opts.animationEffect;if(e.dataset.animation=s?String(s):"none",e.style.setProperty("--glare-duration",`${this.opts.animationDuration||0}ms`),s==="zoom"&&t.$trigger&&t.type==="image"&&t.$image){const i=A(t.$trigger),n=A(t.$image),o=i.width/Math.max(n.width,1),a=i.height/Math.max(n.height,1),l=i.left+i.width/2-(n.left+n.width/2),d=i.top+i.height/2-(n.top+n.height/2);m(t.$image,{transform:`translate3d(${l}px, ${d}px, 0) scale(${Math.max(o,a)})`,opacity:this.opts.zoomOpacity===!1?"1":"0.2",transitionDuration:"0ms"}),M(()=>{t.$image&&m(t.$image,{transform:"",opacity:"",transitionDuration:`${this.opts.animationDuration||366}ms`})})}M(()=>e.classList.add("glare-is-ready"))}playTransition(){const t=this.$refs.container;if(!t)return;const e=I()?!1:this.opts.transitionEffect;t.dataset.transition=e?String(e):"none",t.style.setProperty("--glare-transition-duration",`${this.opts.transitionDuration||0}ms`)}positionContent(){const t=this.current;if(!t?.$image||!t.contentWidth||!t.contentHeight)return;const e=t.$slide;if(!e)return;const s=g(".glare-space",e);if(!s)return;const i=A(s),n=Math.min(i.width/t.contentWidth,i.height/t.contentHeight,1);t.canZoomIn=n<.98||t.contentWidth>i.width||t.contentHeight>i.height,this.$refs.container?.classList.toggle("glare-can-zoom-in",!!t.canZoomIn&&this.zoom.scale<=1.01)}updateChrome(){const t=this.current;if(!t)return;if(this.$refs.infobar){const i=g(".glare-infobar-index",this.$refs.infobar);i&&(i.textContent=`${this.currIndex+1} / ${this.group.length}`)}if(this.$refs.caption){let i=t.caption||"";typeof this.opts.caption=="function"?i=this.opts.caption(this,t):typeof this.opts.caption=="string"&&(i=this.opts.caption),this.$refs.caption.innerHTML=i,this.$refs.caption.classList.toggle("glare-hidden",!i),this.$refs.container?.classList.toggle("glare-show-caption",!!i)}const e=this.currIndex===0&&!this.opts.loop,s=this.currIndex===this.group.length-1&&!this.opts.loop;this.$refs.container?.querySelector("[data-glare-prev]")?.classList.toggle("glare-disabled",e),this.$refs.container?.querySelector("[data-glare-next]")?.classList.toggle("glare-disabled",s),this.$refs.container?.setAttribute("aria-label",dt(t,this.currIndex,this.group.length))}updateDownload(t){const e=this.$refs.container?.querySelector("[data-glare-download]");if(!e)return;const s=t.downloadSrc||(t.type==="image"?t.src:"");s?(e.href=s,e.classList.remove("glare-hidden")):e.classList.add("glare-hidden")}toggleZoom(t){if(!(!this.current||this.current.type!=="image"))if(this.zoom.scale>1.01)this.scaleToFit();else{const e=t?{x:t.clientX,y:t.clientY}:void 0;this.scaleToActual(e?.x,e?.y)}}animateZoom(t,e,s,i=0){const n=this.getImageWrap(),o=this.current?.$image;!n||!o||(this.zoom.scale=x(t,this.zoom.min,this.zoom.max),this.zoom.x=e,this.zoom.y=s,m(o,{transform:`translate3d(${e}px, ${s}px, 0) scale(${this.zoom.scale})`,transitionDuration:`${i}ms`}))}resetZoom(){this.zoom={scale:1,x:0,y:0,min:1,max:5},this.$refs.container?.classList.remove("glare-can-zoom-out")}updateZoomButton(){const t=this.$refs.container?.querySelector("[data-glare-zoom]");t&&(t.innerHTML=this.zoom.scale>1.01?u.zoomOut:u.zoomIn,t.classList.toggle("is-active",this.zoom.scale>1.01))}resetIdle(){this.clearIdle(),this.isIdle&&this.toggleControls(!1);const t=this.opts.idleTime;!t||this.opts.modal||(this.idleTimer=setTimeout(()=>{this.toggleControls(!0)},t*1e3))}clearIdle(){this.idleTimer&&(clearTimeout(this.idleTimer),this.idleTimer=null)}dict(){const t=this.opts.lang||"en";return{...ut,...this.opts.i18n?.en||{},...this.opts.i18n?.[t]||{}}}trigger(t,e,...s){const i=this.opts[t];if(typeof i=="function")return i(this,e,...s)}teardown(){this.gestures?.detach(),this.wheel?.destroy(),this.hash?.destroy(),this.share?.destroy(),this.Thumbs?.destroy(),this.SlideShow?.destroy(),this.FullScreen?.destroy(),this.cleanups.forEach(e=>e()),this.cleanups=[],this.$refs.container?.remove(),this.$refs={container:null,stage:null,bg:null,inner:null,caption:null,toolbar:null,infobar:null,navigation:null};const t=f.indexOf(this);t>=0&&f.splice(t,1),this.opts.hideScrollbar&&Z(!1),this.opts.backFocus&&(this.openedFrom||this.previouslyFocused)?.focus?.({preventScroll:!0}),this.isActive=!1,this.isClosing=!1,this.trigger("afterClose",this.current||void 0),this.trigger("onDeactivate"),this.trigger("onDestroy")}static getInstance(t){return t!=null?f.find(e=>e.id===t)||null:f[f.length-1]||null}static getInstances(){return[...f]}static open(t,e={},s=0){const i=new v(t,e,s);return i.open(s),i}static close(t=!1){if(t){[...f].reverse().forEach(e=>e.close());return}f[f.length-1]?.close()}static destroy(){v.close(!0),L.forEach(t=>t.destroy()),L.length=0}static bind(t,e={}){const s=typeof t=="string"?$(t):t instanceof HTMLElement?[t]:Array.from(t),i=a=>{const l=a.target;if(!l)return;const d=s.find(k=>k===l||k.contains(l));if(!d)return;a.preventDefault();const h=d.getAttribute("data-glare")||d.getAttribute("data-glare")||"",b=h?s.filter(k=>(k.getAttribute("data-glare")||k.getAttribute("data-glare")||"")===h):[d],y=Math.max(0,b.indexOf(d));new v(b,e,y,h||"gallery").open(y)},n=s.map(a=>c(a,"click",i)),o={selector:typeof t=="string"?t:"",options:e,elements:s,destroy:()=>{n.forEach(l=>l());const a=L.indexOf(o);a>=0&&L.splice(a,1)}};return L.push(o),o}static fromSelector(t,e={}){const s=$(t);if(!s.length)return null;const i=new v(s,e,0,"gallery");return i.open(0),i}};v.defaults=T;let E=v;const L=[],ut={CLOSE:"Close",NEXT:"Next",PREV:"Previous",ERROR:"The requested content cannot be loaded.<br/>Please try again later.",PLAY_START:"Start slideshow",PLAY_STOP:"Pause slideshow",FULL_SCREEN:"Full screen",THUMBS:"Thumbnails",DOWNLOAD:"Download",SHARE:"Share",ZOOM:"Zoom"};function dt(r,t,e){const s=r.caption||r.alt||"Media lightbox";return e>1?`${s} (${t+1} of ${e})`:s}function pt(){if(typeof document>"u")return;const r=()=>{$("[data-glare], [data-glare]").length&&E.bind("[data-glare], [data-glare]")};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",r,{once:!0}):r()}p.Glare=E,p.autoBind=pt,p.default=E,p.defaultMedia=q,p.defaults=T,p.detectType=W,p.i18nEn=j,p.itemsFromElements=X,p.normalizeItem=F,Object.defineProperties(p,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));
28
+ //# sourceMappingURL=glare.js.map