@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.
- package/LICENSE +21 -0
- package/README.md +80 -0
- package/dist/defaults.d.ts +5 -0
- package/dist/defaults.d.ts.map +1 -0
- package/dist/fullscreen.d.ts +14 -0
- package/dist/fullscreen.d.ts.map +1 -0
- package/dist/gestures.d.ts +24 -0
- package/dist/gestures.d.ts.map +1 -0
- package/dist/glare.css +1 -0
- package/dist/glare.esm.js +1339 -0
- package/dist/glare.esm.js.map +1 -0
- package/dist/glare.js +28 -0
- package/dist/glare.js.map +1 -0
- package/dist/hash.d.ts +20 -0
- package/dist/hash.d.ts.map +1 -0
- package/dist/icons.d.ts +15 -0
- package/dist/icons.d.ts.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/instance.d.ts +103 -0
- package/dist/instance.d.ts.map +1 -0
- package/dist/media.d.ts +5 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/share.d.ts +13 -0
- package/dist/share.d.ts.map +1 -0
- package/dist/slideshow.d.ts +19 -0
- package/dist/slideshow.d.ts.map +1 -0
- package/dist/thumbs.d.ts +17 -0
- package/dist/thumbs.d.ts.map +1 -0
- package/dist/types.d.ts +237 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/utils.d.ts +31 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/wheel.d.ts +11 -0
- package/dist/wheel.d.ts.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glare.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/hash.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { GlareInstance } from './types';
|
|
2
|
+
declare function parseHash(): {
|
|
3
|
+
gallery: string;
|
|
4
|
+
index: number;
|
|
5
|
+
} | null;
|
|
6
|
+
export declare function getGalleryHash(gallery: string, index: number): string;
|
|
7
|
+
export declare class Hash {
|
|
8
|
+
private instance;
|
|
9
|
+
private gallery;
|
|
10
|
+
private cleanups;
|
|
11
|
+
private skipping;
|
|
12
|
+
constructor(instance: GlareInstance, gallery: string);
|
|
13
|
+
static parse: typeof parseHash;
|
|
14
|
+
init(): void;
|
|
15
|
+
update(index?: number): void;
|
|
16
|
+
clear(): void;
|
|
17
|
+
destroy(): void;
|
|
18
|
+
}
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=hash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAG5C,iBAAS,SAAS,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAO9D;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAErE;AAED,qBAAa,IAAI;IACf,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,QAAQ,CAAQ;gBAEZ,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM;IAKpD,MAAM,CAAC,KAAK,mBAAY;IAExB,IAAI,IAAI,IAAI;IAiBZ,MAAM,CAAC,KAAK,SAA0B,GAAG,IAAI;IAY7C,KAAK,IAAI,IAAI;IAYb,OAAO,IAAI,IAAI;CAKhB"}
|
package/dist/icons.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const icons: {
|
|
2
|
+
readonly 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>";
|
|
3
|
+
readonly 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>";
|
|
4
|
+
readonly 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>";
|
|
5
|
+
readonly 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>";
|
|
6
|
+
readonly 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>";
|
|
7
|
+
readonly 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>";
|
|
8
|
+
readonly 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>";
|
|
9
|
+
readonly 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>";
|
|
10
|
+
readonly 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>";
|
|
11
|
+
readonly 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>";
|
|
12
|
+
readonly 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>";
|
|
13
|
+
readonly 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>";
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=icons.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../src/icons.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK;;;;;;;;;;;;;CAaR,CAAA"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import './styles/glare.css';
|
|
2
|
+
export type { AnimationEffect, AjaxOptions, BoundGroup, ClickAction, ContentType, EventHandler, EventName, FullscreenOptions, HashOptions, I18nDict, IframeOptions, ImageOptions, MediaProvider, GlareInstance, GlareOptions, ShareOptions, SlideItem, SlideSource, SlideshowOptions, ThumbsOptions, ToolbarButton, TouchOptions, TransitionEffect, VideoOptions, } from './types';
|
|
3
|
+
export { defaults, defaultMedia, i18nEn } from './defaults';
|
|
4
|
+
export { Glare, autoBind } from './instance';
|
|
5
|
+
export { detectType, normalizeItem, itemsFromElements } from './media';
|
|
6
|
+
import { Glare } from './instance';
|
|
7
|
+
export default Glare;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,CAAA;AAE3B,YAAY,EACV,eAAe,EACf,WAAW,EACX,UAAU,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,SAAS,EACT,iBAAiB,EACjB,WAAW,EACX,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,aAAa,EACb,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,YAAY,GACb,MAAM,SAAS,CAAA;AAEhB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAC3D,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAEtE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,eAAe,KAAK,CAAA"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { GlareInstance, GlareOptions, SlideItem, SlideSource } from './types';
|
|
2
|
+
import { FullScreen } from './fullscreen';
|
|
3
|
+
import { Slideshow } from './slideshow';
|
|
4
|
+
import { Thumbs } from './thumbs';
|
|
5
|
+
export declare class Glare implements GlareInstance {
|
|
6
|
+
id: number;
|
|
7
|
+
group: SlideItem[];
|
|
8
|
+
opts: GlareOptions;
|
|
9
|
+
current: SlideItem | null;
|
|
10
|
+
currIndex: number;
|
|
11
|
+
prevIndex: number;
|
|
12
|
+
isActive: boolean;
|
|
13
|
+
isClosing: boolean;
|
|
14
|
+
isAnimating: boolean;
|
|
15
|
+
isIdle: boolean;
|
|
16
|
+
$refs: GlareInstance['$refs'];
|
|
17
|
+
SlideShow?: Slideshow;
|
|
18
|
+
Thumbs?: Thumbs;
|
|
19
|
+
FullScreen?: FullScreen;
|
|
20
|
+
private galleryName;
|
|
21
|
+
private cleanups;
|
|
22
|
+
private idleTimer;
|
|
23
|
+
private gestures;
|
|
24
|
+
private hash;
|
|
25
|
+
private wheel;
|
|
26
|
+
private share;
|
|
27
|
+
private zoom;
|
|
28
|
+
private previouslyFocused;
|
|
29
|
+
private openedFrom;
|
|
30
|
+
constructor(items: Array<SlideSource | string> | HTMLElement[], options?: GlareOptions, index?: number, galleryName?: string);
|
|
31
|
+
open(index?: number): void;
|
|
32
|
+
close(_event?: Event | null, duration?: number): void;
|
|
33
|
+
next(duration?: number): void;
|
|
34
|
+
previous(duration?: number): void;
|
|
35
|
+
prev(duration?: number): void;
|
|
36
|
+
jumpTo(index: number, duration?: number): void;
|
|
37
|
+
scaleToFit(duration?: number): void;
|
|
38
|
+
scaleToActual(x?: number, y?: number, duration?: number): void;
|
|
39
|
+
update(): void;
|
|
40
|
+
focus(): void;
|
|
41
|
+
toggleControls(force?: boolean): void;
|
|
42
|
+
getContentEl(): HTMLElement | null;
|
|
43
|
+
getImageWrap(): HTMLElement | null;
|
|
44
|
+
getZoomState(): {
|
|
45
|
+
scale: number;
|
|
46
|
+
x: number;
|
|
47
|
+
y: number;
|
|
48
|
+
min: number;
|
|
49
|
+
max: number;
|
|
50
|
+
};
|
|
51
|
+
applyZoom(scale: number, x: number, y: number, animate?: boolean): void;
|
|
52
|
+
onSwipe(dx: number, dy: number, done: boolean, velocity?: {
|
|
53
|
+
x: number;
|
|
54
|
+
y: number;
|
|
55
|
+
}): void;
|
|
56
|
+
private build;
|
|
57
|
+
private buildToolbar;
|
|
58
|
+
private initModules;
|
|
59
|
+
private bindEvents;
|
|
60
|
+
private onClick;
|
|
61
|
+
private onDblClick;
|
|
62
|
+
private handleClickAction;
|
|
63
|
+
private onKeydown;
|
|
64
|
+
private loadSlide;
|
|
65
|
+
private shouldSmallBtn;
|
|
66
|
+
private resolveContent;
|
|
67
|
+
private loadImage;
|
|
68
|
+
private loadVideo;
|
|
69
|
+
private loadIframe;
|
|
70
|
+
private loadInline;
|
|
71
|
+
private loadAjax;
|
|
72
|
+
private loadHtml;
|
|
73
|
+
private showSpinner;
|
|
74
|
+
private hideSpinner;
|
|
75
|
+
private showError;
|
|
76
|
+
private playOpenAnimation;
|
|
77
|
+
private playTransition;
|
|
78
|
+
private positionContent;
|
|
79
|
+
private updateChrome;
|
|
80
|
+
private updateDownload;
|
|
81
|
+
private toggleZoom;
|
|
82
|
+
private animateZoom;
|
|
83
|
+
private resetZoom;
|
|
84
|
+
private updateZoomButton;
|
|
85
|
+
private resetIdle;
|
|
86
|
+
private clearIdle;
|
|
87
|
+
private dict;
|
|
88
|
+
private trigger;
|
|
89
|
+
private teardown;
|
|
90
|
+
static defaults: GlareOptions;
|
|
91
|
+
static getInstance(id?: number): Glare | null;
|
|
92
|
+
static getInstances(): Glare[];
|
|
93
|
+
static open(items: Array<SlideSource | string> | HTMLElement[], options?: GlareOptions, index?: number): Glare;
|
|
94
|
+
static close(all?: boolean): void;
|
|
95
|
+
static destroy(): void;
|
|
96
|
+
static bind(selector: string | HTMLElement | HTMLElement[] | NodeListOf<HTMLElement>, options?: GlareOptions): {
|
|
97
|
+
destroy: () => void;
|
|
98
|
+
};
|
|
99
|
+
static fromSelector(selector: string, options?: GlareOptions): Glare | null;
|
|
100
|
+
}
|
|
101
|
+
declare function autoBind(): void;
|
|
102
|
+
export { autoBind };
|
|
103
|
+
//# sourceMappingURL=instance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../src/instance.ts"],"names":[],"mappings":"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"}
|
package/dist/media.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ContentType, GlareOptions, SlideItem, SlideSource } from './types';
|
|
2
|
+
export declare function detectType(src: string, explicit?: ContentType): ContentType;
|
|
3
|
+
export declare function normalizeItem(source: SlideSource | string, index: number, opts: GlareOptions): SlideItem;
|
|
4
|
+
export declare function itemsFromElements(elements: HTMLElement[], opts: GlareOptions): SlideItem[];
|
|
5
|
+
//# sourceMappingURL=media.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAiB,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAO/F,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,WAAW,CAW3E;AAuCD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,WAAW,GAAG,MAAM,EAC5B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,YAAY,GACjB,SAAS,CAiDX;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,WAAW,EAAE,EACvB,IAAI,EAAE,YAAY,GACjB,SAAS,EAAE,CAwDb"}
|
package/dist/share.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { GlareInstance, ShareOptions } from './types';
|
|
2
|
+
export declare class Share {
|
|
3
|
+
private instance;
|
|
4
|
+
private opts;
|
|
5
|
+
private $overlay;
|
|
6
|
+
private cleanups;
|
|
7
|
+
constructor(instance: GlareInstance, opts: ShareOptions | true);
|
|
8
|
+
open(): void;
|
|
9
|
+
close(): void;
|
|
10
|
+
private resolveUrl;
|
|
11
|
+
destroy(): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=share.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../src/share.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAa,MAAM,SAAS,CAAA;AAarE,qBAAa,KAAK;IAChB,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,QAAQ,CAAwB;gBAE5B,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI;IAK9D,IAAI,IAAI,IAAI;IAmCZ,KAAK,IAAI,IAAI;IAOb,OAAO,CAAC,UAAU;IAOlB,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { GlareInstance, SlideshowOptions } from './types';
|
|
2
|
+
export declare class Slideshow {
|
|
3
|
+
private instance;
|
|
4
|
+
private opts;
|
|
5
|
+
private timer;
|
|
6
|
+
private active;
|
|
7
|
+
constructor(instance: GlareInstance, opts: SlideshowOptions);
|
|
8
|
+
init(): void;
|
|
9
|
+
isActive(): boolean;
|
|
10
|
+
start(): void;
|
|
11
|
+
stop(): void;
|
|
12
|
+
toggle(): void;
|
|
13
|
+
private queue;
|
|
14
|
+
private clear;
|
|
15
|
+
private updateButton;
|
|
16
|
+
private getLabel;
|
|
17
|
+
destroy(): void;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=slideshow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slideshow.d.ts","sourceRoot":"","sources":["../src/slideshow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAG9D,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,KAAK,CAA6C;IAC1D,OAAO,CAAC,MAAM,CAAQ;gBAEV,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,gBAAgB;IAK3D,IAAI,IAAI,IAAI;IAIZ,QAAQ,IAAI,OAAO;IAInB,KAAK,IAAI,IAAI;IAQb,IAAI,IAAI,IAAI;IAOZ,MAAM,IAAI,IAAI;IAKd,OAAO,CAAC,KAAK;IAUb,OAAO,CAAC,KAAK;IAOb,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,QAAQ;IAShB,OAAO,IAAI,IAAI;CAGhB"}
|
package/dist/thumbs.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { GlareInstance, ThumbsOptions } from './types';
|
|
2
|
+
export declare class Thumbs {
|
|
3
|
+
isActive: boolean;
|
|
4
|
+
private instance;
|
|
5
|
+
private opts;
|
|
6
|
+
private $container;
|
|
7
|
+
private $list;
|
|
8
|
+
private cleanups;
|
|
9
|
+
constructor(instance: GlareInstance, opts: ThumbsOptions);
|
|
10
|
+
init(): void;
|
|
11
|
+
show(): void;
|
|
12
|
+
hide(): void;
|
|
13
|
+
toggle(): void;
|
|
14
|
+
focus(index?: number): void;
|
|
15
|
+
destroy(): void;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=thumbs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thumbs.d.ts","sourceRoot":"","sources":["../src/thumbs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAG3D,qBAAa,MAAM;IACjB,QAAQ,UAAQ;IAChB,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,QAAQ,CAAwB;gBAE5B,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa;IAKxD,IAAI,IAAI,IAAI;IA4CZ,IAAI,IAAI,IAAI;IAOZ,IAAI,IAAI,IAAI;IAOZ,MAAM,IAAI,IAAI;IAKd,KAAK,CAAC,KAAK,SAA0B,GAAG,IAAI;IAS5C,OAAO,IAAI,IAAI;CAQhB"}
|