@gallerist/renderer-dom 0.3.0 → 0.3.1
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/dist/index.cjs +16 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -3
- package/dist/index.d.ts +6 -3
- package/dist/index.js +16 -7
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapters/image.ts","../src/appearance.ts","../src/transform.ts","../src/gestures.ts","../src/idle.ts","../src/overlays/position.ts","../src/overlays/render.ts","../src/presets.ts","../src/regions.ts","../src/strings.ts","../src/mount.ts","../src/bind.ts","../src/index.ts"],"names":["el","fitScale","clampScale","clampPanToBox","clampPan","getInternals","arbitrate","focalZoom","toggleZoom","ICONS","windowIndices","reconcileKeys","stageSize","text","nav","createViewer"],"mappings":"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","file":"index.cjs","sourcesContent":["// Image media adapter (spec §12, decision P0-J). Lives in the renderer because it touches DOM.\n// Responsive srcset, decode-before-reveal, LQIP placeholder, naturalSize hint, abortable load.\n\nimport type { AdapterCtx, Item, MediaAdapter, MountedMedia } from '@gallerist/core'\n\nconst COLOR_RE = /^(#|rgb|hsl|[a-z]+$)/i\n\n// Chars that could escape the url(\"…\") literal and inject extra CSS (e.g. a second url() that\n// fires an attacker-controlled request). Quotes/backslash/newlines are rejected for the url path.\nconst CSS_URL_UNSAFE = /[\"\\\\\\n\\r]/\n\n// Static broken-image glyph (lucide \"image-off\"); safe to inject as markup (no user data).\nconst BROKEN_ICON =\n '<svg viewBox=\"0 0 24 24\" width=\"44\" height=\"44\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M10.4 10.4a2 2 0 1 1-2.8-2.8\"/><path d=\"M21 15.5V5a2 2 0 0 0-2-2H8.5\"/><path d=\"M3.6 3.6A2 2 0 0 0 3 5v14a2 2 0 0 0 2 2h14a2 2 0 0 0 1.4-.6\"/><path d=\"m5 21 7-7\"/><path d=\"m2 2 20 20\"/></svg>'\n\nfunction applyPlaceholder(el: HTMLElement, placeholder: string): void {\n if (placeholder.startsWith('data:') || placeholder.includes('/')) {\n if (CSS_URL_UNSAFE.test(placeholder)) return // reject breakout attempts — paint nothing\n el.style.backgroundImage = `url(\"${placeholder}\")`\n el.style.backgroundSize = 'cover'\n el.style.backgroundPosition = 'center'\n } else if (COLOR_RE.test(placeholder)) {\n el.style.backgroundColor = placeholder\n }\n}\n\nexport function imageAdapter(): MediaAdapter {\n return { type: 'image', mount: mountImage }\n}\n\n/** The built-in image adapter's mount; the renderer preloads only items it would mount. */\nexport function mountImage(item: Item, slot: HTMLElement, ctx: AdapterCtx): MountedMedia {\n const img = document.createElement('img')\n img.setAttribute('decoding', 'async')\n img.setAttribute('fetchpriority', ctx.priority ?? 'auto')\n img.className = 'gallerist-media gallerist-media-image'\n if (item.alt !== undefined) img.alt = item.alt\n if (item.placeholder) applyPlaceholder(img, item.placeholder)\n slot.appendChild(img)\n\n // A loader may resolve to a custom element instead of an <img>; track the live node.\n let element: HTMLElement = img\n\n // On load failure, show a centered error card (icon + the item's alt as a caption) instead\n // of the browser's default top-left broken-image glyph, which overlapped the chrome (I-UX3).\n let errorEl: HTMLElement | null = null\n const showError = () => {\n if (errorEl) return\n img.setAttribute('data-gallerist-error', '') // keeps the img hidden + excludes it from shimmer\n const card = document.createElement('div')\n card.className = 'gallerist-media-error'\n card.setAttribute('role', 'img')\n if (item.alt) card.setAttribute('aria-label', item.alt)\n const icon = document.createElement('div')\n icon.className = 'gallerist-media-error-icon'\n icon.setAttribute('aria-hidden', 'true')\n icon.innerHTML = BROKEN_ICON // static markup only\n card.appendChild(icon)\n if (item.alt) {\n const label = document.createElement('span')\n label.className = 'gallerist-media-error-label'\n label.textContent = item.alt // host-supplied → textContent, never innerHTML\n card.appendChild(label)\n }\n slot.appendChild(card)\n errorEl = card\n }\n\n const ready = new Promise<void>((resolve, reject) => {\n const abortErr = () => new DOMException('Image load aborted', 'AbortError')\n if (ctx.signal.aborted) {\n reject(abortErr())\n return\n }\n const cleanup = () => {\n img.removeEventListener('load', onLoad)\n img.removeEventListener('error', onError)\n ctx.signal.removeEventListener('abort', onAbort)\n }\n const onAbort = () => {\n cleanup()\n reject(abortErr())\n }\n const onLoad = async () => {\n try {\n if (typeof img.decode === 'function') await img.decode()\n } catch {\n // decode can reject on detached/aborted nodes — fall through and reveal anyway.\n }\n cleanup()\n img.setAttribute('data-gallerist-loaded', '')\n resolve()\n }\n const onError = () => {\n cleanup()\n showError()\n reject(new Error(`image load error: ${item.id}`))\n }\n img.addEventListener('load', onLoad)\n img.addEventListener('error', onError)\n ctx.signal.addEventListener('abort', onAbort)\n\n const src = item.source\n if (typeof src === 'string') {\n img.src = src\n } else if ('src' in src) {\n img.src = src.src\n if (src.srcset) img.setAttribute('srcset', src.srcset)\n if (src.sizes) img.setAttribute('sizes', src.sizes)\n } else if ('loader' in src) {\n src\n .loader(ctx.signal)\n .then((res) => {\n if (ctx.signal.aborted) return\n if (typeof res === 'string') {\n img.src = res // load/error handlers settle ready\n } else {\n // a custom element: swap it in, it is its own ready signal\n cleanup()\n img.remove()\n slot.appendChild(res)\n res.setAttribute('data-gallerist-loaded', '')\n element = res\n resolve()\n }\n })\n .catch((err) => {\n cleanup()\n showError()\n reject(err instanceof Error ? err : new Error(String(err)))\n })\n }\n // tiles (DZI) is a v2 seam — not handled here.\n })\n // Avoid unhandled-rejection noise if no one awaits ready on a canceled load.\n ready.catch(() => {})\n\n return {\n get element() {\n return element\n },\n ready,\n supportsZoom: true,\n naturalSize() {\n if (item.naturalSize) return item.naturalSize\n return img.naturalWidth ? { w: img.naturalWidth, h: img.naturalHeight } : null\n },\n destroy() {\n img.removeAttribute('src')\n element.remove()\n errorEl?.remove() // the error card is a slot sibling, not `element`\n },\n }\n}\n","// Skin, accent and colour scheme (plan P2-A/D). The renderer only reflects them as data attributes\n// on the root; the theme's skin files do the rest, so switching any of them never rebuilds the DOM.\n\n/** Visual skin. `gallery` ships in gallerist.css; `console` and `editorial` need their stylesheet\n * (console.css, editorial.css) loaded after it. */\nexport type Skin = 'gallery' | 'console' | 'editorial' | (string & {})\n/** Accents are named per skin. Gallery: periwinkle (default), mint, amber, vermilion. Console:\n * amber (default), cyan, vermilion. Editorial: vermilion (default), cobalt. A name the skin\n * doesn't know falls back to its default. */\nexport type Accent =\n | 'periwinkle'\n | 'mint'\n | 'amber'\n | 'cyan'\n | 'vermilion'\n | 'cobalt'\n | (string & {})\n/** `auto` follows the system's `prefers-color-scheme`. Unset, each skin uses its own default:\n * Gallery and Console dark, Editorial the light wall. */\nexport type ColorScheme = 'dark' | 'light' | 'auto'\n\nexport interface Appearance {\n skin?: Skin\n accent?: Accent\n scheme?: ColorScheme\n}\n\n/**\n * Write an appearance onto a viewer root (`data-gallerist-skin|accent|scheme`). Only the options\n * present in `appearance` change, so `applyAppearance(root, { accent: 'cyan' })` keeps the skin and\n * scheme; an option present but `undefined` goes back to its default (`gallery`, the skin's own\n * scheme and accent).\n */\nexport function applyAppearance(root: HTMLElement, appearance: Appearance): void {\n if ('skin' in appearance) root.setAttribute('data-gallerist-skin', appearance.skin ?? 'gallery')\n if ('scheme' in appearance) {\n if (appearance.scheme) root.setAttribute('data-gallerist-scheme', appearance.scheme)\n else root.removeAttribute('data-gallerist-scheme')\n }\n if ('accent' in appearance) {\n if (appearance.accent) root.setAttribute('data-gallerist-accent', appearance.accent)\n else root.removeAttribute('data-gallerist-accent')\n }\n}\n","import type { ZoomState } from '@gallerist/core'\n\n/** The content layer's CSS transform for a zoom state (stage = content · scale + (x, y)). */\nexport function zoomTransform(zoom: ZoomState): string {\n return `translate(${zoom.x}px, ${zoom.y}px) scale(${zoom.scale})`\n}\n","// Pointer/wheel/double-tap gesture wiring (spec §11). Resolves a single pointer-down to one\n// intent via the core arbitration reducer, applies live pan/zoom imperatively (decision P0-E:\n// no store writes during a gesture), and commits the result on release. The arbitration matrix\n// itself is unit-tested in core; real multi-pointer flows are verified in Playwright (M3.5).\n\nimport type { ViewerApi, ZoomState } from '@gallerist/core'\nimport {\n type Intent,\n arbitrate,\n clampPan,\n clampPanToBox,\n clampScale,\n fitScale,\n focalZoom,\n getInternals,\n toggleZoom,\n} from '@gallerist/core/internal'\nimport { zoomTransform } from './transform'\n\nexport interface Geometry {\n stageRect: { left: number; top: number; width: number; height: number }\n naturalSize: { w: number; h: number } | null\n /** The painted media inside the content layer at fit (e.g. a letterboxed image); pan bounds\n * keep it covering the stage. Omitted: the whole content layer counts as media. */\n mediaBox?: { x: number; y: number; w: number; h: number }\n}\n\nexport interface GestureNav {\n next(): void\n prev(): void\n nextItem(): void\n prevItem(): void\n}\n\nexport interface GestureOptions {\n stage: HTMLElement\n viewer: ViewerApi\n getContent: () => HTMLElement | null\n getGeometry: () => Geometry\n threshold?: number\n commitNav?: number\n closeDismiss?: number\n maxScale?: number\n /** navigation seam — lets the renderer route swipes through linear/oriented nav (defaults to the\n * viewer's group/item axes). */\n nav?: GestureNav\n raf?: (cb: () => void) => number\n caf?: (id: number) => void\n}\n\ninterface Pt {\n x: number\n y: number\n}\n\nconst dist = (a: Pt, b: Pt) => Math.hypot(a.x - b.x, a.y - b.y)\nconst mid = (a: Pt, b: Pt): Pt => ({ x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 })\n\nexport function attachGestures(opts: GestureOptions): () => void {\n const {\n stage,\n viewer,\n getContent,\n getGeometry,\n threshold = 10,\n commitNav = 60,\n closeDismiss = 120,\n maxScale = 4,\n nav = {\n next: () => viewer.next(),\n prev: () => viewer.prev(),\n nextItem: () => viewer.nextItem(),\n prevItem: () => viewer.prevItem(),\n },\n raf = (cb) => requestAnimationFrame(cb),\n caf = (id) => cancelAnimationFrame(id),\n } = opts\n\n // The drag-to-dismiss progress var lives on the root (not the stage) so sibling layers like the\n // backdrop — which are not descendants of the stage — can consume it via inheritance (S-R1).\n const dismissEl = (stage.closest('.gallerist') as HTMLElement | null) ?? stage\n\n const pointers = new Map<number, Pt>()\n let start: Pt | null = null\n let startZoom = { scale: 1, x: 0, y: 0 }\n let pinchStartDist = 0\n let intent: Intent = 'none'\n let live = { scale: 1, x: 0, y: 0 }\n let frame = 0\n // Geometry snapshot for the active gesture — avoids a getBoundingClientRect (forced layout)\n // on every pointermove during pinch/pan, which would jeopardize the 60fps budget (§20).\n let gestureGeom: Geometry | null = null\n\n const geom = () => gestureGeom ?? getGeometry()\n const fitOf = (g: Geometry) =>\n g.naturalSize ? fitScale({ w: g.stageRect.width, h: g.stageRect.height }, g.naturalSize) : 1\n const fit = () => fitOf(geom())\n const toStage = (p: Pt): Pt => {\n const r = geom().stageRect\n return { x: p.x - r.left, y: p.y - r.top }\n }\n // Every commit is settled first: scale into [fit, max], pan so the content covers the stage\n // (centred once it fits). Without this a pinch or double-tap back to fit kept its pan offset and\n // left the image off-centre. The renderer's zoom bounds re-check the same in the core.\n const settle = (z: ZoomState, g: Geometry = geom()): ZoomState => {\n const scaled = { scale: clampScale(z.scale, fitOf(g), maxScale), x: z.x, y: z.y }\n const stageSize = { w: g.stageRect.width, h: g.stageRect.height }\n if (g.mediaBox) return clampPanToBox(scaled, stageSize, g.mediaBox)\n return g.naturalSize ? clampPan(scaled, stageSize, g.naturalSize) : scaled\n }\n const internals = getInternals(viewer)\n // Commit, then show the committed transform: a commit identical to the stored zoom is skipped\n // (no store change, so the renderer won't repaint), which would leave the content at the live\n // gesture transform — e.g. a pan dragged past the edge and clamped back to where it started.\n const commit = (z: ZoomState) => {\n internals.setZoom(z)\n const content = getContent()\n if (content) content.style.transform = zoomTransform(viewer.getState().zoom)\n }\n\n const schedule = () => {\n if (frame) return\n frame = raf(() => {\n frame = 0\n const content = getContent()\n if (content) {\n content.style.transform = zoomTransform(live)\n }\n })\n }\n\n // Pointer capture keeps move/up/cancel flowing to the stage even when the pointer\n // leaves the stage bounds (panning a zoomed image past the edge, a fast swipe). Without\n // it an off-stage pointerup never reaches onUp, stranding the gesture and poisoning the\n // next one. Guard the calls: synthetic test events and inactive pointer ids throw (C3).\n const capture = (id: number) => {\n try {\n stage.setPointerCapture?.(id)\n } catch {}\n }\n const release = (id: number) => {\n try {\n stage.releasePointerCapture?.(id)\n } catch {}\n }\n\n // Wheel/trackpad zoom: snapshot geometry once per burst (no forced layout per tick), accumulate\n // the target locally and apply it imperatively via the RAF schedule, then commit to the store\n // ONCE when the burst settles — instead of a full store commit + render + subscriber fan-out on\n // every tick (the one continuous interaction that was routed through the store) (I-PERF1).\n const WHEEL_COMMIT_MS = 90\n let wheelGeom: Geometry | null = null\n let wheelZoom: { scale: number; x: number; y: number } | null = null\n let wheelTimer: ReturnType<typeof setTimeout> | undefined\n\n const commitWheel = () => {\n wheelTimer = undefined\n wheelGeom = null\n if (wheelZoom) {\n commit(wheelZoom) // already clamped per tick\n wheelZoom = null\n }\n }\n // Force any settle-pending wheel zoom into the store NOW. Called before a competing interaction\n // (pointer down, double-click) snapshots its zoom base, and on teardown, so the wheel result is\n // never clobbered by a stale base nor silently dropped (review #1/#4).\n const flushWheel = () => {\n if (wheelTimer) {\n clearTimeout(wheelTimer)\n commitWheel()\n }\n }\n\n const onDown = (e: PointerEvent) => {\n flushWheel() // commit a pending wheel zoom before snapshotting startZoom from the store\n pointers.set(e.pointerId, { x: e.clientX, y: e.clientY })\n // NB: do NOT capture the pointer here. The stage hosts interactive overlay/plugin UI (e.g. the\n // grid cells, which live inside .gallerist-stage); capturing on every pointerdown would redirect\n // the pointerup and swallow their click. Capture only once a real drag/pinch is recognized\n // (in onMove, and the pinch branch below), so a tap still delivers its click to the target (C3).\n startZoom = { ...viewer.getState().zoom }\n live = { ...startZoom }\n gestureGeom = getGeometry() // snapshot once; reused for the gesture (no per-move layout)\n if (pointers.size === 1) {\n start = { x: e.clientX, y: e.clientY }\n intent = 'none'\n } else if (pointers.size === 2) {\n const [a, b] = [...pointers.values()]\n if (a && b) pinchStartDist = dist(a, b)\n intent = 'zoom'\n for (const id of pointers.keys()) capture(id) // a pinch is unambiguously a gesture\n }\n }\n\n const resolveIntent = (dx: number, dy: number): Intent => {\n const g = geom()\n return arbitrate({\n pointerCount: pointers.size === 0 ? 1 : pointers.size,\n dx,\n dy,\n scale: startZoom.scale,\n fitScale: g.naturalSize ? fit() : startZoom.scale,\n grouped: currentGroupHasMultiple(viewer),\n threshold,\n })\n }\n\n const onMove = (e: PointerEvent) => {\n if (!pointers.has(e.pointerId)) return\n pointers.set(e.pointerId, { x: e.clientX, y: e.clientY })\n\n if (intent === 'zoom' && pointers.size >= 2) {\n const [a, b] = [...pointers.values()]\n if (!a || !b || pinchStartDist === 0) return\n const factor = dist(a, b) / pinchStartDist\n const newScale = clampScale(startZoom.scale * factor, fit(), maxScale)\n live = focalZoom(startZoom, toStage(mid(a, b)), newScale)\n schedule()\n return\n }\n\n if (!start) return\n const dx = e.clientX - start.x\n const dy = e.clientY - start.y\n\n if (intent === 'none') {\n intent = resolveIntent(dx, dy)\n // Now that this is a real drag (not a tap), capture so move/up keep flowing even off-stage\n // — without stealing the click from a tap that never moved (C3).\n if (intent !== 'none') capture(e.pointerId)\n }\n\n if (intent === 'pan') {\n live = { scale: startZoom.scale, x: startZoom.x + dx, y: startZoom.y + dy }\n schedule()\n } else if (intent === 'close') {\n const k = Math.max(0.5, 1 - Math.abs(dy) / 1000)\n live = { scale: startZoom.scale * k, x: startZoom.x + dx, y: startZoom.y + dy }\n dismissEl.style.setProperty(\n '--gallerist-dismiss',\n String(Math.min(1, Math.abs(dy) / closeDismiss)),\n )\n schedule()\n }\n // navigate / secondary are committed on release (track animation lands in M5)\n }\n\n const onUp = (e: PointerEvent) => {\n if (!pointers.has(e.pointerId)) return\n pointers.delete(e.pointerId)\n release(e.pointerId)\n if (frame) {\n caf(frame)\n frame = 0\n }\n\n // Pinch → single-finger handoff: when the first of two fingers lifts, commit the pinch\n // zoom now and re-seat the gesture onto the remaining finger so it continues as a fresh\n // pan/swipe. Otherwise the lingering finger is dead until the second finger lifts (I-R2).\n if (intent === 'zoom' && pointers.size === 1) {\n live = settle(live)\n commit(live)\n const [remaining] = [...pointers.values()]\n startZoom = { ...live }\n start = remaining ? { x: remaining.x, y: remaining.y } : null\n intent = 'none'\n return\n }\n\n // Use the up event's own coordinates: coalesced input may have fired no pointermove,\n // leaving the stored position stale at the down point.\n const dx = start ? e.clientX - start.x : 0\n const dy = start ? e.clientY - start.y : 0\n\n // Resolve at release too: synthetic/coalesced input may deliver no pointermove\n // before pointerup, leaving intent unresolved otherwise.\n if (intent === 'none') intent = resolveIntent(dx, dy)\n\n switch (intent) {\n case 'pan':\n commit(settle(live))\n break\n case 'zoom':\n if (pointers.size === 0) commit(settle(live))\n break\n case 'navigate':\n if (Math.abs(dx) >= commitNav) dx < 0 ? nav.next() : nav.prev()\n break\n case 'close':\n dismissEl.style.removeProperty('--gallerist-dismiss')\n if (Math.abs(dy) >= closeDismiss) viewer.close()\n else commit(startZoom) // snap back from the drag-to-dismiss shrink\n break\n case 'secondary':\n // Arbitration only yields 'secondary' for an upward drag (downward is dismiss), and like\n // the group axis it needs a real commit distance — not just the 10px intent threshold.\n if (-dy >= commitNav) nav.nextItem()\n break\n }\n\n if (pointers.size === 0) {\n start = null\n intent = 'none'\n gestureGeom = null\n }\n }\n\n // pointercancel means the browser took the pointer away (a system gesture, palm rejection, a\n // scroll takeover): abandon the whole gesture rather than treating it as a release, which could\n // navigate or dismiss from a drag the user never finished. Snap back to the committed transform.\n const onCancel = (e: PointerEvent) => {\n if (!pointers.has(e.pointerId)) return\n for (const id of pointers.keys()) release(id)\n pointers.clear()\n if (frame) {\n caf(frame)\n frame = 0\n }\n dismissEl.style.removeProperty('--gallerist-dismiss')\n const content = getContent()\n if (content) content.style.transform = zoomTransform(viewer.getState().zoom)\n start = null\n intent = 'none'\n gestureGeom = null\n }\n\n const onWheel = (e: WheelEvent) => {\n e.preventDefault()\n if (!wheelGeom) wheelGeom = getGeometry()\n const g = wheelGeom\n const base = wheelZoom ?? viewer.getState().zoom\n const factor = e.deltaY < 0 ? 1.15 : 1 / 1.15\n // clamp the scale before pivoting (so the cursor point stays put), then settle the pan; uses\n // the burst's geometry snapshot, never a fresh measure per tick\n const newScale = clampScale(base.scale * factor, fitOf(g), maxScale)\n const focal = { x: e.clientX - g.stageRect.left, y: e.clientY - g.stageRect.top }\n wheelZoom = settle(focalZoom(base, focal, newScale), g)\n live = { ...wheelZoom }\n schedule()\n if (wheelTimer) clearTimeout(wheelTimer)\n wheelTimer = setTimeout(commitWheel, WHEEL_COMMIT_MS)\n }\n\n const onDblClick = (e: MouseEvent) => {\n // a double click on a control in the stage (a pin, a card's link) belongs to that control\n const hit = e.target as Element | null\n if (hit?.closest?.('button, a[href], input, select, textarea, [data-interactive]')) return\n flushWheel() // commit a pending wheel zoom before reading the base for the toggle\n const z = viewer.getState().zoom\n const target = toggleZoom(z.scale, fit(), maxScale)\n commit(settle(focalZoom(z, toStage({ x: e.clientX, y: e.clientY }), target)))\n }\n\n // A mouse drag over the media starts the browser's native image drag-and-drop, which fires\n // pointercancel and steals the gesture. Block it on the media only: overlays and plugin UI in the\n // stage keep their own drag-and-drop.\n const onDragStart = (e: Event) => {\n const target = e.target as Element | null\n const content = getContent()\n if (!target || !content?.contains(target)) return\n if (target.closest?.('.gallerist-overlays-content')) return\n e.preventDefault()\n }\n\n stage.addEventListener('dragstart', onDragStart)\n stage.addEventListener('pointerdown', onDown)\n stage.addEventListener('pointermove', onMove)\n stage.addEventListener('pointerup', onUp)\n stage.addEventListener('pointercancel', onCancel)\n stage.addEventListener('wheel', onWheel, { passive: false })\n stage.addEventListener('dblclick', onDblClick)\n\n return () => {\n stage.removeEventListener('dragstart', onDragStart)\n stage.removeEventListener('pointerdown', onDown)\n stage.removeEventListener('pointermove', onMove)\n stage.removeEventListener('pointerup', onUp)\n stage.removeEventListener('pointercancel', onCancel)\n stage.removeEventListener('wheel', onWheel)\n stage.removeEventListener('dblclick', onDblClick)\n if (frame) caf(frame)\n flushWheel() // commit a settle-pending wheel zoom rather than dropping it on teardown\n }\n}\n\nfunction currentGroupHasMultiple(viewer: ViewerApi): boolean {\n const col = viewer.getCollection()\n const g = viewer.getState().cursor.g\n return (col.groups[g]?.items.length ?? 0) > 1\n}\n","// Idle controller (M14 UX-C). Flags the root with `data-gallerist-idle` after a period of no pointer/\n// key activity so the theme can fade the chrome + rail; any activity wakes it. Inert under\n// prefers-reduced-motion — auto-hiding UI is disorienting motion, so we never hide there.\n\nconst ATTR = 'data-gallerist-idle'\nconst ACTIVITY = ['pointermove', 'pointerdown', 'keydown', 'wheel', 'touchstart'] as const\n// pointermove fires many times/second — re-arm the timer at most this often to avoid timer churn.\nconst REARM_THROTTLE_MS = 200\n\nexport interface IdleControllerOptions {\n /** inactivity before idle (ms). default 2500. */\n delay?: number\n /** override reduced-motion detection (mainly for tests). */\n reducedMotion?: boolean\n}\n\nexport interface IdleController {\n /** reset the timer and wake (clear idle). */\n poke(): void\n destroy(): void\n}\n\nfunction prefersReducedMotion(root: HTMLElement): boolean {\n const win = root.ownerDocument?.defaultView\n return win?.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false\n}\n\nexport function createIdleController(\n root: HTMLElement,\n opts: IdleControllerOptions = {},\n): IdleController {\n const delay = opts.delay ?? 2500\n const reduced = opts.reducedMotion ?? prefersReducedMotion(root)\n\n // Under reduced motion (or no real timers), return an inert controller — chrome stays visible.\n if (reduced) {\n return { poke() {}, destroy() {} }\n }\n\n let timer: ReturnType<typeof setTimeout> | null = null\n let alive = true\n let lastArm = 0\n let isIdle = false\n\n // Only touch the attribute when the idle state actually flips — onActivity runs on every\n // pointermove/wheel during gestures, so an unconditional removeAttribute is a wasted DOM call\n // per input event (S-PERF3).\n const wake = () => {\n if (!isIdle) return\n isIdle = false\n root.removeAttribute(ATTR)\n }\n const goIdle = () => {\n if (!alive || isIdle) return\n isIdle = true\n root.setAttribute(ATTR, '')\n }\n const arm = () => {\n if (timer != null) clearTimeout(timer)\n timer = setTimeout(goIdle, delay)\n lastArm = Date.now()\n }\n // forced reset (public poke) — wake immediately and re-arm.\n const poke = () => {\n wake()\n arm()\n }\n // activity handler — wake instantly, but coalesce re-arming so a stream of pointermoves\n // doesn't recreate the timer on every event.\n const onActivity = () => {\n wake()\n if (Date.now() - lastArm >= REARM_THROTTLE_MS) arm()\n }\n\n for (const ev of ACTIVITY) root.addEventListener(ev, onActivity, { passive: true })\n arm()\n\n return {\n poke,\n destroy() {\n alive = false\n if (timer != null) clearTimeout(timer)\n for (const ev of ACTIVITY) root.removeEventListener(ev, onActivity)\n root.removeAttribute(ATTR)\n },\n }\n}\n","// Overlay positioning math (spec §9.1). Pure — maps content/viewport anchors to box geometry\n// within the content layer (which is CSS-contained, so natural coords map through the contain rect).\n\nimport type { ContentAnchor, OverlaySpec, ViewportAnchor } from '@gallerist/core'\n\nexport interface Size {\n w: number\n h: number\n}\nexport interface ContainRect {\n x: number\n y: number\n w: number\n h: number\n}\nexport interface OverlayBox {\n left: number\n top: number\n width: number | null\n height: number | null\n}\n\n/** Contain rect of `natural` centered within `container` (object-fit: contain). */\nexport function containRect(container: Size, natural: Size): ContainRect {\n const s = Math.min(container.w / natural.w, container.h / natural.h)\n const w = natural.w * s\n const h = natural.h * s\n return { x: (container.w - w) / 2, y: (container.h - h) / 2, w, h }\n}\n\n/** `rect` is the painted media box when the renderer knows it (framed media); otherwise the media\n * is assumed contained in the whole stage. */\nexport function contentAnchorBox(\n anchor: ContentAnchor,\n stage: Size,\n natural: Size,\n rect: ContainRect = containRect(stage, natural),\n): OverlayBox {\n const s = rect.w / natural.w\n const space = anchor.space ?? 'normalized'\n\n const mapX = (x: number) => (space === 'natural' ? rect.x + x * s : rect.x + x * rect.w)\n const mapY = (y: number) => (space === 'natural' ? rect.y + y * s : rect.y + y * rect.h)\n const mapW = (w: number) => (space === 'natural' ? w * s : w * rect.w)\n const mapH = (h: number) => (space === 'natural' ? h * s : h * rect.h)\n\n if (anchor.kind === 'point') {\n return { left: mapX(anchor.x), top: mapY(anchor.y), width: null, height: null }\n }\n return {\n left: mapX(anchor.x),\n top: mapY(anchor.y),\n width: mapW(anchor.w),\n height: mapH(anchor.h),\n }\n}\n\n/** region → scales with the image by default; point → counter-scaled (constant screen size). */\nexport function resolveScaleWithImage(anchor: ContentAnchor, override?: boolean): boolean {\n if (override !== undefined) return override\n return anchor.kind === 'region'\n}\n\n/** Counter-scale transform that keeps a point overlay a constant screen size under zoom. */\nexport function counterScaleTransform(zoomScale: number): string {\n return `translate(-50%, -50%) scale(${1 / zoomScale})`\n}\n\nexport function viewportAnchorStyle(\n at: ViewportAnchor['at'],\n offset: [number, number] = [0, 0],\n): Record<string, string> {\n const [ox, oy] = offset\n const style: Record<string, string> = { position: 'absolute' }\n\n if (at.startsWith('top')) style.top = `${oy}px`\n else if (at.startsWith('bottom')) style.bottom = `${oy}px`\n else style.top = '50%'\n\n if (at.endsWith('left')) style.left = `${ox}px`\n else if (at.endsWith('right')) style.right = `${ox}px`\n else style.left = '50%'\n\n const tx = at === 'top' || at === 'bottom' || at === 'center' ? '-50%' : '0'\n const ty = at === 'left' || at === 'right' || at === 'center' ? '-50%' : '0'\n if (tx !== '0' || ty !== '0') style.transform = `translate(${tx}, ${ty})`\n\n return style\n}\n\n/** Resolve the overlay sources for a slide (group + item), ordered by layer (spec §9). */\nexport function orderByLayer<T extends OverlaySpec>(specs: T[]): T[] {\n return [...specs].sort((a, b) => (a.layer ?? 0) - (b.layer ?? 0))\n}\n","// Overlay rendering (spec §9). Paints viewport-layer and content-layer overlays for the current\n// slide. Content overlays live inside the transformed content layer so they track pan/zoom for\n// free; point overlays are counter-scaled to hold a constant screen size (decision per §9.1).\n\nimport type { Group, Item, OverlaySpec, ViewerApi, ZoomState } from '@gallerist/core'\nimport { getInternals } from '@gallerist/core/internal'\nimport {\n type Size,\n contentAnchorBox,\n counterScaleTransform,\n orderByLayer,\n resolveScaleWithImage,\n viewportAnchorStyle,\n} from './position'\n\nconst FOCUSABLE = 'a[href], button, input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n\nexport interface OverlayPaintCtx {\n group: Group\n item: Item\n viewer: ViewerApi\n zoom: ZoomState\n stage: Size\n natural: Size\n /** the painted media box in content space (framed media insets it) */\n box?: { x: number; y: number; w: number; h: number }\n}\n\n/** A painted overlay, retained so zoom-only updates can adjust it without re-rendering. */\nexport interface OverlayEntry {\n el: HTMLElement\n spec: OverlaySpec\n counterScaled: boolean\n}\n\nexport function gatherOverlays(group: Group, item: Item, globals: OverlaySpec[]): OverlaySpec[] {\n return [...globals, ...(group.overlays ?? []), ...(item.overlays ?? [])]\n}\n\n/**\n * Update retained overlays for a zoom change WITHOUT rebuilding (spec §9.2: no extra layout,\n * never re-invoke user render()). Refreshes visibleAt visibility and point counter-scale.\n */\nexport function updateOverlays(entries: OverlayEntry[], zoomScale: number): void {\n for (const { el, spec, counterScaled } of entries) {\n const visible =\n !spec.visibleAt || (zoomScale >= spec.visibleAt[0] && zoomScale <= spec.visibleAt[1])\n el.style.display = visible ? '' : 'none'\n if (counterScaled) el.style.transform = counterScaleTransform(zoomScale)\n }\n}\n\nexport function paintOverlays(\n viewportHost: HTMLElement,\n contentHost: HTMLElement,\n specs: OverlaySpec[],\n ctx: OverlayPaintCtx,\n): OverlayEntry[] {\n // a repaint must not drop keyboard focus to <body>: remember which overlay had it\n const active = document.activeElement\n const focusedId =\n active && (viewportHost.contains(active) || contentHost.contains(active))\n ? active.closest<HTMLElement>('[data-overlay]')?.dataset.overlay\n : undefined\n viewportHost.replaceChildren()\n contentHost.replaceChildren()\n const entries: OverlayEntry[] = []\n\n for (const spec of orderByLayer(specs)) {\n const host = document.createElement('div')\n host.className = spec.class ? `gallerist-overlay ${spec.class}` : 'gallerist-overlay'\n host.dataset.overlay = spec.id\n host.style.position = 'absolute'\n if (spec.layer !== undefined) host.style.zIndex = String(spec.layer)\n host.style.pointerEvents = spec.interactive ? 'auto' : 'none'\n\n const visible =\n !spec.visibleAt ||\n (ctx.zoom.scale >= spec.visibleAt[0] && ctx.zoom.scale <= spec.visibleAt[1])\n if (!visible) host.style.display = 'none'\n\n if (spec.interactive) {\n host.dataset.interactive = '' // the stage's double-click zoom leaves it alone\n host.addEventListener('click', () =>\n getInternals(ctx.viewer).emit('overlayClick', {\n viewer: ctx.viewer,\n cursor: ctx.viewer.getState().cursor,\n group: ctx.group,\n item: ctx.item,\n id: spec.id,\n }),\n )\n } else {\n host.setAttribute('aria-hidden', 'true')\n }\n\n const out = spec.render({\n group: ctx.group,\n item: ctx.item,\n zoom: ctx.zoom,\n viewer: ctx.viewer,\n })\n if (typeof out === 'string') host.textContent = out\n else host.appendChild(out)\n // an interactive overlay is reachable by keyboard: through its own controls when it has any\n // (a pin's button), otherwise the host itself takes focus\n if (spec.interactive && !host.querySelector(FOCUSABLE)) host.tabIndex = 0\n\n let counterScaled = false\n if (spec.anchor.kind === 'viewport') {\n Object.assign(host.style, viewportAnchorStyle(spec.anchor.at, spec.anchor.offset))\n viewportHost.appendChild(host)\n } else {\n const box = contentAnchorBox(spec.anchor, ctx.stage, ctx.natural, ctx.box)\n host.style.left = `${box.left}px`\n host.style.top = `${box.top}px`\n if (box.width !== null) host.style.width = `${box.width}px`\n if (box.height !== null) host.style.height = `${box.height}px`\n counterScaled = !resolveScaleWithImage(spec.anchor, spec.scaleWithImage)\n if (counterScaled) host.style.transform = counterScaleTransform(ctx.zoom.scale)\n contentHost.appendChild(host)\n }\n entries.push({ el: host, spec, counterScaled })\n }\n if (focusedId) {\n const host = entries.find((e) => e.spec.id === focusedId)?.el\n const target =\n host?.querySelector<HTMLElement>(FOCUSABLE) ?? (host?.tabIndex === 0 ? host : null)\n target?.focus({ preventScroll: true })\n }\n return entries\n}\n","// Layout presets (M14 UX-E). A preset bundles a coherent set of layout choices — arrow placement,\n// chrome auto-hide, and the thumbnail rail's secondary-axis layout / time-ribbon — behind a single\n// name. Pure resolver (no DOM): the renderer applies `rootAttrs` + `arrows`/`autoHide`, and hands\n// the preset to plugin regions (RegionCtx.preset), so thumbnails() takes `thumbnails` as defaults.\n\nimport type { ArrowLayout, GroupAxis, ItemIndicator, RailPlacement } from './mount'\n\nexport type PresetName = 'filmstrip' | 'immersive' | 'reviewer' | 'contact' | 'editorial' | 'tour'\n\n// A type alias, not an interface, so it is a core `PresetDefaults` (the region context's `preset`).\n// Read-only through and through: the built-in presets are frozen, so a write fails at compile time\n// rather than throwing (strict mode) or being ignored at run time.\nexport type ResolvedPreset = {\n /** data-* attributes the renderer sets on the root (drives the theme). */\n readonly rootAttrs: Readonly<Record<string, string>>\n /** default arrow placement (overridable by an explicit mount option). */\n readonly arrows: ArrowLayout\n /** default chrome auto-hide-on-idle (overridable). */\n readonly autoHide: boolean\n /** default thumbnail rail placement (overridable). */\n readonly rail: RailPlacement\n /** thumbnails() defaults: the plugin applies them to the options it wasn't given. */\n readonly thumbnails: Readonly<{\n itemAxis: 'vertical' | 'horizontal'\n groupDisplay?: 'stacked' | 'flat' | 'index'\n timeline?: boolean\n numberItems?: boolean\n }>\n /** turn on the zoom navigator by default (overridable). */\n readonly navigator?: boolean\n /** frame the media (overridable). */\n readonly frame?: boolean\n /** default item indicator (overridable). */\n readonly itemIndicator?: ItemIndicator\n /** which arrow keys and on-screen arrows move between groups, if not the rail's own (overridable). */\n readonly groupAxis?: GroupAxis\n /** name the group arrows after the group they go to (overridable). */\n readonly arrowLabels?: boolean\n}\n\nconst PRESETS: Record<PresetName, ResolvedPreset> = {\n // classic lightbox: bottom rail, side arrows, persistent chrome.\n filmstrip: {\n rootAttrs: { 'data-gallerist-preset': 'filmstrip' },\n arrows: 'pill-right',\n autoHide: false,\n rail: 'bottom',\n thumbnails: { itemAxis: 'vertical' },\n navigator: false,\n },\n // full-bleed: rail hidden by default, chrome auto-hides on idle, minimal UI.\n immersive: {\n rootAttrs: { 'data-gallerist-preset': 'immersive' },\n arrows: 'pill-right',\n autoHide: true,\n rail: 'hidden',\n thumbnails: { itemAxis: 'vertical' },\n navigator: false,\n },\n // time-series reviewer: a bottom timeline rail (a time over each group, from group.meta.time),\n // numbered items, the zoom navigator, and no control over the media (review needs every pixel):\n // docked arrows, the item navigator on the item column or the caption row.\n reviewer: {\n rootAttrs: { 'data-gallerist-preset': 'reviewer' },\n arrows: 'docked',\n autoHide: false,\n rail: 'bottom',\n thumbnails: { itemAxis: 'vertical', timeline: true, numberItems: true },\n navigator: true,\n },\n // a gallery wall: the work framed with room around it, a placard beside it (caption + item\n // navigator), numbered items inline in a bottom rail. Pairs with `skin: 'editorial'`.\n editorial: {\n rootAttrs: { 'data-gallerist-preset': 'editorial' },\n arrows: 'pill-right',\n autoHide: false,\n rail: 'bottom',\n thumbnails: { itemAxis: 'horizontal', numberItems: true },\n frame: true,\n itemIndicator: 'placard',\n },\n // a walkthrough of named sections: a section index down the side (names, counts, the active section\n // expanded), ←/→ between sections on labelled arrows, ↑/↓ within one, and framed media so nothing\n // covers the photo. Pairs with `grid({ layout: 'sections', startOpen: true })`.\n tour: {\n rootAttrs: { 'data-gallerist-preset': 'tour' },\n arrows: 'pill-right',\n autoHide: false,\n rail: 'left',\n thumbnails: { itemAxis: 'horizontal', groupDisplay: 'index', numberItems: true },\n frame: true,\n itemIndicator: 'dots',\n groupAxis: 'horizontal',\n arrowLabels: true,\n },\n // browse-heavy: a vertical rail down the right edge (pairs well with the grid plugin).\n contact: {\n rootAttrs: { 'data-gallerist-preset': 'contact' },\n arrows: 'pill-right',\n autoHide: false,\n rail: 'right',\n thumbnails: { itemAxis: 'vertical' },\n navigator: false,\n },\n}\n\n// The entries are shared by every mount and handed to plugins (RegionCtx.preset): freeze them, so a\n// plugin writing to one can't change the preset for the next mount.\nfor (const p of Object.values(PRESETS))\n for (const o of [p.rootAttrs, p.thumbnails, p]) Object.freeze(o)\n\n/** Resolve a preset name to its layout config; unknown names warn (dev) and fall back to `filmstrip`. */\nexport function resolvePreset(name: string): ResolvedPreset {\n const preset = PRESETS[name as PresetName]\n if (!preset && typeof console !== 'undefined') {\n console.warn(`[gallerist] unknown preset \"${name}\" — falling back to \"filmstrip\"`)\n }\n return preset ?? PRESETS.filmstrip\n}\n","// Region mounting (spec §13). The renderer exposes named region hosts; plugins inject Nodes.\n// toolbar/footer/aside are additive (many plugins contribute buttons or panels); thumbnails/stage/\n// backdrop/caption are exclusive (one owner) — a second claim warns and the last wins.\n\nimport type { PluginInstance, RegionCtx, RegionName } from '@gallerist/core'\n\nexport type RegionHosts = Record<RegionName, HTMLElement>\n\nconst ADDITIVE: ReadonlySet<string> = new Set(['toolbar', 'footer', 'aside'])\n\n/**\n * Returns a function that mounts the current plugin set's regions into their hosts; call it at\n * mount and on every plugin change. Each plugin's region renderer runs once (its Node is cached per\n * plugin instance, as PLUGIN-AUTHORING promises), and only hosts whose node list changed are\n * touched, so unrelated plugin churn (a React <Gallerist.Overlay> mounting) leaves region DOM,\n * focus and scroll position alone.\n */\nexport function createRegionMounter(\n hosts: RegionHosts,\n ctx: RegionCtx,\n): (plugins: readonly PluginInstance[]) => void {\n const rendered = new WeakMap<PluginInstance, Map<string, Node>>()\n const applied = new Map<HTMLElement, Node[]>()\n\n return (plugins) => {\n const desired = new Map<HTMLElement, Node[]>()\n for (const host of Object.values(hosts)) desired.set(host, [])\n const claimedBy = new Map<string, string>()\n for (const plugin of plugins) {\n if (!plugin.regions) continue\n let nodes = rendered.get(plugin)\n if (!nodes) {\n nodes = new Map()\n rendered.set(plugin, nodes)\n }\n for (const [name, render] of Object.entries(plugin.regions)) {\n if (!render) continue\n const host = hosts[name]\n if (!host) {\n // RegionName is open-ended in the contract, but the DOM renderer hosts only a fixed set;\n // warn instead of silently dropping the plugin's UI (review S-A2).\n console.warn(\n `[gallerist] plugin \"${plugin.name}\" targets region \"${name}\", which the default renderer does not host`,\n )\n continue\n }\n let node = nodes.get(name)\n if (!node) {\n node = render(ctx)\n nodes.set(name, node)\n }\n const list = desired.get(host) ?? []\n if (!ADDITIVE.has(name) && claimedBy.has(name)) {\n console.warn(\n `[gallerist] region \"${name}\" claimed by multiple plugins; \"${plugin.name}\" wins over \"${claimedBy.get(name)}\"`,\n )\n list.length = 0\n }\n list.push(node)\n desired.set(host, list)\n if (!ADDITIVE.has(name)) claimedBy.set(name, plugin.name)\n }\n }\n for (const [host, list] of desired) {\n const prev = applied.get(host) ?? []\n if (prev.length === list.length && prev.every((n, i) => n === list[i])) continue\n reconcile(host, prev, list)\n applied.set(host, list)\n }\n }\n}\n\n// Move the host from `prev` to `next` plugin nodes with the fewest DOM moves: nodes that stay in\n// order are never detached (keeping focus, scroll and running transitions), and nodes the renderer\n// added itself (the rail handle) are left alone.\nfunction reconcile(host: HTMLElement, prev: Node[], next: Node[]): void {\n const keep = new Set(next)\n for (const node of prev) if (!keep.has(node) && node.parentNode === host) host.removeChild(node)\n let before: Node | null = null\n for (const node of next) {\n if (before) {\n if (before.nextSibling !== node) host.insertBefore(node, before.nextSibling)\n } else if (node.parentNode !== host) {\n host.appendChild(node)\n }\n before = node\n }\n}\n\n/** Aggregate a flat keymap across plugins (later plugins win on key conflicts). */\nexport function aggregateKeymap(\n plugins: readonly PluginInstance[],\n): Record<string, (e: KeyboardEvent) => void> {\n const map: Record<string, (e: KeyboardEvent) => void> = {}\n for (const plugin of plugins) {\n if (plugin.keymap) Object.assign(map, plugin.keymap)\n }\n return map\n}\n","// Every piece of UI text the DOM renderer produces (button labels and the screen-reader\n// announcements), overridable per mount via `mount(viewer, { strings })` for translation. Positions\n// are functions so a language can order the words and numbers itself. Wording stays generic: the\n// renderer never assumes what a group or an item is (\"screen\", \"product\"); data captions carry that.\n\nexport interface Strings {\n /** accessible name of the overlay dialog (the `label` mount option still wins) */\n dialog: string\n /** role description announced for an inline viewer */\n carousel: string\n close: string\n previous: string\n next: string\n previousItem: string\n nextItem: string\n /** name of a labelled group arrow (`arrowLabels`), given the group it goes to */\n previousTo: (name: string) => string\n nextTo: (name: string) => string\n resetZoom: string\n showThumbnails: string\n hideThumbnails: string\n /** name of a caption renderer's band while it scrolls (it then takes focus, to scroll by keyboard) */\n caption: string\n /** label of an item pill in the position indicator */\n item: (n: number) => string\n /** announced on group navigation, e.g. \"Group 2 of 12\" */\n groupOf: (n: number, total: number) => string\n /** announced on item navigation (and for every item in linear mode), e.g. \"Item 3 of 5\" */\n itemOf: (n: number, total: number) => string\n}\n\nexport const DEFAULT_STRINGS: Strings = {\n dialog: 'Media viewer',\n carousel: 'carousel',\n close: 'Close',\n previous: 'Previous',\n next: 'Next',\n previousItem: 'Previous item',\n nextItem: 'Next item',\n previousTo: (name) => `Previous: ${name}`,\n nextTo: (name) => `Next: ${name}`,\n resetZoom: 'Reset zoom',\n showThumbnails: 'Show thumbnails',\n hideThumbnails: 'Hide thumbnails',\n caption: 'Caption',\n item: (n) => `Item ${n}`,\n groupOf: (n, total) => `Group ${n} of ${total}`,\n itemOf: (n, total) => `Item ${n} of ${total}`,\n}\n","// Default DOM renderer (spec §8.3, §10, §17). Subscribes to the headless viewer and\n// projects state into DOM: portal/inline modes, windowed slides + node recycling, the\n// image adapter, minimal chrome, dialog a11y, keyboard map, and the committed zoom transform.\n// Live pan/zoom (imperative RAF) and motion land in M3.4 / M5.\n\nimport type {\n Group,\n Item,\n MediaAdapter,\n MediaSource,\n OverlaySpec,\n Phase,\n ViewerApi,\n ZoomState,\n} from '@gallerist/core'\nimport { clampPanToBox, clampScale, getInternals } from '@gallerist/core/internal'\nimport { imageAdapter, mountImage } from './adapters/image'\nimport { type Accent, type ColorScheme, type Skin, applyAppearance } from './appearance'\nimport { attachGestures } from './gestures'\nimport { ICONS } from './icons'\nimport { type IdleController, createIdleController } from './idle'\nimport { containRect } from './overlays/position'\nimport { type OverlayEntry, gatherOverlays, paintOverlays, updateOverlays } from './overlays/render'\nimport { type PresetName, resolvePreset } from './presets'\nimport { type RegionHosts, aggregateKeymap, createRegionMounter } from './regions'\nimport { DEFAULT_STRINGS, type Strings } from './strings'\nimport { zoomTransform } from './transform'\nimport { reconcileKeys, windowIndices } from './windowing'\n\nexport type ItemIndicator = 'pills' | 'dots' | 'counter' | 'placard'\n\nexport interface MountOptions {\n /** null/undefined → overlay (portal to body); element → inline. */\n container?: HTMLElement | null\n controls?: boolean\n adapters?: MediaAdapter[]\n preload?: { ahead: number; behind: number }\n /** global overlays applied to every slide (spec §8.1, §9). */\n overlays?: OverlaySpec[]\n /**\n * Placement of the within-group ↑/↓ arrows, surfaced as `data-gallerist-arrows` for the theme\n * (UX-D). `pill-right` (default): ←/→ on the side edges, ↑/↓ as a stacked pill at right-center.\n * `corner-br`: ↑/↓ paired bottom-right. `dpad`: all four clustered as a d-pad. `split`: legacy\n * ↑/↓ top/bottom-center. `docked` (the `reviewer` preset): nothing over the media — the group\n * arrows sit in gutters beside the stage, and the item navigator (↑ · `n / N` · ↓) docks as a\n * header on the aside item column when it shows, else at the end of the caption row.\n */\n arrows?: ArrowLayout\n /**\n * Auto-hide the chrome after a period of inactivity (UX-C), flagged as `data-gallerist-idle` for\n * the theme. Default true; inert under prefers-reduced-motion. The thumbnail rail collapses\n * separately (the `t` key / toggle button / fullscreen), tracked as `data-gallerist-rail`.\n */\n autoHide?: boolean\n /**\n * Named layout preset (UX-E) — sets `data-gallerist-preset` and supplies defaults for `arrows` and\n * `autoHide` (both still overridable by explicit options above). Plugin regions get the preset\n * too: thumbnails() takes `resolvePreset(name).thumbnails` for the options it wasn't given.\n */\n preset?: PresetName\n /**\n * Thumbnail rail placement (UX-E), surfaced as `data-gallerist-rail-pos`. `bottom` (default) keeps\n * the rail horizontal (group axis = ←/→); `left` / `right` run it vertically and remap the\n * keys/arrows (group axis = ↑/↓, items = ←/→ — touch swipes stay conventional); `hidden` starts\n * collapsed (reveal with the toggle / `t` / hover). Overridable; presets supply a default.\n */\n rail?: RailPlacement\n /**\n * Linear traversal (pairs with `thumbnails({ groupDisplay: 'flat' })`). When true, ←/→ walks the\n * flattened item sequence across groups (1a, 1b, 2a, 2b, 2c, 3a…), ↑/↓ retire, the counter shows\n * `item N / total`, and the within-group pills hide — surfaced as `data-gallerist-linear`.\n */\n linear?: boolean\n /**\n * Whether navigation wraps at the ends (mirror of the core `loop` option). Only consulted for\n * `linear` traversal, to wrap the flattened sequence at the global first/last item. Default false.\n */\n loop?: boolean\n /** UI text overrides (button labels, announcements) for translation; merged over English. */\n strings?: Partial<Strings>\n /**\n * How the position within a multi-item group is shown, surfaced as the indicator's `data-mode`.\n * `pills` (default): numbered pills up to 8 items, then `n / N`. `dots`: plain dots with the\n * `n / N` count, up to 12 items, then the count alone. `counter`: always `n / N`. `placard`: the\n * whole item navigator (↑ · ticks · `n / N` · ↓) moves into the caption, which becomes a label\n * beside the work in the `editorial` preset. On a touch screen the theme shows the count only\n * (swipes navigate).\n */\n itemIndicator?: ItemIndicator\n /**\n * Visual skin (`data-gallerist-skin`, default `gallery`). Other skins need their stylesheet loaded\n * after gallerist.css, e.g. `@gallerist/theme-default/console.css` for `console`.\n */\n skin?: Skin\n /** The skin's accent by name (`data-gallerist-accent`); unset uses the skin's default. */\n accent?: Accent\n /** `dark`, `light`, or `auto` to follow the system (`data-gallerist-scheme`); unset, the skin's\n * own default (Gallery and Console dark, Editorial light). */\n scheme?: ColorScheme\n /**\n * Zoom navigator: while zoomed in, a minimap of the image in the stage's bottom corner with a box\n * for the visible part; click or drag it to move around. Default off (the `reviewer` preset turns\n * it on). Part of the built-in controls, so `controls: false` has none.\n */\n navigator?: boolean\n /**\n * Framed media: the image hangs inside the stage with room around it (the skin's\n * `--gallerist-frame-inset`), and the media element is sized to the image itself so a skin can\n * give it a mat and a shadow. Zoom bounds, overlays and pins follow the framed box. Default off\n * (the `editorial` preset turns it on).\n */\n frame?: boolean\n /**\n * Which arrow keys and on-screen arrows move between groups. Default: follows the rail (`horizontal`\n * with a bottom rail, `vertical` with a side rail). The `tour` preset keeps `horizontal` beside a\n * side rail, so ←/→ moves between sections while ↑/↓ moves within one.\n */\n groupAxis?: GroupAxis\n /**\n * Name the group arrows after the group they go to: `true` uses `group.caption`, a function returns\n * the label. Needs horizontal group arrows in the `pill-right` layout; otherwise ignored. The name\n * also goes into the arrow's accessible name (`strings.previousTo` / `nextTo`).\n */\n arrowLabels?: boolean | ((group: Group, index: number) => string | undefined)\n /** Accessible name for the overlay dialog (default 'Media viewer'); sets aria-label. */\n label?: string\n /** Element (or getter) to return focus to when the overlay closes. Falls back to whatever\n * had focus when it opened — useful when the trigger lives in a tree that may have unmounted. */\n returnFocus?: HTMLElement | (() => HTMLElement | null)\n}\n\nexport type ArrowLayout = 'pill-right' | 'corner-br' | 'dpad' | 'split' | 'docked'\nexport type RailPlacement = 'bottom' | 'hidden' | 'left' | 'right'\nexport type GroupAxis = 'horizontal' | 'vertical'\n\nexport interface RendererHandle {\n root: HTMLElement\n destroy(): void\n}\n\ninterface SlideRec {\n slide: HTMLElement\n content: HTMLElement\n overlayHost: HTMLElement\n itemId?: string\n media?: ReturnType<MediaAdapter['mount']>\n abort?: AbortController\n overlayEls?: OverlayEntry[]\n /** the item whose overlays are painted; a new object (changed data) repaints them */\n overlayItem?: Item\n activated?: boolean\n}\n\n/** A plain URL for a media source (loader and tiled sources have none). */\nconst sourceUrl = (source: MediaSource | undefined): string | null =>\n typeof source === 'string' ? source : source && 'src' in source ? source.src : null\n\n/** A text caption, or '' for anything else (untyped data may still hold an old caption object). */\nconst str = (x: unknown): string => (typeof x === 'string' ? x : '')\n\nlet mounts = 0 // ids for the caption, which describes the viewer (aria-describedby)\n\nfunction el(tag: string, className?: string, attrs?: Record<string, string>): HTMLElement {\n const node = document.createElement(tag)\n if (className) node.className = className\n if (attrs) for (const [k, v] of Object.entries(attrs)) node.setAttribute(k, v)\n return node\n}\n\nconst FOCUSABLE_SELECTOR =\n 'a[href],area[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),iframe,[tabindex],[contenteditable=\"true\"]'\n/** Tabbable descendants of `root`, in DOM order (used by the dialog focus trap). */\nfunction focusableWithin(root: HTMLElement): HTMLElement[] {\n return [...root.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)].filter(\n // a hidden control can't take focus: counted as the last one, it would let Tab out of the trap\n (node) =>\n node.tabIndex !== -1 && !node.hasAttribute('disabled') && node.checkVisibility?.() !== false,\n )\n}\n/** True when the key event originates from a control where typing must not be hijacked. */\nfunction isEditableTarget(target: EventTarget | null): boolean {\n const node = target as HTMLElement | null\n return !!node && (node.isContentEditable || /^(input|textarea|select)$/i.test(node.tagName ?? ''))\n}\n\n/** Longest animation (delay + duration × iterations) in ms from a computed style's comma lists.\n * An infinite animation counts one iteration: it never ends, so the timer settles after one. */\nfunction animationMs(style: CSSStyleDeclaration): number {\n const ms = (v: string) => {\n const n = Number.parseFloat(v)\n if (!Number.isFinite(n)) return 0\n return v.trim().endsWith('ms') ? n : n * 1000\n }\n const count = (v: string | undefined) => {\n const n = Number.parseFloat(v ?? '1')\n return Number.isFinite(n) && n > 0 ? n : 1\n }\n const at = (list: string[], i: number) => list[i % list.length]\n const durations = style.animationDuration.split(',')\n const delays = style.animationDelay.split(',')\n const iterations = (style.animationIterationCount || '1').split(',')\n return Math.max(\n 0,\n ...durations.map((d, i) => ms(at(delays, i) ?? '0s') + ms(d) * count(at(iterations, i))),\n )\n}\n\n/** Max committed zoom (fit == 1 in the contained model); shared by gestures, keys and bounds. */\nconst MAX_ZOOM = 4\n\nfunction applyTransform(content: HTMLElement, zoom: ZoomState): void {\n content.style.transform = zoomTransform(zoom)\n}\n\n// Body scroll-lock is shared across all open overlay viewers: the original overflow is\n// captured when the first overlay opens and restored only when the last one is removed. A\n// per-instance capture would let a viewer opened over another record the already-locked\n// 'hidden' as the value to restore, permanently locking page scroll (S-R2). Presence is read\n// from the DOM (the overlay roots themselves) so it self-corrects and never leaks a count.\nlet savedBodyOverflow = ''\nconst anyOverlayMounted = () =>\n !!document.querySelector('.gallerist[data-gallerist-mode=\"overlay\"]')\nfunction lockBodyScroll(): void {\n if (!anyOverlayMounted()) savedBodyOverflow = document.body.style.overflow // first of the stack\n document.body.style.overflow = 'hidden'\n}\nfunction unlockBodyScroll(): void {\n if (!anyOverlayMounted()) document.body.style.overflow = savedBodyOverflow // last one removed\n}\n\n// Background inerting is shared across stacked overlays via the same DOM-presence model as the\n// scroll-lock: every element we mark is tracked module-wide, and inert is only released when the\n// last overlay is gone — so closing an overlay out of LIFO order can't un-inert the page while\n// another modal is still open (review #6, C5).\nconst inertedByGallerist = new Set<HTMLElement>()\nfunction inertBackground(root: HTMLElement): void {\n for (const child of [...document.body.children]) {\n if (child !== root && child instanceof HTMLElement && !child.hasAttribute('inert')) {\n child.setAttribute('inert', '')\n inertedByGallerist.add(child)\n }\n }\n}\nfunction releaseBackgroundInert(): void {\n if (anyOverlayMounted()) return // another overlay still needs the page inert\n for (const el of inertedByGallerist) el.removeAttribute('inert')\n inertedByGallerist.clear()\n}\n\nexport function mount(viewer: ViewerApi, opts: MountOptions = {}): RendererHandle {\n const overlay = !opts.container\n const container = opts.container ?? null\n const controls = opts.controls ?? true\n const preload = opts.preload ?? { ahead: 2, behind: 1 }\n const preset = opts.preset ? resolvePreset(opts.preset) : undefined\n const arrows: ArrowLayout = opts.arrows ?? preset?.arrows ?? 'pill-right'\n const autoHide = opts.autoHide ?? preset?.autoHide ?? true\n const showNavigator = opts.navigator ?? preset?.navigator ?? false\n const frame = opts.frame ?? preset?.frame ?? false\n const rail: RailPlacement = opts.rail ?? preset?.rail ?? 'bottom'\n const railHidden = rail === 'hidden'\n const railPos = rail === 'hidden' ? 'bottom' : rail // bottom | left | right\n // left/right rails run vertically, so the group axis becomes ↑/↓ and items ←/→ (point 5). Touch\n // swipes stay conventional (horizontal = group, swipe-down = dismiss) — only keys/arrows/layout flip.\n const orientation: 'horizontal' | 'vertical' =\n rail === 'left' || rail === 'right' ? 'vertical' : 'horizontal'\n const groupAxis: GroupAxis = opts.groupAxis ?? preset?.groupAxis ?? orientation\n const vertical = groupAxis === 'vertical'\n const linear = opts.linear ?? false\n const arrowLabelsOpt = opts.arrowLabels ?? preset?.arrowLabels ?? false\n const arrowLabel: ((group: Group, index: number) => string | undefined) | null =\n !arrowLabelsOpt || !controls || vertical || linear || arrows !== 'pill-right'\n ? null\n : arrowLabelsOpt === true\n ? (group) => str(group.caption)\n : arrowLabelsOpt\n // Default to the viewer's resolved loop so linear traversal and the slide window agree; an\n // explicit mount({ loop }) still overrides for the rare case they should differ (review #2).\n const loop = opts.loop ?? viewer.loop\n const ui: Strings = { ...DEFAULT_STRINGS, ...opts.strings }\n const itemIndicator: ItemIndicator = opts.itemIndicator ?? preset?.itemIndicator ?? 'pills'\n const placard = itemIndicator === 'placard'\n\n // Aggregate plugin extensions (adapters/overlays captured at mount; regions + keymap re-applied\n // live on plugin changes, see below). Plugins register on the viewer (decision P1-C).\n const internals = getInternals(viewer)\n const plugins = internals.getPlugins()\n const baseAdapters = opts.adapters ?? [imageAdapter()]\n // Adapters, overlays, and keymap are recomputed live so a plugin added via use() after mount\n // contributes all of its extensions, not just regions (review T4 / Important #5).\n const currentAdapters = () => [\n ...baseAdapters,\n ...internals.getPlugins().flatMap((p) => p.mediaAdapters ?? []),\n ]\n // A plugin's overlays are a list, or a function of the slide (per-item pins, annotations).\n const currentGlobalOverlays = (group: Group, item: Item) => [\n ...(opts.overlays ?? []),\n ...internals\n .getPlugins()\n .flatMap((p) =>\n typeof p.overlays === 'function' ? p.overlays({ group, item }) : (p.overlays ?? []),\n ),\n ]\n let pluginKeymap = aggregateKeymap(plugins)\n\n const pickAdapter = (type: string, item: Parameters<MediaAdapter['mount']>[0]) =>\n currentAdapters().find((a) => (a.match ? a.match(item) : a.type === type))\n\n // ── navigation routing (linear flat traversal, point 3) ──────────────────────\n // In linear mode ←/→ walks the flattened (g,i) sequence across groups (1a,1b,2a,2b,2c,3a…) and\n // ↑/↓ retire; the flat list is cached and rebuilt only when the collection changes. `nav.*` is the\n // single seam the keymap, arrow buttons, and gestures route through, so behavior follows the mode.\n let flatSeq: Array<{ g: number; i: number }> = []\n let flatIdx = new Map<string, number>()\n let flatCol: unknown = null\n const ensureFlat = () => {\n const col = viewer.getCollection()\n if (col === flatCol) return\n flatCol = col\n flatSeq = []\n flatIdx = new Map()\n col.groups.forEach((grp, g) =>\n grp.items.forEach((_, i) => {\n flatIdx.set(`${g}:${i}`, flatSeq.length)\n flatSeq.push({ g, i })\n }),\n )\n }\n const flatPosition = (g: number, i: number): number => {\n ensureFlat()\n return flatIdx.get(`${g}:${i}`) ?? 0\n }\n const linearStep = (dir: 1 | -1) => {\n ensureFlat()\n if (flatSeq.length === 0) return\n const { g, i } = viewer.getState().cursor\n let n = (flatIdx.get(`${g}:${i}`) ?? 0) + dir\n if (n >= flatSeq.length) n = loop ? 0 : flatSeq.length - 1\n if (n < 0) n = loop ? flatSeq.length - 1 : 0\n const t = flatSeq[n]\n if (t) viewer.goTo(t.g, t.i)\n }\n const nav = {\n next: () => (linear ? linearStep(1) : viewer.next()),\n prev: () => (linear ? linearStep(-1) : viewer.prev()),\n nextItem: () => {\n if (!linear) viewer.nextItem() // the item axis retires in linear mode\n },\n prevItem: () => {\n if (!linear) viewer.prevItem()\n },\n }\n\n // ── DOM scaffold ───────────────────────────────────────────────────────────\n // The root is a grid of areas (theme base.css): bar / main / aside / caption / footer / rail. Every\n // piece of chrome lives in its own area, so persistent chrome takes space instead of covering the\n // stage and nothing can collide; only the arrows and the item navigator sit over the stage, inside\n // `main` (`docked` moves the navigator out). Presets and rail positions change the grid template.\n const root = el('div', 'gallerist')\n root.setAttribute('data-gallerist-mode', overlay ? 'overlay' : 'inline')\n root.setAttribute('data-gallerist-arrows', arrows)\n root.setAttribute('data-gallerist-rail-pos', railPos)\n root.setAttribute('data-gallerist-orientation', orientation)\n root.setAttribute('data-gallerist-axis', groupAxis)\n if (arrowLabel) root.setAttribute('data-gallerist-arrow-labels', '')\n root.setAttribute('data-gallerist-rail', railHidden ? 'collapsed' : 'expanded')\n if (linear) root.setAttribute('data-gallerist-linear', 'true')\n if (frame) root.setAttribute('data-gallerist-frame', '')\n if (placard) root.setAttribute('data-gallerist-indicator', 'placard')\n applyAppearance(root, { skin: opts.skin, accent: opts.accent, scheme: opts.scheme })\n if (preset) for (const [k, val] of Object.entries(preset.rootAttrs)) root.setAttribute(k, val)\n if (overlay) {\n root.setAttribute('role', 'dialog')\n root.setAttribute('aria-modal', 'true')\n root.setAttribute('aria-label', opts.label ?? ui.dialog) // dialog accessible name (I-UX1)\n root.tabIndex = -1\n } else {\n root.setAttribute('role', 'group')\n root.setAttribute('aria-roledescription', ui.carousel)\n root.tabIndex = -1 // focus lands here when a focused control hides (see setHiddenKeepingFocus)\n }\n\n if (overlay) root.appendChild(el('div', 'gallerist-backdrop'))\n const bar = el('div', 'gallerist-bar')\n const main = el('div', 'gallerist-main')\n const stage = el('div', 'gallerist-stage')\n const track = el('div', 'gallerist-track')\n const viewportLayer = el('div', 'gallerist-viewport-layer')\n const stageRegion = el('div', 'gallerist-region gallerist-region-stage')\n stage.append(track, viewportLayer, stageRegion)\n main.appendChild(stage)\n\n // Named region hosts for plugins (spec §13).\n const regionHosts: RegionHosts = {\n backdrop: el('div', 'gallerist-region gallerist-region-backdrop'),\n stage: stageRegion,\n toolbar: el('div', 'gallerist-region gallerist-region-toolbar'),\n aside: el('div', 'gallerist-region gallerist-region-aside'),\n thumbnails: el('div', 'gallerist-region gallerist-region-thumbnails'),\n footer: el('div', 'gallerist-region gallerist-region-footer'),\n caption: el('div', 'gallerist-region gallerist-region-caption'),\n }\n // The caption bar holds the item's text caption, or a plugin's caption node in its region\n // (plugin-captions), which then replaces the text. Either is the viewer's accessible description.\n const caption = el('div', 'gallerist-caption')\n const cid = `gallerist-caption-${++mounts}`\n const captionText = el('span', 'gallerist-caption-text', { id: cid })\n regionHosts.caption.id = `${cid}r`\n // While a caption renderer's band overflows, its scroller (the band; in a placard, the region in\n // its slot) takes focus and a name, so a keyboard can scroll it. Named by reference: an aria-label\n // would also replace the region's text in the viewer's description.\n const capLabel = el('span', '', { id: `${cid}l`, hidden: '' })\n capLabel.textContent = ui.caption\n const capScroll = placard ? regionHosts.caption : caption\n const fitCaption = () => {\n const on =\n regionHosts.caption.hasChildNodes() && capScroll.scrollHeight > capScroll.clientHeight + 1\n // a band that stops scrolling while focused hands focus back to the viewer (else it falls to\n // <body> and the keyboard goes dead)\n if (!on && document.activeElement === capScroll) root.focus({ preventScroll: true })\n const set = on ? 'setAttribute' : 'removeAttribute'\n capScroll[set]('tabindex', '0')\n capScroll[set]('role', 'region')\n capScroll[set]('aria-labelledby', capLabel.id)\n }\n const capObserver = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(fitCaption) : null\n caption.append(captionText, regionHosts.caption)\n caption.hidden = true\n let anyCaption = false\n const syncCaption = () => {\n const own = regionHosts.caption.hasChildNodes()\n const { g, i } = viewer.getState().cursor\n // the text caption (the theme clamps it), unless a caption region replaces it\n captionText.textContent = own ? '' : str(viewer.getCollection().groups[g]?.items[i]?.caption)\n // a placard is always up: it holds the item navigator as well as the caption\n const hide = !(own || (controls && (anyCaption || placard)))\n caption.hidden = hide\n caption.toggleAttribute('data-gallerist-custom', own)\n // described by the caption only while it shows (hidden text would still be read out)\n root[hide ? 'removeAttribute' : 'setAttribute']('aria-describedby', `${cid} ${cid}r`)\n // the band and its content resize as it grows or scrolls: check then (no layout read here)\n for (const n of [capScroll, ...capScroll.children]) capObserver?.observe(n)\n if (!own) fitCaption()\n }\n root.append(\n regionHosts.backdrop,\n bar,\n main,\n regionHosts.aside,\n caption,\n regionHosts.footer,\n regionHosts.thumbnails,\n capLabel,\n )\n\n const live = el('div', 'gallerist-live', { 'aria-live': 'polite', role: 'status' })\n root.appendChild(live)\n\n // Rail collapse (UX-C): a pull-handle attached to the rail's edge + `t` key + fullscreen →\n // data-gallerist-rail. The handle lives inside the thumbnails region so it reads as part of the\n // gallery; it's (re)placed in mountRegions.\n let railCollapsed = railHidden\n let preFsCollapsed: boolean | null = null\n const railHandle = el('div', 'gallerist-rail-handle')\n const railToggle = el('button', 'gallerist-rail-toggle', {\n type: 'button',\n 'aria-label': railHidden ? ui.showThumbnails : ui.hideThumbnails,\n 'aria-pressed': String(railHidden),\n })\n railToggle.innerHTML = ICONS.collapse\n railHandle.appendChild(railToggle)\n const setRailCollapsed = (v: boolean, manual = false) => {\n railCollapsed = v\n root.setAttribute('data-gallerist-rail', v ? 'collapsed' : 'expanded')\n railToggle.setAttribute('aria-pressed', String(v))\n railToggle.setAttribute('aria-label', v ? ui.showThumbnails : ui.hideThumbnails)\n // a manual toggle while fullscreen wins over the on-exit restore\n if (manual) preFsCollapsed = null\n }\n railToggle.addEventListener('click', () => setRailCollapsed(!railCollapsed, true))\n\n let counter: HTMLElement | undefined\n let title: HTMLElement | undefined\n let position: HTMLElement | undefined\n let itemNav: HTMLElement | undefined\n let controlsBox: HTMLElement | undefined\n let reset: HTMLElement | undefined\n let navigatorEl: HTMLElement | undefined\n let navigatorView: HTMLElement | undefined\n let prevArrow: HTMLElement | undefined\n let nextArrow: HTMLElement | undefined\n // segmented pills are rebuilt only when the active group / its size changes (UX-H)\n let posG = -1\n let posM = -1\n if (controls) {\n // top bar: counter → title → plugin tools → zoom reset → close (one row, never overlapping)\n counter = el('div', 'gallerist-counter')\n title = el('div', 'gallerist-title')\n title.hidden = true\n reset = el('button', 'gallerist-zoom-reset', { type: 'button', 'aria-label': ui.resetZoom })\n reset.innerHTML = ICONS.zoomReset\n reset.hidden = true // only while zoomed in\n reset.addEventListener('click', () => viewer.resetZoom())\n const close = el('button', 'gallerist-close', { type: 'button', 'aria-label': ui.close })\n close.innerHTML = ICONS.close\n close.addEventListener('click', () => viewer.close())\n bar.append(counter, title, regionHosts.toolbar, reset, close)\n\n // over the stage: group arrows and the item navigator (↑ · position · ↓) as one cluster, so\n // each arrow layout places it as a unit. Icons follow the group axis: horizontal → group ←/→,\n // item ↑/↓; vertical (side rail) → group ↑/↓, item ←/→.\n const prev = el('button', 'gallerist-prev', { type: 'button', 'aria-label': ui.previous })\n prev.innerHTML = vertical ? ICONS.itemPrev : ICONS.prev\n prev.addEventListener('click', () => nav.prev())\n const next = el('button', 'gallerist-next', { type: 'button', 'aria-label': ui.next })\n next.innerHTML = vertical ? ICONS.itemNext : ICONS.next\n next.addEventListener('click', () => nav.next())\n prevArrow = prev\n nextArrow = next\n const prevItem = el('button', 'gallerist-item-prev', {\n type: 'button',\n 'aria-label': ui.previousItem,\n })\n prevItem.innerHTML = vertical ? ICONS.prev : ICONS.itemPrev\n prevItem.addEventListener('click', () => nav.prevItem())\n const nextItem = el('button', 'gallerist-item-next', {\n type: 'button',\n 'aria-label': ui.nextItem,\n })\n nextItem.innerHTML = vertical ? ICONS.next : ICONS.itemNext\n nextItem.addEventListener('click', () => nav.nextItem())\n position = el('div', 'gallerist-position')\n itemNav = el('div', 'gallerist-itemnav')\n itemNav.hidden = true // shown only for groups with more than one item (and not in linear mode)\n itemNav.append(prevItem, position, nextItem)\n controlsBox = el('div', 'gallerist-controls')\n controlsBox.append(prev, next)\n // a placard carries the item navigator in the caption, under the label; docked, it is a grid\n // item of its own (the theme puts it on the aside column or the caption row, off the media),\n // after the caption it ends and before the item column it heads (tab order follows)\n if (placard) caption.appendChild(itemNav)\n else if (arrows === 'docked') main.after(caption, itemNav)\n else controlsBox.appendChild(itemNav)\n if (showNavigator) {\n // a pointer aid only (keyboard users zoom and pan with the keys), so hidden from AT\n navigatorEl = el('div', 'gallerist-navigator', { 'aria-hidden': 'true' })\n navigatorEl.hidden = true\n navigatorView = el('div', 'gallerist-navigator-view')\n navigatorEl.appendChild(navigatorView)\n navigatorEl.addEventListener('pointerdown', onNavigatorDown)\n controlsBox.appendChild(navigatorEl)\n }\n main.appendChild(controlsBox)\n } else {\n bar.appendChild(regionHosts.toolbar) // plugin tools keep their place without built-in chrome\n }\n\n // ── slide window ─────────────────────────────────────────────────────────────\n const mounted = new Map<string, SlideRec>()\n let lastCursor: { g: number; i: number } | null = null\n // Window-diff cache: a zoom/pan-only commit (same collection + cursor, current slide fully\n // painted) skips windowIndices/reconcileKeys and just re-applies the transform (I-PERF2).\n let lastWindowCol: unknown = null\n let lastWindowG = -1\n let lastWindowI = -1\n\n // groupId → index, rebuilt only when the collection reference changes (setCollection).\n // Avoids an O(groups) findIndex per mounted slide on every render (matters at 10k groups).\n let indexCol: unknown = null\n let idIndex = new Map<string, number>()\n const groupIndex = (id: string): number => {\n const col = viewer.getCollection()\n if (col !== indexCol) {\n indexCol = col\n idIndex = new Map(col.groups.map((g, i) => [g.id, i]))\n }\n return idIndex.get(id) ?? -1\n }\n\n // Tag the current slide with the axis of motion so the theme can use visibly distinct\n // transitions (spec §27.5): group axis = horizontal time slide, item axis = depth pop.\n const tagAxis = (currentSlide: HTMLElement, cur: { g: number; i: number }) => {\n if (lastCursor && (lastCursor.g !== cur.g || lastCursor.i !== cur.i)) {\n const axis = lastCursor.g !== cur.g ? 'group' : 'item'\n currentSlide.removeAttribute('data-gallerist-enter')\n void currentSlide.offsetWidth // reflow to restart the CSS animation\n currentSlide.setAttribute('data-gallerist-enter', axis)\n }\n lastCursor = { g: cur.g, i: cur.i }\n }\n\n const teardownSlide = (rec: SlideRec) => {\n rec.abort?.abort()\n rec.media?.destroy()\n rec.slide.remove()\n }\n\n let rendering = false\n const renderWindowInner = () => {\n const state = viewer.getState()\n const col = viewer.getCollection()\n const groupCount = col.groups.length\n if (groupCount === 0) return\n const cur = state.cursor\n\n // Fast path: nothing about the window changed (zoom/pan-only commit) — re-apply the transform\n // and counter-scale overlays for the current slide, skip the whole diff + allocations (I-PERF2).\n if (col === lastWindowCol && cur.g === lastWindowG && cur.i === lastWindowI) {\n const rec = mounted.get(col.groups[cur.g]?.id ?? '')\n const it = col.groups[cur.g]?.items[cur.i]\n if (rec && it && rec.itemId === it.id && rec.overlayItem === it) {\n applyTransform(rec.content, state.zoom)\n if (rec.overlayEls) updateOverlays(rec.overlayEls, state.zoom.scale)\n return\n }\n }\n lastWindowCol = col\n lastWindowG = cur.g\n lastWindowI = cur.i\n\n const idxs = windowIndices(cur.g, groupCount, preload.ahead, preload.behind, viewer.loop)\n const wantKeys = idxs.map((g) => col.groups[g]?.id ?? '')\n const { enter, exit } = reconcileKeys([...mounted.keys()], wantKeys)\n\n for (const k of exit) {\n const rec = mounted.get(k)\n if (rec) teardownSlide(rec)\n mounted.delete(k)\n }\n for (const k of enter) {\n const slide = el('div', 'gallerist-slide', { 'data-group': k })\n const content = el('div', 'gallerist-content')\n const overlayHost = el('div', 'gallerist-overlays-content')\n content.appendChild(overlayHost)\n slide.appendChild(content)\n track.appendChild(slide)\n mounted.set(k, { slide, content, overlayHost })\n }\n\n for (const [k, rec] of mounted) {\n const g = groupIndex(k)\n if (g < 0) continue\n const isCurrent = g === cur.g\n const group = col.groups[g]\n if (!group) continue\n const itemIndex = isCurrent ? cur.i : 0\n const it = group.items[itemIndex]\n if (it && rec.itemId !== it.id) {\n rec.abort?.abort()\n rec.media?.destroy()\n const abort = new AbortController()\n rec.media = pickAdapter(it.type, it)?.mount(it, rec.content, {\n signal: abort.signal,\n priority: isCurrent ? 'high' : 'low',\n })\n rec.abort = abort\n rec.itemId = it.id\n rec.activated = false\n rec.content.appendChild(rec.overlayHost) // keep overlays above the media\n frameSlide(rec)\n // Surface the media load lifecycle (spec §18: load/loaded/loadError, which also drive\n // state.loaded). On `loaded`, repaint content overlays: before decode naturalSize() is\n // null and paint falls back to the stage rect (a wrong full-stage contain rect), so the\n // overlays re-anchor to the real image box once the natural size is known (I-R1).\n const mountedId = it.id\n const slideKey = k\n // group/item are stable for this slide; the cursor is read fresh at emit time because\n // loaded/loadError fire later from the ready promise, when the cursor may have moved (review #5).\n const loadBase = { viewer, group, item: it }\n internals.emit('load', { ...loadBase, cursor: viewer.cursor, id: mountedId })\n rec.media?.ready\n ?.then(() => {\n internals.emit('loaded', { ...loadBase, cursor: viewer.cursor, id: mountedId })\n const r = mounted.get(slideKey)\n if (!r || r.itemId !== mountedId) return // navigated away / item swapped out\n frameSlide(r) // the frame fits the now-known natural size\n if (groupIndex(slideKey) !== viewer.getState().cursor.g) return // no longer current\n r.overlayItem = undefined // force a repaint at the now-known natural size\n // a zoom committed before the size was known was bounded by the whole layer\n if (attached) reclampZoom()\n })\n .catch((error) => {\n // A load we cancelled (slide torn down, item swapped out) is not a failure — adapters\n // reject `ready` on abort, and reporting it would mark the item 'error'. Return its\n // status to 'idle' unless the item is already mounted again (a fresh load owns it now).\n if (abort.signal.aborted) {\n const remounted = [...mounted.values()].some((r) => r.itemId === mountedId)\n if (!remounted) internals.cancelLoad(mountedId)\n return\n }\n internals.emit('loadError', {\n ...loadBase,\n cursor: viewer.cursor,\n id: mountedId,\n error,\n })\n })\n }\n // activate/deactivate media on slide enter/leave (spec §12 — play/pause for video)\n if (isCurrent && !rec.activated) {\n rec.media?.activate?.()\n rec.activated = true\n } else if (!isCurrent && rec.activated) {\n rec.media?.deactivate?.()\n rec.activated = false\n }\n if (isCurrent) {\n tagAxis(rec.slide, cur)\n rec.slide.setAttribute('data-gallerist-current', '')\n rec.content.setAttribute('data-gallerist-current', '')\n applyTransform(rec.content, state.zoom)\n if (it) {\n // Repaint (re-invokes user render() + rebuilds DOM) only when the item changes, including\n // new data for the same id (setCollection).\n // On a zoom-only change, update retained overlays in place (spec §9.2: no rebuild).\n if (rec.overlayItem !== it) {\n const r = stage.getBoundingClientRect()\n const stageSize = { w: r.width, h: r.height }\n rec.overlayEls = paintOverlays(\n viewportLayer,\n rec.overlayHost,\n gatherOverlays(group, it, currentGlobalOverlays(group, it)),\n {\n group,\n item: it,\n viewer,\n zoom: state.zoom,\n stage: stageSize,\n natural: rec.media?.naturalSize?.() ?? stageSize,\n box: paintedBox(stageSize, rec.media?.naturalSize?.()),\n },\n )\n rec.overlayItem = it\n } else if (rec.overlayEls) {\n updateOverlays(rec.overlayEls, state.zoom.scale)\n }\n }\n } else {\n rec.slide.removeAttribute('data-gallerist-current')\n rec.content.removeAttribute('data-gallerist-current')\n rec.overlayHost.replaceChildren()\n rec.overlayEls = undefined\n rec.overlayItem = undefined\n }\n }\n // Warm the cache for the images `preload.ahead/behind` steps within the group land on (spec §11:\n // the slides above cover the neighbouring groups, showing their first item). Only items the\n // built-in image adapter would mount; low priority, and only once the current media is ready,\n // so they don't compete with it. Ones no longer wanted are cancelled.\n const items = col.groups[cur.g]?.items ?? []\n const want = new Map<string, Item>()\n for (let d = -preload.behind; d <= preload.ahead; d++) {\n const it = d ? items[cur.i + d] : undefined\n if (it && sourceUrl(it.source) && pickAdapter(it.type, it)?.mount === mountImage)\n want.set(it.id, it)\n }\n for (const [id, img] of warm) if (!want.has(id)) unwarm(id, img)\n const run = ++warmRun\n const start = () => {\n if (run !== warmRun) return // the cursor moved on: a newer render owns the warm set\n for (const [id, it] of want) {\n const s = it.source as { srcset?: string; sizes?: string } // a string has neither\n if (!warm.has(id)) {\n warm.set(\n id,\n Object.assign(new Image(), {\n fetchPriority: 'low',\n sizes: s.sizes ?? '',\n srcset: s.srcset ?? '',\n src: sourceUrl(it.source),\n }),\n )\n }\n }\n }\n const ready = mounted.get(col.groups[cur.g]?.id ?? '')?.media?.ready\n if (ready) ready.then(start, start)\n else start()\n }\n // in-group warmers by item id; cancelling one drops its request\n const warm = new Map<string, HTMLImageElement>()\n let warmRun = 0\n const unwarm = (id: string, img: HTMLImageElement) => {\n img.srcset = img.src = ''\n warm.delete(id)\n }\n // Guard against re-entrancy: emitting load/loaded updates state.loaded, whose store\n // notification re-enters sync()/renderWindow while we're mid-iteration over `mounted`.\n const renderWindow = () => {\n if (rendering) return\n rendering = true\n try {\n renderWindowInner()\n } finally {\n rendering = false\n }\n }\n\n // Within-group position (UX-H): always an \"n / N\" text, plus a jump button per item while the\n // group is small enough — numbered pills (≤ PILL_MAX) or plain dots (≤ DOT_MAX), per the\n // `itemIndicator` option. The theme decides what to show per device (the text alone on touch).\n const PILL_MAX = 8\n const DOT_MAX = 12\n const updatePosition = (g: number, i: number, itemCount: number) => {\n if (!position) return\n const mode =\n itemIndicator === 'pills' && itemCount <= PILL_MAX\n ? 'pills'\n : (itemIndicator === 'dots' || placard) && itemCount <= DOT_MAX\n ? 'dots'\n : 'counter'\n if (g !== posG || itemCount !== posM || position.dataset.mode !== mode) {\n position.dataset.mode = mode\n position.replaceChildren()\n const text = el('span', 'gallerist-position-text')\n position.appendChild(text)\n if (mode !== 'counter') {\n for (let k = 0; k < itemCount; k++) {\n const jump = el('button', mode === 'pills' ? 'gallerist-pill' : 'gallerist-dot', {\n type: 'button',\n 'aria-label': ui.item(k + 1),\n })\n if (mode === 'pills') jump.textContent = String(k + 1)\n jump.addEventListener('click', () => viewer.goTo(g, k))\n position.appendChild(jump)\n }\n }\n posG = g\n posM = itemCount\n }\n const text = position.querySelector('.gallerist-position-text')\n if (text) text.textContent = `${i + 1} / ${itemCount}`\n for (const [k, jump] of position\n .querySelectorAll('.gallerist-pill, .gallerist-dot')\n .entries()) {\n if (k === i) jump.setAttribute('data-active', '')\n else jump.removeAttribute('data-active')\n }\n }\n\n // Hide a control without dropping keyboard focus: if it (or a child) has focus, hand focus to the\n // viewer root first — otherwise the browser drops it to <body> and the root's keymap goes deaf.\n const setHiddenKeepingFocus = (node: HTMLElement, hidden: boolean) => {\n if (hidden && !node.hidden && node.contains(document.activeElement)) {\n root.focus({ preventScroll: true })\n }\n node.hidden = hidden\n }\n\n // A labelled group arrow names where it goes; at an end of the collection it has no name to show.\n const setArrowLabel = (\n arrow: HTMLElement | undefined,\n name: string | undefined,\n plain: string,\n named: (name: string) => string,\n ) => {\n if (!arrow) return\n let label = arrow.querySelector<HTMLElement>('.gallerist-arrow-label')\n if (!label) {\n label = el('span', 'gallerist-arrow-label', { 'aria-hidden': 'true' })\n arrow.appendChild(label)\n }\n label.textContent = name ?? ''\n label.hidden = !name\n arrow.setAttribute('aria-label', name ? named(name) : plain)\n }\n\n // gate chrome updates to cursor/collection changes — skip zoom/pan commits (mirrors the rail)\n let chromeG = -1\n let chromeI = -1\n let chromeCol: unknown = null\n const updateChrome = () => {\n const col = viewer.getCollection()\n const cur = viewer.getState().cursor\n if (col === chromeCol && cur.g === chromeG && cur.i === chromeI) return\n if (col !== chromeCol) {\n // Reserve the caption track for the whole collection when any item has a text caption, so\n // moving between captioned and uncaptioned items never resizes the stage.\n anyCaption = col.groups.some((grp) => grp.items.some((it) => str(it.caption)))\n // likewise the docked item navigator's room, while any group has several items; one group\n // leaves the docked group arrows nowhere to go (the theme drops them and their gutters)\n root.toggleAttribute(\n 'data-gallerist-multi',\n col.groups.some((grp) => grp.items.length > 1),\n )\n const one = col.groups.length < 2\n // a focused docked group arrow goes with the second group: focus to the root, not <body>\n if (\n one &&\n arrows === 'docked' &&\n !linear &&\n [prevArrow, nextArrow].includes(document.activeElement as HTMLElement)\n )\n root.focus({ preventScroll: true })\n root.toggleAttribute('data-gallerist-one-group', one)\n }\n chromeCol = col\n chromeG = cur.g\n chromeI = cur.i\n const G = col.groups.length\n const group = col.groups[cur.g]\n const item = group?.items[cur.i]\n const itemCount = group?.items.length ?? 0\n // the item axis exists only for multi-item groups, and retires in linear mode\n const multi = !linear && itemCount > 1\n if (itemNav) setHiddenKeepingFocus(itemNav, !multi)\n if (title) {\n title.textContent = str(group?.caption)\n title.hidden = !title.textContent\n }\n if (arrowLabel) {\n const nameAt = (step: number) => {\n const n = viewer.loop && G > 1 ? (cur.g + step + G) % G : cur.g + step\n const target = col.groups[n]\n return target ? arrowLabel(target, n) : undefined\n }\n setArrowLabel(prevArrow, nameAt(-1), ui.previous, ui.previousTo)\n setArrowLabel(nextArrow, nameAt(1), ui.next, ui.nextTo)\n }\n syncCaption()\n // Announce the item's own description alongside the position so SR users hear what they\n // navigated to, not just the index (S-UX4).\n const desc = item?.alt ? ` — ${item.alt}` : ''\n if (linear) {\n // flat linear: one running position across all items\n const pos = flatPosition(cur.g, cur.i) + 1 // flatPosition() also rebuilds flatSeq if needed\n const total = flatSeq.length\n if (counter) counter.textContent = `${pos} / ${total}`\n live.textContent = `${ui.itemOf(pos, total)}${desc}`\n } else {\n if (counter) counter.textContent = `${cur.g + 1} / ${G}`\n if (multi) updatePosition(cur.g, cur.i, itemCount)\n live.textContent = multi\n ? `${ui.groupOf(cur.g + 1, G)}, ${ui.itemOf(cur.i + 1, itemCount)}${desc}`\n : `${ui.groupOf(cur.g + 1, G)}${desc}`\n }\n }\n\n // zoom reset only while zoomed in (fit == 1 in the contained model)\n const updateZoomChrome = () => {\n if (reset) setHiddenKeepingFocus(reset, !(viewer.getState().zoom.scale > 1.001))\n updateNavigator()\n }\n\n // ── zoom navigator ────────────────────────────────────────────────────────────\n // The minimap is the image at the navigator's size; the view box is the stage's visible part,\n // mapped from content space through the painted media box (the same box the zoom bounds use).\n function updateNavigator() {\n if (!navigatorEl || !navigatorView) return\n const z = viewer.getState().zoom\n const rec = currentRec()\n const natural = rec?.media?.naturalSize?.()\n const { g, i } = viewer.getState().cursor\n const it = viewer.getCollection().groups[g]?.items[i]\n // the image itself (already loaded): a thumb may be cropped to another shape\n const src = it ? (sourceUrl(it.source) ?? sourceUrl(it.thumb)) : null\n const size = stageSize()\n const zoomable = rec?.media?.supportsZoom !== false // a video keeps no minimap\n if (!(z.scale > 1.001) || !zoomable || !natural || !src || !(size.w > 0)) {\n navigatorEl.hidden = true\n return\n }\n const box = mediaBox(size)\n const url = `url(${JSON.stringify(src)})`\n if (navigatorEl.style.backgroundImage !== url) navigatorEl.style.backgroundImage = url\n // the image's shape; the theme sizes its longer side from --gallerist-navigator-size\n navigatorEl.style.aspectRatio = `${natural.w} / ${natural.h}`\n navigatorEl.dataset.shape = natural.h > natural.w ? 'portrait' : 'landscape'\n const clamp01 = (n: number) => Math.min(1, Math.max(0, n))\n const x0 = clamp01((-z.x / z.scale - box.x) / box.w)\n const y0 = clamp01((-z.y / z.scale - box.y) / box.h)\n const x1 = clamp01(((size.w - z.x) / z.scale - box.x) / box.w)\n const y1 = clamp01(((size.h - z.y) / z.scale - box.y) / box.h)\n Object.assign(navigatorView.style, {\n left: `${x0 * 100}%`,\n top: `${y0 * 100}%`,\n width: `${(x1 - x0) * 100}%`,\n height: `${(y1 - y0) * 100}%`,\n })\n navigatorEl.hidden = false\n }\n // centre the visible part on the pointed spot of the minimap\n const panNavigatorTo = (e: PointerEvent) => {\n if (!navigatorEl) return\n const r = navigatorEl.getBoundingClientRect()\n const size = stageSize()\n if (!(r.width > 0) || !(size.w > 0)) return\n const box = mediaBox(size)\n const z = viewer.getState().zoom\n const cx = box.x + ((e.clientX - r.left) / r.width) * box.w\n const cy = box.y + ((e.clientY - r.top) / r.height) * box.h\n internals.setZoom({\n scale: z.scale,\n x: size.w / 2 - cx * z.scale,\n y: size.h / 2 - cy * z.scale,\n })\n }\n function onNavigatorDown(e: PointerEvent) {\n if (e.button !== 0) return // primary button (or touch / pen contact) only\n const nav = e.currentTarget as HTMLElement\n e.preventDefault()\n e.stopPropagation()\n nav.setPointerCapture?.(e.pointerId)\n panNavigatorTo(e)\n const move = (ev: PointerEvent) => panNavigatorTo(ev)\n const up = () => {\n nav.removeEventListener('pointermove', move)\n nav.removeEventListener('pointerup', up)\n nav.removeEventListener('pointercancel', up)\n nav.removeEventListener('lostpointercapture', up)\n }\n nav.addEventListener('pointermove', move)\n nav.addEventListener('pointerup', up)\n nav.addEventListener('pointercancel', up)\n // hidden mid-drag (zoom reset): capture is lost and no pointerup arrives here\n nav.addEventListener('lostpointercapture', up)\n }\n\n // ── attach / detach ──────────────────────────────────────────────────────────\n let attached = false\n let restoreFocus: HTMLElement | null = null\n\n // Auto-hide chrome on idle (UX-C); inert under reduced motion. Rail collapse is independent.\n // Created before attach() so the (TDZ-safe) poke on show works in both overlay and inline modes.\n const idle: IdleController | null = autoHide ? createIdleController(root) : null\n\n const attach = () => {\n if (attached) return\n attached = true\n if (overlay) {\n restoreFocus = document.activeElement as HTMLElement | null\n lockBodyScroll()\n document.body.appendChild(root)\n // Inert every other top-level element so the dialog is truly modal — focus and the SR\n // virtual cursor can't reach the obscured page behind it (C5). aria-modal alone doesn't\n // enforce this.\n inertBackground(root)\n root.focus()\n }\n setDir()\n readFrameInset()\n idle?.poke() // start the idle countdown from when the viewer is shown\n }\n const detach = () => {\n if (!attached) return\n attached = false\n if (overlay) {\n root.remove() // remove this overlay first so the presence checks below are accurate\n unlockBodyScroll()\n releaseBackgroundInert()\n // Prefer an explicit returnFocus target (survives a trigger that unmounted), else restore\n // focus to whatever was focused on open (S-UX4).\n const target =\n typeof opts.returnFocus === 'function' ? opts.returnFocus() : (opts.returnFocus ?? null)\n ;(target ?? restoreFocus)?.focus?.()\n }\n }\n\n // inline mode is always present in its container\n if (!overlay && container) {\n container.appendChild(root)\n attached = true\n idle?.poke()\n }\n\n const sync = () => {\n const phase: Phase = viewer.getState().phase\n // The theme keys the open/close animation off the phase (see the lifecycle driver below).\n if (root.getAttribute('data-gallerist-phase') !== phase)\n root.setAttribute('data-gallerist-phase', phase)\n if (overlay) {\n if (phase !== 'closed') attach()\n else detach()\n }\n if (attached) {\n if (!root.hasAttribute('data-gallerist-dir')) setDir() // inline mode: attached at mount\n renderWindow()\n updateChrome()\n updateZoomChrome()\n }\n }\n\n // Keyboard zoom pivots on the stage centre (zoomTo's default pivot), spec §5; the zoom bounds\n // clamp the scale and pan.\n const zoomAroundCenter = (factor: number) => viewer.zoomTo(viewer.zoom.scale * factor)\n\n // ── keyboard (spec §5) ───────────────────────────────────────────────────────\n // Which physical arrow drives which axis depends on the group axis (point 5): by default a side\n // rail makes ↑/↓ the group axis and ←/→ the item axis; horizontal keeps the classic mapping.\n const arrowNav: Record<string, () => void> = vertical\n ? {\n ArrowDown: nav.next,\n ArrowUp: nav.prev,\n ArrowRight: nav.nextItem,\n ArrowLeft: nav.prevItem,\n }\n : {\n ArrowRight: nav.next,\n ArrowLeft: nav.prev,\n ArrowDown: nav.nextItem,\n ArrowUp: nav.prevItem,\n }\n const isRtl = (): boolean => {\n const dir = root.closest('[dir]')?.getAttribute('dir')\n if (dir) return dir === 'rtl'\n try {\n return getComputedStyle(root).direction === 'rtl'\n } catch {\n return false\n }\n }\n // Mirror the keymap's notion of direction onto the root so the theme agrees with it (arrow glyphs,\n // physical side rails) — no reliance on :dir(), and it honours a CSS-only `direction: rtl`.\n const setDir = () => root.setAttribute('data-gallerist-dir', isRtl() ? 'rtl' : 'ltr')\n\n const onKey = (e: KeyboardEvent) => {\n // Don't hijack typing inside an embedded control (overlay input/textarea/etc); Escape still\n // closes from anywhere (I-UX2), unless a handler before ours called preventDefault() on it\n // (a host form keeping Escape for itself).\n if (isEditableTarget(e.target) && e.key !== 'Escape') return\n // A focused caption band scrolls with ↑/↓/Home/End rather than navigating. Scrolled here, not\n // left to the browser: WebKit on Linux (GTK/WPE) leaves the placard's band unscrolled.\n const by =\n e.target === capScroll && capScroll.hasAttribute('tabindex')\n ? ({ ArrowUp: -40, ArrowDown: 40, Home: -1e9, End: 1e9 } as Record<string, number>)[e.key]\n : 0\n if (by) {\n capScroll.scrollTop += by\n e.preventDefault()\n return\n }\n // Focus trap: cycle Tab within the dialog so focus can't escape to the inert page (C5).\n if (e.key === 'Tab' && overlay) {\n const tabbables = focusableWithin(root)\n const first = tabbables[0]\n const last = tabbables[tabbables.length - 1]\n if (!first || !last) {\n e.preventDefault()\n return\n }\n const active = document.activeElement\n if (e.shiftKey && (active === first || active === root)) {\n last.focus()\n e.preventDefault()\n } else if (!e.shiftKey && active === last) {\n first.focus()\n e.preventDefault()\n }\n return\n }\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowLeft':\n case 'ArrowUp':\n case 'ArrowDown': {\n // In an RTL document the horizontal arrows mirror (ArrowLeft advances), matching the\n // logical-property chrome layout (S-UX3). Vertical (Up/Down) is unaffected.\n const flip = isRtl() && (e.key === 'ArrowRight' || e.key === 'ArrowLeft')\n const k = flip ? (e.key === 'ArrowRight' ? 'ArrowLeft' : 'ArrowRight') : e.key\n arrowNav[k]?.()\n break\n }\n case 'Escape':\n if (!e.defaultPrevented) viewer.close()\n break\n case '+':\n case '=':\n zoomAroundCenter(1.25)\n break\n case '-':\n zoomAroundCenter(1 / 1.25)\n break\n case '0':\n viewer.resetZoom()\n break\n case 't':\n case 'T':\n setRailCollapsed(!railCollapsed, true)\n break\n case 'Home':\n if (linear) {\n ensureFlat()\n const t = flatSeq[0]\n if (t) viewer.goTo(t.g, t.i)\n } else viewer.goTo(0)\n break\n case 'End':\n if (linear) {\n ensureFlat()\n const t = flatSeq[flatSeq.length - 1]\n if (t) viewer.goTo(t.g, t.i)\n } else viewer.goTo(viewer.getCollection().groups.length - 1)\n break\n default:\n // Modified chords (Ctrl/Cmd/Alt) belong to the browser/OS, not our single-letter map.\n if (e.ctrlKey || e.metaKey || e.altKey) return\n // Within-group digit jumps are meaningless in linear mode (the pills retire), so skip them.\n if (!linear && /^[1-9]$/.test(e.key)) {\n viewer.goTo(viewer.getState().cursor.g, Number(e.key) - 1)\n } else if (pluginKeymap[e.key]) {\n pluginKeymap[e.key]?.(e)\n }\n return\n }\n e.preventDefault()\n }\n root.addEventListener('keydown', onKey)\n\n // Collapse the rail by default while our element is fullscreen; restore the prior state on exit.\n const isOurFullscreen = () => {\n const fe = document.fullscreenElement\n return !!fe && (fe === root || root.contains(fe))\n }\n const onFsChange = () => {\n if (isOurFullscreen()) {\n if (preFsCollapsed === null) preFsCollapsed = railCollapsed\n setRailCollapsed(true)\n } else if (preFsCollapsed !== null) {\n setRailCollapsed(preFsCollapsed)\n preFsCollapsed = null\n }\n }\n document.addEventListener('fullscreenchange', onFsChange)\n\n // ── live gestures (spec §11; imperative during gesture, decision P0-E) ─────────\n const currentRec = () => {\n const key = viewer.getCollection().groups[viewer.getState().cursor.g]?.id\n return key ? mounted.get(key) : undefined\n }\n const detachGestures = attachGestures({\n stage,\n viewer,\n maxScale: MAX_ZOOM,\n nav, // route swipes through the linear/oriented nav seam\n getContent: () => currentRec()?.content ?? null,\n getGeometry: () => {\n const r = stage.getBoundingClientRect()\n // Contained model: the content layer fills the stage and scale 1 == fit; the media is\n // object-fit: contain inside it, so pan bounds use the painted box (see mediaBox).\n return {\n stageRect: { left: r.left, top: r.top, width: r.width, height: r.height },\n naturalSize: { w: r.width, h: r.height },\n mediaBox: mediaBox({ w: r.width, h: r.height }),\n }\n },\n })\n\n // ── open/close transitions (spec §6, §27) ───────────────────────────────────────\n // The theme animates the root per data-gallerist-phase (fade in while opening, out while\n // closing) and the viewer settles to open/closed when that animation ends, so the overlay stays\n // mounted, focus-trapped and scroll-locked through its exit. No animation (reduced motion, inline\n // mode, a theme without one) settles at once. A timer backs up animationend, which never fires if\n // the animation is cancelled or the root is display:none.\n let cancelPhaseWait: (() => void) | null = null\n const awaitPhaseAnimation = (done: () => void) => {\n cancelPhaseWait?.()\n const style = getComputedStyle(root)\n if (!style.animationName || style.animationName === 'none') return done()\n const onEnd = (e: Event) => {\n if (e.target === root) finish() // slide/thumbnail animations bubble up too\n }\n const stop = () => {\n root.removeEventListener('animationend', onEnd)\n clearTimeout(timer)\n cancelPhaseWait = null\n }\n const finish = () => {\n stop()\n done()\n }\n root.addEventListener('animationend', onEnd) // events dispatch async: never before `timer` exists\n const timer = setTimeout(finish, animationMs(style) + 50)\n cancelPhaseWait = stop\n }\n const offLifecycle = internals.setLifecycleDriver({\n opening: awaitPhaseAnimation,\n closing: awaitPhaseAnimation,\n })\n\n // ── zoom bounds (spec §11.1) ───────────────────────────────────────────────────\n // Lend the core the stage geometry so every committed zoom (API, keyboard, gesture end, resize)\n // is clamped in one place. Contained model: the media is object-fit inside a stage-sized content\n // layer, so fit == scale 1, and the pan keeps the painted media box (not the letterbox around it)\n // covering the stage.\n const stageSize = () => {\n const r = stage.getBoundingClientRect()\n return { w: r.width, h: r.height }\n }\n // The current media's painted box in content space; the whole layer until its size is known.\n // The painted media box in content space at fit: the media's contain rect, inside the frame\n // inset when framed; the whole (inset) layer until the natural size is known. Zoom bounds, the\n // navigator, overlays and the framed media element all use this one box.\n let frameInset = 0\n const readFrameInset = () => {\n frameInset = frame\n ? Number.parseFloat(getComputedStyle(root).getPropertyValue('--gallerist-frame-inset')) || 0\n : 0\n }\n function paintedBox(\n size: { w: number; h: number },\n natural: { w: number; h: number } | null | undefined,\n ) {\n const inset = Math.max(0, Math.min(frameInset, size.w / 4, size.h / 4))\n const inner = { w: size.w - 2 * inset, h: size.h - 2 * inset }\n if (!(natural && natural.w > 0 && natural.h > 0)) return { x: inset, y: inset, ...inner }\n const r = containRect(inner, natural)\n return { x: r.x + inset, y: r.y + inset, w: r.w, h: r.h }\n }\n function mediaBox(size: { w: number; h: number }) {\n return paintedBox(size, currentRec()?.media?.naturalSize?.())\n }\n // Framed: size the slide's media element to its painted box (the theme reads these variables).\n function frameSlide(rec: SlideRec) {\n if (!frame) return\n const size = stageSize()\n if (!(size.w > 0 && size.h > 0)) return\n const box = paintedBox(size, rec.media?.naturalSize?.())\n const s = rec.content.style\n s.setProperty('--gallerist-box-x', `${box.x}px`)\n s.setProperty('--gallerist-box-y', `${box.y}px`)\n s.setProperty('--gallerist-box-w', `${box.w}px`)\n s.setProperty('--gallerist-box-h', `${box.h}px`)\n }\n const constrainZoom = (z: ZoomState): ZoomState => {\n const scaled = { scale: clampScale(z.scale, 1, MAX_ZOOM), x: z.x, y: z.y }\n const size = stageSize()\n // Not laid out (closed overlay, hidden container): the scale range needs no geometry, the pan\n // bounds do; the ResizeObserver re-clamps the pan once the stage has a size.\n if (!(size.w > 0 && size.h > 0)) return scaled\n return clampPanToBox(scaled, size, mediaBox(size))\n }\n const offZoomBounds = internals.setZoomBounds({\n center: () => {\n const size = stageSize()\n return { x: size.w / 2, y: size.h / 2 }\n },\n constrain: constrainZoom,\n })\n\n // Re-check the committed zoom against the current geometry; repaints either way.\n const reclampZoom = () => {\n const z = viewer.getState().zoom\n const clamped = constrainZoom(z)\n if (clamped.scale !== z.scale || clamped.x !== z.x || clamped.y !== z.y) {\n internals.setZoom(clamped) // commit → sync → repaint\n } else {\n renderWindow() // repaint overlays at the new rect\n updateNavigator()\n }\n }\n\n // ── re-measure on resize (spec §10.5) ──────────────────────────────────────────\n // A single ResizeObserver on the stage, debounced to one frame. On resize / device rotation\n // it repaints the current slide's content overlays (their px box is derived from the stage\n // rect) and re-clamps the committed zoom against the new fit, so image-space overlays don't\n // drift and a zoomed image can't be stranded panned past the new edge (C2).\n let resizeFrame = 0\n const onStageResize = () => {\n if (resizeFrame) return\n resizeFrame = requestAnimationFrame(() => {\n resizeFrame = 0\n if (!attached) return\n readFrameInset() // the inset can change with the viewport (the mobile layer)\n for (const rec of mounted.values()) frameSlide(rec)\n const cur = currentRec()\n if (cur) cur.overlayItem = undefined // re-anchor overlays against the new stage rect\n reclampZoom()\n })\n }\n const resizeObserver =\n typeof ResizeObserver !== 'undefined' ? new ResizeObserver(onStageResize) : null\n resizeObserver?.observe(stage)\n\n // Immersive floats the bar, caption, rail and side column over the full-bleed stage. Measure\n // where they overlap it and inset the on-stage controls box by that much, so arrows and the item\n // navigator never end up underneath chrome (in every arrow layout, rail expanded or collapsed).\n let insetFrame = 0\n const updateControlsInset = () => {\n insetFrame = 0\n if (!controlsBox) return\n if (root.getAttribute('data-gallerist-preset') !== 'immersive' || !attached) {\n controlsBox.style.removeProperty('--gallerist-controls-inset')\n return\n }\n const m = main.getBoundingClientRect()\n let top = 0\n let right = 0\n let bottom = 0\n let left = 0\n for (const band of [\n bar,\n caption,\n regionHosts.footer,\n regionHosts.thumbnails,\n regionHosts.aside,\n ]) {\n if (band.hidden) continue\n const r = band.getBoundingClientRect()\n if (r.width < 1 || r.height < 1) continue\n if (r.width >= m.width * 0.5) {\n // a horizontal band: it covers the top or the bottom of the stage\n if (r.top - m.top < m.bottom - r.bottom) top = Math.max(top, r.bottom - m.top)\n else bottom = Math.max(bottom, m.bottom - r.top)\n } else if (r.left - m.left < m.right - r.right) {\n left = Math.max(left, r.right - m.left)\n } else {\n right = Math.max(right, m.right - r.left)\n }\n }\n controlsBox.style.setProperty(\n '--gallerist-controls-inset',\n `${top}px ${right}px ${bottom}px ${left}px`,\n )\n }\n const scheduleInset = () => {\n if (!insetFrame) insetFrame = requestAnimationFrame(updateControlsInset)\n }\n const bandObserver =\n controlsBox && typeof ResizeObserver !== 'undefined' ? new ResizeObserver(scheduleInset) : null\n for (const band of [\n main,\n bar,\n caption,\n regionHosts.footer,\n regionHosts.thumbnails,\n regionHosts.aside,\n ]) {\n bandObserver?.observe(band)\n }\n // viewer.refresh(): an explicit re-measure, for layout changes a ResizeObserver can't see\n const offRefresh = internals.onRefresh(onStageResize)\n\n // ── plugin regions (spec §13) ──────────────────────────────────────────────\n const mountPluginRegions = createRegionMounter(regionHosts, { viewer, preset })\n const mountRegions = () => {\n pluginKeymap = aggregateKeymap(internals.getPlugins())\n mountPluginRegions(internals.getPlugins())\n // The pull-handle leads the rail region while a rail plugin is mounted. The mounter leaves\n // nodes it didn't add alone, so place (or drop) the handle here.\n const thumbs = regionHosts.thumbnails\n const hasRail = [...thumbs.childNodes].some((n) => n !== railHandle)\n if (!hasRail) railHandle.remove()\n else if (thumbs.firstChild !== railHandle) thumbs.prepend(railHandle)\n if (!controls) bar.hidden = regionHosts.toolbar.childElementCount === 0\n syncCaption()\n // plugin overlays may have changed (e.g. React <Gallerist.Overlay> mount/unmount) → force repaint\n const cur = currentRec()\n if (cur) cur.overlayItem = undefined\n if (attached) renderWindow()\n }\n mountRegions()\n const offPlugins = internals.onPluginsChanged(mountRegions)\n\n const unsubscribe = viewer.subscribe(sync)\n sync()\n\n return {\n root,\n destroy() {\n unsubscribe()\n offPlugins()\n offZoomBounds()\n offRefresh()\n cancelPhaseWait?.()\n offLifecycle() // settles a transition in flight, so `closed` still fires\n detachGestures()\n resizeObserver?.disconnect()\n bandObserver?.disconnect()\n capObserver?.disconnect()\n if (insetFrame) cancelAnimationFrame(insetFrame)\n if (resizeFrame) cancelAnimationFrame(resizeFrame)\n idle?.destroy()\n document.removeEventListener('fullscreenchange', onFsChange)\n root.removeEventListener('keydown', onKey)\n for (const rec of mounted.values()) teardownSlide(rec)\n mounted.clear()\n warmRun++\n for (const [id, img] of warm) unwarm(id, img)\n detach()\n if (!overlay) root.remove()\n },\n }\n}\n","// Markup init: `<a href=\"big.jpg\" data-gallerist=\"trip\">` links open a viewer, with no collection to\n// write. A single delegated listener reads the links on each click, so links added later join in.\n// One viewer per gallery name, created on first use. Reads attributes only: captions reach the page as\n// text, and the link's URL only ever becomes a media source.\n\nimport {\n type Collection,\n type Group,\n type Item,\n type ViewerApi,\n type ViewerOptions,\n createViewer,\n} from '@gallerist/core'\nimport { type MountOptions, type RendererHandle, mount } from './mount'\n\ntype PerGallery<T> = T | ((gallery: string) => T)\n\nexport interface BindOptions {\n /** which elements are links (default `[data-gallerist]`). */\n selector?: string\n /** where to look for them (default `document`). */\n root?: Document | HTMLElement\n /**\n * `createViewer` options besides the collection (`plugins`, `loop`…), or a function returning a set\n * per gallery. With several galleries use the function for `pins()`, which holds its state on the\n * plugin and so can't be shared between viewers.\n */\n viewer?: PerGallery<Omit<ViewerOptions, 'collection' | 'groups' | 'items'>>\n /** `mount` options (`preset`, `skin`…), or one set per gallery. */\n mount?: PerGallery<MountOptions>\n}\n\nexport interface BindHandle {\n /** open a gallery from code, at its first item or the one given. */\n open(gallery?: string, at?: { g?: number; i?: number }): void\n /** the gallery's viewer, once it has been opened. */\n viewer(gallery?: string): ViewerApi | undefined\n /** stop listening and destroy every viewer. */\n destroy(): void\n}\n\nconst attr = (el: Element, name: string): string | undefined =>\n el.getAttribute(`data-gallerist-${name}`) ?? undefined\n\nconst dimension = (el: Element, name: string): number => Number(attr(el, name))\n\nfunction itemFromLink(el: Element, id: string): Item | null {\n const source = attr(el, 'src') ?? el.getAttribute('href')\n if (!source) return null\n const img = el.querySelector('img')\n const item: Item = {\n id: attr(el, 'id') ?? id,\n type: attr(el, 'type') ?? 'image',\n source,\n }\n const thumb = attr(el, 'thumb') ?? img?.getAttribute('src')\n if (thumb) item.thumb = thumb\n const alt = attr(el, 'alt') ?? img?.getAttribute('alt')\n if (alt) item.alt = alt\n const caption = attr(el, 'caption')\n if (caption) item.caption = caption\n const w = dimension(el, 'width')\n const h = dimension(el, 'height')\n if (w > 0 && h > 0) item.naturalSize = { w, h }\n return item\n}\n\ninterface LinkCollection {\n collection: Collection\n /** where each link landed */\n positions: Map<Element, { g: number; i: number }>\n}\n\n/**\n * Build a collection from link elements. A link with `data-gallerist-group` joins the group of that\n * id, in first-seen order (named by `-group-caption`, with `-group-subtitle` in its meta); any other\n * link is a group of its own. Elements with neither a `data-gallerist-src` nor an `href` are skipped.\n */\nexport function collectionFromLinks(links: Iterable<Element>, idPrefix = 'link'): LinkCollection {\n const groups: Group[] = []\n const byId = new Map<string, number>()\n const positions = new Map<Element, { g: number; i: number }>()\n const usedIds = new Set<string>()\n let n = 0\n for (const el of links) {\n const generated = `${idPrefix}-${n}`\n const item = itemFromLink(el, generated)\n if (!item) continue\n // the same id on two links (a hero and its gallery copy) would fail the whole collection\n if (usedIds.has(item.id)) item.id = usedIds.has(generated) ? `${generated}-dup` : generated\n usedIds.add(item.id)\n const groupId = attr(el, 'group')\n let g = groupId ? byId.get(groupId) : undefined\n if (g === undefined) {\n const group: Group = { id: groupId ?? `${idPrefix}-g${n}`, items: [] }\n const caption = attr(el, 'group-caption')\n if (caption) group.caption = caption\n const subtitle = attr(el, 'group-subtitle')\n if (subtitle) group.meta = { subtitle }\n g = groups.push(group) - 1\n if (groupId) byId.set(groupId, g)\n }\n const items = (groups[g] as Group).items\n positions.set(el, { g, i: items.push(item) - 1 })\n n++\n }\n return { collection: { groups }, positions }\n}\n\n/**\n * Open a viewer from `data-gallerist` links. Each distinct attribute value is its own gallery. A plain\n * click opens the viewer at that link; a modified click (new tab, download) stays the browser's.\n */\nexport function bind(opts: BindOptions = {}): BindHandle {\n const selector = opts.selector ?? '[data-gallerist]'\n const root: Document | HTMLElement = opts.root ?? document\n interface Live {\n viewer: ViewerApi\n handle: RendererHandle\n signature: string\n /** the link that last opened it, which gets focus back */\n link: Element | null\n }\n const live = new Map<string, Live>()\n let destroyed = false\n\n // the viewer's own controls and pin links aren't gallery links, however broad the selector\n const linksOf = (gallery: string) =>\n [...root.querySelectorAll(selector)].filter(\n (el) => (el.getAttribute('data-gallerist') ?? '') === gallery && !el.closest('.gallerist'),\n )\n const pick = <T>(value: PerGallery<T> | undefined, gallery: string): T | undefined =>\n typeof value === 'function' ? (value as (g: string) => T)(gallery) : value\n\n const ensure = (gallery: string) => {\n const { collection, positions } = collectionFromLinks(linksOf(gallery), gallery || 'link')\n if (collection.groups.length === 0) return null\n const signature = JSON.stringify(collection)\n const existing = live.get(gallery)\n if (existing) {\n // links changed since the last open\n if (existing.signature !== signature) {\n existing.viewer.setCollection(collection)\n existing.signature = signature\n }\n return { entry: existing, positions }\n }\n const viewer = createViewer({ ...pick(opts.viewer, gallery), collection })\n const handle = mount(viewer, {\n // a link removed meanwhile falls back to what had focus on opening\n returnFocus: () => {\n const link = live.get(gallery)?.link as HTMLElement | null | undefined\n return link?.isConnected ? link : null\n },\n ...pick(opts.mount, gallery),\n })\n const entry: Live = { viewer, handle, signature, link: null }\n live.set(gallery, entry)\n return { entry, positions }\n }\n\n const onClick = (event: Event) => {\n const e = event as MouseEvent\n if (e.defaultPrevented || e.button !== 0) return\n if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return\n const link = (e.target as Element | null)?.closest?.(selector)\n if (!link || link.closest('.gallerist')) return\n const ready = ensure(link.getAttribute('data-gallerist') ?? '')\n const at = ready?.positions.get(link)\n if (!ready || !at) return // no source: leave the element alone\n e.preventDefault()\n ready.entry.link = link\n ready.entry.viewer.open(at)\n }\n root.addEventListener('click', onClick)\n\n return {\n open(gallery, at) {\n if (destroyed) return\n const ready = ensure(gallery ?? '')\n if (!ready) return\n ready.entry.link = null // not opened from a link: focus goes back where it was\n ready.entry.viewer.open(at ?? { g: 0, i: 0 })\n },\n viewer: (gallery = '') => live.get(gallery)?.viewer,\n destroy() {\n destroyed = true\n root.removeEventListener('click', onClick)\n for (const { handle, viewer } of live.values()) {\n handle.destroy()\n viewer.destroy()\n }\n live.clear()\n },\n }\n}\n","// @gallerist/renderer-dom — default DOM renderer (the only ring that touches the DOM).\ndeclare const __GALLERIST_VERSION__: string | undefined\n/** Package version, injected from package.json at build (tsup `define`). Guarded with `typeof` so\n * importing the source without the define (e2e / example fixtures) yields a dev marker, not a crash. */\nexport const VERSION =\n typeof __GALLERIST_VERSION__ !== 'undefined' ? __GALLERIST_VERSION__ : '0.0.0-dev'\n\nexport { imageAdapter } from './adapters/image'\nexport { type BindHandle, type BindOptions, bind, collectionFromLinks } from './bind'\nexport {\n type Accent,\n type Appearance,\n applyAppearance,\n type ColorScheme,\n type Skin,\n} from './appearance'\nexport {\n type ArrowLayout,\n type GroupAxis,\n type ItemIndicator,\n type MountOptions,\n mount,\n type RailPlacement,\n type RendererHandle,\n} from './mount'\nexport { type PresetName, type ResolvedPreset, resolvePreset } from './presets'\nexport { DEFAULT_STRINGS, type Strings } from './strings'\nexport { type KeyReconcile, reconcileKeys, windowIndices } from './windowing'\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/adapters/image.ts","../src/appearance.ts","../src/transform.ts","../src/gestures.ts","../src/idle.ts","../src/overlays/position.ts","../src/overlays/render.ts","../src/presets.ts","../src/regions.ts","../src/strings.ts","../src/mount.ts","../src/bind.ts","../src/index.ts"],"names":["el","fitScale","clampScale","clampPanToBox","clampPan","getInternals","arbitrate","focalZoom","toggleZoom","ICONS","windowIndices","reconcileKeys","stageSize","text","nav","createViewer"],"mappings":"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","file":"index.cjs","sourcesContent":["// Image media adapter (spec §12, decision P0-J). Lives in the renderer because it touches DOM.\n// Responsive srcset, decode-before-reveal, LQIP placeholder, naturalSize hint, abortable load.\n\nimport type { AdapterCtx, Item, MediaAdapter, MountedMedia } from '@gallerist/core'\n\nconst COLOR_RE = /^(#|rgb|hsl|[a-z]+$)/i\n\n// Chars that could escape the url(\"…\") literal and inject extra CSS (e.g. a second url() that\n// fires an attacker-controlled request). Quotes/backslash/newlines are rejected for the url path.\nconst CSS_URL_UNSAFE = /[\"\\\\\\n\\r]/\n\n// Static broken-image glyph (lucide \"image-off\"); safe to inject as markup (no user data).\nconst BROKEN_ICON =\n '<svg viewBox=\"0 0 24 24\" width=\"44\" height=\"44\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M10.4 10.4a2 2 0 1 1-2.8-2.8\"/><path d=\"M21 15.5V5a2 2 0 0 0-2-2H8.5\"/><path d=\"M3.6 3.6A2 2 0 0 0 3 5v14a2 2 0 0 0 2 2h14a2 2 0 0 0 1.4-.6\"/><path d=\"m5 21 7-7\"/><path d=\"m2 2 20 20\"/></svg>'\n\nfunction applyPlaceholder(el: HTMLElement, placeholder: string): void {\n if (placeholder.startsWith('data:') || placeholder.includes('/')) {\n if (CSS_URL_UNSAFE.test(placeholder)) return // reject breakout attempts — paint nothing\n el.style.backgroundImage = `url(\"${placeholder}\")`\n el.style.backgroundSize = 'cover'\n el.style.backgroundPosition = 'center'\n } else if (COLOR_RE.test(placeholder)) {\n el.style.backgroundColor = placeholder\n }\n}\n\nexport function imageAdapter(): MediaAdapter {\n return { type: 'image', mount: mountImage }\n}\n\n/** The built-in image adapter's mount; the renderer preloads only items it would mount. */\nexport function mountImage(item: Item, slot: HTMLElement, ctx: AdapterCtx): MountedMedia {\n const img = document.createElement('img')\n img.setAttribute('decoding', 'async')\n img.setAttribute('fetchpriority', ctx.priority ?? 'auto')\n img.className = 'gallerist-media gallerist-media-image'\n if (item.alt !== undefined) img.alt = item.alt\n if (item.placeholder) applyPlaceholder(img, item.placeholder)\n slot.appendChild(img)\n\n // A loader may resolve to a custom element instead of an <img>; track the live node.\n let element: HTMLElement = img\n\n // On load failure, show a centered error card (icon + the item's alt as a caption) instead\n // of the browser's default top-left broken-image glyph, which overlapped the chrome (I-UX3).\n let errorEl: HTMLElement | null = null\n const showError = () => {\n if (errorEl) return\n img.setAttribute('data-gallerist-error', '') // keeps the img hidden + excludes it from shimmer\n const card = document.createElement('div')\n card.className = 'gallerist-media-error'\n card.setAttribute('role', 'img')\n if (item.alt) card.setAttribute('aria-label', item.alt)\n const icon = document.createElement('div')\n icon.className = 'gallerist-media-error-icon'\n icon.setAttribute('aria-hidden', 'true')\n icon.innerHTML = BROKEN_ICON // static markup only\n card.appendChild(icon)\n if (item.alt) {\n const label = document.createElement('span')\n label.className = 'gallerist-media-error-label'\n label.textContent = item.alt // host-supplied → textContent, never innerHTML\n card.appendChild(label)\n }\n slot.appendChild(card)\n errorEl = card\n }\n\n const ready = new Promise<void>((resolve, reject) => {\n const abortErr = () => new DOMException('Image load aborted', 'AbortError')\n if (ctx.signal.aborted) {\n reject(abortErr())\n return\n }\n const cleanup = () => {\n img.removeEventListener('load', onLoad)\n img.removeEventListener('error', onError)\n ctx.signal.removeEventListener('abort', onAbort)\n }\n const onAbort = () => {\n cleanup()\n reject(abortErr())\n }\n const onLoad = async () => {\n try {\n if (typeof img.decode === 'function') await img.decode()\n } catch {\n // decode can reject on detached/aborted nodes — fall through and reveal anyway.\n }\n cleanup()\n img.setAttribute('data-gallerist-loaded', '')\n resolve()\n }\n const onError = () => {\n cleanup()\n showError()\n reject(new Error(`image load error: ${item.id}`))\n }\n img.addEventListener('load', onLoad)\n img.addEventListener('error', onError)\n ctx.signal.addEventListener('abort', onAbort)\n\n const src = item.source\n if (typeof src === 'string') {\n img.src = src\n } else if ('src' in src) {\n img.src = src.src\n if (src.srcset) img.setAttribute('srcset', src.srcset)\n if (src.sizes) img.setAttribute('sizes', src.sizes)\n } else if ('loader' in src) {\n src\n .loader(ctx.signal)\n .then((res) => {\n if (ctx.signal.aborted) return\n if (typeof res === 'string') {\n img.src = res // load/error handlers settle ready\n } else {\n // a custom element: swap it in, it is its own ready signal\n cleanup()\n img.remove()\n slot.appendChild(res)\n res.setAttribute('data-gallerist-loaded', '')\n element = res\n resolve()\n }\n })\n .catch((err) => {\n cleanup()\n showError()\n reject(err instanceof Error ? err : new Error(String(err)))\n })\n }\n // tiles (DZI) is a v2 seam — not handled here.\n })\n // Avoid unhandled-rejection noise if no one awaits ready on a canceled load.\n ready.catch(() => {})\n\n return {\n get element() {\n return element\n },\n ready,\n supportsZoom: true,\n naturalSize() {\n if (item.naturalSize) return item.naturalSize\n return img.naturalWidth ? { w: img.naturalWidth, h: img.naturalHeight } : null\n },\n destroy() {\n img.removeAttribute('src')\n element.remove()\n errorEl?.remove() // the error card is a slot sibling, not `element`\n },\n }\n}\n","// Skin, accent and colour scheme (plan P2-A/D). The renderer only reflects them as data attributes\n// on the root; the theme's skin files do the rest, so switching any of them never rebuilds the DOM.\n\n/** Visual skin. `gallery` ships in gallerist.css; `console` and `editorial` need their stylesheet\n * (console.css, editorial.css) loaded after it. */\nexport type Skin = 'gallery' | 'console' | 'editorial' | (string & {})\n/** Accents are named per skin. Gallery: periwinkle (default), mint, amber, vermilion. Console:\n * amber (default), cyan, vermilion. Editorial: vermilion (default), cobalt. A name the skin\n * doesn't know falls back to its default. */\nexport type Accent =\n | 'periwinkle'\n | 'mint'\n | 'amber'\n | 'cyan'\n | 'vermilion'\n | 'cobalt'\n | (string & {})\n/** `auto` follows the system's `prefers-color-scheme`. Unset, each skin uses its own default:\n * Gallery and Console dark, Editorial the light wall. */\nexport type ColorScheme = 'dark' | 'light' | 'auto'\n\nexport interface Appearance {\n skin?: Skin\n accent?: Accent\n scheme?: ColorScheme\n}\n\n/**\n * Write an appearance onto a viewer root (`data-gallerist-skin|accent|scheme`). Only the options\n * present in `appearance` change, so `applyAppearance(root, { accent: 'cyan' })` keeps the skin and\n * scheme; an option present but `undefined` goes back to its default (`gallery`, the skin's own\n * scheme and accent).\n */\nexport function applyAppearance(root: HTMLElement, appearance: Appearance): void {\n if ('skin' in appearance) root.setAttribute('data-gallerist-skin', appearance.skin ?? 'gallery')\n if ('scheme' in appearance) {\n if (appearance.scheme) root.setAttribute('data-gallerist-scheme', appearance.scheme)\n else root.removeAttribute('data-gallerist-scheme')\n }\n if ('accent' in appearance) {\n if (appearance.accent) root.setAttribute('data-gallerist-accent', appearance.accent)\n else root.removeAttribute('data-gallerist-accent')\n }\n}\n","import type { ZoomState } from '@gallerist/core'\n\n/** The content layer's CSS transform for a zoom state (stage = content · scale + (x, y)). */\nexport function zoomTransform(zoom: ZoomState): string {\n return `translate(${zoom.x}px, ${zoom.y}px) scale(${zoom.scale})`\n}\n","// Pointer/wheel/double-tap gesture wiring (spec §11). Resolves a single pointer-down to one\n// intent via the core arbitration reducer, applies live pan/zoom imperatively (decision P0-E:\n// no store writes during a gesture), and commits the result on release. The arbitration matrix\n// itself is unit-tested in core; real multi-pointer flows are verified in Playwright (M3.5).\n\nimport type { ViewerApi, ZoomState } from '@gallerist/core'\nimport {\n type Intent,\n arbitrate,\n clampPan,\n clampPanToBox,\n clampScale,\n fitScale,\n focalZoom,\n getInternals,\n toggleZoom,\n} from '@gallerist/core/internal'\nimport { zoomTransform } from './transform'\n\nexport interface Geometry {\n stageRect: { left: number; top: number; width: number; height: number }\n naturalSize: { w: number; h: number } | null\n /** The painted media inside the content layer at fit (e.g. a letterboxed image); pan bounds\n * keep it covering the stage. Omitted: the whole content layer counts as media. */\n mediaBox?: { x: number; y: number; w: number; h: number }\n}\n\nexport interface GestureNav {\n next(): void\n prev(): void\n nextItem(): void\n prevItem(): void\n}\n\nexport interface GestureOptions {\n stage: HTMLElement\n viewer: ViewerApi\n getContent: () => HTMLElement | null\n getGeometry: () => Geometry\n threshold?: number\n commitNav?: number\n closeDismiss?: number\n maxScale?: number\n /** navigation seam — lets the renderer route swipes through linear/oriented nav (defaults to the\n * viewer's group/item axes). */\n nav?: GestureNav\n raf?: (cb: () => void) => number\n caf?: (id: number) => void\n}\n\ninterface Pt {\n x: number\n y: number\n}\n\nconst dist = (a: Pt, b: Pt) => Math.hypot(a.x - b.x, a.y - b.y)\nconst mid = (a: Pt, b: Pt): Pt => ({ x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 })\n\nexport function attachGestures(opts: GestureOptions): () => void {\n const {\n stage,\n viewer,\n getContent,\n getGeometry,\n threshold = 10,\n commitNav = 60,\n closeDismiss = 120,\n maxScale = 4,\n nav = {\n next: () => viewer.next(),\n prev: () => viewer.prev(),\n nextItem: () => viewer.nextItem(),\n prevItem: () => viewer.prevItem(),\n },\n raf = (cb) => requestAnimationFrame(cb),\n caf = (id) => cancelAnimationFrame(id),\n } = opts\n\n // The drag-to-dismiss progress var lives on the root (not the stage) so sibling layers like the\n // backdrop — which are not descendants of the stage — can consume it via inheritance (S-R1).\n const dismissEl = (stage.closest('.gallerist') as HTMLElement | null) ?? stage\n\n const pointers = new Map<number, Pt>()\n let start: Pt | null = null\n let startZoom = { scale: 1, x: 0, y: 0 }\n let pinchStartDist = 0\n let intent: Intent = 'none'\n let live = { scale: 1, x: 0, y: 0 }\n let frame = 0\n // Geometry snapshot for the active gesture — avoids a getBoundingClientRect (forced layout)\n // on every pointermove during pinch/pan, which would jeopardize the 60fps budget (§20).\n let gestureGeom: Geometry | null = null\n\n const geom = () => gestureGeom ?? getGeometry()\n const fitOf = (g: Geometry) =>\n g.naturalSize ? fitScale({ w: g.stageRect.width, h: g.stageRect.height }, g.naturalSize) : 1\n const fit = () => fitOf(geom())\n const toStage = (p: Pt): Pt => {\n const r = geom().stageRect\n return { x: p.x - r.left, y: p.y - r.top }\n }\n // Every commit is settled first: scale into [fit, max], pan so the content covers the stage\n // (centred once it fits). Without this a pinch or double-tap back to fit kept its pan offset and\n // left the image off-centre. The renderer's zoom bounds re-check the same in the core.\n const settle = (z: ZoomState, g: Geometry = geom()): ZoomState => {\n const scaled = { scale: clampScale(z.scale, fitOf(g), maxScale), x: z.x, y: z.y }\n const stageSize = { w: g.stageRect.width, h: g.stageRect.height }\n if (g.mediaBox) return clampPanToBox(scaled, stageSize, g.mediaBox)\n return g.naturalSize ? clampPan(scaled, stageSize, g.naturalSize) : scaled\n }\n const internals = getInternals(viewer)\n // Commit, then show the committed transform: a commit identical to the stored zoom is skipped\n // (no store change, so the renderer won't repaint), which would leave the content at the live\n // gesture transform — e.g. a pan dragged past the edge and clamped back to where it started.\n const commit = (z: ZoomState) => {\n internals.setZoom(z)\n const content = getContent()\n if (content) content.style.transform = zoomTransform(viewer.getState().zoom)\n }\n\n const schedule = () => {\n if (frame) return\n frame = raf(() => {\n frame = 0\n const content = getContent()\n if (content) {\n content.style.transform = zoomTransform(live)\n }\n })\n }\n\n // Pointer capture keeps move/up/cancel flowing to the stage even when the pointer\n // leaves the stage bounds (panning a zoomed image past the edge, a fast swipe). Without\n // it an off-stage pointerup never reaches onUp, stranding the gesture and poisoning the\n // next one. Guard the calls: synthetic test events and inactive pointer ids throw (C3).\n const capture = (id: number) => {\n try {\n stage.setPointerCapture?.(id)\n } catch {}\n }\n const release = (id: number) => {\n try {\n stage.releasePointerCapture?.(id)\n } catch {}\n }\n\n // Wheel/trackpad zoom: snapshot geometry once per burst (no forced layout per tick), accumulate\n // the target locally and apply it imperatively via the RAF schedule, then commit to the store\n // ONCE when the burst settles — instead of a full store commit + render + subscriber fan-out on\n // every tick (the one continuous interaction that was routed through the store) (I-PERF1).\n const WHEEL_COMMIT_MS = 90\n let wheelGeom: Geometry | null = null\n let wheelZoom: { scale: number; x: number; y: number } | null = null\n let wheelTimer: ReturnType<typeof setTimeout> | undefined\n\n const commitWheel = () => {\n wheelTimer = undefined\n wheelGeom = null\n if (wheelZoom) {\n commit(wheelZoom) // already clamped per tick\n wheelZoom = null\n }\n }\n // Force any settle-pending wheel zoom into the store NOW. Called before a competing interaction\n // (pointer down, double-click) snapshots its zoom base, and on teardown, so the wheel result is\n // never clobbered by a stale base nor silently dropped (review #1/#4).\n const flushWheel = () => {\n if (wheelTimer) {\n clearTimeout(wheelTimer)\n commitWheel()\n }\n }\n\n const onDown = (e: PointerEvent) => {\n flushWheel() // commit a pending wheel zoom before snapshotting startZoom from the store\n pointers.set(e.pointerId, { x: e.clientX, y: e.clientY })\n // NB: do NOT capture the pointer here. The stage hosts interactive overlay/plugin UI (e.g. the\n // grid cells, which live inside .gallerist-stage); capturing on every pointerdown would redirect\n // the pointerup and swallow their click. Capture only once a real drag/pinch is recognized\n // (in onMove, and the pinch branch below), so a tap still delivers its click to the target (C3).\n startZoom = { ...viewer.getState().zoom }\n live = { ...startZoom }\n gestureGeom = getGeometry() // snapshot once; reused for the gesture (no per-move layout)\n if (pointers.size === 1) {\n start = { x: e.clientX, y: e.clientY }\n intent = 'none'\n } else if (pointers.size === 2) {\n const [a, b] = [...pointers.values()]\n if (a && b) pinchStartDist = dist(a, b)\n intent = 'zoom'\n for (const id of pointers.keys()) capture(id) // a pinch is unambiguously a gesture\n }\n }\n\n const resolveIntent = (dx: number, dy: number): Intent => {\n const g = geom()\n return arbitrate({\n pointerCount: pointers.size === 0 ? 1 : pointers.size,\n dx,\n dy,\n scale: startZoom.scale,\n fitScale: g.naturalSize ? fit() : startZoom.scale,\n grouped: currentGroupHasMultiple(viewer),\n threshold,\n })\n }\n\n const onMove = (e: PointerEvent) => {\n if (!pointers.has(e.pointerId)) return\n pointers.set(e.pointerId, { x: e.clientX, y: e.clientY })\n\n if (intent === 'zoom' && pointers.size >= 2) {\n const [a, b] = [...pointers.values()]\n if (!a || !b || pinchStartDist === 0) return\n const factor = dist(a, b) / pinchStartDist\n const newScale = clampScale(startZoom.scale * factor, fit(), maxScale)\n live = focalZoom(startZoom, toStage(mid(a, b)), newScale)\n schedule()\n return\n }\n\n if (!start) return\n const dx = e.clientX - start.x\n const dy = e.clientY - start.y\n\n if (intent === 'none') {\n intent = resolveIntent(dx, dy)\n // Now that this is a real drag (not a tap), capture so move/up keep flowing even off-stage\n // — without stealing the click from a tap that never moved (C3).\n if (intent !== 'none') capture(e.pointerId)\n }\n\n if (intent === 'pan') {\n live = { scale: startZoom.scale, x: startZoom.x + dx, y: startZoom.y + dy }\n schedule()\n } else if (intent === 'close') {\n const k = Math.max(0.5, 1 - Math.abs(dy) / 1000)\n live = { scale: startZoom.scale * k, x: startZoom.x + dx, y: startZoom.y + dy }\n dismissEl.style.setProperty(\n '--gallerist-dismiss',\n String(Math.min(1, Math.abs(dy) / closeDismiss)),\n )\n schedule()\n }\n // navigate / secondary are committed on release (track animation lands in M5)\n }\n\n const onUp = (e: PointerEvent) => {\n if (!pointers.has(e.pointerId)) return\n pointers.delete(e.pointerId)\n release(e.pointerId)\n if (frame) {\n caf(frame)\n frame = 0\n }\n\n // Pinch → single-finger handoff: when the first of two fingers lifts, commit the pinch\n // zoom now and re-seat the gesture onto the remaining finger so it continues as a fresh\n // pan/swipe. Otherwise the lingering finger is dead until the second finger lifts (I-R2).\n if (intent === 'zoom' && pointers.size === 1) {\n live = settle(live)\n commit(live)\n const [remaining] = [...pointers.values()]\n startZoom = { ...live }\n start = remaining ? { x: remaining.x, y: remaining.y } : null\n intent = 'none'\n return\n }\n\n // Use the up event's own coordinates: coalesced input may have fired no pointermove,\n // leaving the stored position stale at the down point.\n const dx = start ? e.clientX - start.x : 0\n const dy = start ? e.clientY - start.y : 0\n\n // Resolve at release too: synthetic/coalesced input may deliver no pointermove\n // before pointerup, leaving intent unresolved otherwise.\n if (intent === 'none') intent = resolveIntent(dx, dy)\n\n switch (intent) {\n case 'pan':\n commit(settle(live))\n break\n case 'zoom':\n if (pointers.size === 0) commit(settle(live))\n break\n case 'navigate':\n if (Math.abs(dx) >= commitNav) dx < 0 ? nav.next() : nav.prev()\n break\n case 'close':\n dismissEl.style.removeProperty('--gallerist-dismiss')\n if (Math.abs(dy) >= closeDismiss) viewer.close()\n else commit(startZoom) // snap back from the drag-to-dismiss shrink\n break\n case 'secondary':\n // Arbitration only yields 'secondary' for an upward drag (downward is dismiss), and like\n // the group axis it needs a real commit distance — not just the 10px intent threshold.\n if (-dy >= commitNav) nav.nextItem()\n break\n }\n\n if (pointers.size === 0) {\n start = null\n intent = 'none'\n gestureGeom = null\n }\n }\n\n // pointercancel means the browser took the pointer away (a system gesture, palm rejection, a\n // scroll takeover): abandon the whole gesture rather than treating it as a release, which could\n // navigate or dismiss from a drag the user never finished. Snap back to the committed transform.\n const onCancel = (e: PointerEvent) => {\n if (!pointers.has(e.pointerId)) return\n for (const id of pointers.keys()) release(id)\n pointers.clear()\n if (frame) {\n caf(frame)\n frame = 0\n }\n dismissEl.style.removeProperty('--gallerist-dismiss')\n const content = getContent()\n if (content) content.style.transform = zoomTransform(viewer.getState().zoom)\n start = null\n intent = 'none'\n gestureGeom = null\n }\n\n const onWheel = (e: WheelEvent) => {\n e.preventDefault()\n if (!wheelGeom) wheelGeom = getGeometry()\n const g = wheelGeom\n const base = wheelZoom ?? viewer.getState().zoom\n const factor = e.deltaY < 0 ? 1.15 : 1 / 1.15\n // clamp the scale before pivoting (so the cursor point stays put), then settle the pan; uses\n // the burst's geometry snapshot, never a fresh measure per tick\n const newScale = clampScale(base.scale * factor, fitOf(g), maxScale)\n const focal = { x: e.clientX - g.stageRect.left, y: e.clientY - g.stageRect.top }\n wheelZoom = settle(focalZoom(base, focal, newScale), g)\n live = { ...wheelZoom }\n schedule()\n if (wheelTimer) clearTimeout(wheelTimer)\n wheelTimer = setTimeout(commitWheel, WHEEL_COMMIT_MS)\n }\n\n const onDblClick = (e: MouseEvent) => {\n // a double click on a control in the stage (a pin, a card's link) belongs to that control\n const hit = e.target as Element | null\n if (hit?.closest?.('button, a[href], input, select, textarea, [data-interactive]')) return\n flushWheel() // commit a pending wheel zoom before reading the base for the toggle\n const z = viewer.getState().zoom\n const target = toggleZoom(z.scale, fit(), maxScale)\n commit(settle(focalZoom(z, toStage({ x: e.clientX, y: e.clientY }), target)))\n }\n\n // A mouse drag over the media starts the browser's native image drag-and-drop, which fires\n // pointercancel and steals the gesture. Block it on the media only: overlays and plugin UI in the\n // stage keep their own drag-and-drop.\n const onDragStart = (e: Event) => {\n const target = e.target as Element | null\n const content = getContent()\n if (!target || !content?.contains(target)) return\n if (target.closest?.('.gallerist-overlays-content')) return\n e.preventDefault()\n }\n\n stage.addEventListener('dragstart', onDragStart)\n stage.addEventListener('pointerdown', onDown)\n stage.addEventListener('pointermove', onMove)\n stage.addEventListener('pointerup', onUp)\n stage.addEventListener('pointercancel', onCancel)\n stage.addEventListener('wheel', onWheel, { passive: false })\n stage.addEventListener('dblclick', onDblClick)\n\n return () => {\n stage.removeEventListener('dragstart', onDragStart)\n stage.removeEventListener('pointerdown', onDown)\n stage.removeEventListener('pointermove', onMove)\n stage.removeEventListener('pointerup', onUp)\n stage.removeEventListener('pointercancel', onCancel)\n stage.removeEventListener('wheel', onWheel)\n stage.removeEventListener('dblclick', onDblClick)\n if (frame) caf(frame)\n flushWheel() // commit a settle-pending wheel zoom rather than dropping it on teardown\n }\n}\n\nfunction currentGroupHasMultiple(viewer: ViewerApi): boolean {\n const col = viewer.getCollection()\n const g = viewer.getState().cursor.g\n return (col.groups[g]?.items.length ?? 0) > 1\n}\n","// Idle controller (M14 UX-C). Flags the root with `data-gallerist-idle` after a period of no pointer/\n// key activity so the theme can fade the chrome + rail; any activity wakes it. Inert under\n// prefers-reduced-motion — auto-hiding UI is disorienting motion, so we never hide there.\n\nconst ATTR = 'data-gallerist-idle'\nconst ACTIVITY = ['pointermove', 'pointerdown', 'keydown', 'wheel', 'touchstart'] as const\n// pointermove fires many times/second — re-arm the timer at most this often to avoid timer churn.\nconst REARM_THROTTLE_MS = 200\n\nexport interface IdleControllerOptions {\n /** inactivity before idle (ms). default 2500. */\n delay?: number\n /** override reduced-motion detection (mainly for tests). */\n reducedMotion?: boolean\n}\n\nexport interface IdleController {\n /** reset the timer and wake (clear idle). */\n poke(): void\n destroy(): void\n}\n\nfunction prefersReducedMotion(root: HTMLElement): boolean {\n const win = root.ownerDocument?.defaultView\n return win?.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false\n}\n\nexport function createIdleController(\n root: HTMLElement,\n opts: IdleControllerOptions = {},\n): IdleController {\n const delay = opts.delay ?? 2500\n const reduced = opts.reducedMotion ?? prefersReducedMotion(root)\n\n // Under reduced motion (or no real timers), return an inert controller — chrome stays visible.\n if (reduced) {\n return { poke() {}, destroy() {} }\n }\n\n let timer: ReturnType<typeof setTimeout> | null = null\n let alive = true\n let lastArm = 0\n let isIdle = false\n\n // Only touch the attribute when the idle state actually flips — onActivity runs on every\n // pointermove/wheel during gestures, so an unconditional removeAttribute is a wasted DOM call\n // per input event (S-PERF3).\n const wake = () => {\n if (!isIdle) return\n isIdle = false\n root.removeAttribute(ATTR)\n }\n const goIdle = () => {\n if (!alive || isIdle) return\n isIdle = true\n root.setAttribute(ATTR, '')\n }\n const arm = () => {\n if (timer != null) clearTimeout(timer)\n timer = setTimeout(goIdle, delay)\n lastArm = Date.now()\n }\n // forced reset (public poke) — wake immediately and re-arm.\n const poke = () => {\n wake()\n arm()\n }\n // activity handler — wake instantly, but coalesce re-arming so a stream of pointermoves\n // doesn't recreate the timer on every event.\n const onActivity = () => {\n wake()\n if (Date.now() - lastArm >= REARM_THROTTLE_MS) arm()\n }\n\n for (const ev of ACTIVITY) root.addEventListener(ev, onActivity, { passive: true })\n arm()\n\n return {\n poke,\n destroy() {\n alive = false\n if (timer != null) clearTimeout(timer)\n for (const ev of ACTIVITY) root.removeEventListener(ev, onActivity)\n root.removeAttribute(ATTR)\n },\n }\n}\n","// Overlay positioning math (spec §9.1). Pure — maps content/viewport anchors to box geometry\n// within the content layer (which is CSS-contained, so natural coords map through the contain rect).\n\nimport type { ContentAnchor, OverlaySpec, ViewportAnchor } from '@gallerist/core'\n\nexport interface Size {\n w: number\n h: number\n}\nexport interface ContainRect {\n x: number\n y: number\n w: number\n h: number\n}\nexport interface OverlayBox {\n left: number\n top: number\n width: number | null\n height: number | null\n}\n\n/** Contain rect of `natural` centered within `container` (object-fit: contain). */\nexport function containRect(container: Size, natural: Size): ContainRect {\n const s = Math.min(container.w / natural.w, container.h / natural.h)\n const w = natural.w * s\n const h = natural.h * s\n return { x: (container.w - w) / 2, y: (container.h - h) / 2, w, h }\n}\n\n/** `rect` is the painted media box when the renderer knows it (framed media); otherwise the media\n * is assumed contained in the whole stage. */\nexport function contentAnchorBox(\n anchor: ContentAnchor,\n stage: Size,\n natural: Size,\n rect: ContainRect = containRect(stage, natural),\n): OverlayBox {\n const s = rect.w / natural.w\n const space = anchor.space ?? 'normalized'\n\n const mapX = (x: number) => (space === 'natural' ? rect.x + x * s : rect.x + x * rect.w)\n const mapY = (y: number) => (space === 'natural' ? rect.y + y * s : rect.y + y * rect.h)\n const mapW = (w: number) => (space === 'natural' ? w * s : w * rect.w)\n const mapH = (h: number) => (space === 'natural' ? h * s : h * rect.h)\n\n if (anchor.kind === 'point') {\n return { left: mapX(anchor.x), top: mapY(anchor.y), width: null, height: null }\n }\n return {\n left: mapX(anchor.x),\n top: mapY(anchor.y),\n width: mapW(anchor.w),\n height: mapH(anchor.h),\n }\n}\n\n/** region → scales with the image by default; point → counter-scaled (constant screen size). */\nexport function resolveScaleWithImage(anchor: ContentAnchor, override?: boolean): boolean {\n if (override !== undefined) return override\n return anchor.kind === 'region'\n}\n\n/** Counter-scale transform that keeps a point overlay a constant screen size under zoom. */\nexport function counterScaleTransform(zoomScale: number): string {\n return `translate(-50%, -50%) scale(${1 / zoomScale})`\n}\n\nexport function viewportAnchorStyle(\n at: ViewportAnchor['at'],\n offset: [number, number] = [0, 0],\n): Record<string, string> {\n const [ox, oy] = offset\n const style: Record<string, string> = { position: 'absolute' }\n\n if (at.startsWith('top')) style.top = `${oy}px`\n else if (at.startsWith('bottom')) style.bottom = `${oy}px`\n else style.top = '50%'\n\n if (at.endsWith('left')) style.left = `${ox}px`\n else if (at.endsWith('right')) style.right = `${ox}px`\n else style.left = '50%'\n\n const tx = at === 'top' || at === 'bottom' || at === 'center' ? '-50%' : '0'\n const ty = at === 'left' || at === 'right' || at === 'center' ? '-50%' : '0'\n if (tx !== '0' || ty !== '0') style.transform = `translate(${tx}, ${ty})`\n\n return style\n}\n\n/** Resolve the overlay sources for a slide (group + item), ordered by layer (spec §9). */\nexport function orderByLayer<T extends OverlaySpec>(specs: T[]): T[] {\n return [...specs].sort((a, b) => (a.layer ?? 0) - (b.layer ?? 0))\n}\n","// Overlay rendering (spec §9). Paints viewport-layer and content-layer overlays for the current\n// slide. Content overlays live inside the transformed content layer so they track pan/zoom for\n// free; point overlays are counter-scaled to hold a constant screen size (decision per §9.1).\n\nimport type { Group, Item, OverlaySpec, ViewerApi, ZoomState } from '@gallerist/core'\nimport { getInternals } from '@gallerist/core/internal'\nimport {\n type Size,\n contentAnchorBox,\n counterScaleTransform,\n orderByLayer,\n resolveScaleWithImage,\n viewportAnchorStyle,\n} from './position'\n\nconst FOCUSABLE = 'a[href], button, input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n\nexport interface OverlayPaintCtx {\n group: Group\n item: Item\n viewer: ViewerApi\n zoom: ZoomState\n stage: Size\n natural: Size\n /** the painted media box in content space (framed media insets it) */\n box?: { x: number; y: number; w: number; h: number }\n}\n\n/** A painted overlay, retained so zoom-only updates can adjust it without re-rendering. */\nexport interface OverlayEntry {\n el: HTMLElement\n spec: OverlaySpec\n counterScaled: boolean\n}\n\nexport function gatherOverlays(group: Group, item: Item, globals: OverlaySpec[]): OverlaySpec[] {\n return [...globals, ...(group.overlays ?? []), ...(item.overlays ?? [])]\n}\n\n/**\n * Update retained overlays for a zoom change WITHOUT rebuilding (spec §9.2: no extra layout,\n * never re-invoke user render()). Refreshes visibleAt visibility and point counter-scale.\n */\nexport function updateOverlays(entries: OverlayEntry[], zoomScale: number): void {\n for (const { el, spec, counterScaled } of entries) {\n const visible =\n !spec.visibleAt || (zoomScale >= spec.visibleAt[0] && zoomScale <= spec.visibleAt[1])\n el.style.display = visible ? '' : 'none'\n if (counterScaled) el.style.transform = counterScaleTransform(zoomScale)\n }\n}\n\nexport function paintOverlays(\n viewportHost: HTMLElement,\n contentHost: HTMLElement,\n specs: OverlaySpec[],\n ctx: OverlayPaintCtx,\n): OverlayEntry[] {\n // a repaint must not drop keyboard focus to <body>: remember which overlay had it\n const active = document.activeElement\n const focusedId =\n active && (viewportHost.contains(active) || contentHost.contains(active))\n ? active.closest<HTMLElement>('[data-overlay]')?.dataset.overlay\n : undefined\n viewportHost.replaceChildren()\n contentHost.replaceChildren()\n const entries: OverlayEntry[] = []\n\n for (const spec of orderByLayer(specs)) {\n const host = document.createElement('div')\n host.className = spec.class ? `gallerist-overlay ${spec.class}` : 'gallerist-overlay'\n host.dataset.overlay = spec.id\n host.style.position = 'absolute'\n if (spec.layer !== undefined) host.style.zIndex = String(spec.layer)\n host.style.pointerEvents = spec.interactive ? 'auto' : 'none'\n\n const visible =\n !spec.visibleAt ||\n (ctx.zoom.scale >= spec.visibleAt[0] && ctx.zoom.scale <= spec.visibleAt[1])\n if (!visible) host.style.display = 'none'\n\n if (spec.interactive) {\n host.dataset.interactive = '' // the stage's double-click zoom leaves it alone\n host.addEventListener('click', () =>\n getInternals(ctx.viewer).emit('overlayClick', {\n viewer: ctx.viewer,\n cursor: ctx.viewer.getState().cursor,\n group: ctx.group,\n item: ctx.item,\n id: spec.id,\n }),\n )\n } else {\n host.setAttribute('aria-hidden', 'true')\n }\n\n const out = spec.render({\n group: ctx.group,\n item: ctx.item,\n zoom: ctx.zoom,\n viewer: ctx.viewer,\n })\n if (typeof out === 'string') host.textContent = out\n else host.appendChild(out)\n // an interactive overlay is reachable by keyboard: through its own controls when it has any\n // (a pin's button), otherwise the host itself takes focus\n if (spec.interactive && !host.querySelector(FOCUSABLE)) host.tabIndex = 0\n\n let counterScaled = false\n if (spec.anchor.kind === 'viewport') {\n Object.assign(host.style, viewportAnchorStyle(spec.anchor.at, spec.anchor.offset))\n viewportHost.appendChild(host)\n } else {\n const box = contentAnchorBox(spec.anchor, ctx.stage, ctx.natural, ctx.box)\n host.style.left = `${box.left}px`\n host.style.top = `${box.top}px`\n if (box.width !== null) host.style.width = `${box.width}px`\n if (box.height !== null) host.style.height = `${box.height}px`\n counterScaled = !resolveScaleWithImage(spec.anchor, spec.scaleWithImage)\n if (counterScaled) host.style.transform = counterScaleTransform(ctx.zoom.scale)\n contentHost.appendChild(host)\n }\n entries.push({ el: host, spec, counterScaled })\n }\n if (focusedId) {\n const host = entries.find((e) => e.spec.id === focusedId)?.el\n const target =\n host?.querySelector<HTMLElement>(FOCUSABLE) ?? (host?.tabIndex === 0 ? host : null)\n target?.focus({ preventScroll: true })\n }\n return entries\n}\n","// Layout presets (M14 UX-E). A preset bundles a coherent set of layout choices — arrow placement,\n// chrome auto-hide, and the thumbnail rail's secondary-axis layout / time-ribbon — behind a single\n// name. Pure resolver (no DOM): the renderer applies `rootAttrs` + `arrows`/`autoHide`, and hands\n// the preset to plugin regions (RegionCtx.preset), so thumbnails() takes `thumbnails` as defaults.\n\nimport type { ArrowLayout, GroupAxis, ItemIndicator, RailPlacement } from './mount'\n\nexport type PresetName = 'filmstrip' | 'immersive' | 'reviewer' | 'contact' | 'editorial' | 'tour'\n\n// A type alias, not an interface, so it is a core `PresetDefaults` (the region context's `preset`).\n// Read-only through and through: the built-in presets are frozen, so a write fails at compile time\n// rather than throwing (strict mode) or being ignored at run time.\nexport type ResolvedPreset = {\n /** data-* attributes the renderer sets on the root (drives the theme). */\n readonly rootAttrs: Readonly<Record<string, string>>\n /** default arrow placement (overridable by an explicit mount option). */\n readonly arrows: ArrowLayout\n /** default chrome auto-hide-on-idle (overridable). */\n readonly autoHide: boolean\n /** default thumbnail rail placement (overridable). */\n readonly rail: RailPlacement\n /** thumbnails() defaults: the plugin applies them to the options it wasn't given. */\n readonly thumbnails: Readonly<{\n itemAxis: 'vertical' | 'horizontal'\n groupDisplay?: 'stacked' | 'flat' | 'index'\n timeline?: boolean\n numberItems?: boolean\n }>\n /** turn on the zoom navigator by default (overridable). */\n readonly navigator?: boolean\n /** frame the media (overridable). */\n readonly frame?: boolean\n /** default item indicator (overridable). */\n readonly itemIndicator?: ItemIndicator\n /** which arrow keys and on-screen arrows move between groups, if not the rail's own (overridable). */\n readonly groupAxis?: GroupAxis\n /** name the group arrows after the group they go to (overridable). */\n readonly arrowLabels?: boolean\n}\n\nconst PRESETS: Record<PresetName, ResolvedPreset> = {\n // classic lightbox: bottom rail, side arrows, persistent chrome.\n filmstrip: {\n rootAttrs: { 'data-gallerist-preset': 'filmstrip' },\n arrows: 'pill-right',\n autoHide: false,\n rail: 'bottom',\n thumbnails: { itemAxis: 'vertical' },\n navigator: false,\n },\n // full-bleed: rail hidden by default, chrome auto-hides on idle, minimal UI.\n immersive: {\n rootAttrs: { 'data-gallerist-preset': 'immersive' },\n arrows: 'pill-right',\n autoHide: true,\n rail: 'hidden',\n thumbnails: { itemAxis: 'vertical' },\n navigator: false,\n },\n // time-series reviewer: a bottom timeline rail (a time over each group, from group.meta.time),\n // numbered items, the zoom navigator, and no control over the media (review needs every pixel):\n // docked arrows, the item navigator on the item column or the caption row.\n reviewer: {\n rootAttrs: { 'data-gallerist-preset': 'reviewer' },\n arrows: 'docked',\n autoHide: false,\n rail: 'bottom',\n thumbnails: { itemAxis: 'vertical', timeline: true, numberItems: true },\n navigator: true,\n },\n // a gallery wall: the work framed with room around it, a placard beside it (caption + item\n // navigator), numbered items inline in a bottom rail. Pairs with `skin: 'editorial'`.\n editorial: {\n rootAttrs: { 'data-gallerist-preset': 'editorial' },\n arrows: 'pill-right',\n autoHide: false,\n rail: 'bottom',\n thumbnails: { itemAxis: 'horizontal', numberItems: true },\n frame: true,\n itemIndicator: 'placard',\n },\n // a walkthrough of named sections: a section index down the side (names, counts, the active section\n // expanded), ←/→ between sections on labelled arrows, ↑/↓ within one, and framed media so nothing\n // covers the photo. Pairs with `grid({ layout: 'sections', startOpen: true })`.\n tour: {\n rootAttrs: { 'data-gallerist-preset': 'tour' },\n arrows: 'pill-right',\n autoHide: false,\n rail: 'left',\n thumbnails: { itemAxis: 'horizontal', groupDisplay: 'index', numberItems: true },\n frame: true,\n itemIndicator: 'dots',\n groupAxis: 'horizontal',\n arrowLabels: true,\n },\n // browse-heavy: a vertical rail down the right edge (pairs well with the grid plugin).\n contact: {\n rootAttrs: { 'data-gallerist-preset': 'contact' },\n arrows: 'pill-right',\n autoHide: false,\n rail: 'right',\n thumbnails: { itemAxis: 'vertical' },\n navigator: false,\n },\n}\n\n// The entries are shared by every mount and handed to plugins (RegionCtx.preset): freeze them, so a\n// plugin writing to one can't change the preset for the next mount.\nfor (const p of Object.values(PRESETS))\n for (const o of [p.rootAttrs, p.thumbnails, p]) Object.freeze(o)\n\n/** Resolve a preset name to its layout config; unknown names warn (dev) and fall back to `filmstrip`. */\nexport function resolvePreset(name: string): ResolvedPreset {\n const preset = PRESETS[name as PresetName]\n if (!preset && typeof console !== 'undefined') {\n console.warn(`[gallerist] unknown preset \"${name}\" — falling back to \"filmstrip\"`)\n }\n return preset ?? PRESETS.filmstrip\n}\n","// Region mounting (spec §13). The renderer exposes named region hosts; plugins inject Nodes.\n// toolbar/footer/aside are additive (many plugins contribute buttons or panels); thumbnails/stage/\n// backdrop/caption are exclusive (one owner) — a second claim warns and the last wins.\n\nimport type { PluginInstance, RegionCtx, RegionName } from '@gallerist/core'\n\nexport type RegionHosts = Record<RegionName, HTMLElement>\n\nconst ADDITIVE: ReadonlySet<string> = new Set(['toolbar', 'footer', 'aside'])\n\n/**\n * Returns a function that mounts the current plugin set's regions into their hosts; call it at\n * mount and on every plugin change. Each plugin's region renderer runs once (its Node is cached per\n * plugin instance, as PLUGIN-AUTHORING promises), and only hosts whose node list changed are\n * touched, so unrelated plugin churn (a React <Gallerist.Overlay> mounting) leaves region DOM,\n * focus and scroll position alone.\n */\nexport function createRegionMounter(\n hosts: RegionHosts,\n ctx: RegionCtx,\n): (plugins: readonly PluginInstance[]) => void {\n const rendered = new WeakMap<PluginInstance, Map<string, Node>>()\n const applied = new Map<HTMLElement, Node[]>()\n\n return (plugins) => {\n const desired = new Map<HTMLElement, Node[]>()\n for (const host of Object.values(hosts)) desired.set(host, [])\n const claimedBy = new Map<string, string>()\n for (const plugin of plugins) {\n if (!plugin.regions) continue\n let nodes = rendered.get(plugin)\n if (!nodes) {\n nodes = new Map()\n rendered.set(plugin, nodes)\n }\n for (const [name, render] of Object.entries(plugin.regions)) {\n if (!render) continue\n const host = hosts[name]\n if (!host) {\n // RegionName is open-ended in the contract, but the DOM renderer hosts only a fixed set;\n // warn instead of silently dropping the plugin's UI (review S-A2).\n console.warn(\n `[gallerist] plugin \"${plugin.name}\" targets region \"${name}\", which the default renderer does not host`,\n )\n continue\n }\n let node = nodes.get(name)\n if (!node) {\n node = render(ctx)\n nodes.set(name, node)\n }\n const list = desired.get(host) ?? []\n if (!ADDITIVE.has(name) && claimedBy.has(name)) {\n console.warn(\n `[gallerist] region \"${name}\" claimed by multiple plugins; \"${plugin.name}\" wins over \"${claimedBy.get(name)}\"`,\n )\n list.length = 0\n }\n list.push(node)\n desired.set(host, list)\n if (!ADDITIVE.has(name)) claimedBy.set(name, plugin.name)\n }\n }\n for (const [host, list] of desired) {\n const prev = applied.get(host) ?? []\n if (prev.length === list.length && prev.every((n, i) => n === list[i])) continue\n reconcile(host, prev, list)\n applied.set(host, list)\n }\n }\n}\n\n// Move the host from `prev` to `next` plugin nodes with the fewest DOM moves: nodes that stay in\n// order are never detached (keeping focus, scroll and running transitions), and nodes the renderer\n// added itself (the rail handle) are left alone.\nfunction reconcile(host: HTMLElement, prev: Node[], next: Node[]): void {\n const keep = new Set(next)\n for (const node of prev) if (!keep.has(node) && node.parentNode === host) host.removeChild(node)\n let before: Node | null = null\n for (const node of next) {\n if (before) {\n if (before.nextSibling !== node) host.insertBefore(node, before.nextSibling)\n } else if (node.parentNode !== host) {\n host.appendChild(node)\n }\n before = node\n }\n}\n\n/** Aggregate a flat keymap across plugins (later plugins win on key conflicts). */\nexport function aggregateKeymap(\n plugins: readonly PluginInstance[],\n): Record<string, (e: KeyboardEvent) => void> {\n const map: Record<string, (e: KeyboardEvent) => void> = {}\n for (const plugin of plugins) {\n if (plugin.keymap) Object.assign(map, plugin.keymap)\n }\n return map\n}\n","// Every piece of UI text the DOM renderer produces (button labels and the screen-reader\n// announcements), overridable per mount via `mount(viewer, { strings })` for translation. Positions\n// are functions so a language can order the words and numbers itself. Wording stays generic: the\n// renderer never assumes what a group or an item is (\"screen\", \"product\"); data captions carry that.\n\nexport interface Strings {\n /** accessible name of the overlay dialog (the `label` mount option still wins) */\n dialog: string\n /** role description announced for an inline viewer */\n carousel: string\n close: string\n previous: string\n next: string\n previousItem: string\n nextItem: string\n /** name of a labelled group arrow (`arrowLabels`), given the group it goes to */\n previousTo: (name: string) => string\n nextTo: (name: string) => string\n resetZoom: string\n showThumbnails: string\n hideThumbnails: string\n /** name of a caption renderer's band while it scrolls (it then takes focus, to scroll by keyboard) */\n caption: string\n /** label of an item pill in the position indicator */\n item: (n: number) => string\n /** announced on group navigation, e.g. \"Group 2 of 12\" */\n groupOf: (n: number, total: number) => string\n /** announced on item navigation (and for every item in linear mode), e.g. \"Item 3 of 5\" */\n itemOf: (n: number, total: number) => string\n}\n\nexport const DEFAULT_STRINGS: Strings = {\n dialog: 'Media viewer',\n carousel: 'carousel',\n close: 'Close',\n previous: 'Previous',\n next: 'Next',\n previousItem: 'Previous item',\n nextItem: 'Next item',\n previousTo: (name) => `Previous: ${name}`,\n nextTo: (name) => `Next: ${name}`,\n resetZoom: 'Reset zoom',\n showThumbnails: 'Show thumbnails',\n hideThumbnails: 'Hide thumbnails',\n caption: 'Caption',\n item: (n) => `Item ${n}`,\n groupOf: (n, total) => `Group ${n} of ${total}`,\n itemOf: (n, total) => `Item ${n} of ${total}`,\n}\n","// Default DOM renderer (spec §8.3, §10, §17). Subscribes to the headless viewer and\n// projects state into DOM: portal/inline modes, windowed slides + node recycling, the\n// image adapter, minimal chrome, dialog a11y, keyboard map, and the committed zoom transform.\n// Live pan/zoom (imperative RAF) and motion land in M3.4 / M5.\n\nimport type {\n Group,\n Item,\n MediaAdapter,\n MediaSource,\n OverlaySpec,\n Phase,\n ViewerApi,\n ZoomState,\n} from '@gallerist/core'\nimport { clampPanToBox, clampScale, getInternals } from '@gallerist/core/internal'\nimport { imageAdapter, mountImage } from './adapters/image'\nimport { type Accent, type ColorScheme, type Skin, applyAppearance } from './appearance'\nimport { attachGestures } from './gestures'\nimport { ICONS } from './icons'\nimport { type IdleController, createIdleController } from './idle'\nimport { containRect } from './overlays/position'\nimport { type OverlayEntry, gatherOverlays, paintOverlays, updateOverlays } from './overlays/render'\nimport { type PresetName, resolvePreset } from './presets'\nimport { type RegionHosts, aggregateKeymap, createRegionMounter } from './regions'\nimport { DEFAULT_STRINGS, type Strings } from './strings'\nimport { zoomTransform } from './transform'\nimport { reconcileKeys, windowIndices } from './windowing'\n\nexport type ItemIndicator = 'pills' | 'dots' | 'counter' | 'placard'\n\nexport interface MountOptions {\n /** null/undefined → overlay (portal to body); element → inline. */\n container?: HTMLElement | null\n controls?: boolean\n adapters?: MediaAdapter[]\n preload?: { ahead: number; behind: number }\n /** global overlays applied to every slide (spec §8.1, §9). */\n overlays?: OverlaySpec[]\n /**\n * Placement of the within-group ↑/↓ arrows, surfaced as `data-gallerist-arrows` for the theme\n * (UX-D). `pill-right` (default): ←/→ on the side edges, ↑/↓ as a stacked pill at right-center.\n * `corner-br`: ↑/↓ paired bottom-right. `dpad`: all four clustered as a d-pad. `split`: legacy\n * ↑/↓ top/bottom-center. `docked` (the `reviewer` preset): nothing over the media — the group\n * arrows sit in gutters beside the stage, and the item navigator (↑ · `n / N` · ↓) docks as a\n * header on the aside item column when it shows, else at the end of the caption row.\n */\n arrows?: ArrowLayout\n /**\n * Auto-hide the chrome after a period of inactivity (UX-C), flagged as `data-gallerist-idle` for\n * the theme. Default true; inert under prefers-reduced-motion. The thumbnail rail collapses\n * separately (the `t` key / toggle button / fullscreen), tracked as `data-gallerist-rail`.\n */\n autoHide?: boolean\n /**\n * Named layout preset (UX-E) — sets `data-gallerist-preset` and supplies defaults for `arrows` and\n * `autoHide` (both still overridable by explicit options above). Plugin regions get the preset\n * too: thumbnails() takes `resolvePreset(name).thumbnails` for the options it wasn't given.\n */\n preset?: PresetName\n /**\n * Thumbnail rail placement (UX-E), surfaced as `data-gallerist-rail-pos`. `bottom` (default) keeps\n * the rail horizontal (group axis = ←/→); `left` / `right` run it vertically and remap the\n * keys/arrows (group axis = ↑/↓, items = ←/→ — touch swipes stay conventional); `hidden` starts\n * collapsed (reveal with the toggle / `t` / hover). Overridable; presets supply a default.\n */\n rail?: RailPlacement\n /**\n * Linear traversal: ←/→ walk the flattened item sequence across groups (1a, 1b, 2a, 2b, 2c, 3a…),\n * ↑/↓ retire, the counter shows `item N / total`, and the within-group pills hide — surfaced as\n * `data-gallerist-linear`. Unset, it follows the rail: on while the `thumbnails` region holds an\n * element marked `data-gallerist-linear` (a flat rail, `thumbnails({ groupDisplay: 'flat' })`,\n * marks its region so), off otherwise, and it changes when the plugins do. `true` or `false`\n * fixes it.\n */\n linear?: boolean\n /**\n * Whether navigation wraps at the ends (mirror of the core `loop` option). Only consulted for\n * `linear` traversal, to wrap the flattened sequence at the global first/last item. Default false.\n */\n loop?: boolean\n /** UI text overrides (button labels, announcements) for translation; merged over English. */\n strings?: Partial<Strings>\n /**\n * How the position within a multi-item group is shown, surfaced as the indicator's `data-mode`.\n * `pills` (default): numbered pills up to 8 items, then `n / N`. `dots`: plain dots with the\n * `n / N` count, up to 12 items, then the count alone. `counter`: always `n / N`. `placard`: the\n * whole item navigator (↑ · ticks · `n / N` · ↓) moves into the caption, which becomes a label\n * beside the work in the `editorial` preset. On a touch screen the theme shows the count only\n * (swipes navigate).\n */\n itemIndicator?: ItemIndicator\n /**\n * Visual skin (`data-gallerist-skin`, default `gallery`). Other skins need their stylesheet loaded\n * after gallerist.css, e.g. `@gallerist/theme-default/console.css` for `console`.\n */\n skin?: Skin\n /** The skin's accent by name (`data-gallerist-accent`); unset uses the skin's default. */\n accent?: Accent\n /** `dark`, `light`, or `auto` to follow the system (`data-gallerist-scheme`); unset, the skin's\n * own default (Gallery and Console dark, Editorial light). */\n scheme?: ColorScheme\n /**\n * Zoom navigator: while zoomed in, a minimap of the image in the stage's bottom corner with a box\n * for the visible part; click or drag it to move around. Default off (the `reviewer` preset turns\n * it on). Part of the built-in controls, so `controls: false` has none.\n */\n navigator?: boolean\n /**\n * Framed media: the image hangs inside the stage with room around it (the skin's\n * `--gallerist-frame-inset`), and the media element is sized to the image itself so a skin can\n * give it a mat and a shadow. Zoom bounds, overlays and pins follow the framed box. Default off\n * (the `editorial` preset turns it on).\n */\n frame?: boolean\n /**\n * Which arrow keys and on-screen arrows move between groups. Default: follows the rail (`horizontal`\n * with a bottom rail, `vertical` with a side rail). The `tour` preset keeps `horizontal` beside a\n * side rail, so ←/→ moves between sections while ↑/↓ moves within one.\n */\n groupAxis?: GroupAxis\n /**\n * Name the group arrows after the group they go to: `true` uses `group.caption`, a function returns\n * the label. Needs horizontal group arrows in the `pill-right` layout; otherwise ignored. The name\n * also goes into the arrow's accessible name (`strings.previousTo` / `nextTo`).\n */\n arrowLabels?: boolean | ((group: Group, index: number) => string | undefined)\n /** Accessible name for the overlay dialog (default 'Media viewer'); sets aria-label. */\n label?: string\n /** Element (or getter) to return focus to when the overlay closes. Falls back to whatever\n * had focus when it opened — useful when the trigger lives in a tree that may have unmounted. */\n returnFocus?: HTMLElement | (() => HTMLElement | null)\n}\n\nexport type ArrowLayout = 'pill-right' | 'corner-br' | 'dpad' | 'split' | 'docked'\nexport type RailPlacement = 'bottom' | 'hidden' | 'left' | 'right'\nexport type GroupAxis = 'horizontal' | 'vertical'\n\nexport interface RendererHandle {\n root: HTMLElement\n destroy(): void\n}\n\ninterface SlideRec {\n slide: HTMLElement\n content: HTMLElement\n overlayHost: HTMLElement\n itemId?: string\n media?: ReturnType<MediaAdapter['mount']>\n abort?: AbortController\n overlayEls?: OverlayEntry[]\n /** the item whose overlays are painted; a new object (changed data) repaints them */\n overlayItem?: Item\n activated?: boolean\n}\n\n/** A plain URL for a media source (loader and tiled sources have none). */\nconst sourceUrl = (source: MediaSource | undefined): string | null =>\n typeof source === 'string' ? source : source && 'src' in source ? source.src : null\n\n/** A text caption, or '' for anything else (untyped data may still hold an old caption object). */\nconst str = (x: unknown): string => (typeof x === 'string' ? x : '')\n\nlet mounts = 0 // ids for the caption, which describes the viewer (aria-describedby)\n\nfunction el(tag: string, className?: string, attrs?: Record<string, string>): HTMLElement {\n const node = document.createElement(tag)\n if (className) node.className = className\n if (attrs) for (const [k, v] of Object.entries(attrs)) node.setAttribute(k, v)\n return node\n}\n\nconst FOCUSABLE_SELECTOR =\n 'a[href],area[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),iframe,[tabindex],[contenteditable=\"true\"]'\n/** Tabbable descendants of `root`, in DOM order (used by the dialog focus trap). */\nfunction focusableWithin(root: HTMLElement): HTMLElement[] {\n return [...root.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)].filter(\n // a hidden control can't take focus: counted as the last one, it would let Tab out of the trap\n (node) =>\n node.tabIndex !== -1 && !node.hasAttribute('disabled') && node.checkVisibility?.() !== false,\n )\n}\n/** True when the key event originates from a control where typing must not be hijacked. */\nfunction isEditableTarget(target: EventTarget | null): boolean {\n const node = target as HTMLElement | null\n return !!node && (node.isContentEditable || /^(input|textarea|select)$/i.test(node.tagName ?? ''))\n}\n\n/** Longest animation (delay + duration × iterations) in ms from a computed style's comma lists.\n * An infinite animation counts one iteration: it never ends, so the timer settles after one. */\nfunction animationMs(style: CSSStyleDeclaration): number {\n const ms = (v: string) => {\n const n = Number.parseFloat(v)\n if (!Number.isFinite(n)) return 0\n return v.trim().endsWith('ms') ? n : n * 1000\n }\n const count = (v: string | undefined) => {\n const n = Number.parseFloat(v ?? '1')\n return Number.isFinite(n) && n > 0 ? n : 1\n }\n const at = (list: string[], i: number) => list[i % list.length]\n const durations = style.animationDuration.split(',')\n const delays = style.animationDelay.split(',')\n const iterations = (style.animationIterationCount || '1').split(',')\n return Math.max(\n 0,\n ...durations.map((d, i) => ms(at(delays, i) ?? '0s') + ms(d) * count(at(iterations, i))),\n )\n}\n\n/** Max committed zoom (fit == 1 in the contained model); shared by gestures, keys and bounds. */\nconst MAX_ZOOM = 4\n\nfunction applyTransform(content: HTMLElement, zoom: ZoomState): void {\n content.style.transform = zoomTransform(zoom)\n}\n\n// Body scroll-lock is shared across all open overlay viewers: the original overflow is\n// captured when the first overlay opens and restored only when the last one is removed. A\n// per-instance capture would let a viewer opened over another record the already-locked\n// 'hidden' as the value to restore, permanently locking page scroll (S-R2). Presence is read\n// from the DOM (the overlay roots themselves) so it self-corrects and never leaks a count.\nlet savedBodyOverflow = ''\nconst anyOverlayMounted = () =>\n !!document.querySelector('.gallerist[data-gallerist-mode=\"overlay\"]')\nfunction lockBodyScroll(): void {\n if (!anyOverlayMounted()) savedBodyOverflow = document.body.style.overflow // first of the stack\n document.body.style.overflow = 'hidden'\n}\nfunction unlockBodyScroll(): void {\n if (!anyOverlayMounted()) document.body.style.overflow = savedBodyOverflow // last one removed\n}\n\n// Background inerting is shared across stacked overlays via the same DOM-presence model as the\n// scroll-lock: every element we mark is tracked module-wide, and inert is only released when the\n// last overlay is gone — so closing an overlay out of LIFO order can't un-inert the page while\n// another modal is still open (review #6, C5).\nconst inertedByGallerist = new Set<HTMLElement>()\nfunction inertBackground(root: HTMLElement): void {\n for (const child of [...document.body.children]) {\n if (child !== root && child instanceof HTMLElement && !child.hasAttribute('inert')) {\n child.setAttribute('inert', '')\n inertedByGallerist.add(child)\n }\n }\n}\nfunction releaseBackgroundInert(): void {\n if (anyOverlayMounted()) return // another overlay still needs the page inert\n for (const el of inertedByGallerist) el.removeAttribute('inert')\n inertedByGallerist.clear()\n}\n\nexport function mount(viewer: ViewerApi, opts: MountOptions = {}): RendererHandle {\n const overlay = !opts.container\n const container = opts.container ?? null\n const controls = opts.controls ?? true\n const preload = opts.preload ?? { ahead: 2, behind: 1 }\n const preset = opts.preset ? resolvePreset(opts.preset) : undefined\n const arrows: ArrowLayout = opts.arrows ?? preset?.arrows ?? 'pill-right'\n const autoHide = opts.autoHide ?? preset?.autoHide ?? true\n const showNavigator = opts.navigator ?? preset?.navigator ?? false\n const frame = opts.frame ?? preset?.frame ?? false\n const rail: RailPlacement = opts.rail ?? preset?.rail ?? 'bottom'\n const railHidden = rail === 'hidden'\n const railPos = rail === 'hidden' ? 'bottom' : rail // bottom | left | right\n // left/right rails run vertically, so the group axis becomes ↑/↓ and items ←/→ (point 5). Touch\n // swipes stay conventional (horizontal = group, swipe-down = dismiss) — only keys/arrows/layout flip.\n const orientation: 'horizontal' | 'vertical' =\n rail === 'left' || rail === 'right' ? 'vertical' : 'horizontal'\n const groupAxis: GroupAxis = opts.groupAxis ?? preset?.groupAxis ?? orientation\n const vertical = groupAxis === 'vertical'\n // settled with the plugin regions (mountRegions): the option, else what the rail asks for\n let linear = false\n const arrowLabelsOpt = opts.arrowLabels ?? preset?.arrowLabels ?? false\n // the arrows' group names (not shown while linear, whose arrows walk the items)\n const arrowLabel: ((group: Group, index: number) => string | undefined) | null =\n !arrowLabelsOpt || !controls || vertical || arrows !== 'pill-right'\n ? null\n : arrowLabelsOpt === true\n ? (group) => str(group.caption)\n : arrowLabelsOpt\n // Default to the viewer's resolved loop so linear traversal and the slide window agree; an\n // explicit mount({ loop }) still overrides for the rare case they should differ (review #2).\n const loop = opts.loop ?? viewer.loop\n const ui: Strings = { ...DEFAULT_STRINGS, ...opts.strings }\n const itemIndicator: ItemIndicator = opts.itemIndicator ?? preset?.itemIndicator ?? 'pills'\n const placard = itemIndicator === 'placard'\n\n // Aggregate plugin extensions (adapters/overlays captured at mount; regions + keymap re-applied\n // live on plugin changes, see below). Plugins register on the viewer (decision P1-C).\n const internals = getInternals(viewer)\n const plugins = internals.getPlugins()\n const baseAdapters = opts.adapters ?? [imageAdapter()]\n // Adapters, overlays, and keymap are recomputed live so a plugin added via use() after mount\n // contributes all of its extensions, not just regions (review T4 / Important #5).\n const currentAdapters = () => [\n ...baseAdapters,\n ...internals.getPlugins().flatMap((p) => p.mediaAdapters ?? []),\n ]\n // A plugin's overlays are a list, or a function of the slide (per-item pins, annotations).\n const currentGlobalOverlays = (group: Group, item: Item) => [\n ...(opts.overlays ?? []),\n ...internals\n .getPlugins()\n .flatMap((p) =>\n typeof p.overlays === 'function' ? p.overlays({ group, item }) : (p.overlays ?? []),\n ),\n ]\n let pluginKeymap = aggregateKeymap(plugins)\n\n const pickAdapter = (type: string, item: Parameters<MediaAdapter['mount']>[0]) =>\n currentAdapters().find((a) => (a.match ? a.match(item) : a.type === type))\n\n // ── navigation routing (linear flat traversal, point 3) ──────────────────────\n // In linear mode ←/→ walks the flattened (g,i) sequence across groups (1a,1b,2a,2b,2c,3a…) and\n // ↑/↓ retire; the flat list is cached and rebuilt only when the collection changes. `nav.*` is the\n // single seam the keymap, arrow buttons, and gestures route through, so behavior follows the mode.\n let flatSeq: Array<{ g: number; i: number }> = []\n let flatIdx = new Map<string, number>()\n let flatCol: unknown = null\n const ensureFlat = () => {\n const col = viewer.getCollection()\n if (col === flatCol) return\n flatCol = col\n flatSeq = []\n flatIdx = new Map()\n col.groups.forEach((grp, g) =>\n grp.items.forEach((_, i) => {\n flatIdx.set(`${g}:${i}`, flatSeq.length)\n flatSeq.push({ g, i })\n }),\n )\n }\n const flatPosition = (g: number, i: number): number => {\n ensureFlat()\n return flatIdx.get(`${g}:${i}`) ?? 0\n }\n const linearStep = (dir: 1 | -1) => {\n ensureFlat()\n if (flatSeq.length === 0) return\n const { g, i } = viewer.getState().cursor\n let n = (flatIdx.get(`${g}:${i}`) ?? 0) + dir\n if (n >= flatSeq.length) n = loop ? 0 : flatSeq.length - 1\n if (n < 0) n = loop ? flatSeq.length - 1 : 0\n const t = flatSeq[n]\n if (t) viewer.goTo(t.g, t.i)\n }\n const nav = {\n next: () => (linear ? linearStep(1) : viewer.next()),\n prev: () => (linear ? linearStep(-1) : viewer.prev()),\n nextItem: () => {\n if (!linear) viewer.nextItem() // the item axis retires in linear mode\n },\n prevItem: () => {\n if (!linear) viewer.prevItem()\n },\n }\n\n // ── DOM scaffold ───────────────────────────────────────────────────────────\n // The root is a grid of areas (theme base.css): bar / main / aside / caption / footer / rail. Every\n // piece of chrome lives in its own area, so persistent chrome takes space instead of covering the\n // stage and nothing can collide; only the arrows and the item navigator sit over the stage, inside\n // `main` (`docked` moves the navigator out). Presets and rail positions change the grid template.\n const root = el('div', 'gallerist')\n root.setAttribute('data-gallerist-mode', overlay ? 'overlay' : 'inline')\n root.setAttribute('data-gallerist-arrows', arrows)\n root.setAttribute('data-gallerist-rail-pos', railPos)\n root.setAttribute('data-gallerist-orientation', orientation)\n root.setAttribute('data-gallerist-axis', groupAxis)\n root.setAttribute('data-gallerist-rail', railHidden ? 'collapsed' : 'expanded')\n if (frame) root.setAttribute('data-gallerist-frame', '')\n if (placard) root.setAttribute('data-gallerist-indicator', 'placard')\n applyAppearance(root, { skin: opts.skin, accent: opts.accent, scheme: opts.scheme })\n if (preset) for (const [k, val] of Object.entries(preset.rootAttrs)) root.setAttribute(k, val)\n if (overlay) {\n root.setAttribute('role', 'dialog')\n root.setAttribute('aria-modal', 'true')\n root.setAttribute('aria-label', opts.label ?? ui.dialog) // dialog accessible name (I-UX1)\n root.tabIndex = -1\n } else {\n root.setAttribute('role', 'group')\n root.setAttribute('aria-roledescription', ui.carousel)\n root.tabIndex = -1 // focus lands here when a focused control hides (see setHiddenKeepingFocus)\n }\n\n if (overlay) root.appendChild(el('div', 'gallerist-backdrop'))\n const bar = el('div', 'gallerist-bar')\n const main = el('div', 'gallerist-main')\n const stage = el('div', 'gallerist-stage')\n const track = el('div', 'gallerist-track')\n const viewportLayer = el('div', 'gallerist-viewport-layer')\n const stageRegion = el('div', 'gallerist-region gallerist-region-stage')\n stage.append(track, viewportLayer, stageRegion)\n main.appendChild(stage)\n\n // Named region hosts for plugins (spec §13).\n const regionHosts: RegionHosts = {\n backdrop: el('div', 'gallerist-region gallerist-region-backdrop'),\n stage: stageRegion,\n toolbar: el('div', 'gallerist-region gallerist-region-toolbar'),\n aside: el('div', 'gallerist-region gallerist-region-aside'),\n thumbnails: el('div', 'gallerist-region gallerist-region-thumbnails'),\n footer: el('div', 'gallerist-region gallerist-region-footer'),\n caption: el('div', 'gallerist-region gallerist-region-caption'),\n }\n // The caption bar holds the item's text caption, or a plugin's caption node in its region\n // (plugin-captions), which then replaces the text. Either is the viewer's accessible description.\n const caption = el('div', 'gallerist-caption')\n const cid = `gallerist-caption-${++mounts}`\n const captionText = el('span', 'gallerist-caption-text', { id: cid })\n regionHosts.caption.id = `${cid}r`\n // While a caption renderer's band overflows, its scroller (the band; in a placard, the region in\n // its slot) takes focus and a name, so a keyboard can scroll it. Named by reference: an aria-label\n // would also replace the region's text in the viewer's description.\n const capLabel = el('span', '', { id: `${cid}l`, hidden: '' })\n capLabel.textContent = ui.caption\n const capScroll = placard ? regionHosts.caption : caption\n const fitCaption = () => {\n const on =\n regionHosts.caption.hasChildNodes() && capScroll.scrollHeight > capScroll.clientHeight + 1\n // a band that stops scrolling while focused hands focus back to the viewer (else it falls to\n // <body> and the keyboard goes dead)\n if (!on && document.activeElement === capScroll) root.focus({ preventScroll: true })\n const set = on ? 'setAttribute' : 'removeAttribute'\n capScroll[set]('tabindex', '0')\n capScroll[set]('role', 'region')\n capScroll[set]('aria-labelledby', capLabel.id)\n }\n const capObserver = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(fitCaption) : null\n caption.append(captionText, regionHosts.caption)\n caption.hidden = true\n let anyCaption = false\n const syncCaption = () => {\n const own = regionHosts.caption.hasChildNodes()\n const { g, i } = viewer.getState().cursor\n // the text caption (the theme clamps it), unless a caption region replaces it\n captionText.textContent = own ? '' : str(viewer.getCollection().groups[g]?.items[i]?.caption)\n // a placard is always up: it holds the item navigator as well as the caption\n const hide = !(own || (controls && (anyCaption || placard)))\n caption.hidden = hide\n caption.toggleAttribute('data-gallerist-custom', own)\n // described by the caption only while it shows (hidden text would still be read out)\n root[hide ? 'removeAttribute' : 'setAttribute']('aria-describedby', `${cid} ${cid}r`)\n // the band and its content resize as it grows or scrolls: check then (no layout read here)\n for (const n of [capScroll, ...capScroll.children]) capObserver?.observe(n)\n if (!own) fitCaption()\n }\n root.append(\n regionHosts.backdrop,\n bar,\n main,\n regionHosts.aside,\n caption,\n regionHosts.footer,\n regionHosts.thumbnails,\n capLabel,\n )\n\n const live = el('div', 'gallerist-live', { 'aria-live': 'polite', role: 'status' })\n root.appendChild(live)\n\n // Rail collapse (UX-C): a pull-handle attached to the rail's edge + `t` key + fullscreen →\n // data-gallerist-rail. The handle lives inside the thumbnails region so it reads as part of the\n // gallery; it's (re)placed in mountRegions.\n let railCollapsed = railHidden\n let preFsCollapsed: boolean | null = null\n const railHandle = el('div', 'gallerist-rail-handle')\n const railToggle = el('button', 'gallerist-rail-toggle', {\n type: 'button',\n 'aria-label': railHidden ? ui.showThumbnails : ui.hideThumbnails,\n 'aria-pressed': String(railHidden),\n })\n railToggle.innerHTML = ICONS.collapse\n railHandle.appendChild(railToggle)\n const setRailCollapsed = (v: boolean, manual = false) => {\n railCollapsed = v\n root.setAttribute('data-gallerist-rail', v ? 'collapsed' : 'expanded')\n railToggle.setAttribute('aria-pressed', String(v))\n railToggle.setAttribute('aria-label', v ? ui.showThumbnails : ui.hideThumbnails)\n // a manual toggle while fullscreen wins over the on-exit restore\n if (manual) preFsCollapsed = null\n }\n railToggle.addEventListener('click', () => setRailCollapsed(!railCollapsed, true))\n\n let counter: HTMLElement | undefined\n let title: HTMLElement | undefined\n let position: HTMLElement | undefined\n let itemNav: HTMLElement | undefined\n let controlsBox: HTMLElement | undefined\n let reset: HTMLElement | undefined\n let navigatorEl: HTMLElement | undefined\n let navigatorView: HTMLElement | undefined\n let prevArrow: HTMLElement | undefined\n let nextArrow: HTMLElement | undefined\n // segmented pills are rebuilt only when the active group / its size changes (UX-H)\n let posG = -1\n let posM = -1\n if (controls) {\n // top bar: counter → title → plugin tools → zoom reset → close (one row, never overlapping)\n counter = el('div', 'gallerist-counter')\n title = el('div', 'gallerist-title')\n title.hidden = true\n reset = el('button', 'gallerist-zoom-reset', { type: 'button', 'aria-label': ui.resetZoom })\n reset.innerHTML = ICONS.zoomReset\n reset.hidden = true // only while zoomed in\n reset.addEventListener('click', () => viewer.resetZoom())\n const close = el('button', 'gallerist-close', { type: 'button', 'aria-label': ui.close })\n close.innerHTML = ICONS.close\n close.addEventListener('click', () => viewer.close())\n bar.append(counter, title, regionHosts.toolbar, reset, close)\n\n // over the stage: group arrows and the item navigator (↑ · position · ↓) as one cluster, so\n // each arrow layout places it as a unit. Icons follow the group axis: horizontal → group ←/→,\n // item ↑/↓; vertical (side rail) → group ↑/↓, item ←/→.\n const prev = el('button', 'gallerist-prev', { type: 'button', 'aria-label': ui.previous })\n prev.innerHTML = vertical ? ICONS.itemPrev : ICONS.prev\n prev.addEventListener('click', () => nav.prev())\n const next = el('button', 'gallerist-next', { type: 'button', 'aria-label': ui.next })\n next.innerHTML = vertical ? ICONS.itemNext : ICONS.next\n next.addEventListener('click', () => nav.next())\n prevArrow = prev\n nextArrow = next\n const prevItem = el('button', 'gallerist-item-prev', {\n type: 'button',\n 'aria-label': ui.previousItem,\n })\n prevItem.innerHTML = vertical ? ICONS.prev : ICONS.itemPrev\n prevItem.addEventListener('click', () => nav.prevItem())\n const nextItem = el('button', 'gallerist-item-next', {\n type: 'button',\n 'aria-label': ui.nextItem,\n })\n nextItem.innerHTML = vertical ? ICONS.next : ICONS.itemNext\n nextItem.addEventListener('click', () => nav.nextItem())\n position = el('div', 'gallerist-position')\n itemNav = el('div', 'gallerist-itemnav')\n itemNav.hidden = true // shown only for groups with more than one item (and not in linear mode)\n itemNav.append(prevItem, position, nextItem)\n controlsBox = el('div', 'gallerist-controls')\n controlsBox.append(prev, next)\n // a placard carries the item navigator in the caption, under the label; docked, it is a grid\n // item of its own (the theme puts it on the aside column or the caption row, off the media),\n // after the caption it ends and before the item column it heads (tab order follows)\n if (placard) caption.appendChild(itemNav)\n else if (arrows === 'docked') main.after(caption, itemNav)\n else controlsBox.appendChild(itemNav)\n if (showNavigator) {\n // a pointer aid only (keyboard users zoom and pan with the keys), so hidden from AT\n navigatorEl = el('div', 'gallerist-navigator', { 'aria-hidden': 'true' })\n navigatorEl.hidden = true\n navigatorView = el('div', 'gallerist-navigator-view')\n navigatorEl.appendChild(navigatorView)\n navigatorEl.addEventListener('pointerdown', onNavigatorDown)\n controlsBox.appendChild(navigatorEl)\n }\n main.appendChild(controlsBox)\n } else {\n bar.appendChild(regionHosts.toolbar) // plugin tools keep their place without built-in chrome\n }\n\n // ── slide window ─────────────────────────────────────────────────────────────\n const mounted = new Map<string, SlideRec>()\n let lastCursor: { g: number; i: number } | null = null\n // Window-diff cache: a zoom/pan-only commit (same collection + cursor, current slide fully\n // painted) skips windowIndices/reconcileKeys and just re-applies the transform (I-PERF2).\n let lastWindowCol: unknown = null\n let lastWindowG = -1\n let lastWindowI = -1\n\n // groupId → index, rebuilt only when the collection reference changes (setCollection).\n // Avoids an O(groups) findIndex per mounted slide on every render (matters at 10k groups).\n let indexCol: unknown = null\n let idIndex = new Map<string, number>()\n const groupIndex = (id: string): number => {\n const col = viewer.getCollection()\n if (col !== indexCol) {\n indexCol = col\n idIndex = new Map(col.groups.map((g, i) => [g.id, i]))\n }\n return idIndex.get(id) ?? -1\n }\n\n // Tag the current slide with the axis of motion so the theme can use visibly distinct\n // transitions (spec §27.5): group axis = horizontal time slide, item axis = depth pop.\n const tagAxis = (currentSlide: HTMLElement, cur: { g: number; i: number }) => {\n if (lastCursor && (lastCursor.g !== cur.g || lastCursor.i !== cur.i)) {\n const axis = lastCursor.g !== cur.g ? 'group' : 'item'\n currentSlide.removeAttribute('data-gallerist-enter')\n void currentSlide.offsetWidth // reflow to restart the CSS animation\n currentSlide.setAttribute('data-gallerist-enter', axis)\n }\n lastCursor = { g: cur.g, i: cur.i }\n }\n\n const teardownSlide = (rec: SlideRec) => {\n rec.abort?.abort()\n rec.media?.destroy()\n rec.slide.remove()\n }\n\n let rendering = false\n const renderWindowInner = () => {\n const state = viewer.getState()\n const col = viewer.getCollection()\n const groupCount = col.groups.length\n if (groupCount === 0) return\n const cur = state.cursor\n\n // Fast path: nothing about the window changed (zoom/pan-only commit) — re-apply the transform\n // and counter-scale overlays for the current slide, skip the whole diff + allocations (I-PERF2).\n if (col === lastWindowCol && cur.g === lastWindowG && cur.i === lastWindowI) {\n const rec = mounted.get(col.groups[cur.g]?.id ?? '')\n const it = col.groups[cur.g]?.items[cur.i]\n if (rec && it && rec.itemId === it.id && rec.overlayItem === it) {\n applyTransform(rec.content, state.zoom)\n if (rec.overlayEls) updateOverlays(rec.overlayEls, state.zoom.scale)\n return\n }\n }\n lastWindowCol = col\n lastWindowG = cur.g\n lastWindowI = cur.i\n\n const idxs = windowIndices(cur.g, groupCount, preload.ahead, preload.behind, viewer.loop)\n const wantKeys = idxs.map((g) => col.groups[g]?.id ?? '')\n const { enter, exit } = reconcileKeys([...mounted.keys()], wantKeys)\n\n for (const k of exit) {\n const rec = mounted.get(k)\n if (rec) teardownSlide(rec)\n mounted.delete(k)\n }\n for (const k of enter) {\n const slide = el('div', 'gallerist-slide', { 'data-group': k })\n const content = el('div', 'gallerist-content')\n const overlayHost = el('div', 'gallerist-overlays-content')\n content.appendChild(overlayHost)\n slide.appendChild(content)\n track.appendChild(slide)\n mounted.set(k, { slide, content, overlayHost })\n }\n\n for (const [k, rec] of mounted) {\n const g = groupIndex(k)\n if (g < 0) continue\n const isCurrent = g === cur.g\n const group = col.groups[g]\n if (!group) continue\n const itemIndex = isCurrent ? cur.i : 0\n const it = group.items[itemIndex]\n if (it && rec.itemId !== it.id) {\n rec.abort?.abort()\n rec.media?.destroy()\n const abort = new AbortController()\n rec.media = pickAdapter(it.type, it)?.mount(it, rec.content, {\n signal: abort.signal,\n priority: isCurrent ? 'high' : 'low',\n })\n rec.abort = abort\n rec.itemId = it.id\n rec.activated = false\n rec.content.appendChild(rec.overlayHost) // keep overlays above the media\n frameSlide(rec)\n // Surface the media load lifecycle (spec §18: load/loaded/loadError, which also drive\n // state.loaded). On `loaded`, repaint content overlays: before decode naturalSize() is\n // null and paint falls back to the stage rect (a wrong full-stage contain rect), so the\n // overlays re-anchor to the real image box once the natural size is known (I-R1).\n const mountedId = it.id\n const slideKey = k\n // group/item are stable for this slide; the cursor is read fresh at emit time because\n // loaded/loadError fire later from the ready promise, when the cursor may have moved (review #5).\n const loadBase = { viewer, group, item: it }\n internals.emit('load', { ...loadBase, cursor: viewer.cursor, id: mountedId })\n rec.media?.ready\n ?.then(() => {\n internals.emit('loaded', { ...loadBase, cursor: viewer.cursor, id: mountedId })\n const r = mounted.get(slideKey)\n if (!r || r.itemId !== mountedId) return // navigated away / item swapped out\n frameSlide(r) // the frame fits the now-known natural size\n if (groupIndex(slideKey) !== viewer.getState().cursor.g) return // no longer current\n r.overlayItem = undefined // force a repaint at the now-known natural size\n // a zoom committed before the size was known was bounded by the whole layer\n if (attached) reclampZoom()\n })\n .catch((error) => {\n // A load we cancelled (slide torn down, item swapped out) is not a failure — adapters\n // reject `ready` on abort, and reporting it would mark the item 'error'. Return its\n // status to 'idle' unless the item is already mounted again (a fresh load owns it now).\n if (abort.signal.aborted) {\n const remounted = [...mounted.values()].some((r) => r.itemId === mountedId)\n if (!remounted) internals.cancelLoad(mountedId)\n return\n }\n internals.emit('loadError', {\n ...loadBase,\n cursor: viewer.cursor,\n id: mountedId,\n error,\n })\n })\n }\n // activate/deactivate media on slide enter/leave (spec §12 — play/pause for video)\n if (isCurrent && !rec.activated) {\n rec.media?.activate?.()\n rec.activated = true\n } else if (!isCurrent && rec.activated) {\n rec.media?.deactivate?.()\n rec.activated = false\n }\n if (isCurrent) {\n tagAxis(rec.slide, cur)\n rec.slide.setAttribute('data-gallerist-current', '')\n rec.content.setAttribute('data-gallerist-current', '')\n applyTransform(rec.content, state.zoom)\n if (it) {\n // Repaint (re-invokes user render() + rebuilds DOM) only when the item changes, including\n // new data for the same id (setCollection).\n // On a zoom-only change, update retained overlays in place (spec §9.2: no rebuild).\n if (rec.overlayItem !== it) {\n const r = stage.getBoundingClientRect()\n const stageSize = { w: r.width, h: r.height }\n rec.overlayEls = paintOverlays(\n viewportLayer,\n rec.overlayHost,\n gatherOverlays(group, it, currentGlobalOverlays(group, it)),\n {\n group,\n item: it,\n viewer,\n zoom: state.zoom,\n stage: stageSize,\n natural: rec.media?.naturalSize?.() ?? stageSize,\n box: paintedBox(stageSize, rec.media?.naturalSize?.()),\n },\n )\n rec.overlayItem = it\n } else if (rec.overlayEls) {\n updateOverlays(rec.overlayEls, state.zoom.scale)\n }\n }\n } else {\n rec.slide.removeAttribute('data-gallerist-current')\n rec.content.removeAttribute('data-gallerist-current')\n rec.overlayHost.replaceChildren()\n rec.overlayEls = undefined\n rec.overlayItem = undefined\n }\n }\n // Warm the cache for the images `preload.ahead/behind` steps within the group land on (spec §11:\n // the slides above cover the neighbouring groups, showing their first item). Only items the\n // built-in image adapter would mount; low priority, and only once the current media is ready,\n // so they don't compete with it. Ones no longer wanted are cancelled.\n const items = col.groups[cur.g]?.items ?? []\n const want = new Map<string, Item>()\n for (let d = -preload.behind; d <= preload.ahead; d++) {\n const it = d ? items[cur.i + d] : undefined\n if (it && sourceUrl(it.source) && pickAdapter(it.type, it)?.mount === mountImage)\n want.set(it.id, it)\n }\n for (const [id, img] of warm) if (!want.has(id)) unwarm(id, img)\n const run = ++warmRun\n const start = () => {\n if (run !== warmRun) return // the cursor moved on: a newer render owns the warm set\n for (const [id, it] of want) {\n const s = it.source as { srcset?: string; sizes?: string } // a string has neither\n if (!warm.has(id)) {\n warm.set(\n id,\n Object.assign(new Image(), {\n fetchPriority: 'low',\n sizes: s.sizes ?? '',\n srcset: s.srcset ?? '',\n src: sourceUrl(it.source),\n }),\n )\n }\n }\n }\n const ready = mounted.get(col.groups[cur.g]?.id ?? '')?.media?.ready\n if (ready) ready.then(start, start)\n else start()\n }\n // in-group warmers by item id; cancelling one drops its request\n const warm = new Map<string, HTMLImageElement>()\n let warmRun = 0\n const unwarm = (id: string, img: HTMLImageElement) => {\n img.srcset = img.src = ''\n warm.delete(id)\n }\n // Guard against re-entrancy: emitting load/loaded updates state.loaded, whose store\n // notification re-enters sync()/renderWindow while we're mid-iteration over `mounted`.\n const renderWindow = () => {\n if (rendering) return\n rendering = true\n try {\n renderWindowInner()\n } finally {\n rendering = false\n }\n }\n\n // Within-group position (UX-H): always an \"n / N\" text, plus a jump button per item while the\n // group is small enough — numbered pills (≤ PILL_MAX) or plain dots (≤ DOT_MAX), per the\n // `itemIndicator` option. The theme decides what to show per device (the text alone on touch).\n const PILL_MAX = 8\n const DOT_MAX = 12\n const updatePosition = (g: number, i: number, itemCount: number) => {\n if (!position) return\n const mode =\n itemIndicator === 'pills' && itemCount <= PILL_MAX\n ? 'pills'\n : (itemIndicator === 'dots' || placard) && itemCount <= DOT_MAX\n ? 'dots'\n : 'counter'\n if (g !== posG || itemCount !== posM || position.dataset.mode !== mode) {\n position.dataset.mode = mode\n position.replaceChildren()\n const text = el('span', 'gallerist-position-text')\n position.appendChild(text)\n if (mode !== 'counter') {\n for (let k = 0; k < itemCount; k++) {\n const jump = el('button', mode === 'pills' ? 'gallerist-pill' : 'gallerist-dot', {\n type: 'button',\n 'aria-label': ui.item(k + 1),\n })\n if (mode === 'pills') jump.textContent = String(k + 1)\n jump.addEventListener('click', () => viewer.goTo(g, k))\n position.appendChild(jump)\n }\n }\n posG = g\n posM = itemCount\n }\n const text = position.querySelector('.gallerist-position-text')\n if (text) text.textContent = `${i + 1} / ${itemCount}`\n for (const [k, jump] of position\n .querySelectorAll('.gallerist-pill, .gallerist-dot')\n .entries()) {\n if (k === i) jump.setAttribute('data-active', '')\n else jump.removeAttribute('data-active')\n }\n }\n\n // Hide a control without dropping keyboard focus: if it (or a child) has focus, hand focus to the\n // viewer root first — otherwise the browser drops it to <body> and the root's keymap goes deaf.\n const setHiddenKeepingFocus = (node: HTMLElement, hidden: boolean) => {\n if (hidden && !node.hidden && node.contains(document.activeElement)) {\n root.focus({ preventScroll: true })\n }\n node.hidden = hidden\n }\n\n // A labelled group arrow names where it goes; at an end of the collection it has no name to show.\n const setArrowLabel = (\n arrow: HTMLElement | undefined,\n name: string | undefined,\n plain: string,\n named: (name: string) => string,\n ) => {\n if (!arrow) return\n let label = arrow.querySelector<HTMLElement>('.gallerist-arrow-label')\n if (!label) {\n label = el('span', 'gallerist-arrow-label', { 'aria-hidden': 'true' })\n arrow.appendChild(label)\n }\n label.textContent = name ?? ''\n label.hidden = !name\n arrow.setAttribute('aria-label', name ? named(name) : plain)\n }\n\n // gate chrome updates to cursor/collection changes — skip zoom/pan commits (mirrors the rail)\n let chromeG = -1\n let chromeI = -1\n let chromeCol: unknown = null\n const updateChrome = () => {\n const col = viewer.getCollection()\n const cur = viewer.getState().cursor\n if (col === chromeCol && cur.g === chromeG && cur.i === chromeI) return\n if (col !== chromeCol) {\n // Reserve the caption track for the whole collection when any item has a text caption, so\n // moving between captioned and uncaptioned items never resizes the stage.\n anyCaption = col.groups.some((grp) => grp.items.some((it) => str(it.caption)))\n // likewise the docked item navigator's room, while any group has several items; one group\n // leaves the docked group arrows nowhere to go (the theme drops them and their gutters)\n root.toggleAttribute(\n 'data-gallerist-multi',\n col.groups.some((grp) => grp.items.length > 1),\n )\n const one = col.groups.length < 2\n // a focused docked group arrow goes with the second group: focus to the root, not <body>\n if (\n one &&\n arrows === 'docked' &&\n !linear &&\n [prevArrow, nextArrow].includes(document.activeElement as HTMLElement)\n )\n root.focus({ preventScroll: true })\n root.toggleAttribute('data-gallerist-one-group', one)\n }\n chromeCol = col\n chromeG = cur.g\n chromeI = cur.i\n const G = col.groups.length\n const group = col.groups[cur.g]\n const item = group?.items[cur.i]\n const itemCount = group?.items.length ?? 0\n // the item axis exists only for multi-item groups, and retires in linear mode\n const multi = !linear && itemCount > 1\n if (itemNav) setHiddenKeepingFocus(itemNav, !multi)\n if (title) {\n title.textContent = str(group?.caption)\n title.hidden = !title.textContent\n }\n if (arrowLabel) {\n const nameAt = (step: number) => {\n const n = viewer.loop && G > 1 ? (cur.g + step + G) % G : cur.g + step\n const target = col.groups[n]\n return target && !linear ? arrowLabel(target, n) : undefined\n }\n setArrowLabel(prevArrow, nameAt(-1), ui.previous, ui.previousTo)\n setArrowLabel(nextArrow, nameAt(1), ui.next, ui.nextTo)\n }\n syncCaption()\n // Announce the item's own description alongside the position so SR users hear what they\n // navigated to, not just the index (S-UX4).\n const desc = item?.alt ? ` — ${item.alt}` : ''\n if (linear) {\n // flat linear: one running position across all items\n const pos = flatPosition(cur.g, cur.i) + 1 // flatPosition() also rebuilds flatSeq if needed\n const total = flatSeq.length\n if (counter) counter.textContent = `${pos} / ${total}`\n live.textContent = `${ui.itemOf(pos, total)}${desc}`\n } else {\n if (counter) counter.textContent = `${cur.g + 1} / ${G}`\n if (multi) updatePosition(cur.g, cur.i, itemCount)\n live.textContent = multi\n ? `${ui.groupOf(cur.g + 1, G)}, ${ui.itemOf(cur.i + 1, itemCount)}${desc}`\n : `${ui.groupOf(cur.g + 1, G)}${desc}`\n }\n }\n\n // zoom reset only while zoomed in (fit == 1 in the contained model)\n const updateZoomChrome = () => {\n if (reset) setHiddenKeepingFocus(reset, !(viewer.getState().zoom.scale > 1.001))\n updateNavigator()\n }\n\n // ── zoom navigator ────────────────────────────────────────────────────────────\n // The minimap is the image at the navigator's size; the view box is the stage's visible part,\n // mapped from content space through the painted media box (the same box the zoom bounds use).\n function updateNavigator() {\n if (!navigatorEl || !navigatorView) return\n const z = viewer.getState().zoom\n const rec = currentRec()\n const natural = rec?.media?.naturalSize?.()\n const { g, i } = viewer.getState().cursor\n const it = viewer.getCollection().groups[g]?.items[i]\n // the image itself (already loaded): a thumb may be cropped to another shape\n const src = it ? (sourceUrl(it.source) ?? sourceUrl(it.thumb)) : null\n const size = stageSize()\n const zoomable = rec?.media?.supportsZoom !== false // a video keeps no minimap\n if (!(z.scale > 1.001) || !zoomable || !natural || !src || !(size.w > 0)) {\n navigatorEl.hidden = true\n return\n }\n const box = mediaBox(size)\n const url = `url(${JSON.stringify(src)})`\n if (navigatorEl.style.backgroundImage !== url) navigatorEl.style.backgroundImage = url\n // the image's shape; the theme sizes its longer side from --gallerist-navigator-size\n navigatorEl.style.aspectRatio = `${natural.w} / ${natural.h}`\n navigatorEl.dataset.shape = natural.h > natural.w ? 'portrait' : 'landscape'\n const clamp01 = (n: number) => Math.min(1, Math.max(0, n))\n const x0 = clamp01((-z.x / z.scale - box.x) / box.w)\n const y0 = clamp01((-z.y / z.scale - box.y) / box.h)\n const x1 = clamp01(((size.w - z.x) / z.scale - box.x) / box.w)\n const y1 = clamp01(((size.h - z.y) / z.scale - box.y) / box.h)\n Object.assign(navigatorView.style, {\n left: `${x0 * 100}%`,\n top: `${y0 * 100}%`,\n width: `${(x1 - x0) * 100}%`,\n height: `${(y1 - y0) * 100}%`,\n })\n navigatorEl.hidden = false\n }\n // centre the visible part on the pointed spot of the minimap\n const panNavigatorTo = (e: PointerEvent) => {\n if (!navigatorEl) return\n const r = navigatorEl.getBoundingClientRect()\n const size = stageSize()\n if (!(r.width > 0) || !(size.w > 0)) return\n const box = mediaBox(size)\n const z = viewer.getState().zoom\n const cx = box.x + ((e.clientX - r.left) / r.width) * box.w\n const cy = box.y + ((e.clientY - r.top) / r.height) * box.h\n internals.setZoom({\n scale: z.scale,\n x: size.w / 2 - cx * z.scale,\n y: size.h / 2 - cy * z.scale,\n })\n }\n function onNavigatorDown(e: PointerEvent) {\n if (e.button !== 0) return // primary button (or touch / pen contact) only\n const nav = e.currentTarget as HTMLElement\n e.preventDefault()\n e.stopPropagation()\n nav.setPointerCapture?.(e.pointerId)\n panNavigatorTo(e)\n const move = (ev: PointerEvent) => panNavigatorTo(ev)\n const up = () => {\n nav.removeEventListener('pointermove', move)\n nav.removeEventListener('pointerup', up)\n nav.removeEventListener('pointercancel', up)\n nav.removeEventListener('lostpointercapture', up)\n }\n nav.addEventListener('pointermove', move)\n nav.addEventListener('pointerup', up)\n nav.addEventListener('pointercancel', up)\n // hidden mid-drag (zoom reset): capture is lost and no pointerup arrives here\n nav.addEventListener('lostpointercapture', up)\n }\n\n // ── attach / detach ──────────────────────────────────────────────────────────\n let attached = false\n let restoreFocus: HTMLElement | null = null\n\n // Auto-hide chrome on idle (UX-C); inert under reduced motion. Rail collapse is independent.\n // Created before attach() so the (TDZ-safe) poke on show works in both overlay and inline modes.\n const idle: IdleController | null = autoHide ? createIdleController(root) : null\n\n const attach = () => {\n if (attached) return\n attached = true\n if (overlay) {\n restoreFocus = document.activeElement as HTMLElement | null\n lockBodyScroll()\n document.body.appendChild(root)\n // Inert every other top-level element so the dialog is truly modal — focus and the SR\n // virtual cursor can't reach the obscured page behind it (C5). aria-modal alone doesn't\n // enforce this.\n inertBackground(root)\n root.focus()\n }\n setDir()\n readFrameInset()\n idle?.poke() // start the idle countdown from when the viewer is shown\n }\n const detach = () => {\n if (!attached) return\n attached = false\n if (overlay) {\n root.remove() // remove this overlay first so the presence checks below are accurate\n unlockBodyScroll()\n releaseBackgroundInert()\n // Prefer an explicit returnFocus target (survives a trigger that unmounted), else restore\n // focus to whatever was focused on open (S-UX4).\n const target =\n typeof opts.returnFocus === 'function' ? opts.returnFocus() : (opts.returnFocus ?? null)\n ;(target ?? restoreFocus)?.focus?.()\n }\n }\n\n // inline mode is always present in its container\n if (!overlay && container) {\n container.appendChild(root)\n attached = true\n idle?.poke()\n }\n\n const sync = () => {\n const phase: Phase = viewer.getState().phase\n // The theme keys the open/close animation off the phase (see the lifecycle driver below).\n if (root.getAttribute('data-gallerist-phase') !== phase)\n root.setAttribute('data-gallerist-phase', phase)\n if (overlay) {\n if (phase !== 'closed') attach()\n else detach()\n }\n if (attached) {\n if (!root.hasAttribute('data-gallerist-dir')) setDir() // inline mode: attached at mount\n renderWindow()\n updateChrome()\n updateZoomChrome()\n }\n }\n\n // Keyboard zoom pivots on the stage centre (zoomTo's default pivot), spec §5; the zoom bounds\n // clamp the scale and pan.\n const zoomAroundCenter = (factor: number) => viewer.zoomTo(viewer.zoom.scale * factor)\n\n // ── keyboard (spec §5) ───────────────────────────────────────────────────────\n // Which physical arrow drives which axis depends on the group axis (point 5): by default a side\n // rail makes ↑/↓ the group axis and ←/→ the item axis; horizontal keeps the classic mapping.\n const arrowNav: Record<string, () => void> = vertical\n ? {\n ArrowDown: nav.next,\n ArrowUp: nav.prev,\n ArrowRight: nav.nextItem,\n ArrowLeft: nav.prevItem,\n }\n : {\n ArrowRight: nav.next,\n ArrowLeft: nav.prev,\n ArrowDown: nav.nextItem,\n ArrowUp: nav.prevItem,\n }\n const isRtl = (): boolean => {\n const dir = root.closest('[dir]')?.getAttribute('dir')\n if (dir) return dir === 'rtl'\n try {\n return getComputedStyle(root).direction === 'rtl'\n } catch {\n return false\n }\n }\n // Mirror the keymap's notion of direction onto the root so the theme agrees with it (arrow glyphs,\n // physical side rails) — no reliance on :dir(), and it honours a CSS-only `direction: rtl`.\n const setDir = () => root.setAttribute('data-gallerist-dir', isRtl() ? 'rtl' : 'ltr')\n\n const onKey = (e: KeyboardEvent) => {\n // Don't hijack typing inside an embedded control (overlay input/textarea/etc); Escape still\n // closes from anywhere (I-UX2), unless a handler before ours called preventDefault() on it\n // (a host form keeping Escape for itself).\n if (isEditableTarget(e.target) && e.key !== 'Escape') return\n // A focused caption band scrolls with ↑/↓/Home/End rather than navigating. Scrolled here, not\n // left to the browser: WebKit on Linux (GTK/WPE) leaves the placard's band unscrolled.\n const by =\n e.target === capScroll && capScroll.hasAttribute('tabindex')\n ? ({ ArrowUp: -40, ArrowDown: 40, Home: -1e9, End: 1e9 } as Record<string, number>)[e.key]\n : 0\n if (by) {\n capScroll.scrollTop += by\n e.preventDefault()\n return\n }\n // Focus trap: cycle Tab within the dialog so focus can't escape to the inert page (C5).\n if (e.key === 'Tab' && overlay) {\n const tabbables = focusableWithin(root)\n const first = tabbables[0]\n const last = tabbables[tabbables.length - 1]\n if (!first || !last) {\n e.preventDefault()\n return\n }\n const active = document.activeElement\n if (e.shiftKey && (active === first || active === root)) {\n last.focus()\n e.preventDefault()\n } else if (!e.shiftKey && active === last) {\n first.focus()\n e.preventDefault()\n }\n return\n }\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowLeft':\n case 'ArrowUp':\n case 'ArrowDown': {\n // In an RTL document the horizontal arrows mirror (ArrowLeft advances), matching the\n // logical-property chrome layout (S-UX3). Vertical (Up/Down) is unaffected.\n const flip = isRtl() && (e.key === 'ArrowRight' || e.key === 'ArrowLeft')\n const k = flip ? (e.key === 'ArrowRight' ? 'ArrowLeft' : 'ArrowRight') : e.key\n arrowNav[k]?.()\n break\n }\n case 'Escape':\n if (!e.defaultPrevented) viewer.close()\n break\n case '+':\n case '=':\n zoomAroundCenter(1.25)\n break\n case '-':\n zoomAroundCenter(1 / 1.25)\n break\n case '0':\n viewer.resetZoom()\n break\n case 't':\n case 'T':\n setRailCollapsed(!railCollapsed, true)\n break\n case 'Home':\n if (linear) {\n ensureFlat()\n const t = flatSeq[0]\n if (t) viewer.goTo(t.g, t.i)\n } else viewer.goTo(0)\n break\n case 'End':\n if (linear) {\n ensureFlat()\n const t = flatSeq[flatSeq.length - 1]\n if (t) viewer.goTo(t.g, t.i)\n } else viewer.goTo(viewer.getCollection().groups.length - 1)\n break\n default:\n // Modified chords (Ctrl/Cmd/Alt) belong to the browser/OS, not our single-letter map.\n if (e.ctrlKey || e.metaKey || e.altKey) return\n // Within-group digit jumps are meaningless in linear mode (the pills retire), so skip them.\n if (!linear && /^[1-9]$/.test(e.key)) {\n viewer.goTo(viewer.getState().cursor.g, Number(e.key) - 1)\n } else if (pluginKeymap[e.key]) {\n pluginKeymap[e.key]?.(e)\n }\n return\n }\n e.preventDefault()\n }\n root.addEventListener('keydown', onKey)\n\n // Collapse the rail by default while our element is fullscreen; restore the prior state on exit.\n const isOurFullscreen = () => {\n const fe = document.fullscreenElement\n return !!fe && (fe === root || root.contains(fe))\n }\n const onFsChange = () => {\n if (isOurFullscreen()) {\n if (preFsCollapsed === null) preFsCollapsed = railCollapsed\n setRailCollapsed(true)\n } else if (preFsCollapsed !== null) {\n setRailCollapsed(preFsCollapsed)\n preFsCollapsed = null\n }\n }\n document.addEventListener('fullscreenchange', onFsChange)\n\n // ── live gestures (spec §11; imperative during gesture, decision P0-E) ─────────\n const currentRec = () => {\n const key = viewer.getCollection().groups[viewer.getState().cursor.g]?.id\n return key ? mounted.get(key) : undefined\n }\n const detachGestures = attachGestures({\n stage,\n viewer,\n maxScale: MAX_ZOOM,\n nav, // route swipes through the linear/oriented nav seam\n getContent: () => currentRec()?.content ?? null,\n getGeometry: () => {\n const r = stage.getBoundingClientRect()\n // Contained model: the content layer fills the stage and scale 1 == fit; the media is\n // object-fit: contain inside it, so pan bounds use the painted box (see mediaBox).\n return {\n stageRect: { left: r.left, top: r.top, width: r.width, height: r.height },\n naturalSize: { w: r.width, h: r.height },\n mediaBox: mediaBox({ w: r.width, h: r.height }),\n }\n },\n })\n\n // ── open/close transitions (spec §6, §27) ───────────────────────────────────────\n // The theme animates the root per data-gallerist-phase (fade in while opening, out while\n // closing) and the viewer settles to open/closed when that animation ends, so the overlay stays\n // mounted, focus-trapped and scroll-locked through its exit. No animation (reduced motion, inline\n // mode, a theme without one) settles at once. A timer backs up animationend, which never fires if\n // the animation is cancelled or the root is display:none.\n let cancelPhaseWait: (() => void) | null = null\n const awaitPhaseAnimation = (done: () => void) => {\n cancelPhaseWait?.()\n const style = getComputedStyle(root)\n if (!style.animationName || style.animationName === 'none') return done()\n const onEnd = (e: Event) => {\n if (e.target === root) finish() // slide/thumbnail animations bubble up too\n }\n const stop = () => {\n root.removeEventListener('animationend', onEnd)\n clearTimeout(timer)\n cancelPhaseWait = null\n }\n const finish = () => {\n stop()\n done()\n }\n root.addEventListener('animationend', onEnd) // events dispatch async: never before `timer` exists\n const timer = setTimeout(finish, animationMs(style) + 50)\n cancelPhaseWait = stop\n }\n const offLifecycle = internals.setLifecycleDriver({\n opening: awaitPhaseAnimation,\n closing: awaitPhaseAnimation,\n })\n\n // ── zoom bounds (spec §11.1) ───────────────────────────────────────────────────\n // Lend the core the stage geometry so every committed zoom (API, keyboard, gesture end, resize)\n // is clamped in one place. Contained model: the media is object-fit inside a stage-sized content\n // layer, so fit == scale 1, and the pan keeps the painted media box (not the letterbox around it)\n // covering the stage.\n const stageSize = () => {\n const r = stage.getBoundingClientRect()\n return { w: r.width, h: r.height }\n }\n // The current media's painted box in content space; the whole layer until its size is known.\n // The painted media box in content space at fit: the media's contain rect, inside the frame\n // inset when framed; the whole (inset) layer until the natural size is known. Zoom bounds, the\n // navigator, overlays and the framed media element all use this one box.\n let frameInset = 0\n const readFrameInset = () => {\n frameInset = frame\n ? Number.parseFloat(getComputedStyle(root).getPropertyValue('--gallerist-frame-inset')) || 0\n : 0\n }\n function paintedBox(\n size: { w: number; h: number },\n natural: { w: number; h: number } | null | undefined,\n ) {\n const inset = Math.max(0, Math.min(frameInset, size.w / 4, size.h / 4))\n const inner = { w: size.w - 2 * inset, h: size.h - 2 * inset }\n if (!(natural && natural.w > 0 && natural.h > 0)) return { x: inset, y: inset, ...inner }\n const r = containRect(inner, natural)\n return { x: r.x + inset, y: r.y + inset, w: r.w, h: r.h }\n }\n function mediaBox(size: { w: number; h: number }) {\n return paintedBox(size, currentRec()?.media?.naturalSize?.())\n }\n // Framed: size the slide's media element to its painted box (the theme reads these variables).\n function frameSlide(rec: SlideRec) {\n if (!frame) return\n const size = stageSize()\n if (!(size.w > 0 && size.h > 0)) return\n const box = paintedBox(size, rec.media?.naturalSize?.())\n const s = rec.content.style\n s.setProperty('--gallerist-box-x', `${box.x}px`)\n s.setProperty('--gallerist-box-y', `${box.y}px`)\n s.setProperty('--gallerist-box-w', `${box.w}px`)\n s.setProperty('--gallerist-box-h', `${box.h}px`)\n }\n const constrainZoom = (z: ZoomState): ZoomState => {\n const scaled = { scale: clampScale(z.scale, 1, MAX_ZOOM), x: z.x, y: z.y }\n const size = stageSize()\n // Not laid out (closed overlay, hidden container): the scale range needs no geometry, the pan\n // bounds do; the ResizeObserver re-clamps the pan once the stage has a size.\n if (!(size.w > 0 && size.h > 0)) return scaled\n return clampPanToBox(scaled, size, mediaBox(size))\n }\n const offZoomBounds = internals.setZoomBounds({\n center: () => {\n const size = stageSize()\n return { x: size.w / 2, y: size.h / 2 }\n },\n constrain: constrainZoom,\n })\n\n // Re-check the committed zoom against the current geometry; repaints either way.\n const reclampZoom = () => {\n const z = viewer.getState().zoom\n const clamped = constrainZoom(z)\n if (clamped.scale !== z.scale || clamped.x !== z.x || clamped.y !== z.y) {\n internals.setZoom(clamped) // commit → sync → repaint\n } else {\n renderWindow() // repaint overlays at the new rect\n updateNavigator()\n }\n }\n\n // ── re-measure on resize (spec §10.5) ──────────────────────────────────────────\n // A single ResizeObserver on the stage, debounced to one frame. On resize / device rotation\n // it repaints the current slide's content overlays (their px box is derived from the stage\n // rect) and re-clamps the committed zoom against the new fit, so image-space overlays don't\n // drift and a zoomed image can't be stranded panned past the new edge (C2).\n let resizeFrame = 0\n const onStageResize = () => {\n if (resizeFrame) return\n resizeFrame = requestAnimationFrame(() => {\n resizeFrame = 0\n if (!attached) return\n readFrameInset() // the inset can change with the viewport (the mobile layer)\n for (const rec of mounted.values()) frameSlide(rec)\n const cur = currentRec()\n if (cur) cur.overlayItem = undefined // re-anchor overlays against the new stage rect\n reclampZoom()\n })\n }\n const resizeObserver =\n typeof ResizeObserver !== 'undefined' ? new ResizeObserver(onStageResize) : null\n resizeObserver?.observe(stage)\n\n // Immersive floats the bar, caption, rail and side column over the full-bleed stage. Measure\n // where they overlap it and inset the on-stage controls box by that much, so arrows and the item\n // navigator never end up underneath chrome (in every arrow layout, rail expanded or collapsed).\n let insetFrame = 0\n const updateControlsInset = () => {\n insetFrame = 0\n if (!controlsBox) return\n if (root.getAttribute('data-gallerist-preset') !== 'immersive' || !attached) {\n controlsBox.style.removeProperty('--gallerist-controls-inset')\n return\n }\n const m = main.getBoundingClientRect()\n let top = 0\n let right = 0\n let bottom = 0\n let left = 0\n for (const band of [\n bar,\n caption,\n regionHosts.footer,\n regionHosts.thumbnails,\n regionHosts.aside,\n ]) {\n if (band.hidden) continue\n const r = band.getBoundingClientRect()\n if (r.width < 1 || r.height < 1) continue\n if (r.width >= m.width * 0.5) {\n // a horizontal band: it covers the top or the bottom of the stage\n if (r.top - m.top < m.bottom - r.bottom) top = Math.max(top, r.bottom - m.top)\n else bottom = Math.max(bottom, m.bottom - r.top)\n } else if (r.left - m.left < m.right - r.right) {\n left = Math.max(left, r.right - m.left)\n } else {\n right = Math.max(right, m.right - r.left)\n }\n }\n controlsBox.style.setProperty(\n '--gallerist-controls-inset',\n `${top}px ${right}px ${bottom}px ${left}px`,\n )\n }\n const scheduleInset = () => {\n if (!insetFrame) insetFrame = requestAnimationFrame(updateControlsInset)\n }\n const bandObserver =\n controlsBox && typeof ResizeObserver !== 'undefined' ? new ResizeObserver(scheduleInset) : null\n for (const band of [\n main,\n bar,\n caption,\n regionHosts.footer,\n regionHosts.thumbnails,\n regionHosts.aside,\n ]) {\n bandObserver?.observe(band)\n }\n // viewer.refresh(): an explicit re-measure, for layout changes a ResizeObserver can't see\n const offRefresh = internals.onRefresh(onStageResize)\n\n // ── plugin regions (spec §13) ──────────────────────────────────────────────\n const mountPluginRegions = createRegionMounter(regionHosts, { viewer, preset })\n const mountRegions = () => {\n pluginKeymap = aggregateKeymap(internals.getPlugins())\n mountPluginRegions(internals.getPlugins())\n // Linear traversal: the option, else on while the rail asks for it (a flat thumbnails rail marks\n // its region), so it follows a rail added or removed after mount.\n const on = opts.linear ?? !!regionHosts.thumbnails.querySelector('[data-gallerist-linear]')\n root.toggleAttribute('data-gallerist-arrow-labels', !!arrowLabel && !on)\n if (on !== linear) {\n linear = on\n if (on) root.setAttribute('data-gallerist-linear', 'true')\n else root.removeAttribute('data-gallerist-linear')\n chromeCol = null // the counter, the item navigator and the arrows' names follow it\n }\n // The pull-handle leads the rail region while a rail plugin is mounted. The mounter leaves\n // nodes it didn't add alone, so place (or drop) the handle here.\n const thumbs = regionHosts.thumbnails\n const hasRail = [...thumbs.childNodes].some((n) => n !== railHandle)\n if (!hasRail) railHandle.remove()\n else if (thumbs.firstChild !== railHandle) thumbs.prepend(railHandle)\n if (!controls) bar.hidden = regionHosts.toolbar.childElementCount === 0\n syncCaption()\n // plugin overlays may have changed (e.g. React <Gallerist.Overlay> mount/unmount) → force repaint\n const cur = currentRec()\n if (cur) cur.overlayItem = undefined\n if (attached) {\n renderWindow()\n updateChrome()\n }\n }\n mountRegions()\n const offPlugins = internals.onPluginsChanged(mountRegions)\n\n const unsubscribe = viewer.subscribe(sync)\n sync()\n\n return {\n root,\n destroy() {\n unsubscribe()\n offPlugins()\n offZoomBounds()\n offRefresh()\n cancelPhaseWait?.()\n offLifecycle() // settles a transition in flight, so `closed` still fires\n detachGestures()\n resizeObserver?.disconnect()\n bandObserver?.disconnect()\n capObserver?.disconnect()\n if (insetFrame) cancelAnimationFrame(insetFrame)\n if (resizeFrame) cancelAnimationFrame(resizeFrame)\n idle?.destroy()\n document.removeEventListener('fullscreenchange', onFsChange)\n root.removeEventListener('keydown', onKey)\n for (const rec of mounted.values()) teardownSlide(rec)\n mounted.clear()\n warmRun++\n for (const [id, img] of warm) unwarm(id, img)\n detach()\n if (!overlay) root.remove()\n },\n }\n}\n","// Markup init: `<a href=\"big.jpg\" data-gallerist=\"trip\">` links open a viewer, with no collection to\n// write. A single delegated listener reads the links on each click, so links added later join in.\n// One viewer per gallery name, created on first use. Reads attributes only: captions reach the page as\n// text, and the link's URL only ever becomes a media source.\n\nimport {\n type Collection,\n type Group,\n type Item,\n type ViewerApi,\n type ViewerOptions,\n createViewer,\n} from '@gallerist/core'\nimport { type MountOptions, type RendererHandle, mount } from './mount'\n\ntype PerGallery<T> = T | ((gallery: string) => T)\n\nexport interface BindOptions {\n /** which elements are links (default `[data-gallerist]`). */\n selector?: string\n /** where to look for them (default `document`). */\n root?: Document | HTMLElement\n /**\n * `createViewer` options besides the collection (`plugins`, `loop`…), or a function returning a set\n * per gallery. With several galleries use the function for `pins()`, which holds its state on the\n * plugin and so can't be shared between viewers.\n */\n viewer?: PerGallery<Omit<ViewerOptions, 'collection' | 'groups' | 'items'>>\n /** `mount` options (`preset`, `skin`…), or one set per gallery. */\n mount?: PerGallery<MountOptions>\n}\n\nexport interface BindHandle {\n /** open a gallery from code, at its first item or the one given. */\n open(gallery?: string, at?: { g?: number; i?: number }): void\n /** the gallery's viewer, once it has been opened. */\n viewer(gallery?: string): ViewerApi | undefined\n /** stop listening and destroy every viewer. */\n destroy(): void\n}\n\nconst attr = (el: Element, name: string): string | undefined =>\n el.getAttribute(`data-gallerist-${name}`) ?? undefined\n\nconst dimension = (el: Element, name: string): number => Number(attr(el, name))\n\nfunction itemFromLink(el: Element, id: string): Item | null {\n const source = attr(el, 'src') ?? el.getAttribute('href')\n if (!source) return null\n const img = el.querySelector('img')\n const item: Item = {\n id: attr(el, 'id') ?? id,\n type: attr(el, 'type') ?? 'image',\n source,\n }\n const thumb = attr(el, 'thumb') ?? img?.getAttribute('src')\n if (thumb) item.thumb = thumb\n const alt = attr(el, 'alt') ?? img?.getAttribute('alt')\n if (alt) item.alt = alt\n const caption = attr(el, 'caption')\n if (caption) item.caption = caption\n const w = dimension(el, 'width')\n const h = dimension(el, 'height')\n if (w > 0 && h > 0) item.naturalSize = { w, h }\n return item\n}\n\ninterface LinkCollection {\n collection: Collection\n /** where each link landed */\n positions: Map<Element, { g: number; i: number }>\n}\n\n/**\n * Build a collection from link elements. A link with `data-gallerist-group` joins the group of that\n * id, in first-seen order (named by `-group-caption`, with `-group-subtitle` in its meta); any other\n * link is a group of its own. Elements with neither a `data-gallerist-src` nor an `href` are skipped.\n */\nexport function collectionFromLinks(links: Iterable<Element>, idPrefix = 'link'): LinkCollection {\n const groups: Group[] = []\n const byId = new Map<string, number>()\n const positions = new Map<Element, { g: number; i: number }>()\n const usedIds = new Set<string>()\n let n = 0\n for (const el of links) {\n const generated = `${idPrefix}-${n}`\n const item = itemFromLink(el, generated)\n if (!item) continue\n // the same id on two links (a hero and its gallery copy) would fail the whole collection\n if (usedIds.has(item.id)) item.id = usedIds.has(generated) ? `${generated}-dup` : generated\n usedIds.add(item.id)\n const groupId = attr(el, 'group')\n let g = groupId ? byId.get(groupId) : undefined\n if (g === undefined) {\n const group: Group = { id: groupId ?? `${idPrefix}-g${n}`, items: [] }\n const caption = attr(el, 'group-caption')\n if (caption) group.caption = caption\n const subtitle = attr(el, 'group-subtitle')\n if (subtitle) group.meta = { subtitle }\n g = groups.push(group) - 1\n if (groupId) byId.set(groupId, g)\n }\n const items = (groups[g] as Group).items\n positions.set(el, { g, i: items.push(item) - 1 })\n n++\n }\n return { collection: { groups }, positions }\n}\n\n/**\n * Open a viewer from `data-gallerist` links. Each distinct attribute value is its own gallery. A plain\n * click opens the viewer at that link; a modified click (new tab, download) stays the browser's.\n */\nexport function bind(opts: BindOptions = {}): BindHandle {\n const selector = opts.selector ?? '[data-gallerist]'\n const root: Document | HTMLElement = opts.root ?? document\n interface Live {\n viewer: ViewerApi\n handle: RendererHandle\n signature: string\n /** the link that last opened it, which gets focus back */\n link: Element | null\n }\n const live = new Map<string, Live>()\n let destroyed = false\n\n // the viewer's own controls and pin links aren't gallery links, however broad the selector\n const linksOf = (gallery: string) =>\n [...root.querySelectorAll(selector)].filter(\n (el) => (el.getAttribute('data-gallerist') ?? '') === gallery && !el.closest('.gallerist'),\n )\n const pick = <T>(value: PerGallery<T> | undefined, gallery: string): T | undefined =>\n typeof value === 'function' ? (value as (g: string) => T)(gallery) : value\n\n const ensure = (gallery: string) => {\n const { collection, positions } = collectionFromLinks(linksOf(gallery), gallery || 'link')\n if (collection.groups.length === 0) return null\n const signature = JSON.stringify(collection)\n const existing = live.get(gallery)\n if (existing) {\n // links changed since the last open\n if (existing.signature !== signature) {\n existing.viewer.setCollection(collection)\n existing.signature = signature\n }\n return { entry: existing, positions }\n }\n const viewer = createViewer({ ...pick(opts.viewer, gallery), collection })\n const handle = mount(viewer, {\n // a link removed meanwhile falls back to what had focus on opening\n returnFocus: () => {\n const link = live.get(gallery)?.link as HTMLElement | null | undefined\n return link?.isConnected ? link : null\n },\n ...pick(opts.mount, gallery),\n })\n const entry: Live = { viewer, handle, signature, link: null }\n live.set(gallery, entry)\n return { entry, positions }\n }\n\n const onClick = (event: Event) => {\n const e = event as MouseEvent\n if (e.defaultPrevented || e.button !== 0) return\n if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return\n const link = (e.target as Element | null)?.closest?.(selector)\n if (!link || link.closest('.gallerist')) return\n const ready = ensure(link.getAttribute('data-gallerist') ?? '')\n const at = ready?.positions.get(link)\n if (!ready || !at) return // no source: leave the element alone\n e.preventDefault()\n ready.entry.link = link\n ready.entry.viewer.open(at)\n }\n root.addEventListener('click', onClick)\n\n return {\n open(gallery, at) {\n if (destroyed) return\n const ready = ensure(gallery ?? '')\n if (!ready) return\n ready.entry.link = null // not opened from a link: focus goes back where it was\n ready.entry.viewer.open(at ?? { g: 0, i: 0 })\n },\n viewer: (gallery = '') => live.get(gallery)?.viewer,\n destroy() {\n destroyed = true\n root.removeEventListener('click', onClick)\n for (const { handle, viewer } of live.values()) {\n handle.destroy()\n viewer.destroy()\n }\n live.clear()\n },\n }\n}\n","// @gallerist/renderer-dom — default DOM renderer (the only ring that touches the DOM).\ndeclare const __GALLERIST_VERSION__: string | undefined\n/** Package version, injected from package.json at build (tsup `define`). Guarded with `typeof` so\n * importing the source without the define (e2e / example fixtures) yields a dev marker, not a crash. */\nexport const VERSION =\n typeof __GALLERIST_VERSION__ !== 'undefined' ? __GALLERIST_VERSION__ : '0.0.0-dev'\n\nexport { imageAdapter } from './adapters/image'\nexport { type BindHandle, type BindOptions, bind, collectionFromLinks } from './bind'\nexport {\n type Accent,\n type Appearance,\n applyAppearance,\n type ColorScheme,\n type Skin,\n} from './appearance'\nexport {\n type ArrowLayout,\n type GroupAxis,\n type ItemIndicator,\n type MountOptions,\n mount,\n type RailPlacement,\n type RendererHandle,\n} from './mount'\nexport { type PresetName, type ResolvedPreset, resolvePreset } from './presets'\nexport { DEFAULT_STRINGS, type Strings } from './strings'\nexport { type KeyReconcile, reconcileKeys, windowIndices } from './windowing'\n"]}
|