@thisiscrowd/crowdbox 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/README.md +348 -0
- package/dist/crowdbox.css +1 -0
- package/dist/crowdbox.css.map +1 -0
- package/dist/crowdbox.esm.js +1557 -0
- package/dist/crowdbox.esm.js.map +1 -0
- package/dist/crowdbox.umd.js +8 -0
- package/dist/crowdbox.umd.js.map +1 -0
- package/package.json +59 -0
- package/src/adapters/iframe.js +30 -0
- package/src/adapters/image.js +91 -0
- package/src/adapters/video.js +44 -0
- package/src/adapters/vimeo.js +52 -0
- package/src/adapters/youtube.js +54 -0
- package/src/browser.js +7 -0
- package/src/core/Crowdbox.js +739 -0
- package/src/core/EventEmitter.js +43 -0
- package/src/core/LightboxGallery.js +2 -0
- package/src/core/Registry.js +26 -0
- package/src/core/utils.js +115 -0
- package/src/index.js +61 -0
- package/src/plugins/download/download.js +50 -0
- package/src/plugins/fullscreen/fullscreen.js +65 -0
- package/src/plugins/share/share.js +63 -0
- package/src/plugins/thumbs/thumbs.js +108 -0
- package/src/plugins/zoom/zoom.js +51 -0
- package/src/react/GalleryGrid.jsx +75 -0
- package/src/react/Lightbox.jsx +36 -0
- package/src/react/useLightbox.js +34 -0
- package/src/styles/_animations.scss +62 -0
- package/src/styles/_mosaic.scss +46 -0
- package/src/styles/_responsive.scss +34 -0
- package/src/styles/_thumbnails.scss +66 -0
- package/src/styles/_toolbar.scss +150 -0
- package/src/styles/_variables.scss +23 -0
- package/src/styles/main.scss +164 -0
- package/types/index.d.ts +239 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crowdbox.esm.js","sources":["../src/core/EventEmitter.js","../src/core/Registry.js","../src/core/utils.js","../src/core/Crowdbox.js","../src/adapters/image.js","../src/adapters/video.js","../src/adapters/youtube.js","../src/adapters/vimeo.js","../src/adapters/iframe.js","../src/plugins/zoom/zoom.js","../src/plugins/thumbs/thumbs.js","../src/plugins/fullscreen/fullscreen.js","../src/plugins/download/download.js","../src/plugins/share/share.js","../src/index.js"],"sourcesContent":["export class EventEmitter {\n constructor() {\n this._events = Object.create(null);\n }\n\n on(event, listener) {\n if (!this._events[event]) this._events[event] = [];\n this._events[event].push(listener);\n return this;\n }\n\n once(event, listener) {\n const wrapper = (...args) => {\n listener(...args);\n this.off(event, wrapper);\n };\n wrapper._original = listener;\n return this.on(event, wrapper);\n }\n\n off(event, listener) {\n if (!this._events[event]) return this;\n this._events[event] = this._events[event].filter(\n (l) => l !== listener && l._original !== listener\n );\n return this;\n }\n\n emit(event, ...args) {\n if (!this._events[event]) return false;\n [...this._events[event]].forEach((l) => l(...args));\n return true;\n }\n\n removeAllListeners(event) {\n if (event) {\n delete this._events[event];\n } else {\n this._events = Object.create(null);\n }\n return this;\n }\n}\n","// Central registry for media adapters and plugins so the host app\n// can swap or extend them without forking the library.\nconst adapters = new Map();\nconst plugins = new Map();\n\nexport const Registry = {\n registerAdapter(type, adapter) {\n adapters.set(type, adapter);\n },\n\n getAdapter(type) {\n return adapters.get(type) ?? null;\n },\n\n registerPlugin(name, plugin) {\n plugins.set(name, plugin);\n },\n\n getPlugin(name) {\n return plugins.get(name) ?? null;\n },\n\n getPlugins() {\n return [...plugins.values()];\n },\n};\n","export function createElement(tag, attrs = {}, ...children) {\n const el = document.createElement(tag);\n for (const [k, v] of Object.entries(attrs)) {\n if (k === 'class') el.className = v;\n else if (k.startsWith('data-')) el.dataset[k.slice(5).replace(/-([a-z])/g, (_, c) => c.toUpperCase())] = v;\n else if (k === 'aria' || k.startsWith('aria-')) el.setAttribute(k, v);\n else el[k] = v;\n }\n children.flat().forEach((child) => {\n if (child == null) return;\n el.appendChild(typeof child === 'string' ? document.createTextNode(child) : child);\n });\n return el;\n}\n\nexport function mergeDeep(target, ...sources) {\n for (const src of sources) {\n for (const key of Object.keys(src ?? {})) {\n if (src[key] && typeof src[key] === 'object' && !Array.isArray(src[key])) {\n if (!target[key] || typeof target[key] !== 'object') target[key] = {};\n mergeDeep(target[key], src[key]);\n } else {\n target[key] = src[key];\n }\n }\n }\n return target;\n}\n\nexport function getYouTubeId(url) {\n const m = url.match(/(?:youtube\\.com\\/(?:watch\\?v=|embed\\/|shorts\\/)|youtu\\.be\\/)([a-zA-Z0-9_-]{11})/);\n return m ? m[1] : null;\n}\n\nexport function getVimeoId(url) {\n const m = url.match(/vimeo\\.com\\/(?:video\\/)?(\\d+)/);\n return m ? m[1] : null;\n}\n\nexport function isVideoUrl(url) {\n return /\\.(mp4|webm|ogg|mov)(\\?.*)?$/i.test(url);\n}\n\nexport function isYouTubeUrl(url) {\n return /youtube\\.com|youtu\\.be/.test(url);\n}\n\nexport function isVimeoUrl(url) {\n return /vimeo\\.com/.test(url);\n}\n\nexport function detectMediaType(src) {\n if (!src) return 'unknown';\n if (isYouTubeUrl(src)) return 'youtube';\n if (isVimeoUrl(src)) return 'vimeo';\n if (isVideoUrl(src)) return 'video';\n if (/\\.(jpg|jpeg|png|gif|webp|avif|svg)(\\?.*)?$/i.test(src)) return 'image';\n return 'iframe';\n}\n\nexport function trapFocus(container) {\n const focusable = container.querySelectorAll(\n 'a[href],button:not([disabled]),textarea,input,select,[tabindex]:not([tabindex=\"-1\"])'\n );\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n function handler(e) {\n if (e.key !== 'Tab') return;\n if (e.shiftKey) {\n if (document.activeElement === first) { e.preventDefault(); last?.focus(); }\n } else {\n if (document.activeElement === last) { e.preventDefault(); first?.focus(); }\n }\n }\n container.addEventListener('keydown', handler);\n return () => container.removeEventListener('keydown', handler);\n}\n\nexport function requestFullscreen(el) {\n return (el.requestFullscreen || el.webkitRequestFullscreen || el.mozRequestFullScreen)?.call(el);\n}\n\nexport function exitFullscreen() {\n return (document.exitFullscreen || document.webkitExitFullscreen || document.mozCancelFullScreen)?.call(document);\n}\n\nexport function isFullscreen() {\n return !!(document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement);\n}\n\nexport function clamp(value, min, max) {\n return Math.min(Math.max(value, min), max);\n}\n\nexport function noop() {}\n\nexport function debounce(fn, ms) {\n let t;\n return (...args) => { clearTimeout(t); t = setTimeout(() => fn(...args), ms); };\n}\n\nexport function isTouchDevice() {\n return 'ontouchstart' in window || navigator.maxTouchPoints > 0;\n}\n\nexport function supportsPassive() {\n let ok = false;\n try {\n window.addEventListener('test', null, Object.defineProperty({}, 'passive', { get() { ok = true; } }));\n } catch (_) {}\n return ok;\n}\n\nexport const passiveOpt = supportsPassive() ? { passive: true } : false;\n","import { EventEmitter } from './EventEmitter.js';\nimport { Registry } from './Registry.js';\nimport {\n createElement,\n mergeDeep,\n detectMediaType,\n trapFocus,\n clamp,\n passiveOpt,\n} from './utils.js';\n\nconst DEFAULTS = {\n selector: '[data-lgx]',\n gallerySelector: null, // group items by this attr value\n loop: true,\n keyboard: true,\n touch: true,\n drag: true,\n zoom: true,\n thumbnails: true,\n captions: true,\n counter: true,\n fullscreen: true,\n download: false,\n share: false,\n closeOnBackdrop: true,\n closeOnEscape: true,\n animationDuration: 300,\n slideAnimationDuration: 360,\n zoomStep: 0.5,\n zoomMax: 4,\n zoomMin: 1,\n lazyLoad: true,\n preload: 1, // preload N slides ahead/behind\n autoplay: false,\n autoplayInterval: 4000,\n showAutoplay: true, // show/hide autoplay button in toolbar\n i18n: {\n close: 'Close',\n prev: 'Previous',\n next: 'Next',\n zoomIn: 'Zoom in',\n zoomOut: 'Zoom out',\n fullscreen: 'Fullscreen',\n download: 'Download',\n share: 'Share',\n autoplayStart: 'Start slideshow',\n autoplayStop: 'Stop slideshow',\n counter: '{current} of {total}',\n },\n};\n\nexport class Crowdbox extends EventEmitter {\n constructor(options = {}) {\n super();\n this.opts = mergeDeep({}, DEFAULTS, options);\n this._items = [];\n this._index = 0;\n this._open = false;\n this._zoom = 1;\n this._panX = 0;\n this._panY = 0;\n this._autoplayTimer = null;\n this._releaseFocusTrap = null;\n this._previousFocus = null;\n this._plugins = [];\n this._dom = {};\n\n this._initPlugins();\n this._bindTriggers();\n }\n\n // ─── Public API ──────────────────────────────────────────────────────────────\n\n open(items, startIndex = 0) {\n if (this._open) this.close();\n this._items = this._normalizeItems(items);\n this._index = clamp(startIndex, 0, this._items.length - 1);\n this._open = true;\n this._zoom = 1;\n this._panX = 0;\n this._panY = 0;\n\n this._buildDOM();\n this._attachKeyboard();\n this._attachTouch();\n this._renderSlide(this._index);\n this._preload(this._index);\n this._pluginHook('afterOpen');\n this.emit('open', { index: this._index, item: this._items[this._index] });\n\n if (this.opts.autoplay && !this._isAutoplayBlockingMedia(this._items[this._index])) this._startAutoplay();\n return this;\n }\n\n close() {\n if (!this._open) return this;\n this._open = false;\n this._stopAutoplay();\n this._pauseCurrentMedia();\n this._pluginHook('beforeClose');\n\n const modal = this._dom.modal;\n if (modal) {\n modal.style.animation = `lgx-fade-out ${this.opts.animationDuration}ms ease forwards`;\n setTimeout(() => { modal.remove(); this._dom = {}; }, this.opts.animationDuration);\n }\n\n this._detachKeyboard();\n if (this._releaseFocusTrap) { this._releaseFocusTrap(); this._releaseFocusTrap = null; }\n if (this._previousFocus) { this._previousFocus.focus(); this._previousFocus = null; }\n document.body.style.overflow = '';\n\n this._pluginHook('afterClose');\n this.emit('close');\n return this;\n }\n\n next() {\n const total = this._items.length;\n if (!total) return this;\n if (!this.opts.loop && this._index >= total - 1) return this;\n this._goTo((this._index + 1) % total, 'next');\n return this;\n }\n\n prev() {\n const total = this._items.length;\n if (!total) return this;\n if (!this.opts.loop && this._index === 0) return this;\n this._goTo((this._index - 1 + total) % total, 'prev');\n return this;\n }\n\n goTo(index) {\n const i = clamp(index, 0, this._items.length - 1);\n this._goTo(i, i > this._index ? 'next' : 'prev');\n return this;\n }\n\n zoomIn() {\n this._applyZoom(this._zoom + this.opts.zoomStep);\n return this;\n }\n\n zoomOut() {\n this._applyZoom(this._zoom - this.opts.zoomStep);\n return this;\n }\n\n resetZoom() {\n this._applyZoom(1, true);\n return this;\n }\n\n startAutoplay() { this._startAutoplay(); return this; }\n stopAutoplay() { this._stopAutoplay(); return this; }\n toggleAutoplay() {\n this._autoplayTimer ? this._stopAutoplay() : this._startAutoplay();\n return this;\n }\n\n destroy() {\n this.close();\n this._detachTriggers();\n this._plugins.forEach((p) => p.destroy?.());\n this.removeAllListeners();\n }\n\n // ─── Internal ─────────────────────────────────────────────────────────────────\n\n _normalizeItems(items) {\n if (!Array.isArray(items)) items = [items];\n return items.map((item) => {\n if (typeof item === 'string') item = { src: item };\n if (!item.type) item.type = detectMediaType(item.src);\n return item;\n });\n }\n\n _initPlugins() {\n const pluginDefs = Registry.getPlugins();\n pluginDefs.forEach((Def) => {\n if (this.opts[Def.pluginName] === false) return;\n const inst = typeof Def === 'function' ? new Def(this) : Def;\n if (typeof inst.init === 'function') inst.init(this);\n this._plugins.push(inst);\n });\n }\n\n _pluginHook(hook, ...args) {\n this._plugins.forEach((p) => p[hook]?.(...args));\n }\n\n // ─── DOM ──────────────────────────────────────────────────────────────────────\n\n _buildDOM() {\n this._previousFocus = document.activeElement;\n document.body.style.overflow = 'hidden';\n\n const modal = createElement('div', {\n class: 'lgx-modal',\n role: 'dialog',\n 'aria-modal': 'true',\n 'aria-label': 'Media lightbox',\n });\n modal.style.setProperty('--lgx-duration', `${this.opts.animationDuration}ms`);\n modal.style.setProperty('--lgx-slide-duration', `${this.opts.slideAnimationDuration}ms`);\n\n const backdrop = createElement('div', { class: 'lgx-backdrop' });\n if (this.opts.closeOnBackdrop) {\n backdrop.addEventListener('click', () => this.close());\n }\n\n const container = createElement('div', { class: 'lgx-container' });\n\n // Toolbar\n const toolbar = this._buildToolbar();\n\n // Stage — nav buttons live here so top:50% is relative to the image area,\n // not the full container (which includes caption + thumbnail strip).\n const stage = createElement('div', { class: 'lgx-stage', 'aria-live': 'polite' });\n const slideWrapper = createElement('div', { class: 'lgx-slide-wrapper' });\n const btnPrev = this._buildNavBtn('prev');\n const btnNext = this._buildNavBtn('next');\n stage.append(slideWrapper, btnPrev, btnNext);\n\n // Caption — normal flex child so it sits between stage and thumbnail strip\n // without z-index fights. Hidden via display:none when empty.\n const caption = createElement('div', { class: 'lgx-caption', 'aria-live': 'polite' });\n caption.style.display = 'none';\n\n // Counter (absolute, overlays top of stage)\n const counter = createElement('div', { class: 'lgx-counter', 'aria-live': 'polite' });\n\n // Loading spinner\n const spinner = createElement('div', { class: 'lgx-spinner', 'aria-hidden': 'true' },\n createElement('div', { class: 'lgx-spinner__ring' })\n );\n\n // Order matters for flex layout: stage grows, caption sits below it, thumbs at bottom\n container.append(toolbar, stage, caption, counter, spinner);\n\n modal.append(backdrop, container);\n document.body.appendChild(modal);\n\n // Animate in\n modal.style.animation = `lgx-fade-in ${this.opts.animationDuration}ms ease forwards`;\n\n const btnAutoplay = toolbar.querySelector('.lgx-btn--autoplay');\n this._dom = { modal, backdrop, container, stage, slideWrapper, toolbar, caption, counter, spinner, btnPrev, btnNext, btnAutoplay };\n this._releaseFocusTrap = trapFocus(modal);\n\n // Focus the container for keyboard events\n container.setAttribute('tabindex', '-1');\n container.focus();\n\n this._pluginHook('afterBuildDOM');\n }\n\n _buildToolbar() {\n const toolbar = createElement('div', { class: 'lgx-toolbar', role: 'toolbar', 'aria-label': 'Gallery controls' });\n\n const close = createElement('button', {\n class: 'lgx-btn lgx-btn--close',\n type: 'button',\n 'aria-label': this.opts.i18n.close,\n title: this.opts.i18n.close,\n }, this._svgIcon('close'));\n close.addEventListener('click', () => this.close());\n\n const autoplay = createElement('button', {\n class: 'lgx-btn lgx-btn--autoplay',\n type: 'button',\n 'aria-label': this.opts.i18n.autoplayStart,\n title: this.opts.i18n.autoplayStart,\n 'aria-pressed': 'false',\n }, this._svgIcon('play'));\n autoplay.addEventListener('click', () => this.toggleAutoplay());\n\n if (this.opts.showAutoplay) toolbar.appendChild(autoplay);\n toolbar.appendChild(close);\n this._dom.btnAutoplay = this.opts.showAutoplay ? autoplay : null;\n this._dom.btnClose = close;\n this._pluginHook('buildToolbar', toolbar);\n\n return toolbar;\n }\n\n _buildNavBtn(dir) {\n const label = dir === 'prev' ? this.opts.i18n.prev : this.opts.i18n.next;\n const btn = createElement('button', {\n class: `lgx-btn lgx-btn--nav lgx-btn--${dir}`,\n type: 'button',\n 'aria-label': label,\n title: label,\n }, this._svgIcon(dir));\n\n btn.addEventListener('click', () => (dir === 'prev' ? this.prev() : this.next()));\n\n if (this._items.length <= 1) btn.style.display = 'none';\n return btn;\n }\n\n // ─── Slide Rendering ──────────────────────────────────────────────────────────\n\n _renderSlide(index, direction = null) {\n const item = this._items[index];\n if (!item) return;\n\n this._pauseCurrentMedia();\n\n const adapter = this._resolveAdapter(item);\n if (!adapter) return;\n\n const slide = adapter.render(item);\n slide.dataset.lgxIndex = index;\n\n // Animate out old slide\n const old = this._dom.slideWrapper.querySelector('.lgx-slide--active');\n\n if (old && direction) {\n const outClass = direction === 'next' ? 'lgx-slide--out-left' : 'lgx-slide--out-right';\n const inClass = direction === 'next' ? 'lgx-slide--in-right' : 'lgx-slide--in-left';\n\n // Add inClass BEFORE appending so fill-mode \"both\" starts the slide\n // at opacity:0 — prevents the 1-frame flash at its final visible position.\n slide.classList.add(inClass);\n this._dom.slideWrapper.appendChild(slide);\n\n // Defer the outgoing animation by one rAF so the browser has committed\n // the new slide's start state before anything moves.\n requestAnimationFrame(() => {\n old.classList.remove('lgx-slide--active');\n old.classList.add(outClass);\n });\n\n // Use animationend for frame-accurate cleanup; setTimeout is the fallback\n // in case animationend never fires (e.g. display:none mid-animation).\n let done = false;\n const cleanup = () => {\n if (done) return;\n done = true;\n old.remove();\n slide.classList.remove(inClass);\n slide.classList.add('lgx-slide--active');\n };\n\n old.addEventListener('animationend', cleanup, { once: true });\n setTimeout(cleanup, this.opts.slideAnimationDuration + 100);\n } else {\n this._dom.slideWrapper.innerHTML = '';\n slide.classList.add('lgx-slide--active');\n this._dom.slideWrapper.appendChild(slide);\n }\n\n this._dom.currentSlide = slide;\n this._index = index;\n this._zoom = 1;\n this._panX = 0;\n\n // Show spinner, hide once slide reports loaded (JS fallback for browsers\n // without :has() support — CSS handles it in modern browsers).\n this._watchSlideLoaded(slide);\n this._bindMediaAutoplayStop(slide, item);\n if (this._autoplayTimer && this._isAutoplayBlockingMedia(item)) this._stopAutoplay();\n this._panY = 0;\n this._updateUI();\n this._pluginHook('afterSlide', index, item);\n this.emit('slide', { index, item });\n }\n\n _goTo(index, direction) {\n this._renderSlide(index, direction);\n this._preload(index);\n }\n\n _watchSlideLoaded(slide) {\n const spinner = this._dom.spinner;\n if (!spinner) return;\n\n // Already loaded (e.g. cached image or video adapter)\n if (slide.classList.contains('lgx-content--loaded')) {\n spinner.style.display = 'none';\n return;\n }\n\n spinner.style.display = '';\n\n // Disconnect any previous observer\n this._spinnerObserver?.disconnect();\n\n this._spinnerObserver = new MutationObserver(() => {\n if (slide.classList.contains('lgx-content--loaded')) {\n spinner.style.display = 'none';\n this._spinnerObserver.disconnect();\n }\n });\n this._spinnerObserver.observe(slide, { attributes: true, attributeFilter: ['class'] });\n }\n\n _preload(index) {\n if (!this.opts.lazyLoad) return;\n const n = this.opts.preload;\n const total = this._items.length;\n for (let i = 1; i <= n; i++) {\n [\n (index + i) % total,\n (index - i + total) % total,\n ].forEach((pi) => {\n const pitem = this._items[pi];\n if (pitem?.type === 'image' && !pitem._preloaded) {\n const img = new Image();\n img.src = pitem.src;\n pitem._preloaded = true;\n }\n });\n }\n }\n\n _resolveAdapter(item) {\n const adapter = Registry.getAdapter(item.type);\n if (adapter) return adapter;\n // Fallback: scan all adapters\n const all = ['image', 'video', 'youtube', 'vimeo', 'iframe'];\n for (const t of all) {\n const a = Registry.getAdapter(t);\n if (a?.canHandle(item)) return a;\n }\n return null;\n }\n\n _pauseCurrentMedia() {\n const slide = this._dom.slideWrapper?.querySelector('.lgx-slide--active, .lgx-content');\n if (slide?._pause) slide._pause();\n // Pause html5 video elements\n slide?.querySelectorAll('video').forEach((v) => v.pause());\n }\n\n // ─── UI Updates ───────────────────────────────────────────────────────────────\n\n _updateUI() {\n const { _index: i, _items: items, opts, _dom: dom } = this;\n const total = items.length;\n\n // Counter\n if (dom.counter && opts.counter) {\n dom.counter.textContent = opts.i18n.counter\n .replace('{current}', i + 1)\n .replace('{total}', total);\n dom.counter.style.display = total > 1 ? '' : 'none';\n }\n\n // Caption\n if (dom.caption && opts.captions) {\n const cap = String(items[i]?.caption ?? '').trim();\n dom.caption.innerHTML = cap;\n dom.caption.style.display = cap ? '' : 'none';\n }\n\n // Nav buttons\n if (!opts.loop) {\n if (dom.btnPrev) dom.btnPrev.disabled = i === 0;\n if (dom.btnNext) dom.btnNext.disabled = i === total - 1;\n }\n\n // Show/hide nav for single-item galleries\n const showNav = total > 1;\n if (dom.btnPrev) dom.btnPrev.style.display = showNav ? '' : 'none';\n if (dom.btnNext) dom.btnNext.style.display = showNav ? '' : 'none';\n if (dom.btnAutoplay) dom.btnAutoplay.style.display = showNav ? '' : 'none';\n\n this._updateAutoplayButton();\n\n this._pluginHook('updateUI');\n }\n\n _updateAutoplayButton() {\n const btn = this._dom.btnAutoplay;\n if (!btn) return;\n\n const active = !!this._autoplayTimer;\n const label = active ? this.opts.i18n.autoplayStop : this.opts.i18n.autoplayStart;\n btn.classList.toggle('lgx-btn--active', active);\n btn.setAttribute('aria-pressed', active ? 'true' : 'false');\n btn.setAttribute('aria-label', label);\n btn.title = label;\n btn.innerHTML = this._svgIcon(active ? 'stop' : 'play').outerHTML;\n }\n\n // ─── Zoom / Pan ───────────────────────────────────────────────────────────────\n\n _applyZoom(newZoom, reset = false) {\n newZoom = clamp(newZoom, this.opts.zoomMin, this.opts.zoomMax);\n if (reset) { newZoom = 1; this._panX = 0; this._panY = 0; }\n this._zoom = newZoom;\n\n const img = this._dom.slideWrapper?.querySelector('.lgx-image');\n if (!img) return;\n\n img.style.transform = `translate(${this._panX}px, ${this._panY}px) scale(${newZoom})`;\n img.style.cursor = newZoom > 1 ? 'move' : 'default';\n\n this._pluginHook('afterZoom', newZoom);\n this.emit('zoom', { zoom: newZoom });\n }\n\n // ─── Keyboard ─────────────────────────────────────────────────────────────────\n\n _attachKeyboard() {\n if (!this.opts.keyboard) return;\n this._onKeydown = (e) => {\n switch (e.key) {\n case 'ArrowRight': this.next(); break;\n case 'ArrowLeft': this.prev(); break;\n case 'Escape': if (this.opts.closeOnEscape) this.close(); break;\n case 'f': case 'F': this._pluginHook('toggleFullscreen'); break;\n case '+': case '=': this.zoomIn(); break;\n case '-': this.zoomOut(); break;\n case '0': this.resetZoom(); break;\n }\n };\n document.addEventListener('keydown', this._onKeydown);\n }\n\n _detachKeyboard() {\n if (this._onKeydown) document.removeEventListener('keydown', this._onKeydown);\n }\n\n // ─── Touch / Drag ─────────────────────────────────────────────────────────────\n\n _attachTouch() {\n if (!this.opts.touch && !this.opts.drag) return;\n const stage = this._dom.stage;\n if (!stage) return;\n\n let startX, startY, startPanX, startPanY, isDragging = false;\n const SWIPE_THRESHOLD = 50;\n\n const onStart = (e) => {\n const pt = e.touches ? e.touches[0] : e;\n startX = pt.clientX;\n startY = pt.clientY;\n startPanX = this._panX;\n startPanY = this._panY;\n isDragging = true;\n };\n\n const onMove = (e) => {\n if (!isDragging) return;\n const pt = e.touches ? e.touches[0] : e;\n const dx = pt.clientX - startX;\n const dy = pt.clientY - startY;\n\n if (this._zoom > 1) {\n // Pan mode\n this._panX = startPanX + dx;\n this._panY = startPanY + dy;\n const img = this._dom.slideWrapper?.querySelector('.lgx-image');\n if (img) img.style.transform = `translate(${this._panX}px, ${this._panY}px) scale(${this._zoom})`;\n e.preventDefault();\n }\n };\n\n const onEnd = (e) => {\n if (!isDragging) return;\n isDragging = false;\n const pt = e.changedTouches ? e.changedTouches[0] : e;\n const dx = pt.clientX - startX;\n\n if (this._zoom === 1 && Math.abs(dx) > SWIPE_THRESHOLD) {\n dx < 0 ? this.next() : this.prev();\n }\n };\n\n // Double-tap / double-click zoom\n let lastTap = 0;\n const onTap = (e) => {\n const now = Date.now();\n if (now - lastTap < 300) {\n this._zoom === 1 ? this._applyZoom(2) : this.resetZoom();\n e.preventDefault();\n }\n lastTap = now;\n };\n\n stage.addEventListener('mousedown', onStart);\n stage.addEventListener('mousemove', onMove);\n stage.addEventListener('mouseup', onEnd);\n stage.addEventListener('touchstart', onStart, passiveOpt);\n stage.addEventListener('touchmove', onMove, { passive: false });\n stage.addEventListener('touchend', onEnd, passiveOpt);\n stage.addEventListener('click', onTap);\n\n // Pinch zoom\n let initDist = 0, initZoom = 1;\n stage.addEventListener('touchstart', (e) => {\n if (e.touches.length === 2) {\n initDist = Math.hypot(\n e.touches[0].clientX - e.touches[1].clientX,\n e.touches[0].clientY - e.touches[1].clientY\n );\n initZoom = this._zoom;\n }\n }, passiveOpt);\n\n stage.addEventListener('touchmove', (e) => {\n if (e.touches.length === 2) {\n const dist = Math.hypot(\n e.touches[0].clientX - e.touches[1].clientX,\n e.touches[0].clientY - e.touches[1].clientY\n );\n this._applyZoom(initZoom * (dist / initDist));\n e.preventDefault();\n }\n }, { passive: false });\n }\n\n // ─── Autoplay ──────────────────────────────────────────────────────────────────\n\n _startAutoplay() {\n if (this._isAutoplayBlockingMedia(this._items[this._index])) {\n this._stopAutoplay();\n return;\n }\n this._stopAutoplay();\n this._autoplayTimer = setInterval(() => this.next(), this.opts.autoplayInterval);\n this._updateAutoplayButton();\n this.emit('autoplay:start');\n }\n\n _stopAutoplay() {\n if (this._autoplayTimer) {\n clearInterval(this._autoplayTimer);\n this._autoplayTimer = null;\n this._updateAutoplayButton();\n this.emit('autoplay:stop');\n }\n }\n\n _bindMediaAutoplayStop(slide, item) {\n if (!this._isAutoplayBlockingMedia(item)) return;\n\n const stop = () => this._stopAutoplay();\n slide.addEventListener('lgx:media-play', stop, { once: true });\n slide.querySelectorAll('video').forEach((video) => {\n video.addEventListener('play', stop, { once: true });\n });\n }\n\n _isAutoplayBlockingMedia(item) {\n return ['video', 'youtube', 'vimeo', 'iframe'].includes(item?.type);\n }\n\n // ─── Trigger binding ──────────────────────────────────────────────────────────\n\n _bindTriggers() {\n if (typeof document === 'undefined') return;\n if (!this.opts.selector) return;\n\n const handler = (e) => {\n const trigger = e.target.closest(this.opts.selector);\n if (!trigger) return;\n e.preventDefault();\n\n // Gather all items from the same gallery group\n const groupAttr = trigger.dataset.lgxGallery || trigger.closest('[data-lgx-gallery]')?.dataset.lgxGallery;\n let siblings;\n\n if (groupAttr) {\n siblings = [...document.querySelectorAll(`[data-lgx-gallery=\"${groupAttr}\"] ${this.opts.selector}, ${this.opts.selector}[data-lgx-gallery=\"${groupAttr}\"]`)];\n } else {\n siblings = [trigger];\n }\n\n const items = siblings.map((el) => this._itemFromElement(el));\n const startIndex = siblings.indexOf(trigger);\n this.open(items, Math.max(0, startIndex));\n };\n\n document.addEventListener('click', handler);\n this._triggerHandler = handler;\n }\n\n _detachTriggers() {\n if (this._triggerHandler) {\n document.removeEventListener('click', this._triggerHandler);\n }\n }\n\n _itemFromElement(el) {\n const d = el.dataset;\n const img = el.matches('img') ? el : el.querySelector('img');\n const captionEl = el.querySelector('[data-lgx-caption], figcaption, .caption, .lgx-caption-text');\n const caption = d.lgxCaption\n || img?.dataset?.lgxCaption\n || captionEl?.innerHTML\n || el.getAttribute('aria-label')\n || el.title\n || img?.title\n || img?.alt\n || '';\n\n return {\n src: d.lgxSrc || el.href || el.src || '',\n type: d.lgxType || undefined,\n thumb: d.lgxThumb || img?.src || null,\n caption,\n alt: d.lgxAlt || img?.alt || '',\n download: d.lgxDownload || null,\n autoplay: d.lgxAutoplay !== undefined,\n poster: d.lgxPoster || null,\n };\n }\n\n // ─── SVG Icons ────────────────────────────────────────────────────────────────\n\n _svgIcon(name) {\n const icons = {\n close: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>',\n prev: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"15,18 9,12 15,6\"/></svg>',\n next: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"9,18 15,12 9,6\"/></svg>',\n play: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M8 5.14v13.72a1 1 0 0 0 1.52.86l11.43-6.86a1 1 0 0 0 0-1.72L9.52 4.28A1 1 0 0 0 8 5.14z\"/></svg>',\n stop: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><rect x=\"7\" y=\"7\" width=\"10\" height=\"10\" rx=\"1.5\"/></svg>',\n zoomin: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"/><line x1=\"11\" y1=\"8\" x2=\"11\" y2=\"14\"/><line x1=\"8\" y1=\"11\" x2=\"14\" y2=\"11\"/></svg>',\n zoomout: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"/><line x1=\"8\" y1=\"11\" x2=\"14\" y2=\"11\"/></svg>',\n fullscreen: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"15,3 21,3 21,9\"/><polyline points=\"9,21 3,21 3,15\"/><line x1=\"21\" y1=\"3\" x2=\"14\" y2=\"10\"/><line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\"/></svg>',\n download: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><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\" y1=\"15\" x2=\"12\" y2=\"3\"/></svg>',\n share: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><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\" y1=\"13.51\" x2=\"15.42\" y2=\"17.49\"/><line x1=\"15.41\" y1=\"6.51\" x2=\"8.59\" y2=\"10.49\"/></svg>',\n };\n const div = document.createElement('span');\n div.className = 'lgx-icon';\n div.setAttribute('aria-hidden', 'true');\n div.innerHTML = icons[name] ?? '';\n return div;\n }\n}\n\nexport { Crowdbox as LightboxGallery };\n","const COLS = 8;\nconst ROWS = 7;\nconst TILE_DURATION = 420; // ms — must match CSS animation duration\nconst MAX_DELAY = 380; // ms — last tile starts at this offset\n\n// Tile colours — dark palette with subtle variation\nconst TILE_COLORS = [\n '#111116', '#13131a', '#0f0f14', '#161620',\n '#121218', '#101015', '#141419', '#0e0e13',\n];\n\nfunction buildMosaic() {\n const mosaic = document.createElement('div');\n mosaic.className = 'lgx-mosaic';\n mosaic.style.gridTemplateColumns = `repeat(${COLS}, 1fr)`;\n mosaic.style.gridTemplateRows = `repeat(${ROWS}, 1fr)`;\n\n for (let r = 0; r < ROWS; r++) {\n for (let c = 0; c < COLS; c++) {\n const tile = document.createElement('div');\n tile.className = 'lgx-mosaic__tile';\n\n // Diagonal wave: top-left tiles dissolve first\n const diagRatio = (r + c) / (ROWS + COLS - 2); // 0 → 1\n const delay = Math.round(diagRatio * MAX_DELAY);\n tile.style.setProperty('--lgx-tile-delay', `${delay}ms`);\n\n // Pick a colour from the palette so adjacent tiles vary slightly\n tile.style.background = TILE_COLORS[(r * COLS + c) % TILE_COLORS.length];\n\n mosaic.appendChild(tile);\n }\n }\n\n return mosaic;\n}\n\nexport const ImageAdapter = {\n type: 'image',\n\n canHandle(item) {\n return item.type === 'image' || /\\.(jpg|jpeg|png|gif|webp|avif|svg)(\\?.*)?$/i.test(item.src ?? '');\n },\n\n render(item) {\n const wrapper = document.createElement('div');\n wrapper.className = 'lgx-content lgx-content--image';\n // position:relative and overflow:hidden are set in CSS on .lgx-content--image\n // so the mosaic tiles (position:absolute inside) are clipped correctly.\n\n const img = document.createElement('img');\n img.className = 'lgx-image';\n img.alt = item.alt ?? item.caption ?? '';\n img.draggable = false;\n\n // Low-res thumb while full image loads\n if (item.thumb) {\n img.src = item.thumb;\n img.style.filter = 'blur(8px)';\n }\n\n const loadStart = Date.now();\n const hi = new Image();\n hi.onload = () => {\n img.src = hi.src;\n img.style.filter = '';\n img.style.transition = 'filter 0.3s';\n wrapper.classList.add('lgx-content--loaded');\n\n // Skip mosaic when the image was served from cache (load time < 40 ms) —\n // it would collide with the slide-in transition and cause flickering.\n const fromNetwork = Date.now() - loadStart > 40;\n if (fromNetwork) {\n const mosaic = buildMosaic();\n wrapper.appendChild(mosaic);\n const totalMs = MAX_DELAY + TILE_DURATION + 60;\n setTimeout(() => mosaic.remove(), totalMs);\n }\n };\n\n hi.onerror = () => wrapper.classList.add('lgx-content--error');\n hi.src = item.src;\n\n wrapper.appendChild(img);\n return wrapper;\n },\n\n getThumbnail(item) {\n return item.thumb ?? item.src;\n },\n};\n","export const VideoAdapter = {\n type: 'video',\n\n canHandle(item) {\n return item.type === 'video' || /\\.(mp4|webm|ogg|mov)(\\?.*)?$/i.test(item.src ?? '');\n },\n\n render(item) {\n const wrapper = document.createElement('div');\n wrapper.className = 'lgx-content lgx-content--video';\n\n const video = document.createElement('video');\n video.className = 'lgx-video';\n video.controls = true;\n video.playsInline = true;\n video.preload = 'metadata';\n if (item.autoplay) video.autoplay = true;\n if (item.loop) video.loop = true;\n if (item.muted) video.muted = true;\n if (item.poster) video.poster = item.poster;\n video.addEventListener('play', () => {\n wrapper.dispatchEvent(new CustomEvent('lgx:media-play', { bubbles: true }));\n });\n\n const sources = Array.isArray(item.src) ? item.src : [item.src];\n sources.forEach((s) => {\n const src = typeof s === 'string' ? { src: s } : s;\n const source = document.createElement('source');\n source.src = src.src;\n if (src.type) source.type = src.type;\n video.appendChild(source);\n });\n\n wrapper.appendChild(video);\n wrapper.classList.add('lgx-content--loaded');\n\n wrapper._pause = () => video.pause();\n return wrapper;\n },\n\n getThumbnail(item) {\n return item.thumb ?? item.poster ?? null;\n },\n};\n","import { getYouTubeId } from '../core/utils.js';\n\nexport const YouTubeAdapter = {\n type: 'youtube',\n\n canHandle(item) {\n return item.type === 'youtube' || /youtube\\.com|youtu\\.be/.test(item.src ?? '');\n },\n\n render(item) {\n const wrapper = document.createElement('div');\n wrapper.className = 'lgx-content lgx-content--youtube lgx-content--iframe';\n\n const id = getYouTubeId(item.src);\n if (!id) {\n wrapper.textContent = 'Invalid YouTube URL';\n return wrapper;\n }\n\n const params = new URLSearchParams({\n autoplay: item.autoplay ? '1' : '0',\n rel: '0',\n modestbranding: '1',\n enablejsapi: '1',\n ...(item.start ? { start: item.start } : {}),\n });\n\n const iframe = document.createElement('iframe');\n iframe.className = 'lgx-iframe';\n iframe.src = `https://www.youtube.com/embed/${id}?${params}`;\n iframe.allow = 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture';\n iframe.allowFullscreen = true;\n iframe.setAttribute('loading', 'lazy');\n iframe.title = item.caption ?? 'YouTube video';\n\n iframe.addEventListener('load', () => wrapper.classList.add('lgx-content--loaded'));\n\n wrapper.appendChild(iframe);\n\n wrapper._pause = () => {\n try {\n iframe.contentWindow?.postMessage('{\"event\":\"command\",\"func\":\"pauseVideo\",\"args\":\"\"}', '*');\n } catch (_) {}\n };\n\n return wrapper;\n },\n\n getThumbnail(item) {\n if (item.thumb) return item.thumb;\n const id = getYouTubeId(item.src);\n return id ? `https://img.youtube.com/vi/${id}/mqdefault.jpg` : null;\n },\n};\n","import { getVimeoId } from '../core/utils.js';\n\nexport const VimeoAdapter = {\n type: 'vimeo',\n\n canHandle(item) {\n return item.type === 'vimeo' || /vimeo\\.com/.test(item.src ?? '');\n },\n\n render(item) {\n const wrapper = document.createElement('div');\n wrapper.className = 'lgx-content lgx-content--vimeo lgx-content--iframe';\n\n const id = getVimeoId(item.src);\n if (!id) {\n wrapper.textContent = 'Invalid Vimeo URL';\n return wrapper;\n }\n\n const params = new URLSearchParams({\n autoplay: item.autoplay ? '1' : '0',\n title: '0',\n byline: '0',\n portrait: '0',\n api: '1',\n });\n\n const iframe = document.createElement('iframe');\n iframe.className = 'lgx-iframe';\n iframe.src = `https://player.vimeo.com/video/${id}?${params}`;\n iframe.allow = 'autoplay; fullscreen; picture-in-picture';\n iframe.allowFullscreen = true;\n iframe.setAttribute('loading', 'lazy');\n iframe.title = item.caption ?? 'Vimeo video';\n\n iframe.addEventListener('load', () => wrapper.classList.add('lgx-content--loaded'));\n\n wrapper.appendChild(iframe);\n\n wrapper._pause = () => {\n try {\n iframe.contentWindow?.postMessage('{\"method\":\"pause\"}', '*');\n } catch (_) {}\n };\n\n return wrapper;\n },\n\n getThumbnail(item) {\n return item.thumb ?? null;\n },\n};\n","export const IframeAdapter = {\n type: 'iframe',\n\n canHandle(item) {\n return item.type === 'iframe';\n },\n\n render(item) {\n const wrapper = document.createElement('div');\n wrapper.className = 'lgx-content lgx-content--iframe';\n\n const iframe = document.createElement('iframe');\n iframe.className = 'lgx-iframe';\n iframe.src = item.src;\n iframe.allowFullscreen = true;\n iframe.setAttribute('loading', 'lazy');\n iframe.title = item.caption ?? 'Embedded content';\n if (item.iframeWidth) iframe.style.width = item.iframeWidth;\n if (item.iframeHeight) iframe.style.height = item.iframeHeight;\n\n iframe.addEventListener('load', () => wrapper.classList.add('lgx-content--loaded'));\n\n wrapper.appendChild(iframe);\n return wrapper;\n },\n\n getThumbnail(item) {\n return item.thumb ?? null;\n },\n};\n","export class ZoomPlugin {\n static pluginName = 'zoom';\n\n constructor(gallery) {\n this.gallery = gallery;\n this._btnIn = null;\n this._btnOut = null;\n }\n\n init(gallery) {\n this.gallery = gallery;\n }\n\n buildToolbar(toolbar) {\n if (!this.gallery.opts.zoom) return;\n\n this._btnIn = this._makeBtn('zoomin', this.gallery.opts.i18n.zoomIn, () => this.gallery.zoomIn());\n this._btnOut = this._makeBtn('zoomout', this.gallery.opts.i18n.zoomOut, () => this.gallery.zoomOut());\n\n // Insert before close button\n const close = toolbar.querySelector('.lgx-btn--close');\n toolbar.insertBefore(this._btnOut, close);\n toolbar.insertBefore(this._btnIn, this._btnOut);\n }\n\n afterSlide(index, item) {\n const isImage = item.type === 'image';\n if (this._btnIn) this._btnIn.style.display = isImage ? '' : 'none';\n if (this._btnOut) this._btnOut.style.display = isImage ? '' : 'none';\n }\n\n afterZoom(zoom) {\n const min = this.gallery.opts.zoomMin;\n const max = this.gallery.opts.zoomMax;\n if (this._btnIn) this._btnIn.disabled = zoom >= max;\n if (this._btnOut) this._btnOut.disabled = zoom <= min;\n }\n\n _makeBtn(iconName, label, onClick) {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = `lgx-btn lgx-btn--${iconName}`;\n btn.setAttribute('aria-label', label);\n btn.title = label;\n btn.innerHTML = this.gallery._svgIcon(iconName).outerHTML;\n btn.addEventListener('click', onClick);\n return btn;\n }\n\n destroy() {}\n}\n","export class ThumbsPlugin {\n static pluginName = 'thumbnails';\n\n constructor(gallery) {\n this.gallery = gallery;\n this._strip = null;\n this._thumbEls = [];\n this._observer = null;\n }\n\n init(gallery) {\n this.gallery = gallery;\n }\n\n afterBuildDOM() {\n if (!this.gallery.opts.thumbnails) return;\n if (this.gallery._items.length < 2) return;\n\n this._buildStrip();\n }\n\n afterSlide(index) {\n this._activate(index);\n }\n\n _buildStrip() {\n const gallery = this.gallery;\n const strip = document.createElement('div');\n strip.className = 'lgx-thumbs';\n strip.setAttribute('role', 'tablist');\n strip.setAttribute('aria-label', 'Gallery thumbnails');\n\n this._thumbEls = gallery._items.map((item, i) => {\n const thumb = document.createElement('button');\n thumb.type = 'button';\n thumb.className = 'lgx-thumb';\n thumb.setAttribute('role', 'tab');\n thumb.setAttribute('aria-label', `Slide ${i + 1}${item.caption ? ': ' + item.caption : ''}`);\n thumb.setAttribute('aria-selected', i === gallery._index ? 'true' : 'false');\n thumb.dataset.lgxThumbIndex = i;\n\n const adapter = gallery._resolveAdapter(item);\n const thumbSrc = adapter?.getThumbnail(item);\n\n if (thumbSrc) {\n const img = document.createElement('img');\n img.alt = '';\n img.loading = 'lazy';\n\n // IntersectionObserver lazy load\n if ('IntersectionObserver' in window) {\n img.dataset.src = thumbSrc;\n this._observe(img);\n } else {\n img.src = thumbSrc;\n }\n\n thumb.appendChild(img);\n } else {\n // Video/iframe fallback: show index number\n thumb.appendChild(document.createTextNode(i + 1));\n thumb.classList.add('lgx-thumb--no-image');\n }\n\n thumb.addEventListener('click', () => gallery.goTo(i));\n return thumb;\n });\n\n this._thumbEls.forEach((t) => strip.appendChild(t));\n gallery._dom.container.appendChild(strip);\n gallery._dom.thumbStrip = strip;\n this._strip = strip;\n\n this._activate(gallery._index);\n }\n\n _activate(index) {\n this._thumbEls.forEach((t, i) => {\n const active = i === index;\n t.classList.toggle('lgx-thumb--active', active);\n t.setAttribute('aria-selected', active ? 'true' : 'false');\n });\n\n // Scroll active thumb into view\n const activeThumb = this._thumbEls[index];\n if (activeThumb && this._strip) {\n activeThumb.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });\n }\n }\n\n _observe(img) {\n if (!this._observer) {\n this._observer = new IntersectionObserver((entries) => {\n entries.forEach((e) => {\n if (e.isIntersecting) {\n e.target.src = e.target.dataset.src;\n this._observer.unobserve(e.target);\n }\n });\n }, { rootMargin: '100px' });\n }\n this._observer.observe(img);\n }\n\n destroy() {\n this._observer?.disconnect();\n }\n}\n","import { requestFullscreen, exitFullscreen, isFullscreen } from '../../core/utils.js';\n\nexport class FullscreenPlugin {\n static pluginName = 'fullscreen';\n\n constructor(gallery) {\n this.gallery = gallery;\n this._btn = null;\n this._onChange = null;\n }\n\n init(gallery) {\n this.gallery = gallery;\n }\n\n buildToolbar(toolbar) {\n if (!this.gallery.opts.fullscreen) return;\n\n this._btn = document.createElement('button');\n this._btn.type = 'button';\n this._btn.className = 'lgx-btn lgx-btn--fullscreen';\n this._btn.setAttribute('aria-label', this.gallery.opts.i18n.fullscreen);\n this._btn.title = this.gallery.opts.i18n.fullscreen;\n this._btn.innerHTML = this.gallery._svgIcon('fullscreen').outerHTML;\n this._btn.addEventListener('click', () => this.toggle());\n\n const close = toolbar.querySelector('.lgx-btn--close');\n toolbar.insertBefore(this._btn, close);\n\n this._onChange = () => this._updateBtn();\n document.addEventListener('fullscreenchange', this._onChange);\n document.addEventListener('webkitfullscreenchange', this._onChange);\n }\n\n toggle() {\n if (isFullscreen()) {\n exitFullscreen();\n } else {\n requestFullscreen(this.gallery._dom.modal);\n }\n }\n\n toggleFullscreen() {\n this.toggle();\n }\n\n _updateBtn() {\n if (!this._btn) return;\n const full = isFullscreen();\n this._btn.setAttribute('aria-pressed', full ? 'true' : 'false');\n this.gallery._dom.modal?.classList.toggle('lgx-modal--fullscreen', full);\n }\n\n afterClose() {\n if (isFullscreen()) exitFullscreen();\n if (this._onChange) {\n document.removeEventListener('fullscreenchange', this._onChange);\n document.removeEventListener('webkitfullscreenchange', this._onChange);\n }\n }\n\n destroy() {\n this.afterClose();\n }\n}\n","export class DownloadPlugin {\n static pluginName = 'download';\n\n constructor(gallery) {\n this.gallery = gallery;\n this._btn = null;\n }\n\n init(gallery) {\n this.gallery = gallery;\n }\n\n buildToolbar(toolbar) {\n if (!this.gallery.opts.download) return;\n\n this._btn = document.createElement('button');\n this._btn.type = 'button';\n this._btn.className = 'lgx-btn lgx-btn--download';\n this._btn.setAttribute('aria-label', this.gallery.opts.i18n.download);\n this._btn.title = this.gallery.opts.i18n.download;\n this._btn.innerHTML = this.gallery._svgIcon('download').outerHTML;\n this._btn.addEventListener('click', () => this._download());\n\n const close = toolbar.querySelector('.lgx-btn--close');\n toolbar.insertBefore(this._btn, close);\n }\n\n afterSlide(index, item) {\n if (!this._btn) return;\n // Hide download for video embeds where we can't trigger a download\n const canDownload = ['image', 'video'].includes(item.type);\n this._btn.style.display = canDownload ? '' : 'none';\n }\n\n _download() {\n const item = this.gallery._items[this.gallery._index];\n if (!item) return;\n const url = item.download || item.src;\n const a = document.createElement('a');\n a.href = url;\n a.download = item.downloadName || url.split('/').pop() || 'download';\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n this.gallery.emit('download', { item });\n }\n\n destroy() {}\n}\n","export class SharePlugin {\n static pluginName = 'share';\n\n constructor(gallery) {\n this.gallery = gallery;\n this._btn = null;\n }\n\n init(gallery) {\n this.gallery = gallery;\n }\n\n buildToolbar(toolbar) {\n if (!this.gallery.opts.share) return;\n\n this._btn = document.createElement('button');\n this._btn.type = 'button';\n this._btn.className = 'lgx-btn lgx-btn--share';\n this._btn.setAttribute('aria-label', this.gallery.opts.i18n.share);\n this._btn.title = this.gallery.opts.i18n.share;\n this._btn.innerHTML = this.gallery._svgIcon('share').outerHTML;\n this._btn.addEventListener('click', () => this._share());\n\n const close = toolbar.querySelector('.lgx-btn--close');\n toolbar.insertBefore(this._btn, close);\n }\n\n async _share() {\n const item = this.gallery._items[this.gallery._index];\n if (!item) return;\n\n const shareData = {\n title: item.caption || document.title,\n url: item.shareUrl || item.src,\n };\n\n // Native Web Share API (mobile)\n if (navigator.share) {\n try {\n await navigator.share(shareData);\n this.gallery.emit('share', { item, method: 'native' });\n return;\n } catch (_) {}\n }\n\n // Fallback: copy URL to clipboard\n if (navigator.clipboard) {\n await navigator.clipboard.writeText(shareData.url);\n this._showToast('Link copied!');\n this.gallery.emit('share', { item, method: 'clipboard' });\n }\n }\n\n _showToast(msg) {\n const toast = document.createElement('div');\n toast.className = 'lgx-toast';\n toast.textContent = msg;\n this.gallery._dom.modal?.appendChild(toast);\n setTimeout(() => toast.remove(), 2500);\n }\n\n destroy() {}\n}\n","// Core\nexport { Crowdbox, LightboxGallery } from './core/Crowdbox.js';\nexport { EventEmitter } from './core/EventEmitter.js';\nexport { Registry } from './core/Registry.js';\n\n// Adapters\nimport { ImageAdapter } from './adapters/image.js';\nimport { VideoAdapter } from './adapters/video.js';\nimport { YouTubeAdapter } from './adapters/youtube.js';\nimport { VimeoAdapter } from './adapters/vimeo.js';\nimport { IframeAdapter } from './adapters/iframe.js';\n\n// Plugins\nimport { ZoomPlugin } from './plugins/zoom/zoom.js';\nimport { ThumbsPlugin } from './plugins/thumbs/thumbs.js';\nimport { FullscreenPlugin } from './plugins/fullscreen/fullscreen.js';\nimport { DownloadPlugin } from './plugins/download/download.js';\nimport { SharePlugin } from './plugins/share/share.js';\n\nexport { ImageAdapter, VideoAdapter, YouTubeAdapter, VimeoAdapter, IframeAdapter };\nexport { ZoomPlugin, ThumbsPlugin, FullscreenPlugin, DownloadPlugin, SharePlugin };\n\n// Auto-register everything so the library works out of the box\nimport { Registry as Reg } from './core/Registry.js';\n\nReg.registerAdapter('image', ImageAdapter);\nReg.registerAdapter('video', VideoAdapter);\nReg.registerAdapter('youtube', YouTubeAdapter);\nReg.registerAdapter('vimeo', VimeoAdapter);\nReg.registerAdapter('iframe', IframeAdapter);\n\nReg.registerPlugin('zoom', ZoomPlugin);\nReg.registerPlugin('thumbnails', ThumbsPlugin);\nReg.registerPlugin('fullscreen', FullscreenPlugin);\nReg.registerPlugin('download', DownloadPlugin);\nReg.registerPlugin('share', SharePlugin);\n\n// ─── Convenience factory ─────────────────────────────────────────────────────\nimport { Crowdbox } from './core/Crowdbox.js';\n\n/**\n * Create a Crowdbox instance and return it.\n * This is the primary public API for vanilla / script-tag usage.\n */\nexport function createGallery(options = {}) {\n return new Crowdbox(options);\n}\n\n// Auto-init from [data-lgx-init] attribute\nif (typeof document !== 'undefined') {\n document.addEventListener('DOMContentLoaded', () => {\n document.querySelectorAll('[data-lgx-init]').forEach((root) => {\n try {\n const opts = JSON.parse(root.dataset.lgxInit || '{}');\n new Crowdbox({ selector: `#${root.id} [data-lgx]`, ...opts });\n } catch (_) {}\n });\n });\n}\n\nexport default Crowdbox;\n"],"names":["Reg"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Crowdbox v1.0.0
|
|
3
|
+
* A modern, lightweight, extensible Crowdbox gallery plugin supporting images and video
|
|
4
|
+
* (c) 2026 Crowdbox
|
|
5
|
+
* Released under the MIT License.
|
|
6
|
+
*/
|
|
7
|
+
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Crowdbox=e()}(this,function(){"use strict";class t{constructor(){this._events=Object.create(null)}on(t,e){return this._events[t]||(this._events[t]=[]),this._events[t].push(e),this}once(t,e){const s=(...i)=>{e(...i),this.off(t,s)};return s._original=e,this.on(t,s)}off(t,e){return this._events[t]?(this._events[t]=this._events[t].filter(t=>t!==e&&t._original!==e),this):this}emit(t,...e){return!!this._events[t]&&([...this._events[t]].forEach(t=>t(...e)),!0)}removeAllListeners(t){return t?delete this._events[t]:this._events=Object.create(null),this}}const e=new Map,s=new Map,i={registerAdapter(t,s){e.set(t,s)},getAdapter:t=>e.get(t)??null,registerPlugin(t,e){s.set(t,e)},getPlugin:t=>s.get(t)??null,getPlugins:()=>[...s.values()]};function n(t,e={},...s){const i=document.createElement(t);for(const[t,s]of Object.entries(e))"class"===t?i.className=s:t.startsWith("data-")?i.dataset[t.slice(5).replace(/-([a-z])/g,(t,e)=>e.toUpperCase())]=s:"aria"===t||t.startsWith("aria-")?i.setAttribute(t,s):i[t]=s;return s.flat().forEach(t=>{null!=t&&i.appendChild("string"==typeof t?document.createTextNode(t):t)}),i}function o(t,...e){for(const s of e)for(const e of Object.keys(s??{}))s[e]&&"object"==typeof s[e]&&!Array.isArray(s[e])?(t[e]&&"object"==typeof t[e]||(t[e]={}),o(t[e],s[e])):t[e]=s[e];return t}function l(t){const e=t.match(/(?:youtube\.com\/(?:watch\?v=|embed\/|shorts\/)|youtu\.be\/)([a-zA-Z0-9_-]{11})/);return e?e[1]:null}function a(){return(document.exitFullscreen||document.webkitExitFullscreen||document.mozCancelFullScreen)?.call(document)}function r(){return!!(document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement)}function c(t,e,s){return Math.min(Math.max(t,e),s)}const d=!!function(){let t=!1;try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get(){t=!0}}))}catch(t){}return t}()&&{passive:!0},u={selector:"[data-lgx]",gallerySelector:null,loop:!0,keyboard:!0,touch:!0,drag:!0,zoom:!0,thumbnails:!0,captions:!0,counter:!0,fullscreen:!0,download:!1,share:!1,closeOnBackdrop:!0,closeOnEscape:!0,animationDuration:300,slideAnimationDuration:360,zoomStep:.5,zoomMax:4,zoomMin:1,lazyLoad:!0,preload:1,autoplay:!1,autoplayInterval:4e3,showAutoplay:!0,i18n:{close:"Close",prev:"Previous",next:"Next",zoomIn:"Zoom in",zoomOut:"Zoom out",fullscreen:"Fullscreen",download:"Download",share:"Share",autoplayStart:"Start slideshow",autoplayStop:"Stop slideshow",counter:"{current} of {total}"}};class h extends t{constructor(t={}){super(),this.opts=o({},u,t),this._items=[],this._index=0,this._open=!1,this._zoom=1,this._panX=0,this._panY=0,this._autoplayTimer=null,this._releaseFocusTrap=null,this._previousFocus=null,this._plugins=[],this._dom={},this._initPlugins(),this._bindTriggers()}open(t,e=0){return this._open&&this.close(),this._items=this._normalizeItems(t),this._index=c(e,0,this._items.length-1),this._open=!0,this._zoom=1,this._panX=0,this._panY=0,this._buildDOM(),this._attachKeyboard(),this._attachTouch(),this._renderSlide(this._index),this._preload(this._index),this._pluginHook("afterOpen"),this.emit("open",{index:this._index,item:this._items[this._index]}),this.opts.autoplay&&!this._isAutoplayBlockingMedia(this._items[this._index])&&this._startAutoplay(),this}close(){if(!this._open)return this;this._open=!1,this._stopAutoplay(),this._pauseCurrentMedia(),this._pluginHook("beforeClose");const t=this._dom.modal;return t&&(t.style.animation=`lgx-fade-out ${this.opts.animationDuration}ms ease forwards`,setTimeout(()=>{t.remove(),this._dom={}},this.opts.animationDuration)),this._detachKeyboard(),this._releaseFocusTrap&&(this._releaseFocusTrap(),this._releaseFocusTrap=null),this._previousFocus&&(this._previousFocus.focus(),this._previousFocus=null),document.body.style.overflow="",this._pluginHook("afterClose"),this.emit("close"),this}next(){const t=this._items.length;return t?(!this.opts.loop&&this._index>=t-1||this._goTo((this._index+1)%t,"next"),this):this}prev(){const t=this._items.length;return t&&(this.opts.loop||0!==this._index)?(this._goTo((this._index-1+t)%t,"prev"),this):this}goTo(t){const e=c(t,0,this._items.length-1);return this._goTo(e,e>this._index?"next":"prev"),this}zoomIn(){return this._applyZoom(this._zoom+this.opts.zoomStep),this}zoomOut(){return this._applyZoom(this._zoom-this.opts.zoomStep),this}resetZoom(){return this._applyZoom(1,!0),this}startAutoplay(){return this._startAutoplay(),this}stopAutoplay(){return this._stopAutoplay(),this}toggleAutoplay(){return this._autoplayTimer?this._stopAutoplay():this._startAutoplay(),this}destroy(){this.close(),this._detachTriggers(),this._plugins.forEach(t=>t.destroy?.()),this.removeAllListeners()}_normalizeItems(t){return Array.isArray(t)||(t=[t]),t.map(t=>{var e;return"string"==typeof t&&(t={src:t}),t.type||(t.type=(e=t.src)?/youtube\.com|youtu\.be/.test(e)?"youtube":/vimeo\.com/.test(e)?"vimeo":function(t){return/\.(mp4|webm|ogg|mov)(\?.*)?$/i.test(t)}(e)?"video":/\.(jpg|jpeg|png|gif|webp|avif|svg)(\?.*)?$/i.test(e)?"image":"iframe":"unknown"),t})}_initPlugins(){i.getPlugins().forEach(t=>{if(!1===this.opts[t.pluginName])return;const e="function"==typeof t?new t(this):t;"function"==typeof e.init&&e.init(this),this._plugins.push(e)})}_pluginHook(t,...e){this._plugins.forEach(s=>s[t]?.(...e))}_buildDOM(){this._previousFocus=document.activeElement,document.body.style.overflow="hidden";const t=n("div",{class:"lgx-modal",role:"dialog","aria-modal":"true","aria-label":"Media lightbox"});t.style.setProperty("--lgx-duration",`${this.opts.animationDuration}ms`),t.style.setProperty("--lgx-slide-duration",`${this.opts.slideAnimationDuration}ms`);const e=n("div",{class:"lgx-backdrop"});this.opts.closeOnBackdrop&&e.addEventListener("click",()=>this.close());const s=n("div",{class:"lgx-container"}),i=this._buildToolbar(),o=n("div",{class:"lgx-stage","aria-live":"polite"}),l=n("div",{class:"lgx-slide-wrapper"}),a=this._buildNavBtn("prev"),r=this._buildNavBtn("next");o.append(l,a,r);const c=n("div",{class:"lgx-caption","aria-live":"polite"});c.style.display="none";const d=n("div",{class:"lgx-counter","aria-live":"polite"}),u=n("div",{class:"lgx-spinner","aria-hidden":"true"},n("div",{class:"lgx-spinner__ring"}));s.append(i,o,c,d,u),t.append(e,s),document.body.appendChild(t),t.style.animation=`lgx-fade-in ${this.opts.animationDuration}ms ease forwards`;const h=i.querySelector(".lgx-btn--autoplay");this._dom={modal:t,backdrop:e,container:s,stage:o,slideWrapper:l,toolbar:i,caption:c,counter:d,spinner:u,btnPrev:a,btnNext:r,btnAutoplay:h},this._releaseFocusTrap=function(t){const e=t.querySelectorAll('a[href],button:not([disabled]),textarea,input,select,[tabindex]:not([tabindex="-1"])'),s=e[0],i=e[e.length-1];function n(t){"Tab"===t.key&&(t.shiftKey?document.activeElement===s&&(t.preventDefault(),i?.focus()):document.activeElement===i&&(t.preventDefault(),s?.focus()))}return t.addEventListener("keydown",n),()=>t.removeEventListener("keydown",n)}(t),s.setAttribute("tabindex","-1"),s.focus(),this._pluginHook("afterBuildDOM")}_buildToolbar(){const t=n("div",{class:"lgx-toolbar",role:"toolbar","aria-label":"Gallery controls"}),e=n("button",{class:"lgx-btn lgx-btn--close",type:"button","aria-label":this.opts.i18n.close,title:this.opts.i18n.close},this._svgIcon("close"));e.addEventListener("click",()=>this.close());const s=n("button",{class:"lgx-btn lgx-btn--autoplay",type:"button","aria-label":this.opts.i18n.autoplayStart,title:this.opts.i18n.autoplayStart,"aria-pressed":"false"},this._svgIcon("play"));return s.addEventListener("click",()=>this.toggleAutoplay()),this.opts.showAutoplay&&t.appendChild(s),t.appendChild(e),this._dom.btnAutoplay=this.opts.showAutoplay?s:null,this._dom.btnClose=e,this._pluginHook("buildToolbar",t),t}_buildNavBtn(t){const e="prev"===t?this.opts.i18n.prev:this.opts.i18n.next,s=n("button",{class:`lgx-btn lgx-btn--nav lgx-btn--${t}`,type:"button","aria-label":e,title:e},this._svgIcon(t));return s.addEventListener("click",()=>"prev"===t?this.prev():this.next()),this._items.length<=1&&(s.style.display="none"),s}_renderSlide(t,e=null){const s=this._items[t];if(!s)return;this._pauseCurrentMedia();const i=this._resolveAdapter(s);if(!i)return;const n=i.render(s);n.dataset.lgxIndex=t;const o=this._dom.slideWrapper.querySelector(".lgx-slide--active");if(o&&e){const t="next"===e?"lgx-slide--out-left":"lgx-slide--out-right",s="next"===e?"lgx-slide--in-right":"lgx-slide--in-left";n.classList.add(s),this._dom.slideWrapper.appendChild(n),requestAnimationFrame(()=>{o.classList.remove("lgx-slide--active"),o.classList.add(t)});let i=!1;const l=()=>{i||(i=!0,o.remove(),n.classList.remove(s),n.classList.add("lgx-slide--active"))};o.addEventListener("animationend",l,{once:!0}),setTimeout(l,this.opts.slideAnimationDuration+100)}else this._dom.slideWrapper.innerHTML="",n.classList.add("lgx-slide--active"),this._dom.slideWrapper.appendChild(n);this._dom.currentSlide=n,this._index=t,this._zoom=1,this._panX=0,this._watchSlideLoaded(n),this._bindMediaAutoplayStop(n,s),this._autoplayTimer&&this._isAutoplayBlockingMedia(s)&&this._stopAutoplay(),this._panY=0,this._updateUI(),this._pluginHook("afterSlide",t,s),this.emit("slide",{index:t,item:s})}_goTo(t,e){this._renderSlide(t,e),this._preload(t)}_watchSlideLoaded(t){const e=this._dom.spinner;e&&(t.classList.contains("lgx-content--loaded")?e.style.display="none":(e.style.display="",this._spinnerObserver?.disconnect(),this._spinnerObserver=new MutationObserver(()=>{t.classList.contains("lgx-content--loaded")&&(e.style.display="none",this._spinnerObserver.disconnect())}),this._spinnerObserver.observe(t,{attributes:!0,attributeFilter:["class"]})))}_preload(t){if(!this.opts.lazyLoad)return;const e=this.opts.preload,s=this._items.length;for(let i=1;i<=e;i++)[(t+i)%s,(t-i+s)%s].forEach(t=>{const e=this._items[t];if("image"===e?.type&&!e._preloaded){(new Image).src=e.src,e._preloaded=!0}})}_resolveAdapter(t){const e=i.getAdapter(t.type);if(e)return e;const s=["image","video","youtube","vimeo","iframe"];for(const e of s){const s=i.getAdapter(e);if(s?.canHandle(t))return s}return null}_pauseCurrentMedia(){const t=this._dom.slideWrapper?.querySelector(".lgx-slide--active, .lgx-content");t?._pause&&t._pause(),t?.querySelectorAll("video").forEach(t=>t.pause())}_updateUI(){const{_index:t,_items:e,opts:s,_dom:i}=this,n=e.length;if(i.counter&&s.counter&&(i.counter.textContent=s.i18n.counter.replace("{current}",t+1).replace("{total}",n),i.counter.style.display=n>1?"":"none"),i.caption&&s.captions){const s=String(e[t]?.caption??"").trim();i.caption.innerHTML=s,i.caption.style.display=s?"":"none"}s.loop||(i.btnPrev&&(i.btnPrev.disabled=0===t),i.btnNext&&(i.btnNext.disabled=t===n-1));const o=n>1;i.btnPrev&&(i.btnPrev.style.display=o?"":"none"),i.btnNext&&(i.btnNext.style.display=o?"":"none"),i.btnAutoplay&&(i.btnAutoplay.style.display=o?"":"none"),this._updateAutoplayButton(),this._pluginHook("updateUI")}_updateAutoplayButton(){const t=this._dom.btnAutoplay;if(!t)return;const e=!!this._autoplayTimer,s=e?this.opts.i18n.autoplayStop:this.opts.i18n.autoplayStart;t.classList.toggle("lgx-btn--active",e),t.setAttribute("aria-pressed",e?"true":"false"),t.setAttribute("aria-label",s),t.title=s,t.innerHTML=this._svgIcon(e?"stop":"play").outerHTML}_applyZoom(t,e=!1){t=c(t,this.opts.zoomMin,this.opts.zoomMax),e&&(t=1,this._panX=0,this._panY=0),this._zoom=t;const s=this._dom.slideWrapper?.querySelector(".lgx-image");s&&(s.style.transform=`translate(${this._panX}px, ${this._panY}px) scale(${t})`,s.style.cursor=t>1?"move":"default",this._pluginHook("afterZoom",t),this.emit("zoom",{zoom:t}))}_attachKeyboard(){this.opts.keyboard&&(this._onKeydown=t=>{switch(t.key){case"ArrowRight":this.next();break;case"ArrowLeft":this.prev();break;case"Escape":this.opts.closeOnEscape&&this.close();break;case"f":case"F":this._pluginHook("toggleFullscreen");break;case"+":case"=":this.zoomIn();break;case"-":this.zoomOut();break;case"0":this.resetZoom()}},document.addEventListener("keydown",this._onKeydown))}_detachKeyboard(){this._onKeydown&&document.removeEventListener("keydown",this._onKeydown)}_attachTouch(){if(!this.opts.touch&&!this.opts.drag)return;const t=this._dom.stage;if(!t)return;let e,s,i,n,o=!1;const l=t=>{const l=t.touches?t.touches[0]:t;e=l.clientX,s=l.clientY,i=this._panX,n=this._panY,o=!0},a=t=>{if(!o)return;const l=t.touches?t.touches[0]:t,a=l.clientX-e,r=l.clientY-s;if(this._zoom>1){this._panX=i+a,this._panY=n+r;const e=this._dom.slideWrapper?.querySelector(".lgx-image");e&&(e.style.transform=`translate(${this._panX}px, ${this._panY}px) scale(${this._zoom})`),t.preventDefault()}},r=t=>{if(!o)return;o=!1;const s=(t.changedTouches?t.changedTouches[0]:t).clientX-e;1===this._zoom&&Math.abs(s)>50&&(s<0?this.next():this.prev())};let c=0;t.addEventListener("mousedown",l),t.addEventListener("mousemove",a),t.addEventListener("mouseup",r),t.addEventListener("touchstart",l,d),t.addEventListener("touchmove",a,{passive:!1}),t.addEventListener("touchend",r,d),t.addEventListener("click",t=>{const e=Date.now();e-c<300&&(1===this._zoom?this._applyZoom(2):this.resetZoom(),t.preventDefault()),c=e});let u=0,h=1;t.addEventListener("touchstart",t=>{2===t.touches.length&&(u=Math.hypot(t.touches[0].clientX-t.touches[1].clientX,t.touches[0].clientY-t.touches[1].clientY),h=this._zoom)},d),t.addEventListener("touchmove",t=>{if(2===t.touches.length){const e=Math.hypot(t.touches[0].clientX-t.touches[1].clientX,t.touches[0].clientY-t.touches[1].clientY);this._applyZoom(h*(e/u)),t.preventDefault()}},{passive:!1})}_startAutoplay(){this._isAutoplayBlockingMedia(this._items[this._index])?this._stopAutoplay():(this._stopAutoplay(),this._autoplayTimer=setInterval(()=>this.next(),this.opts.autoplayInterval),this._updateAutoplayButton(),this.emit("autoplay:start"))}_stopAutoplay(){this._autoplayTimer&&(clearInterval(this._autoplayTimer),this._autoplayTimer=null,this._updateAutoplayButton(),this.emit("autoplay:stop"))}_bindMediaAutoplayStop(t,e){if(!this._isAutoplayBlockingMedia(e))return;const s=()=>this._stopAutoplay();t.addEventListener("lgx:media-play",s,{once:!0}),t.querySelectorAll("video").forEach(t=>{t.addEventListener("play",s,{once:!0})})}_isAutoplayBlockingMedia(t){return["video","youtube","vimeo","iframe"].includes(t?.type)}_bindTriggers(){if("undefined"==typeof document)return;if(!this.opts.selector)return;const t=t=>{const e=t.target.closest(this.opts.selector);if(!e)return;t.preventDefault();const s=e.dataset.lgxGallery||e.closest("[data-lgx-gallery]")?.dataset.lgxGallery;let i;i=s?[...document.querySelectorAll(`[data-lgx-gallery="${s}"] ${this.opts.selector}, ${this.opts.selector}[data-lgx-gallery="${s}"]`)]:[e];const n=i.map(t=>this._itemFromElement(t)),o=i.indexOf(e);this.open(n,Math.max(0,o))};document.addEventListener("click",t),this._triggerHandler=t}_detachTriggers(){this._triggerHandler&&document.removeEventListener("click",this._triggerHandler)}_itemFromElement(t){const e=t.dataset,s=t.matches("img")?t:t.querySelector("img"),i=t.querySelector("[data-lgx-caption], figcaption, .caption, .lgx-caption-text"),n=e.lgxCaption||s?.dataset?.lgxCaption||i?.innerHTML||t.getAttribute("aria-label")||t.title||s?.title||s?.alt||"";return{src:e.lgxSrc||t.href||t.src||"",type:e.lgxType||void 0,thumb:e.lgxThumb||s?.src||null,caption:n,alt:e.lgxAlt||s?.alt||"",download:e.lgxDownload||null,autoplay:void 0!==e.lgxAutoplay,poster:e.lgxPoster||null}}_svgIcon(t){const e=document.createElement("span");return e.className="lgx-icon",e.setAttribute("aria-hidden","true"),e.innerHTML={close:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>',prev:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="15,18 9,12 15,6"/></svg>',next:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="9,18 15,12 9,6"/></svg>',play:'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M8 5.14v13.72a1 1 0 0 0 1.52.86l11.43-6.86a1 1 0 0 0 0-1.72L9.52 4.28A1 1 0 0 0 8 5.14z"/></svg>',stop:'<svg viewBox="0 0 24 24" fill="currentColor"><rect x="7" y="7" width="10" height="10" rx="1.5"/></svg>',zoomin:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/><line x1="11" y1="8" x2="11" y2="14"/><line x1="8" y1="11" x2="14" y2="11"/></svg>',zoomout:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/><line x1="8" y1="11" x2="14" y2="11"/></svg>',fullscreen:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="15,3 21,3 21,9"/><polyline points="9,21 3,21 3,15"/><line x1="21" y1="3" x2="14" y2="10"/><line x1="3" y1="21" x2="10" y2="14"/></svg>',download:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><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" y1="15" x2="12" y2="3"/></svg>',share:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><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" y1="13.51" x2="15.42" y2="17.49"/><line x1="15.41" y1="6.51" x2="8.59" y2="10.49"/></svg>'}[t]??"",e}}const p=["#111116","#13131a","#0f0f14","#161620","#121218","#101015","#141419","#0e0e13"];const m={type:"image",canHandle:t=>"image"===t.type||/\.(jpg|jpeg|png|gif|webp|avif|svg)(\?.*)?$/i.test(t.src??""),render(t){const e=document.createElement("div");e.className="lgx-content lgx-content--image";const s=document.createElement("img");s.className="lgx-image",s.alt=t.alt??t.caption??"",s.draggable=!1,t.thumb&&(s.src=t.thumb,s.style.filter="blur(8px)");const i=Date.now(),n=new Image;return n.onload=()=>{s.src=n.src,s.style.filter="",s.style.transition="filter 0.3s",e.classList.add("lgx-content--loaded");if(Date.now()-i>40){const t=function(){const t=document.createElement("div");t.className="lgx-mosaic",t.style.gridTemplateColumns="repeat(8, 1fr)",t.style.gridTemplateRows="repeat(7, 1fr)";for(let e=0;e<7;e++)for(let s=0;s<8;s++){const i=document.createElement("div");i.className="lgx-mosaic__tile";const n=(e+s)/13,o=Math.round(380*n);i.style.setProperty("--lgx-tile-delay",`${o}ms`),i.style.background=p[(8*e+s)%p.length],t.appendChild(i)}return t}();e.appendChild(t);setTimeout(()=>t.remove(),860)}},n.onerror=()=>e.classList.add("lgx-content--error"),n.src=t.src,e.appendChild(s),e},getThumbnail:t=>t.thumb??t.src},g={type:"video",canHandle:t=>"video"===t.type||/\.(mp4|webm|ogg|mov)(\?.*)?$/i.test(t.src??""),render(t){const e=document.createElement("div");e.className="lgx-content lgx-content--video";const s=document.createElement("video");s.className="lgx-video",s.controls=!0,s.playsInline=!0,s.preload="metadata",t.autoplay&&(s.autoplay=!0),t.loop&&(s.loop=!0),t.muted&&(s.muted=!0),t.poster&&(s.poster=t.poster),s.addEventListener("play",()=>{e.dispatchEvent(new CustomEvent("lgx:media-play",{bubbles:!0}))});return(Array.isArray(t.src)?t.src:[t.src]).forEach(t=>{const e="string"==typeof t?{src:t}:t,i=document.createElement("source");i.src=e.src,e.type&&(i.type=e.type),s.appendChild(i)}),e.appendChild(s),e.classList.add("lgx-content--loaded"),e._pause=()=>s.pause(),e},getThumbnail:t=>t.thumb??t.poster??null},y={type:"youtube",canHandle:t=>"youtube"===t.type||/youtube\.com|youtu\.be/.test(t.src??""),render(t){const e=document.createElement("div");e.className="lgx-content lgx-content--youtube lgx-content--iframe";const s=l(t.src);if(!s)return e.textContent="Invalid YouTube URL",e;const i=new URLSearchParams({autoplay:t.autoplay?"1":"0",rel:"0",modestbranding:"1",enablejsapi:"1",...t.start?{start:t.start}:{}}),n=document.createElement("iframe");return n.className="lgx-iframe",n.src=`https://www.youtube.com/embed/${s}?${i}`,n.allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",n.allowFullscreen=!0,n.setAttribute("loading","lazy"),n.title=t.caption??"YouTube video",n.addEventListener("load",()=>e.classList.add("lgx-content--loaded")),e.appendChild(n),e._pause=()=>{try{n.contentWindow?.postMessage('{"event":"command","func":"pauseVideo","args":""}',"*")}catch(t){}},e},getThumbnail(t){if(t.thumb)return t.thumb;const e=l(t.src);return e?`https://img.youtube.com/vi/${e}/mqdefault.jpg`:null}},_={type:"vimeo",canHandle:t=>"vimeo"===t.type||/vimeo\.com/.test(t.src??""),render(t){const e=document.createElement("div");e.className="lgx-content lgx-content--vimeo lgx-content--iframe";const s=function(t){const e=t.match(/vimeo\.com\/(?:video\/)?(\d+)/);return e?e[1]:null}(t.src);if(!s)return e.textContent="Invalid Vimeo URL",e;const i=new URLSearchParams({autoplay:t.autoplay?"1":"0",title:"0",byline:"0",portrait:"0",api:"1"}),n=document.createElement("iframe");return n.className="lgx-iframe",n.src=`https://player.vimeo.com/video/${s}?${i}`,n.allow="autoplay; fullscreen; picture-in-picture",n.allowFullscreen=!0,n.setAttribute("loading","lazy"),n.title=t.caption??"Vimeo video",n.addEventListener("load",()=>e.classList.add("lgx-content--loaded")),e.appendChild(n),e._pause=()=>{try{n.contentWindow?.postMessage('{"method":"pause"}',"*")}catch(t){}},e},getThumbnail:t=>t.thumb??null},b={type:"iframe",canHandle:t=>"iframe"===t.type,render(t){const e=document.createElement("div");e.className="lgx-content lgx-content--iframe";const s=document.createElement("iframe");return s.className="lgx-iframe",s.src=t.src,s.allowFullscreen=!0,s.setAttribute("loading","lazy"),s.title=t.caption??"Embedded content",t.iframeWidth&&(s.style.width=t.iframeWidth),t.iframeHeight&&(s.style.height=t.iframeHeight),s.addEventListener("load",()=>e.classList.add("lgx-content--loaded")),e.appendChild(s),e},getThumbnail:t=>t.thumb??null};return i.registerAdapter("image",m),i.registerAdapter("video",g),i.registerAdapter("youtube",y),i.registerAdapter("vimeo",_),i.registerAdapter("iframe",b),i.registerPlugin("zoom",class{static pluginName="zoom";constructor(t){this.gallery=t,this._btnIn=null,this._btnOut=null}init(t){this.gallery=t}buildToolbar(t){if(!this.gallery.opts.zoom)return;this._btnIn=this._makeBtn("zoomin",this.gallery.opts.i18n.zoomIn,()=>this.gallery.zoomIn()),this._btnOut=this._makeBtn("zoomout",this.gallery.opts.i18n.zoomOut,()=>this.gallery.zoomOut());const e=t.querySelector(".lgx-btn--close");t.insertBefore(this._btnOut,e),t.insertBefore(this._btnIn,this._btnOut)}afterSlide(t,e){const s="image"===e.type;this._btnIn&&(this._btnIn.style.display=s?"":"none"),this._btnOut&&(this._btnOut.style.display=s?"":"none")}afterZoom(t){const e=this.gallery.opts.zoomMin,s=this.gallery.opts.zoomMax;this._btnIn&&(this._btnIn.disabled=t>=s),this._btnOut&&(this._btnOut.disabled=t<=e)}_makeBtn(t,e,s){const i=document.createElement("button");return i.type="button",i.className=`lgx-btn lgx-btn--${t}`,i.setAttribute("aria-label",e),i.title=e,i.innerHTML=this.gallery._svgIcon(t).outerHTML,i.addEventListener("click",s),i}destroy(){}}),i.registerPlugin("thumbnails",class{static pluginName="thumbnails";constructor(t){this.gallery=t,this._strip=null,this._thumbEls=[],this._observer=null}init(t){this.gallery=t}afterBuildDOM(){this.gallery.opts.thumbnails&&(this.gallery._items.length<2||this._buildStrip())}afterSlide(t){this._activate(t)}_buildStrip(){const t=this.gallery,e=document.createElement("div");e.className="lgx-thumbs",e.setAttribute("role","tablist"),e.setAttribute("aria-label","Gallery thumbnails"),this._thumbEls=t._items.map((e,s)=>{const i=document.createElement("button");i.type="button",i.className="lgx-thumb",i.setAttribute("role","tab"),i.setAttribute("aria-label",`Slide ${s+1}${e.caption?": "+e.caption:""}`),i.setAttribute("aria-selected",s===t._index?"true":"false"),i.dataset.lgxThumbIndex=s;const n=t._resolveAdapter(e),o=n?.getThumbnail(e);if(o){const t=document.createElement("img");t.alt="",t.loading="lazy","IntersectionObserver"in window?(t.dataset.src=o,this._observe(t)):t.src=o,i.appendChild(t)}else i.appendChild(document.createTextNode(s+1)),i.classList.add("lgx-thumb--no-image");return i.addEventListener("click",()=>t.goTo(s)),i}),this._thumbEls.forEach(t=>e.appendChild(t)),t._dom.container.appendChild(e),t._dom.thumbStrip=e,this._strip=e,this._activate(t._index)}_activate(t){this._thumbEls.forEach((e,s)=>{const i=s===t;e.classList.toggle("lgx-thumb--active",i),e.setAttribute("aria-selected",i?"true":"false")});const e=this._thumbEls[t];e&&this._strip&&e.scrollIntoView({behavior:"smooth",block:"nearest",inline:"center"})}_observe(t){this._observer||(this._observer=new IntersectionObserver(t=>{t.forEach(t=>{t.isIntersecting&&(t.target.src=t.target.dataset.src,this._observer.unobserve(t.target))})},{rootMargin:"100px"})),this._observer.observe(t)}destroy(){this._observer?.disconnect()}}),i.registerPlugin("fullscreen",class{static pluginName="fullscreen";constructor(t){this.gallery=t,this._btn=null,this._onChange=null}init(t){this.gallery=t}buildToolbar(t){if(!this.gallery.opts.fullscreen)return;this._btn=document.createElement("button"),this._btn.type="button",this._btn.className="lgx-btn lgx-btn--fullscreen",this._btn.setAttribute("aria-label",this.gallery.opts.i18n.fullscreen),this._btn.title=this.gallery.opts.i18n.fullscreen,this._btn.innerHTML=this.gallery._svgIcon("fullscreen").outerHTML,this._btn.addEventListener("click",()=>this.toggle());const e=t.querySelector(".lgx-btn--close");t.insertBefore(this._btn,e),this._onChange=()=>this._updateBtn(),document.addEventListener("fullscreenchange",this._onChange),document.addEventListener("webkitfullscreenchange",this._onChange)}toggle(){var t;r()?a():(t=this.gallery._dom.modal,(t.requestFullscreen||t.webkitRequestFullscreen||t.mozRequestFullScreen)?.call(t))}toggleFullscreen(){this.toggle()}_updateBtn(){if(!this._btn)return;const t=r();this._btn.setAttribute("aria-pressed",t?"true":"false"),this.gallery._dom.modal?.classList.toggle("lgx-modal--fullscreen",t)}afterClose(){r()&&a(),this._onChange&&(document.removeEventListener("fullscreenchange",this._onChange),document.removeEventListener("webkitfullscreenchange",this._onChange))}destroy(){this.afterClose()}}),i.registerPlugin("download",class{static pluginName="download";constructor(t){this.gallery=t,this._btn=null}init(t){this.gallery=t}buildToolbar(t){if(!this.gallery.opts.download)return;this._btn=document.createElement("button"),this._btn.type="button",this._btn.className="lgx-btn lgx-btn--download",this._btn.setAttribute("aria-label",this.gallery.opts.i18n.download),this._btn.title=this.gallery.opts.i18n.download,this._btn.innerHTML=this.gallery._svgIcon("download").outerHTML,this._btn.addEventListener("click",()=>this._download());const e=t.querySelector(".lgx-btn--close");t.insertBefore(this._btn,e)}afterSlide(t,e){if(!this._btn)return;const s=["image","video"].includes(e.type);this._btn.style.display=s?"":"none"}_download(){const t=this.gallery._items[this.gallery._index];if(!t)return;const e=t.download||t.src,s=document.createElement("a");s.href=e,s.download=t.downloadName||e.split("/").pop()||"download",s.style.display="none",document.body.appendChild(s),s.click(),document.body.removeChild(s),this.gallery.emit("download",{item:t})}destroy(){}}),i.registerPlugin("share",class{static pluginName="share";constructor(t){this.gallery=t,this._btn=null}init(t){this.gallery=t}buildToolbar(t){if(!this.gallery.opts.share)return;this._btn=document.createElement("button"),this._btn.type="button",this._btn.className="lgx-btn lgx-btn--share",this._btn.setAttribute("aria-label",this.gallery.opts.i18n.share),this._btn.title=this.gallery.opts.i18n.share,this._btn.innerHTML=this.gallery._svgIcon("share").outerHTML,this._btn.addEventListener("click",()=>this._share());const e=t.querySelector(".lgx-btn--close");t.insertBefore(this._btn,e)}async _share(){const t=this.gallery._items[this.gallery._index];if(!t)return;const e={title:t.caption||document.title,url:t.shareUrl||t.src};if(navigator.share)try{return await navigator.share(e),void this.gallery.emit("share",{item:t,method:"native"})}catch(t){}navigator.clipboard&&(await navigator.clipboard.writeText(e.url),this._showToast("Link copied!"),this.gallery.emit("share",{item:t,method:"clipboard"}))}_showToast(t){const e=document.createElement("div");e.className="lgx-toast",e.textContent=t,this.gallery._dom.modal?.appendChild(e),setTimeout(()=>e.remove(),2500)}destroy(){}}),"undefined"!=typeof document&&document.addEventListener("DOMContentLoaded",()=>{document.querySelectorAll("[data-lgx-init]").forEach(t=>{try{const e=JSON.parse(t.dataset.lgxInit||"{}");new h({selector:`#${t.id} [data-lgx]`,...e})}catch(t){}})}),h});
|
|
8
|
+
//# sourceMappingURL=crowdbox.umd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crowdbox.umd.js","sources":["../src/core/EventEmitter.js","../src/core/Registry.js","../src/core/utils.js","../src/core/Crowdbox.js","../src/adapters/image.js","../src/adapters/video.js","../src/adapters/youtube.js","../src/adapters/vimeo.js","../src/adapters/iframe.js","../src/index.js","../src/plugins/zoom/zoom.js","../src/plugins/thumbs/thumbs.js","../src/plugins/fullscreen/fullscreen.js","../src/plugins/download/download.js","../src/plugins/share/share.js"],"sourcesContent":["export class EventEmitter {\n constructor() {\n this._events = Object.create(null);\n }\n\n on(event, listener) {\n if (!this._events[event]) this._events[event] = [];\n this._events[event].push(listener);\n return this;\n }\n\n once(event, listener) {\n const wrapper = (...args) => {\n listener(...args);\n this.off(event, wrapper);\n };\n wrapper._original = listener;\n return this.on(event, wrapper);\n }\n\n off(event, listener) {\n if (!this._events[event]) return this;\n this._events[event] = this._events[event].filter(\n (l) => l !== listener && l._original !== listener\n );\n return this;\n }\n\n emit(event, ...args) {\n if (!this._events[event]) return false;\n [...this._events[event]].forEach((l) => l(...args));\n return true;\n }\n\n removeAllListeners(event) {\n if (event) {\n delete this._events[event];\n } else {\n this._events = Object.create(null);\n }\n return this;\n }\n}\n","// Central registry for media adapters and plugins so the host app\n// can swap or extend them without forking the library.\nconst adapters = new Map();\nconst plugins = new Map();\n\nexport const Registry = {\n registerAdapter(type, adapter) {\n adapters.set(type, adapter);\n },\n\n getAdapter(type) {\n return adapters.get(type) ?? null;\n },\n\n registerPlugin(name, plugin) {\n plugins.set(name, plugin);\n },\n\n getPlugin(name) {\n return plugins.get(name) ?? null;\n },\n\n getPlugins() {\n return [...plugins.values()];\n },\n};\n","export function createElement(tag, attrs = {}, ...children) {\n const el = document.createElement(tag);\n for (const [k, v] of Object.entries(attrs)) {\n if (k === 'class') el.className = v;\n else if (k.startsWith('data-')) el.dataset[k.slice(5).replace(/-([a-z])/g, (_, c) => c.toUpperCase())] = v;\n else if (k === 'aria' || k.startsWith('aria-')) el.setAttribute(k, v);\n else el[k] = v;\n }\n children.flat().forEach((child) => {\n if (child == null) return;\n el.appendChild(typeof child === 'string' ? document.createTextNode(child) : child);\n });\n return el;\n}\n\nexport function mergeDeep(target, ...sources) {\n for (const src of sources) {\n for (const key of Object.keys(src ?? {})) {\n if (src[key] && typeof src[key] === 'object' && !Array.isArray(src[key])) {\n if (!target[key] || typeof target[key] !== 'object') target[key] = {};\n mergeDeep(target[key], src[key]);\n } else {\n target[key] = src[key];\n }\n }\n }\n return target;\n}\n\nexport function getYouTubeId(url) {\n const m = url.match(/(?:youtube\\.com\\/(?:watch\\?v=|embed\\/|shorts\\/)|youtu\\.be\\/)([a-zA-Z0-9_-]{11})/);\n return m ? m[1] : null;\n}\n\nexport function getVimeoId(url) {\n const m = url.match(/vimeo\\.com\\/(?:video\\/)?(\\d+)/);\n return m ? m[1] : null;\n}\n\nexport function isVideoUrl(url) {\n return /\\.(mp4|webm|ogg|mov)(\\?.*)?$/i.test(url);\n}\n\nexport function isYouTubeUrl(url) {\n return /youtube\\.com|youtu\\.be/.test(url);\n}\n\nexport function isVimeoUrl(url) {\n return /vimeo\\.com/.test(url);\n}\n\nexport function detectMediaType(src) {\n if (!src) return 'unknown';\n if (isYouTubeUrl(src)) return 'youtube';\n if (isVimeoUrl(src)) return 'vimeo';\n if (isVideoUrl(src)) return 'video';\n if (/\\.(jpg|jpeg|png|gif|webp|avif|svg)(\\?.*)?$/i.test(src)) return 'image';\n return 'iframe';\n}\n\nexport function trapFocus(container) {\n const focusable = container.querySelectorAll(\n 'a[href],button:not([disabled]),textarea,input,select,[tabindex]:not([tabindex=\"-1\"])'\n );\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n function handler(e) {\n if (e.key !== 'Tab') return;\n if (e.shiftKey) {\n if (document.activeElement === first) { e.preventDefault(); last?.focus(); }\n } else {\n if (document.activeElement === last) { e.preventDefault(); first?.focus(); }\n }\n }\n container.addEventListener('keydown', handler);\n return () => container.removeEventListener('keydown', handler);\n}\n\nexport function requestFullscreen(el) {\n return (el.requestFullscreen || el.webkitRequestFullscreen || el.mozRequestFullScreen)?.call(el);\n}\n\nexport function exitFullscreen() {\n return (document.exitFullscreen || document.webkitExitFullscreen || document.mozCancelFullScreen)?.call(document);\n}\n\nexport function isFullscreen() {\n return !!(document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement);\n}\n\nexport function clamp(value, min, max) {\n return Math.min(Math.max(value, min), max);\n}\n\nexport function noop() {}\n\nexport function debounce(fn, ms) {\n let t;\n return (...args) => { clearTimeout(t); t = setTimeout(() => fn(...args), ms); };\n}\n\nexport function isTouchDevice() {\n return 'ontouchstart' in window || navigator.maxTouchPoints > 0;\n}\n\nexport function supportsPassive() {\n let ok = false;\n try {\n window.addEventListener('test', null, Object.defineProperty({}, 'passive', { get() { ok = true; } }));\n } catch (_) {}\n return ok;\n}\n\nexport const passiveOpt = supportsPassive() ? { passive: true } : false;\n","import { EventEmitter } from './EventEmitter.js';\nimport { Registry } from './Registry.js';\nimport {\n createElement,\n mergeDeep,\n detectMediaType,\n trapFocus,\n clamp,\n passiveOpt,\n} from './utils.js';\n\nconst DEFAULTS = {\n selector: '[data-lgx]',\n gallerySelector: null, // group items by this attr value\n loop: true,\n keyboard: true,\n touch: true,\n drag: true,\n zoom: true,\n thumbnails: true,\n captions: true,\n counter: true,\n fullscreen: true,\n download: false,\n share: false,\n closeOnBackdrop: true,\n closeOnEscape: true,\n animationDuration: 300,\n slideAnimationDuration: 360,\n zoomStep: 0.5,\n zoomMax: 4,\n zoomMin: 1,\n lazyLoad: true,\n preload: 1, // preload N slides ahead/behind\n autoplay: false,\n autoplayInterval: 4000,\n showAutoplay: true, // show/hide autoplay button in toolbar\n i18n: {\n close: 'Close',\n prev: 'Previous',\n next: 'Next',\n zoomIn: 'Zoom in',\n zoomOut: 'Zoom out',\n fullscreen: 'Fullscreen',\n download: 'Download',\n share: 'Share',\n autoplayStart: 'Start slideshow',\n autoplayStop: 'Stop slideshow',\n counter: '{current} of {total}',\n },\n};\n\nexport class Crowdbox extends EventEmitter {\n constructor(options = {}) {\n super();\n this.opts = mergeDeep({}, DEFAULTS, options);\n this._items = [];\n this._index = 0;\n this._open = false;\n this._zoom = 1;\n this._panX = 0;\n this._panY = 0;\n this._autoplayTimer = null;\n this._releaseFocusTrap = null;\n this._previousFocus = null;\n this._plugins = [];\n this._dom = {};\n\n this._initPlugins();\n this._bindTriggers();\n }\n\n // ─── Public API ──────────────────────────────────────────────────────────────\n\n open(items, startIndex = 0) {\n if (this._open) this.close();\n this._items = this._normalizeItems(items);\n this._index = clamp(startIndex, 0, this._items.length - 1);\n this._open = true;\n this._zoom = 1;\n this._panX = 0;\n this._panY = 0;\n\n this._buildDOM();\n this._attachKeyboard();\n this._attachTouch();\n this._renderSlide(this._index);\n this._preload(this._index);\n this._pluginHook('afterOpen');\n this.emit('open', { index: this._index, item: this._items[this._index] });\n\n if (this.opts.autoplay && !this._isAutoplayBlockingMedia(this._items[this._index])) this._startAutoplay();\n return this;\n }\n\n close() {\n if (!this._open) return this;\n this._open = false;\n this._stopAutoplay();\n this._pauseCurrentMedia();\n this._pluginHook('beforeClose');\n\n const modal = this._dom.modal;\n if (modal) {\n modal.style.animation = `lgx-fade-out ${this.opts.animationDuration}ms ease forwards`;\n setTimeout(() => { modal.remove(); this._dom = {}; }, this.opts.animationDuration);\n }\n\n this._detachKeyboard();\n if (this._releaseFocusTrap) { this._releaseFocusTrap(); this._releaseFocusTrap = null; }\n if (this._previousFocus) { this._previousFocus.focus(); this._previousFocus = null; }\n document.body.style.overflow = '';\n\n this._pluginHook('afterClose');\n this.emit('close');\n return this;\n }\n\n next() {\n const total = this._items.length;\n if (!total) return this;\n if (!this.opts.loop && this._index >= total - 1) return this;\n this._goTo((this._index + 1) % total, 'next');\n return this;\n }\n\n prev() {\n const total = this._items.length;\n if (!total) return this;\n if (!this.opts.loop && this._index === 0) return this;\n this._goTo((this._index - 1 + total) % total, 'prev');\n return this;\n }\n\n goTo(index) {\n const i = clamp(index, 0, this._items.length - 1);\n this._goTo(i, i > this._index ? 'next' : 'prev');\n return this;\n }\n\n zoomIn() {\n this._applyZoom(this._zoom + this.opts.zoomStep);\n return this;\n }\n\n zoomOut() {\n this._applyZoom(this._zoom - this.opts.zoomStep);\n return this;\n }\n\n resetZoom() {\n this._applyZoom(1, true);\n return this;\n }\n\n startAutoplay() { this._startAutoplay(); return this; }\n stopAutoplay() { this._stopAutoplay(); return this; }\n toggleAutoplay() {\n this._autoplayTimer ? this._stopAutoplay() : this._startAutoplay();\n return this;\n }\n\n destroy() {\n this.close();\n this._detachTriggers();\n this._plugins.forEach((p) => p.destroy?.());\n this.removeAllListeners();\n }\n\n // ─── Internal ─────────────────────────────────────────────────────────────────\n\n _normalizeItems(items) {\n if (!Array.isArray(items)) items = [items];\n return items.map((item) => {\n if (typeof item === 'string') item = { src: item };\n if (!item.type) item.type = detectMediaType(item.src);\n return item;\n });\n }\n\n _initPlugins() {\n const pluginDefs = Registry.getPlugins();\n pluginDefs.forEach((Def) => {\n if (this.opts[Def.pluginName] === false) return;\n const inst = typeof Def === 'function' ? new Def(this) : Def;\n if (typeof inst.init === 'function') inst.init(this);\n this._plugins.push(inst);\n });\n }\n\n _pluginHook(hook, ...args) {\n this._plugins.forEach((p) => p[hook]?.(...args));\n }\n\n // ─── DOM ──────────────────────────────────────────────────────────────────────\n\n _buildDOM() {\n this._previousFocus = document.activeElement;\n document.body.style.overflow = 'hidden';\n\n const modal = createElement('div', {\n class: 'lgx-modal',\n role: 'dialog',\n 'aria-modal': 'true',\n 'aria-label': 'Media lightbox',\n });\n modal.style.setProperty('--lgx-duration', `${this.opts.animationDuration}ms`);\n modal.style.setProperty('--lgx-slide-duration', `${this.opts.slideAnimationDuration}ms`);\n\n const backdrop = createElement('div', { class: 'lgx-backdrop' });\n if (this.opts.closeOnBackdrop) {\n backdrop.addEventListener('click', () => this.close());\n }\n\n const container = createElement('div', { class: 'lgx-container' });\n\n // Toolbar\n const toolbar = this._buildToolbar();\n\n // Stage — nav buttons live here so top:50% is relative to the image area,\n // not the full container (which includes caption + thumbnail strip).\n const stage = createElement('div', { class: 'lgx-stage', 'aria-live': 'polite' });\n const slideWrapper = createElement('div', { class: 'lgx-slide-wrapper' });\n const btnPrev = this._buildNavBtn('prev');\n const btnNext = this._buildNavBtn('next');\n stage.append(slideWrapper, btnPrev, btnNext);\n\n // Caption — normal flex child so it sits between stage and thumbnail strip\n // without z-index fights. Hidden via display:none when empty.\n const caption = createElement('div', { class: 'lgx-caption', 'aria-live': 'polite' });\n caption.style.display = 'none';\n\n // Counter (absolute, overlays top of stage)\n const counter = createElement('div', { class: 'lgx-counter', 'aria-live': 'polite' });\n\n // Loading spinner\n const spinner = createElement('div', { class: 'lgx-spinner', 'aria-hidden': 'true' },\n createElement('div', { class: 'lgx-spinner__ring' })\n );\n\n // Order matters for flex layout: stage grows, caption sits below it, thumbs at bottom\n container.append(toolbar, stage, caption, counter, spinner);\n\n modal.append(backdrop, container);\n document.body.appendChild(modal);\n\n // Animate in\n modal.style.animation = `lgx-fade-in ${this.opts.animationDuration}ms ease forwards`;\n\n const btnAutoplay = toolbar.querySelector('.lgx-btn--autoplay');\n this._dom = { modal, backdrop, container, stage, slideWrapper, toolbar, caption, counter, spinner, btnPrev, btnNext, btnAutoplay };\n this._releaseFocusTrap = trapFocus(modal);\n\n // Focus the container for keyboard events\n container.setAttribute('tabindex', '-1');\n container.focus();\n\n this._pluginHook('afterBuildDOM');\n }\n\n _buildToolbar() {\n const toolbar = createElement('div', { class: 'lgx-toolbar', role: 'toolbar', 'aria-label': 'Gallery controls' });\n\n const close = createElement('button', {\n class: 'lgx-btn lgx-btn--close',\n type: 'button',\n 'aria-label': this.opts.i18n.close,\n title: this.opts.i18n.close,\n }, this._svgIcon('close'));\n close.addEventListener('click', () => this.close());\n\n const autoplay = createElement('button', {\n class: 'lgx-btn lgx-btn--autoplay',\n type: 'button',\n 'aria-label': this.opts.i18n.autoplayStart,\n title: this.opts.i18n.autoplayStart,\n 'aria-pressed': 'false',\n }, this._svgIcon('play'));\n autoplay.addEventListener('click', () => this.toggleAutoplay());\n\n if (this.opts.showAutoplay) toolbar.appendChild(autoplay);\n toolbar.appendChild(close);\n this._dom.btnAutoplay = this.opts.showAutoplay ? autoplay : null;\n this._dom.btnClose = close;\n this._pluginHook('buildToolbar', toolbar);\n\n return toolbar;\n }\n\n _buildNavBtn(dir) {\n const label = dir === 'prev' ? this.opts.i18n.prev : this.opts.i18n.next;\n const btn = createElement('button', {\n class: `lgx-btn lgx-btn--nav lgx-btn--${dir}`,\n type: 'button',\n 'aria-label': label,\n title: label,\n }, this._svgIcon(dir));\n\n btn.addEventListener('click', () => (dir === 'prev' ? this.prev() : this.next()));\n\n if (this._items.length <= 1) btn.style.display = 'none';\n return btn;\n }\n\n // ─── Slide Rendering ──────────────────────────────────────────────────────────\n\n _renderSlide(index, direction = null) {\n const item = this._items[index];\n if (!item) return;\n\n this._pauseCurrentMedia();\n\n const adapter = this._resolveAdapter(item);\n if (!adapter) return;\n\n const slide = adapter.render(item);\n slide.dataset.lgxIndex = index;\n\n // Animate out old slide\n const old = this._dom.slideWrapper.querySelector('.lgx-slide--active');\n\n if (old && direction) {\n const outClass = direction === 'next' ? 'lgx-slide--out-left' : 'lgx-slide--out-right';\n const inClass = direction === 'next' ? 'lgx-slide--in-right' : 'lgx-slide--in-left';\n\n // Add inClass BEFORE appending so fill-mode \"both\" starts the slide\n // at opacity:0 — prevents the 1-frame flash at its final visible position.\n slide.classList.add(inClass);\n this._dom.slideWrapper.appendChild(slide);\n\n // Defer the outgoing animation by one rAF so the browser has committed\n // the new slide's start state before anything moves.\n requestAnimationFrame(() => {\n old.classList.remove('lgx-slide--active');\n old.classList.add(outClass);\n });\n\n // Use animationend for frame-accurate cleanup; setTimeout is the fallback\n // in case animationend never fires (e.g. display:none mid-animation).\n let done = false;\n const cleanup = () => {\n if (done) return;\n done = true;\n old.remove();\n slide.classList.remove(inClass);\n slide.classList.add('lgx-slide--active');\n };\n\n old.addEventListener('animationend', cleanup, { once: true });\n setTimeout(cleanup, this.opts.slideAnimationDuration + 100);\n } else {\n this._dom.slideWrapper.innerHTML = '';\n slide.classList.add('lgx-slide--active');\n this._dom.slideWrapper.appendChild(slide);\n }\n\n this._dom.currentSlide = slide;\n this._index = index;\n this._zoom = 1;\n this._panX = 0;\n\n // Show spinner, hide once slide reports loaded (JS fallback for browsers\n // without :has() support — CSS handles it in modern browsers).\n this._watchSlideLoaded(slide);\n this._bindMediaAutoplayStop(slide, item);\n if (this._autoplayTimer && this._isAutoplayBlockingMedia(item)) this._stopAutoplay();\n this._panY = 0;\n this._updateUI();\n this._pluginHook('afterSlide', index, item);\n this.emit('slide', { index, item });\n }\n\n _goTo(index, direction) {\n this._renderSlide(index, direction);\n this._preload(index);\n }\n\n _watchSlideLoaded(slide) {\n const spinner = this._dom.spinner;\n if (!spinner) return;\n\n // Already loaded (e.g. cached image or video adapter)\n if (slide.classList.contains('lgx-content--loaded')) {\n spinner.style.display = 'none';\n return;\n }\n\n spinner.style.display = '';\n\n // Disconnect any previous observer\n this._spinnerObserver?.disconnect();\n\n this._spinnerObserver = new MutationObserver(() => {\n if (slide.classList.contains('lgx-content--loaded')) {\n spinner.style.display = 'none';\n this._spinnerObserver.disconnect();\n }\n });\n this._spinnerObserver.observe(slide, { attributes: true, attributeFilter: ['class'] });\n }\n\n _preload(index) {\n if (!this.opts.lazyLoad) return;\n const n = this.opts.preload;\n const total = this._items.length;\n for (let i = 1; i <= n; i++) {\n [\n (index + i) % total,\n (index - i + total) % total,\n ].forEach((pi) => {\n const pitem = this._items[pi];\n if (pitem?.type === 'image' && !pitem._preloaded) {\n const img = new Image();\n img.src = pitem.src;\n pitem._preloaded = true;\n }\n });\n }\n }\n\n _resolveAdapter(item) {\n const adapter = Registry.getAdapter(item.type);\n if (adapter) return adapter;\n // Fallback: scan all adapters\n const all = ['image', 'video', 'youtube', 'vimeo', 'iframe'];\n for (const t of all) {\n const a = Registry.getAdapter(t);\n if (a?.canHandle(item)) return a;\n }\n return null;\n }\n\n _pauseCurrentMedia() {\n const slide = this._dom.slideWrapper?.querySelector('.lgx-slide--active, .lgx-content');\n if (slide?._pause) slide._pause();\n // Pause html5 video elements\n slide?.querySelectorAll('video').forEach((v) => v.pause());\n }\n\n // ─── UI Updates ───────────────────────────────────────────────────────────────\n\n _updateUI() {\n const { _index: i, _items: items, opts, _dom: dom } = this;\n const total = items.length;\n\n // Counter\n if (dom.counter && opts.counter) {\n dom.counter.textContent = opts.i18n.counter\n .replace('{current}', i + 1)\n .replace('{total}', total);\n dom.counter.style.display = total > 1 ? '' : 'none';\n }\n\n // Caption\n if (dom.caption && opts.captions) {\n const cap = String(items[i]?.caption ?? '').trim();\n dom.caption.innerHTML = cap;\n dom.caption.style.display = cap ? '' : 'none';\n }\n\n // Nav buttons\n if (!opts.loop) {\n if (dom.btnPrev) dom.btnPrev.disabled = i === 0;\n if (dom.btnNext) dom.btnNext.disabled = i === total - 1;\n }\n\n // Show/hide nav for single-item galleries\n const showNav = total > 1;\n if (dom.btnPrev) dom.btnPrev.style.display = showNav ? '' : 'none';\n if (dom.btnNext) dom.btnNext.style.display = showNav ? '' : 'none';\n if (dom.btnAutoplay) dom.btnAutoplay.style.display = showNav ? '' : 'none';\n\n this._updateAutoplayButton();\n\n this._pluginHook('updateUI');\n }\n\n _updateAutoplayButton() {\n const btn = this._dom.btnAutoplay;\n if (!btn) return;\n\n const active = !!this._autoplayTimer;\n const label = active ? this.opts.i18n.autoplayStop : this.opts.i18n.autoplayStart;\n btn.classList.toggle('lgx-btn--active', active);\n btn.setAttribute('aria-pressed', active ? 'true' : 'false');\n btn.setAttribute('aria-label', label);\n btn.title = label;\n btn.innerHTML = this._svgIcon(active ? 'stop' : 'play').outerHTML;\n }\n\n // ─── Zoom / Pan ───────────────────────────────────────────────────────────────\n\n _applyZoom(newZoom, reset = false) {\n newZoom = clamp(newZoom, this.opts.zoomMin, this.opts.zoomMax);\n if (reset) { newZoom = 1; this._panX = 0; this._panY = 0; }\n this._zoom = newZoom;\n\n const img = this._dom.slideWrapper?.querySelector('.lgx-image');\n if (!img) return;\n\n img.style.transform = `translate(${this._panX}px, ${this._panY}px) scale(${newZoom})`;\n img.style.cursor = newZoom > 1 ? 'move' : 'default';\n\n this._pluginHook('afterZoom', newZoom);\n this.emit('zoom', { zoom: newZoom });\n }\n\n // ─── Keyboard ─────────────────────────────────────────────────────────────────\n\n _attachKeyboard() {\n if (!this.opts.keyboard) return;\n this._onKeydown = (e) => {\n switch (e.key) {\n case 'ArrowRight': this.next(); break;\n case 'ArrowLeft': this.prev(); break;\n case 'Escape': if (this.opts.closeOnEscape) this.close(); break;\n case 'f': case 'F': this._pluginHook('toggleFullscreen'); break;\n case '+': case '=': this.zoomIn(); break;\n case '-': this.zoomOut(); break;\n case '0': this.resetZoom(); break;\n }\n };\n document.addEventListener('keydown', this._onKeydown);\n }\n\n _detachKeyboard() {\n if (this._onKeydown) document.removeEventListener('keydown', this._onKeydown);\n }\n\n // ─── Touch / Drag ─────────────────────────────────────────────────────────────\n\n _attachTouch() {\n if (!this.opts.touch && !this.opts.drag) return;\n const stage = this._dom.stage;\n if (!stage) return;\n\n let startX, startY, startPanX, startPanY, isDragging = false;\n const SWIPE_THRESHOLD = 50;\n\n const onStart = (e) => {\n const pt = e.touches ? e.touches[0] : e;\n startX = pt.clientX;\n startY = pt.clientY;\n startPanX = this._panX;\n startPanY = this._panY;\n isDragging = true;\n };\n\n const onMove = (e) => {\n if (!isDragging) return;\n const pt = e.touches ? e.touches[0] : e;\n const dx = pt.clientX - startX;\n const dy = pt.clientY - startY;\n\n if (this._zoom > 1) {\n // Pan mode\n this._panX = startPanX + dx;\n this._panY = startPanY + dy;\n const img = this._dom.slideWrapper?.querySelector('.lgx-image');\n if (img) img.style.transform = `translate(${this._panX}px, ${this._panY}px) scale(${this._zoom})`;\n e.preventDefault();\n }\n };\n\n const onEnd = (e) => {\n if (!isDragging) return;\n isDragging = false;\n const pt = e.changedTouches ? e.changedTouches[0] : e;\n const dx = pt.clientX - startX;\n\n if (this._zoom === 1 && Math.abs(dx) > SWIPE_THRESHOLD) {\n dx < 0 ? this.next() : this.prev();\n }\n };\n\n // Double-tap / double-click zoom\n let lastTap = 0;\n const onTap = (e) => {\n const now = Date.now();\n if (now - lastTap < 300) {\n this._zoom === 1 ? this._applyZoom(2) : this.resetZoom();\n e.preventDefault();\n }\n lastTap = now;\n };\n\n stage.addEventListener('mousedown', onStart);\n stage.addEventListener('mousemove', onMove);\n stage.addEventListener('mouseup', onEnd);\n stage.addEventListener('touchstart', onStart, passiveOpt);\n stage.addEventListener('touchmove', onMove, { passive: false });\n stage.addEventListener('touchend', onEnd, passiveOpt);\n stage.addEventListener('click', onTap);\n\n // Pinch zoom\n let initDist = 0, initZoom = 1;\n stage.addEventListener('touchstart', (e) => {\n if (e.touches.length === 2) {\n initDist = Math.hypot(\n e.touches[0].clientX - e.touches[1].clientX,\n e.touches[0].clientY - e.touches[1].clientY\n );\n initZoom = this._zoom;\n }\n }, passiveOpt);\n\n stage.addEventListener('touchmove', (e) => {\n if (e.touches.length === 2) {\n const dist = Math.hypot(\n e.touches[0].clientX - e.touches[1].clientX,\n e.touches[0].clientY - e.touches[1].clientY\n );\n this._applyZoom(initZoom * (dist / initDist));\n e.preventDefault();\n }\n }, { passive: false });\n }\n\n // ─── Autoplay ──────────────────────────────────────────────────────────────────\n\n _startAutoplay() {\n if (this._isAutoplayBlockingMedia(this._items[this._index])) {\n this._stopAutoplay();\n return;\n }\n this._stopAutoplay();\n this._autoplayTimer = setInterval(() => this.next(), this.opts.autoplayInterval);\n this._updateAutoplayButton();\n this.emit('autoplay:start');\n }\n\n _stopAutoplay() {\n if (this._autoplayTimer) {\n clearInterval(this._autoplayTimer);\n this._autoplayTimer = null;\n this._updateAutoplayButton();\n this.emit('autoplay:stop');\n }\n }\n\n _bindMediaAutoplayStop(slide, item) {\n if (!this._isAutoplayBlockingMedia(item)) return;\n\n const stop = () => this._stopAutoplay();\n slide.addEventListener('lgx:media-play', stop, { once: true });\n slide.querySelectorAll('video').forEach((video) => {\n video.addEventListener('play', stop, { once: true });\n });\n }\n\n _isAutoplayBlockingMedia(item) {\n return ['video', 'youtube', 'vimeo', 'iframe'].includes(item?.type);\n }\n\n // ─── Trigger binding ──────────────────────────────────────────────────────────\n\n _bindTriggers() {\n if (typeof document === 'undefined') return;\n if (!this.opts.selector) return;\n\n const handler = (e) => {\n const trigger = e.target.closest(this.opts.selector);\n if (!trigger) return;\n e.preventDefault();\n\n // Gather all items from the same gallery group\n const groupAttr = trigger.dataset.lgxGallery || trigger.closest('[data-lgx-gallery]')?.dataset.lgxGallery;\n let siblings;\n\n if (groupAttr) {\n siblings = [...document.querySelectorAll(`[data-lgx-gallery=\"${groupAttr}\"] ${this.opts.selector}, ${this.opts.selector}[data-lgx-gallery=\"${groupAttr}\"]`)];\n } else {\n siblings = [trigger];\n }\n\n const items = siblings.map((el) => this._itemFromElement(el));\n const startIndex = siblings.indexOf(trigger);\n this.open(items, Math.max(0, startIndex));\n };\n\n document.addEventListener('click', handler);\n this._triggerHandler = handler;\n }\n\n _detachTriggers() {\n if (this._triggerHandler) {\n document.removeEventListener('click', this._triggerHandler);\n }\n }\n\n _itemFromElement(el) {\n const d = el.dataset;\n const img = el.matches('img') ? el : el.querySelector('img');\n const captionEl = el.querySelector('[data-lgx-caption], figcaption, .caption, .lgx-caption-text');\n const caption = d.lgxCaption\n || img?.dataset?.lgxCaption\n || captionEl?.innerHTML\n || el.getAttribute('aria-label')\n || el.title\n || img?.title\n || img?.alt\n || '';\n\n return {\n src: d.lgxSrc || el.href || el.src || '',\n type: d.lgxType || undefined,\n thumb: d.lgxThumb || img?.src || null,\n caption,\n alt: d.lgxAlt || img?.alt || '',\n download: d.lgxDownload || null,\n autoplay: d.lgxAutoplay !== undefined,\n poster: d.lgxPoster || null,\n };\n }\n\n // ─── SVG Icons ────────────────────────────────────────────────────────────────\n\n _svgIcon(name) {\n const icons = {\n close: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>',\n prev: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"15,18 9,12 15,6\"/></svg>',\n next: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"9,18 15,12 9,6\"/></svg>',\n play: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M8 5.14v13.72a1 1 0 0 0 1.52.86l11.43-6.86a1 1 0 0 0 0-1.72L9.52 4.28A1 1 0 0 0 8 5.14z\"/></svg>',\n stop: '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><rect x=\"7\" y=\"7\" width=\"10\" height=\"10\" rx=\"1.5\"/></svg>',\n zoomin: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"/><line x1=\"11\" y1=\"8\" x2=\"11\" y2=\"14\"/><line x1=\"8\" y1=\"11\" x2=\"14\" y2=\"11\"/></svg>',\n zoomout: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"/><line x1=\"8\" y1=\"11\" x2=\"14\" y2=\"11\"/></svg>',\n fullscreen: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"15,3 21,3 21,9\"/><polyline points=\"9,21 3,21 3,15\"/><line x1=\"21\" y1=\"3\" x2=\"14\" y2=\"10\"/><line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\"/></svg>',\n download: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><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\" y1=\"15\" x2=\"12\" y2=\"3\"/></svg>',\n share: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><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\" y1=\"13.51\" x2=\"15.42\" y2=\"17.49\"/><line x1=\"15.41\" y1=\"6.51\" x2=\"8.59\" y2=\"10.49\"/></svg>',\n };\n const div = document.createElement('span');\n div.className = 'lgx-icon';\n div.setAttribute('aria-hidden', 'true');\n div.innerHTML = icons[name] ?? '';\n return div;\n }\n}\n\nexport { Crowdbox as LightboxGallery };\n","const COLS = 8;\nconst ROWS = 7;\nconst TILE_DURATION = 420; // ms — must match CSS animation duration\nconst MAX_DELAY = 380; // ms — last tile starts at this offset\n\n// Tile colours — dark palette with subtle variation\nconst TILE_COLORS = [\n '#111116', '#13131a', '#0f0f14', '#161620',\n '#121218', '#101015', '#141419', '#0e0e13',\n];\n\nfunction buildMosaic() {\n const mosaic = document.createElement('div');\n mosaic.className = 'lgx-mosaic';\n mosaic.style.gridTemplateColumns = `repeat(${COLS}, 1fr)`;\n mosaic.style.gridTemplateRows = `repeat(${ROWS}, 1fr)`;\n\n for (let r = 0; r < ROWS; r++) {\n for (let c = 0; c < COLS; c++) {\n const tile = document.createElement('div');\n tile.className = 'lgx-mosaic__tile';\n\n // Diagonal wave: top-left tiles dissolve first\n const diagRatio = (r + c) / (ROWS + COLS - 2); // 0 → 1\n const delay = Math.round(diagRatio * MAX_DELAY);\n tile.style.setProperty('--lgx-tile-delay', `${delay}ms`);\n\n // Pick a colour from the palette so adjacent tiles vary slightly\n tile.style.background = TILE_COLORS[(r * COLS + c) % TILE_COLORS.length];\n\n mosaic.appendChild(tile);\n }\n }\n\n return mosaic;\n}\n\nexport const ImageAdapter = {\n type: 'image',\n\n canHandle(item) {\n return item.type === 'image' || /\\.(jpg|jpeg|png|gif|webp|avif|svg)(\\?.*)?$/i.test(item.src ?? '');\n },\n\n render(item) {\n const wrapper = document.createElement('div');\n wrapper.className = 'lgx-content lgx-content--image';\n // position:relative and overflow:hidden are set in CSS on .lgx-content--image\n // so the mosaic tiles (position:absolute inside) are clipped correctly.\n\n const img = document.createElement('img');\n img.className = 'lgx-image';\n img.alt = item.alt ?? item.caption ?? '';\n img.draggable = false;\n\n // Low-res thumb while full image loads\n if (item.thumb) {\n img.src = item.thumb;\n img.style.filter = 'blur(8px)';\n }\n\n const loadStart = Date.now();\n const hi = new Image();\n hi.onload = () => {\n img.src = hi.src;\n img.style.filter = '';\n img.style.transition = 'filter 0.3s';\n wrapper.classList.add('lgx-content--loaded');\n\n // Skip mosaic when the image was served from cache (load time < 40 ms) —\n // it would collide with the slide-in transition and cause flickering.\n const fromNetwork = Date.now() - loadStart > 40;\n if (fromNetwork) {\n const mosaic = buildMosaic();\n wrapper.appendChild(mosaic);\n const totalMs = MAX_DELAY + TILE_DURATION + 60;\n setTimeout(() => mosaic.remove(), totalMs);\n }\n };\n\n hi.onerror = () => wrapper.classList.add('lgx-content--error');\n hi.src = item.src;\n\n wrapper.appendChild(img);\n return wrapper;\n },\n\n getThumbnail(item) {\n return item.thumb ?? item.src;\n },\n};\n","export const VideoAdapter = {\n type: 'video',\n\n canHandle(item) {\n return item.type === 'video' || /\\.(mp4|webm|ogg|mov)(\\?.*)?$/i.test(item.src ?? '');\n },\n\n render(item) {\n const wrapper = document.createElement('div');\n wrapper.className = 'lgx-content lgx-content--video';\n\n const video = document.createElement('video');\n video.className = 'lgx-video';\n video.controls = true;\n video.playsInline = true;\n video.preload = 'metadata';\n if (item.autoplay) video.autoplay = true;\n if (item.loop) video.loop = true;\n if (item.muted) video.muted = true;\n if (item.poster) video.poster = item.poster;\n video.addEventListener('play', () => {\n wrapper.dispatchEvent(new CustomEvent('lgx:media-play', { bubbles: true }));\n });\n\n const sources = Array.isArray(item.src) ? item.src : [item.src];\n sources.forEach((s) => {\n const src = typeof s === 'string' ? { src: s } : s;\n const source = document.createElement('source');\n source.src = src.src;\n if (src.type) source.type = src.type;\n video.appendChild(source);\n });\n\n wrapper.appendChild(video);\n wrapper.classList.add('lgx-content--loaded');\n\n wrapper._pause = () => video.pause();\n return wrapper;\n },\n\n getThumbnail(item) {\n return item.thumb ?? item.poster ?? null;\n },\n};\n","import { getYouTubeId } from '../core/utils.js';\n\nexport const YouTubeAdapter = {\n type: 'youtube',\n\n canHandle(item) {\n return item.type === 'youtube' || /youtube\\.com|youtu\\.be/.test(item.src ?? '');\n },\n\n render(item) {\n const wrapper = document.createElement('div');\n wrapper.className = 'lgx-content lgx-content--youtube lgx-content--iframe';\n\n const id = getYouTubeId(item.src);\n if (!id) {\n wrapper.textContent = 'Invalid YouTube URL';\n return wrapper;\n }\n\n const params = new URLSearchParams({\n autoplay: item.autoplay ? '1' : '0',\n rel: '0',\n modestbranding: '1',\n enablejsapi: '1',\n ...(item.start ? { start: item.start } : {}),\n });\n\n const iframe = document.createElement('iframe');\n iframe.className = 'lgx-iframe';\n iframe.src = `https://www.youtube.com/embed/${id}?${params}`;\n iframe.allow = 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture';\n iframe.allowFullscreen = true;\n iframe.setAttribute('loading', 'lazy');\n iframe.title = item.caption ?? 'YouTube video';\n\n iframe.addEventListener('load', () => wrapper.classList.add('lgx-content--loaded'));\n\n wrapper.appendChild(iframe);\n\n wrapper._pause = () => {\n try {\n iframe.contentWindow?.postMessage('{\"event\":\"command\",\"func\":\"pauseVideo\",\"args\":\"\"}', '*');\n } catch (_) {}\n };\n\n return wrapper;\n },\n\n getThumbnail(item) {\n if (item.thumb) return item.thumb;\n const id = getYouTubeId(item.src);\n return id ? `https://img.youtube.com/vi/${id}/mqdefault.jpg` : null;\n },\n};\n","import { getVimeoId } from '../core/utils.js';\n\nexport const VimeoAdapter = {\n type: 'vimeo',\n\n canHandle(item) {\n return item.type === 'vimeo' || /vimeo\\.com/.test(item.src ?? '');\n },\n\n render(item) {\n const wrapper = document.createElement('div');\n wrapper.className = 'lgx-content lgx-content--vimeo lgx-content--iframe';\n\n const id = getVimeoId(item.src);\n if (!id) {\n wrapper.textContent = 'Invalid Vimeo URL';\n return wrapper;\n }\n\n const params = new URLSearchParams({\n autoplay: item.autoplay ? '1' : '0',\n title: '0',\n byline: '0',\n portrait: '0',\n api: '1',\n });\n\n const iframe = document.createElement('iframe');\n iframe.className = 'lgx-iframe';\n iframe.src = `https://player.vimeo.com/video/${id}?${params}`;\n iframe.allow = 'autoplay; fullscreen; picture-in-picture';\n iframe.allowFullscreen = true;\n iframe.setAttribute('loading', 'lazy');\n iframe.title = item.caption ?? 'Vimeo video';\n\n iframe.addEventListener('load', () => wrapper.classList.add('lgx-content--loaded'));\n\n wrapper.appendChild(iframe);\n\n wrapper._pause = () => {\n try {\n iframe.contentWindow?.postMessage('{\"method\":\"pause\"}', '*');\n } catch (_) {}\n };\n\n return wrapper;\n },\n\n getThumbnail(item) {\n return item.thumb ?? null;\n },\n};\n","export const IframeAdapter = {\n type: 'iframe',\n\n canHandle(item) {\n return item.type === 'iframe';\n },\n\n render(item) {\n const wrapper = document.createElement('div');\n wrapper.className = 'lgx-content lgx-content--iframe';\n\n const iframe = document.createElement('iframe');\n iframe.className = 'lgx-iframe';\n iframe.src = item.src;\n iframe.allowFullscreen = true;\n iframe.setAttribute('loading', 'lazy');\n iframe.title = item.caption ?? 'Embedded content';\n if (item.iframeWidth) iframe.style.width = item.iframeWidth;\n if (item.iframeHeight) iframe.style.height = item.iframeHeight;\n\n iframe.addEventListener('load', () => wrapper.classList.add('lgx-content--loaded'));\n\n wrapper.appendChild(iframe);\n return wrapper;\n },\n\n getThumbnail(item) {\n return item.thumb ?? null;\n },\n};\n","// Core\nexport { Crowdbox, LightboxGallery } from './core/Crowdbox.js';\nexport { EventEmitter } from './core/EventEmitter.js';\nexport { Registry } from './core/Registry.js';\n\n// Adapters\nimport { ImageAdapter } from './adapters/image.js';\nimport { VideoAdapter } from './adapters/video.js';\nimport { YouTubeAdapter } from './adapters/youtube.js';\nimport { VimeoAdapter } from './adapters/vimeo.js';\nimport { IframeAdapter } from './adapters/iframe.js';\n\n// Plugins\nimport { ZoomPlugin } from './plugins/zoom/zoom.js';\nimport { ThumbsPlugin } from './plugins/thumbs/thumbs.js';\nimport { FullscreenPlugin } from './plugins/fullscreen/fullscreen.js';\nimport { DownloadPlugin } from './plugins/download/download.js';\nimport { SharePlugin } from './plugins/share/share.js';\n\nexport { ImageAdapter, VideoAdapter, YouTubeAdapter, VimeoAdapter, IframeAdapter };\nexport { ZoomPlugin, ThumbsPlugin, FullscreenPlugin, DownloadPlugin, SharePlugin };\n\n// Auto-register everything so the library works out of the box\nimport { Registry as Reg } from './core/Registry.js';\n\nReg.registerAdapter('image', ImageAdapter);\nReg.registerAdapter('video', VideoAdapter);\nReg.registerAdapter('youtube', YouTubeAdapter);\nReg.registerAdapter('vimeo', VimeoAdapter);\nReg.registerAdapter('iframe', IframeAdapter);\n\nReg.registerPlugin('zoom', ZoomPlugin);\nReg.registerPlugin('thumbnails', ThumbsPlugin);\nReg.registerPlugin('fullscreen', FullscreenPlugin);\nReg.registerPlugin('download', DownloadPlugin);\nReg.registerPlugin('share', SharePlugin);\n\n// ─── Convenience factory ─────────────────────────────────────────────────────\nimport { Crowdbox } from './core/Crowdbox.js';\n\n/**\n * Create a Crowdbox instance and return it.\n * This is the primary public API for vanilla / script-tag usage.\n */\nexport function createGallery(options = {}) {\n return new Crowdbox(options);\n}\n\n// Auto-init from [data-lgx-init] attribute\nif (typeof document !== 'undefined') {\n document.addEventListener('DOMContentLoaded', () => {\n document.querySelectorAll('[data-lgx-init]').forEach((root) => {\n try {\n const opts = JSON.parse(root.dataset.lgxInit || '{}');\n new Crowdbox({ selector: `#${root.id} [data-lgx]`, ...opts });\n } catch (_) {}\n });\n });\n}\n\nexport default Crowdbox;\n","export class ZoomPlugin {\n static pluginName = 'zoom';\n\n constructor(gallery) {\n this.gallery = gallery;\n this._btnIn = null;\n this._btnOut = null;\n }\n\n init(gallery) {\n this.gallery = gallery;\n }\n\n buildToolbar(toolbar) {\n if (!this.gallery.opts.zoom) return;\n\n this._btnIn = this._makeBtn('zoomin', this.gallery.opts.i18n.zoomIn, () => this.gallery.zoomIn());\n this._btnOut = this._makeBtn('zoomout', this.gallery.opts.i18n.zoomOut, () => this.gallery.zoomOut());\n\n // Insert before close button\n const close = toolbar.querySelector('.lgx-btn--close');\n toolbar.insertBefore(this._btnOut, close);\n toolbar.insertBefore(this._btnIn, this._btnOut);\n }\n\n afterSlide(index, item) {\n const isImage = item.type === 'image';\n if (this._btnIn) this._btnIn.style.display = isImage ? '' : 'none';\n if (this._btnOut) this._btnOut.style.display = isImage ? '' : 'none';\n }\n\n afterZoom(zoom) {\n const min = this.gallery.opts.zoomMin;\n const max = this.gallery.opts.zoomMax;\n if (this._btnIn) this._btnIn.disabled = zoom >= max;\n if (this._btnOut) this._btnOut.disabled = zoom <= min;\n }\n\n _makeBtn(iconName, label, onClick) {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = `lgx-btn lgx-btn--${iconName}`;\n btn.setAttribute('aria-label', label);\n btn.title = label;\n btn.innerHTML = this.gallery._svgIcon(iconName).outerHTML;\n btn.addEventListener('click', onClick);\n return btn;\n }\n\n destroy() {}\n}\n","export class ThumbsPlugin {\n static pluginName = 'thumbnails';\n\n constructor(gallery) {\n this.gallery = gallery;\n this._strip = null;\n this._thumbEls = [];\n this._observer = null;\n }\n\n init(gallery) {\n this.gallery = gallery;\n }\n\n afterBuildDOM() {\n if (!this.gallery.opts.thumbnails) return;\n if (this.gallery._items.length < 2) return;\n\n this._buildStrip();\n }\n\n afterSlide(index) {\n this._activate(index);\n }\n\n _buildStrip() {\n const gallery = this.gallery;\n const strip = document.createElement('div');\n strip.className = 'lgx-thumbs';\n strip.setAttribute('role', 'tablist');\n strip.setAttribute('aria-label', 'Gallery thumbnails');\n\n this._thumbEls = gallery._items.map((item, i) => {\n const thumb = document.createElement('button');\n thumb.type = 'button';\n thumb.className = 'lgx-thumb';\n thumb.setAttribute('role', 'tab');\n thumb.setAttribute('aria-label', `Slide ${i + 1}${item.caption ? ': ' + item.caption : ''}`);\n thumb.setAttribute('aria-selected', i === gallery._index ? 'true' : 'false');\n thumb.dataset.lgxThumbIndex = i;\n\n const adapter = gallery._resolveAdapter(item);\n const thumbSrc = adapter?.getThumbnail(item);\n\n if (thumbSrc) {\n const img = document.createElement('img');\n img.alt = '';\n img.loading = 'lazy';\n\n // IntersectionObserver lazy load\n if ('IntersectionObserver' in window) {\n img.dataset.src = thumbSrc;\n this._observe(img);\n } else {\n img.src = thumbSrc;\n }\n\n thumb.appendChild(img);\n } else {\n // Video/iframe fallback: show index number\n thumb.appendChild(document.createTextNode(i + 1));\n thumb.classList.add('lgx-thumb--no-image');\n }\n\n thumb.addEventListener('click', () => gallery.goTo(i));\n return thumb;\n });\n\n this._thumbEls.forEach((t) => strip.appendChild(t));\n gallery._dom.container.appendChild(strip);\n gallery._dom.thumbStrip = strip;\n this._strip = strip;\n\n this._activate(gallery._index);\n }\n\n _activate(index) {\n this._thumbEls.forEach((t, i) => {\n const active = i === index;\n t.classList.toggle('lgx-thumb--active', active);\n t.setAttribute('aria-selected', active ? 'true' : 'false');\n });\n\n // Scroll active thumb into view\n const activeThumb = this._thumbEls[index];\n if (activeThumb && this._strip) {\n activeThumb.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });\n }\n }\n\n _observe(img) {\n if (!this._observer) {\n this._observer = new IntersectionObserver((entries) => {\n entries.forEach((e) => {\n if (e.isIntersecting) {\n e.target.src = e.target.dataset.src;\n this._observer.unobserve(e.target);\n }\n });\n }, { rootMargin: '100px' });\n }\n this._observer.observe(img);\n }\n\n destroy() {\n this._observer?.disconnect();\n }\n}\n","import { requestFullscreen, exitFullscreen, isFullscreen } from '../../core/utils.js';\n\nexport class FullscreenPlugin {\n static pluginName = 'fullscreen';\n\n constructor(gallery) {\n this.gallery = gallery;\n this._btn = null;\n this._onChange = null;\n }\n\n init(gallery) {\n this.gallery = gallery;\n }\n\n buildToolbar(toolbar) {\n if (!this.gallery.opts.fullscreen) return;\n\n this._btn = document.createElement('button');\n this._btn.type = 'button';\n this._btn.className = 'lgx-btn lgx-btn--fullscreen';\n this._btn.setAttribute('aria-label', this.gallery.opts.i18n.fullscreen);\n this._btn.title = this.gallery.opts.i18n.fullscreen;\n this._btn.innerHTML = this.gallery._svgIcon('fullscreen').outerHTML;\n this._btn.addEventListener('click', () => this.toggle());\n\n const close = toolbar.querySelector('.lgx-btn--close');\n toolbar.insertBefore(this._btn, close);\n\n this._onChange = () => this._updateBtn();\n document.addEventListener('fullscreenchange', this._onChange);\n document.addEventListener('webkitfullscreenchange', this._onChange);\n }\n\n toggle() {\n if (isFullscreen()) {\n exitFullscreen();\n } else {\n requestFullscreen(this.gallery._dom.modal);\n }\n }\n\n toggleFullscreen() {\n this.toggle();\n }\n\n _updateBtn() {\n if (!this._btn) return;\n const full = isFullscreen();\n this._btn.setAttribute('aria-pressed', full ? 'true' : 'false');\n this.gallery._dom.modal?.classList.toggle('lgx-modal--fullscreen', full);\n }\n\n afterClose() {\n if (isFullscreen()) exitFullscreen();\n if (this._onChange) {\n document.removeEventListener('fullscreenchange', this._onChange);\n document.removeEventListener('webkitfullscreenchange', this._onChange);\n }\n }\n\n destroy() {\n this.afterClose();\n }\n}\n","export class DownloadPlugin {\n static pluginName = 'download';\n\n constructor(gallery) {\n this.gallery = gallery;\n this._btn = null;\n }\n\n init(gallery) {\n this.gallery = gallery;\n }\n\n buildToolbar(toolbar) {\n if (!this.gallery.opts.download) return;\n\n this._btn = document.createElement('button');\n this._btn.type = 'button';\n this._btn.className = 'lgx-btn lgx-btn--download';\n this._btn.setAttribute('aria-label', this.gallery.opts.i18n.download);\n this._btn.title = this.gallery.opts.i18n.download;\n this._btn.innerHTML = this.gallery._svgIcon('download').outerHTML;\n this._btn.addEventListener('click', () => this._download());\n\n const close = toolbar.querySelector('.lgx-btn--close');\n toolbar.insertBefore(this._btn, close);\n }\n\n afterSlide(index, item) {\n if (!this._btn) return;\n // Hide download for video embeds where we can't trigger a download\n const canDownload = ['image', 'video'].includes(item.type);\n this._btn.style.display = canDownload ? '' : 'none';\n }\n\n _download() {\n const item = this.gallery._items[this.gallery._index];\n if (!item) return;\n const url = item.download || item.src;\n const a = document.createElement('a');\n a.href = url;\n a.download = item.downloadName || url.split('/').pop() || 'download';\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n this.gallery.emit('download', { item });\n }\n\n destroy() {}\n}\n","export class SharePlugin {\n static pluginName = 'share';\n\n constructor(gallery) {\n this.gallery = gallery;\n this._btn = null;\n }\n\n init(gallery) {\n this.gallery = gallery;\n }\n\n buildToolbar(toolbar) {\n if (!this.gallery.opts.share) return;\n\n this._btn = document.createElement('button');\n this._btn.type = 'button';\n this._btn.className = 'lgx-btn lgx-btn--share';\n this._btn.setAttribute('aria-label', this.gallery.opts.i18n.share);\n this._btn.title = this.gallery.opts.i18n.share;\n this._btn.innerHTML = this.gallery._svgIcon('share').outerHTML;\n this._btn.addEventListener('click', () => this._share());\n\n const close = toolbar.querySelector('.lgx-btn--close');\n toolbar.insertBefore(this._btn, close);\n }\n\n async _share() {\n const item = this.gallery._items[this.gallery._index];\n if (!item) return;\n\n const shareData = {\n title: item.caption || document.title,\n url: item.shareUrl || item.src,\n };\n\n // Native Web Share API (mobile)\n if (navigator.share) {\n try {\n await navigator.share(shareData);\n this.gallery.emit('share', { item, method: 'native' });\n return;\n } catch (_) {}\n }\n\n // Fallback: copy URL to clipboard\n if (navigator.clipboard) {\n await navigator.clipboard.writeText(shareData.url);\n this._showToast('Link copied!');\n this.gallery.emit('share', { item, method: 'clipboard' });\n }\n }\n\n _showToast(msg) {\n const toast = document.createElement('div');\n toast.className = 'lgx-toast';\n toast.textContent = msg;\n this.gallery._dom.modal?.appendChild(toast);\n setTimeout(() => toast.remove(), 2500);\n }\n\n destroy() {}\n}\n"],"names":["EventEmitter","constructor","this","_events","Object","create","on","event","listener","push","once","wrapper","args","off","_original","filter","l","emit","forEach","removeAllListeners","adapters","Map","plugins","Registry","registerAdapter","type","adapter","set","getAdapter","get","registerPlugin","name","plugin","getPlugin","getPlugins","values","createElement","tag","attrs","children","el","document","k","v","entries","className","startsWith","dataset","slice","replace","_","c","toUpperCase","setAttribute","flat","child","appendChild","createTextNode","mergeDeep","target","sources","src","key","keys","Array","isArray","getYouTubeId","url","m","match","exitFullscreen","webkitExitFullscreen","mozCancelFullScreen","call","isFullscreen","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","clamp","value","min","max","Math","passiveOpt","ok","window","addEventListener","defineProperty","supportsPassive","passive","DEFAULTS","selector","gallerySelector","loop","keyboard","touch","drag","zoom","thumbnails","captions","counter","fullscreen","download","share","closeOnBackdrop","closeOnEscape","animationDuration","slideAnimationDuration","zoomStep","zoomMax","zoomMin","lazyLoad","preload","autoplay","autoplayInterval","showAutoplay","i18n","close","prev","next","zoomIn","zoomOut","autoplayStart","autoplayStop","Crowdbox","options","super","opts","_items","_index","_open","_zoom","_panX","_panY","_autoplayTimer","_releaseFocusTrap","_previousFocus","_plugins","_dom","_initPlugins","_bindTriggers","open","items","startIndex","_normalizeItems","length","_buildDOM","_attachKeyboard","_attachTouch","_renderSlide","_preload","_pluginHook","index","item","_isAutoplayBlockingMedia","_startAutoplay","_stopAutoplay","_pauseCurrentMedia","modal","style","animation","setTimeout","remove","_detachKeyboard","focus","body","overflow","total","_goTo","goTo","i","_applyZoom","resetZoom","startAutoplay","stopAutoplay","toggleAutoplay","destroy","_detachTriggers","p","map","test","isVideoUrl","Def","pluginName","inst","init","hook","activeElement","class","role","setProperty","backdrop","container","toolbar","_buildToolbar","stage","slideWrapper","btnPrev","_buildNavBtn","btnNext","append","caption","display","spinner","btnAutoplay","querySelector","focusable","querySelectorAll","first","last","handler","e","shiftKey","preventDefault","removeEventListener","trapFocus","title","_svgIcon","btnClose","dir","label","btn","direction","_resolveAdapter","slide","render","lgxIndex","old","outClass","inClass","classList","add","requestAnimationFrame","done","cleanup","innerHTML","currentSlide","_watchSlideLoaded","_bindMediaAutoplayStop","_updateUI","contains","_spinnerObserver","disconnect","MutationObserver","observe","attributes","attributeFilter","n","pi","pitem","_preloaded","Image","all","t","a","canHandle","_pause","pause","dom","textContent","cap","String","trim","disabled","showNav","_updateAutoplayButton","active","toggle","outerHTML","newZoom","reset","img","transform","cursor","_onKeydown","startX","startY","startPanX","startPanY","isDragging","onStart","pt","touches","clientX","clientY","onMove","dx","dy","onEnd","changedTouches","abs","lastTap","now","Date","initDist","initZoom","hypot","dist","setInterval","clearInterval","stop","video","includes","trigger","closest","groupAttr","lgxGallery","siblings","_itemFromElement","indexOf","_triggerHandler","d","matches","captionEl","lgxCaption","getAttribute","alt","lgxSrc","href","lgxType","undefined","thumb","lgxThumb","lgxAlt","lgxDownload","lgxAutoplay","poster","lgxPoster","div","play","zoomin","zoomout","TILE_COLORS","ImageAdapter","draggable","loadStart","hi","onload","transition","mosaic","gridTemplateColumns","gridTemplateRows","r","tile","diagRatio","delay","round","background","buildMosaic","MAX_DELAY","onerror","getThumbnail","VideoAdapter","controls","playsInline","muted","dispatchEvent","CustomEvent","bubbles","s","source","YouTubeAdapter","id","params","URLSearchParams","rel","modestbranding","enablejsapi","start","iframe","allow","allowFullscreen","contentWindow","postMessage","VimeoAdapter","getVimeoId","byline","portrait","api","IframeAdapter","iframeWidth","width","iframeHeight","height","Reg","static","gallery","_btnIn","_btnOut","buildToolbar","_makeBtn","insertBefore","afterSlide","isImage","afterZoom","iconName","onClick","_strip","_thumbEls","_observer","afterBuildDOM","_buildStrip","_activate","strip","lgxThumbIndex","thumbSrc","loading","_observe","thumbStrip","activeThumb","scrollIntoView","behavior","block","inline","IntersectionObserver","isIntersecting","unobserve","rootMargin","_btn","_onChange","_updateBtn","requestFullscreen","webkitRequestFullscreen","mozRequestFullScreen","toggleFullscreen","full","afterClose","_download","canDownload","downloadName","split","pop","click","removeChild","_share","shareData","shareUrl","navigator","method","clipboard","writeText","_showToast","msg","toast","root","JSON","parse","lgxInit"],"mappings":"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"}
|