{
  "version": 3,
  "sources": ["../../renderer/src/v3/inline-media-lightbox.js", "../../renderer/src/flat.js"],
  "sourcesContent": ["/**\n * Delegated clicks on `.v3-inline-media-thumb-btn` \u2192 fullscreen lightbox (body-mounted).\n * Bundle buttons carry `data-bundle-gallery` (URL-encoded JSON) for prev/next in the viewer.\n */\n\nlet activeOverlay = null;\n/** @type {Element | null} */\nlet prevFocus = null;\n\nexport function closeLightbox() {\n    if (!activeOverlay) return;\n    const keyHandler = activeOverlay._keyHandler;\n    if (keyHandler) {\n        document.removeEventListener('keydown', keyHandler);\n    }\n    const videos = activeOverlay.querySelectorAll('video');\n    videos.forEach((v) => {\n        try {\n            v.pause();\n        } catch (_) {}\n    });\n    activeOverlay.remove();\n    activeOverlay = null;\n    if (prevFocus && typeof prevFocus.focus === 'function') {\n        try {\n            prevFocus.focus();\n        } catch (_) {}\n    }\n    prevFocus = null;\n}\n\n/**\n * @typedef {{ kind: 'image' | 'video', fullSrc: string, fullSrcset?: string, poster?: string, alt: string }} GallerySlide\n */\n\nfunction fillStageWithSlide(stage, s) {\n    stage.replaceChildren();\n    if (s.kind === 'video') {\n        const v = document.createElement('video');\n        v.className = 'v3-inline-media-lightbox__el';\n        if (s.fullSrc) v.src = s.fullSrc;\n        v.setAttribute('controls', '');\n        v.setAttribute('playsinline', '');\n        if (s.poster) v.setAttribute('poster', s.poster);\n        stage.appendChild(v);\n        requestAnimationFrame(() => {\n            v.play().catch(() => {});\n        });\n    } else {\n        const img = document.createElement('img');\n        img.className = 'v3-inline-media-lightbox__el';\n        if (s.fullSrc) img.src = s.fullSrc;\n        if (s.fullSrcset) img.setAttribute('srcset', s.fullSrcset);\n        img.alt = s.alt || '';\n        stage.appendChild(img);\n    }\n}\n\n/**\n * Exported for the flat reading view (PCB-21), which carries its slides in a data attribute.\n *\n * @param {GallerySlide[]} slides\n * @param {number} startIndex\n */\nexport function openGalleryLightbox(slides, startIndex) {\n    closeLightbox();\n    if (!slides?.length) return;\n\n    prevFocus = document.activeElement;\n\n    const overlay = document.createElement('div');\n    overlay.className = 'v3-inline-media-lightbox';\n    overlay.setAttribute('role', 'dialog');\n    overlay.setAttribute('aria-modal', 'true');\n    overlay.setAttribute('aria-label', 'Full screen media gallery');\n\n    const backdrop = document.createElement('button');\n    backdrop.type = 'button';\n    backdrop.className = 'v3-inline-media-lightbox__backdrop';\n    backdrop.setAttribute('aria-label', 'Close');\n\n    const closeBtn = document.createElement('button');\n    closeBtn.type = 'button';\n    closeBtn.className = 'v3-inline-media-lightbox__close';\n    closeBtn.setAttribute('aria-label', 'Close');\n    closeBtn.textContent = '\\u2715';\n\n    const stage = document.createElement('div');\n    stage.className = 'v3-inline-media-lightbox__stage';\n\n    const prevBtn = document.createElement('button');\n    prevBtn.type = 'button';\n    prevBtn.className = 'v3-inline-media-lightbox__nav v3-inline-media-lightbox__nav--prev';\n    prevBtn.setAttribute('aria-label', 'Previous');\n    prevBtn.innerHTML = '<span aria-hidden=\"true\">\\u2039</span>';\n\n    const nextBtn = document.createElement('button');\n    nextBtn.type = 'button';\n    nextBtn.className = 'v3-inline-media-lightbox__nav v3-inline-media-lightbox__nav--next';\n    nextBtn.setAttribute('aria-label', 'Next');\n    nextBtn.innerHTML = '<span aria-hidden=\"true\">\\u203a</span>';\n\n    const counter = document.createElement('div');\n    counter.className = 'v3-inline-media-lightbox__counter';\n    counter.setAttribute('aria-live', 'polite');\n\n    let index = Math.max(0, Math.min(startIndex, slides.length - 1));\n    const multi = slides.length > 1;\n\n    function renderSlide() {\n        fillStageWithSlide(stage, slides[index]);\n        counter.textContent = `${index + 1} / ${slides.length}`;\n        prevBtn.hidden = !multi;\n        nextBtn.hidden = !multi;\n        counter.hidden = !multi;\n    }\n\n    const onClose = () => closeLightbox();\n\n    overlay.appendChild(backdrop);\n    overlay.appendChild(stage);\n    overlay.appendChild(prevBtn);\n    overlay.appendChild(nextBtn);\n    overlay.appendChild(counter);\n    overlay.appendChild(closeBtn);\n    document.body.appendChild(overlay);\n    activeOverlay = overlay;\n\n    renderSlide();\n\n    requestAnimationFrame(() => {\n        overlay.classList.add('is-open');\n    });\n\n    backdrop.addEventListener('click', onClose);\n    closeBtn.addEventListener('click', onClose);\n\n    const step = (delta) => {\n        if (!multi) return;\n        index = (index + delta + slides.length) % slides.length;\n        const prevV = stage.querySelector('video');\n        if (prevV) {\n            try {\n                prevV.pause();\n            } catch (_) {}\n        }\n        renderSlide();\n    };\n\n    prevBtn.addEventListener('click', (e) => {\n        e.preventDefault();\n        e.stopPropagation();\n        step(-1);\n    });\n    nextBtn.addEventListener('click', (e) => {\n        e.preventDefault();\n        e.stopPropagation();\n        step(1);\n    });\n\n    const onKey = (e) => {\n        if (e.key === 'Escape') {\n            e.preventDefault();\n            onClose();\n            return;\n        }\n        if (multi && e.key === 'ArrowLeft') {\n            e.preventDefault();\n            step(-1);\n            return;\n        }\n        if (multi && e.key === 'ArrowRight') {\n            e.preventDefault();\n            step(1);\n        }\n    };\n    document.addEventListener('keydown', onKey);\n    overlay._keyHandler = onKey;\n\n    closeBtn.focus();\n}\n\nfunction openLightbox(btn) {\n    const bundleRaw = btn.getAttribute('data-bundle-gallery');\n    if (bundleRaw) {\n        let slides;\n        try {\n            slides = JSON.parse(decodeURIComponent(bundleRaw));\n        } catch {\n            return;\n        }\n        if (Array.isArray(slides) && slides.length) {\n            openGalleryLightbox(\n                /** @type {GallerySlide[]} */ (slides),\n                0,\n            );\n            return;\n        }\n    }\n\n    closeLightbox();\n    const kind = btn.getAttribute('data-media-kind');\n    const src = btn.getAttribute('data-full-src');\n    if (!src) return;\n\n    prevFocus = document.activeElement;\n\n    const overlay = document.createElement('div');\n    overlay.className = 'v3-inline-media-lightbox';\n    overlay.setAttribute('role', 'dialog');\n    overlay.setAttribute('aria-modal', 'true');\n    overlay.setAttribute('aria-label', 'Full screen media');\n\n    const backdrop = document.createElement('button');\n    backdrop.type = 'button';\n    backdrop.className = 'v3-inline-media-lightbox__backdrop';\n    backdrop.setAttribute('aria-label', 'Close');\n\n    const closeBtn = document.createElement('button');\n    closeBtn.type = 'button';\n    closeBtn.className = 'v3-inline-media-lightbox__close';\n    closeBtn.setAttribute('aria-label', 'Close');\n    closeBtn.textContent = '\\u2715';\n\n    const stage = document.createElement('div');\n    stage.className = 'v3-inline-media-lightbox__stage';\n\n    if (kind === 'video') {\n        const v = document.createElement('video');\n        v.className = 'v3-inline-media-lightbox__el';\n        v.src = src;\n        v.setAttribute('controls', '');\n        v.setAttribute('playsinline', '');\n        const poster = btn.getAttribute('data-poster');\n        if (poster) v.setAttribute('poster', poster);\n        stage.appendChild(v);\n    } else {\n        const img = document.createElement('img');\n        img.className = 'v3-inline-media-lightbox__el';\n        img.src = src;\n        const srcset = btn.getAttribute('data-full-srcset');\n        if (srcset) img.setAttribute('srcset', srcset);\n        const thumb = btn.querySelector('.v3-inline-media-thumb-img[alt]');\n        if (thumb && thumb.getAttribute('alt')) {\n            img.alt = thumb.getAttribute('alt') || '';\n        }\n        stage.appendChild(img);\n    }\n\n    overlay.appendChild(backdrop);\n    overlay.appendChild(stage);\n    overlay.appendChild(closeBtn);\n    document.body.appendChild(overlay);\n    activeOverlay = overlay;\n\n    requestAnimationFrame(() => {\n        overlay.classList.add('is-open');\n    });\n\n    const onClose = () => closeLightbox();\n    backdrop.addEventListener('click', onClose);\n    closeBtn.addEventListener('click', onClose);\n\n    const onKey = (e) => {\n        if (e.key === 'Escape') {\n            e.preventDefault();\n            onClose();\n        }\n    };\n    document.addEventListener('keydown', onKey);\n    overlay._keyHandler = onKey;\n\n    closeBtn.focus();\n\n    if (kind === 'video') {\n        const v = stage.querySelector('video');\n        if (v) {\n            v.play().catch(() => {});\n        }\n    }\n}\n\n/**\n * @param {HTMLElement | null} contentHost\n */\nexport function attachInlineMediaLightbox(contentHost) {\n    if (!contentHost || contentHost.dataset.ssMediaLightboxBound === '1') return;\n    contentHost.dataset.ssMediaLightboxBound = '1';\n    contentHost.addEventListener('click', (e) => {\n        const t = e.target;\n        if (!(t instanceof Element)) return;\n        const btn = t.closest('.v3-inline-media-thumb-btn');\n        if (!btn || !contentHost.contains(btn)) return;\n        e.preventDefault();\n        e.stopPropagation();\n        openLightbox(/** @type {HTMLButtonElement} */ (btn));\n    });\n}\n", "/** PCB-21: the flat page's lightbox and quote links. Pure enhancement \u2014 the page works without it. */\nimport { openGalleryLightbox } from './v3/inline-media-lightbox.js';\n\n/**\n * The slides of the gallery a picture belongs to, and where that picture sits in them.\n * @param {Element} anchor an `a.flat-media`\n * @returns {{ slides: object[], index: number } | null}\n */\nexport function gallerySlidesFor(anchor) {\n    const gallery = anchor.closest('[data-flat-gallery]');\n    if (!gallery) return null;\n    let slides;\n    try {\n        slides = JSON.parse(gallery.getAttribute('data-flat-gallery') || '[]');\n    } catch (_) {\n        return null;\n    }\n    if (!Array.isArray(slides) || !slides.length) return null;\n    const index = Number(anchor.getAttribute('data-flat-slide'));\n    return { slides, index: Number.isFinite(index) ? index : 0 };\n}\n\n/** Delegate picture-link clicks to the lightbox; a modified click is left alone. */\nexport function attachFlatLightbox(root) {\n    root.addEventListener('click', (e) => {\n        if (e.defaultPrevented || e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;\n        const t = e.target;\n        if (!(t instanceof Element)) return;\n        const anchor = t.closest('a.flat-media');\n        if (!anchor) return;\n        const found = gallerySlidesFor(anchor);\n        if (!found) return;\n        e.preventDefault();\n        openGalleryLightbox(found.slides, found.index);\n    });\n}\n\n\n/* ---- quote with a link (PCB-24) ---- */\n\n/** Longest run of words put in a text fragment whole; past this it becomes start,end. */\nconst QUOTE_WORDS_WHOLE = 12;\n/** Words taken from each end when the selection is too long to carry entire. */\nconst QUOTE_WORDS_EDGE = 5;\n\n/** Percent-encode one side of a `#:~:text=` fragment; `-` and `,` are directive syntax too. */\nexport function encodeTextDirective(text) {\n    return encodeURIComponent(text).replace(/-/g, '%2D').replace(/,/g, '%2C');\n}\n\n/** The `text=` payload for a selection: whole when short, else the spec's `start,end` form. */\nexport function textDirectiveFor(raw) {\n    const words = String(raw || '').replace(/\\s+/g, ' ').trim().split(' ').filter(Boolean);\n    if (!words.length) return '';\n    if (words.length <= QUOTE_WORDS_WHOLE) return encodeTextDirective(words.join(' '));\n    const start = words.slice(0, QUOTE_WORDS_EDGE).join(' ');\n    const end = words.slice(-QUOTE_WORDS_EDGE).join(' ');\n    return `${encodeTextDirective(start)},${encodeTextDirective(end)}`;\n}\n\n/**\n * The link for a passage. The chapter anchor is the fallback once a re-pace moves `?g=`.\n * @param {{pathname: string, origin: string}} location\n * @param {string} at the block's `data-at`\n * @param {string} chapterId the id of the nearest heading above it, or ''\n * @param {string} text the selected text\n */\nexport function quoteLink(location, at, chapterId, text) {\n    const directive = textDirectiveFor(text);\n    const query = at ? `?g=${encodeURIComponent(at)}` : '';\n    const anchor = chapterId ? `#${chapterId}` : '#';\n    const fragment = directive ? `${anchor}:~:text=${directive}` : (chapterId ? anchor : '');\n    return `${location.origin}${location.pathname}${query}${fragment}`;\n}\n\n/** The id of the chapter heading a block sits under, or '' when it sits under none. */\nexport function chapterIdFor(block) {\n    for (let el = block.previousElementSibling; el; el = el.previousElementSibling) {\n        if (el.classList && el.classList.contains('flat__chapter') && el.id) return el.id;\n    }\n    return '';\n}\n\n/** The `.flat__text` a selection lies wholly inside, or null \u2014 two blocks have no one place. */\nexport function selectedBlock(selection) {\n    if (!selection || selection.isCollapsed || !selection.rangeCount) return null;\n    if (!String(selection).trim()) return null;\n    const range = selection.getRangeAt(0);\n    const closest = (node) => {\n        const el = node && node.nodeType === 1 ? node : node && node.parentElement;\n        return el ? el.closest('.flat__text') : null;\n    };\n    const start = closest(range.startContainer);\n    return start && start === closest(range.endContainer) ? start : null;\n}\n\nconst COPY_LABEL = 'Copy link to this passage';\n\n/** Put it under the selection; a range that reports no rectangle leaves it where CSS put it. */\nfunction position(link, block, selection) {\n    const range = selection.getRangeAt(0);\n    if (typeof range.getBoundingClientRect !== 'function') return;\n    const rect = range.getBoundingClientRect();\n    const host = block.getBoundingClientRect();\n    if (!rect.width && !rect.height) return;\n    link.style.left = `${Math.max(0, rect.left - host.left)}px`;\n    link.style.top = `${rect.bottom - host.top + 8}px`;\n}\n\n/**\n * Mount the quote affordance; nothing appears until a reader selects something.\n * @param {Document} root\n * @param {{location?: object, clipboard?: object}} [opts] seams for the tests\n */\nexport function attachQuoteLink(root, opts = {}) {\n    const loc = opts.location || (root.defaultView && root.defaultView.location) || {origin: '', pathname: ''};\n    const view = root.defaultView;\n    let link = null;\n\n    const hide = () => { if (link) { link.remove(); link = null; } };\n\n    const show = (block, selection) => {\n        const at = block.getAttribute('data-at') || '';\n        const href = quoteLink(loc, at, chapterIdFor(block), String(selection));\n        if (!link) {\n            link = root.createElement('a');\n            link.className = 'flat-quote';\n            link.addEventListener('click', (e) => {\n                if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey || e.button !== 0) return;\n                e.preventDefault();\n                const clipboard = opts.clipboard || (view && view.navigator && view.navigator.clipboard);\n                if (!clipboard || !clipboard.writeText) return;   // the anchor is the fallback\n                Promise.resolve(clipboard.writeText(link.href)).then(\n                    () => { link.textContent = 'Link copied'; },\n                    () => { /* the anchor is still there to be copied by hand */ },\n                );\n            });\n        }\n        link.href = href;\n        link.textContent = COPY_LABEL;\n        /* Last child of its block, so Tab from the passage reaches it. */\n        if (link.parentElement !== block) block.appendChild(link);\n        position(link, block, selection);\n    };\n\n    const sync = () => {\n        const selection = root.getSelection && root.getSelection();\n        if (link && selection && link.contains(selection.anchorNode)) return;\n        const block = selectedBlock(selection);\n        if (block) show(block, selection);\n        else hide();\n    };\n\n    root.addEventListener('selectionchange', sync);\n    root.addEventListener('keydown', (e) => { if (e.key === 'Escape') hide(); });\n    return {sync, hide};\n}\n\nif (typeof document !== 'undefined') {\n    attachFlatLightbox(document);\n    attachQuoteLink(document);\n}\n"],
  "mappings": "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",
  "names": ["activeOverlay", "prevFocus", "closeLightbox", "keyHandler", "v", "fillStageWithSlide", "stage", "s", "img", "openGalleryLightbox", "slides", "startIndex", "overlay", "backdrop", "closeBtn", "prevBtn", "nextBtn", "counter", "index", "multi", "renderSlide", "onClose", "step", "delta", "prevV", "e", "onKey", "gallerySlidesFor", "anchor", "gallery", "slides", "index", "attachFlatLightbox", "root", "e", "t", "found", "openGalleryLightbox", "QUOTE_WORDS_WHOLE", "QUOTE_WORDS_EDGE", "encodeTextDirective", "text", "textDirectiveFor", "raw", "words", "start", "end", "quoteLink", "location", "at", "chapterId", "directive", "query", "fragment", "chapterIdFor", "block", "el", "selectedBlock", "selection", "range", "closest", "node", "COPY_LABEL", "position", "link", "rect", "host", "attachQuoteLink", "opts", "loc", "view", "hide", "show", "href", "clipboard", "sync"]
}
