@loupekit/sdk 0.3.4 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/styles.ts","../src/fingerprint.ts","../../../node_modules/modern-screenshot/dist/index.mjs","../src/capture.ts","../src/store.ts","../src/http-adapter.ts","../src/app.ts","../src/index.ts"],"sourcesContent":["// Scoped to the Shadow DOM — none of this leaks to (or is affected by) the host page.\nexport const STYLES = /* css */ `\n:host { all: initial; }\n* { box-sizing: border-box; font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif; }\n\n/* Custom properties must live on :host — inside the Shadow DOM, :root matches\n nothing and no element carries a .loupe class, so they'd never resolve. */\n:host {\n --accent: #4a55d6;\n --pin: #ff5842;\n --ink: #16181f;\n --panel: #ffffff;\n --panel-2: #f4f5f9;\n --line: #e2e5ee;\n --muted: #6b7180;\n}\n\n.overlay {\n position: fixed; inset: 0; z-index: 2147483000; pointer-events: none;\n}\n\n/* inspector highlight */\n.hl {\n position: fixed; pointer-events: none; z-index: 2147483001;\n border: 2px solid var(--accent);\n background: rgba(74, 85, 214, 0.10);\n border-radius: 4px; display: none;\n transition: all 60ms linear;\n}\n.hl .tip {\n position: absolute; top: -24px; left: 0; background: var(--accent); color: #fff;\n font-size: 11px; font-weight: 600; padding: 2px 7px; border-radius: 4px; white-space: nowrap;\n font-family: ui-monospace, Menlo, monospace;\n}\n\n/* region selection (during drag) + active-comment outline */\n.selbox {\n position: fixed; pointer-events: none; z-index: 2147483001; display: none;\n border: 2px dashed var(--accent); background: rgba(74, 85, 214, 0.12); border-radius: 4px;\n}\n.region-box {\n position: fixed; pointer-events: none; z-index: 2147483001; display: none;\n border: 2px solid var(--pin); border-radius: 4px;\n box-shadow: 0 0 0 2px rgba(255, 88, 66, .25), 0 4px 16px rgba(0,0,0,.25);\n}\n\n/* pins */\n.pin {\n position: fixed; pointer-events: auto; z-index: 2147483002;\n width: 26px; height: 26px; border-radius: 50% 50% 50% 2px;\n background: var(--pin); color: #fff; border: 2px solid #fff;\n font-size: 12px; font-weight: 700; cursor: pointer;\n box-shadow: 0 2px 8px rgba(0,0,0,.35);\n display: grid; place-items: center; transform: translate(-4px, -4px);\n transition: transform 80ms ease;\n}\n.pin:hover { transform: translate(-4px, -4px) scale(1.12); }\n.pin.detached { background: #9aa0af; }\n.pin.done { background: #10935a; }\n.pin.active { outline: 3px solid rgba(74,85,214,.4); }\n\n/* toolbar */\n.toolbar {\n position: fixed; bottom: 20px; left: 50%; transform: translateX(-50%);\n z-index: 2147483003; pointer-events: auto;\n display: flex; align-items: center; gap: 4px;\n background: #1b1e27; color: #fff; padding: 6px; border-radius: 12px;\n box-shadow: 0 8px 30px rgba(0,0,0,.4); border: 1px solid #2b2f3b;\n}\n.toolbar button {\n background: transparent; color: #cfd3de; border: 0; cursor: pointer;\n font-size: 13px; font-weight: 500; padding: 8px 12px; border-radius: 8px;\n display: flex; align-items: center; gap: 6px;\n}\n.toolbar button:hover { background: #2b2f3b; color: #fff; }\n.toolbar button .ico { flex: none; display: block; }\n.toolbar button.on { background: var(--accent); color: #fff; }\n.toolbar .sep { width: 1px; height: 20px; background: #333846; margin: 0 2px; }\n.toolbar .brand {\n font-weight: 700; padding: 8px; border-radius: 8px; letter-spacing: -.01em;\n cursor: pointer; user-select: none;\n}\n.toolbar .brand:hover { background: #2b2f3b; }\n/* collapsed → show only the brand/logo; click it again to expand */\n.toolbar.collapsed { gap: 0; }\n.toolbar.collapsed > *:not(.brand) { display: none; }\n.toolbar .count {\n background: var(--pin); color: #fff; font-size: 11px; font-weight: 700;\n border-radius: 999px; padding: 1px 7px; margin-left: 2px;\n}\n\n/* composer popover */\n.composer {\n position: fixed; z-index: 2147483004; pointer-events: auto; width: 300px;\n background: var(--panel); color: var(--ink); border: 1px solid var(--line);\n border-radius: 12px; box-shadow: 0 12px 40px rgba(0,0,0,.22); padding: 12px; display: none;\n}\n.composer .target {\n font-family: ui-monospace, Menlo, monospace; font-size: 11px; color: var(--accent);\n background: var(--panel-2); border-radius: 6px; padding: 5px 8px; margin-bottom: 8px;\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n}\n.composer textarea {\n width: 100%; min-height: 68px; resize: vertical; border: 1px solid var(--line);\n border-radius: 8px; padding: 8px; font-size: 13px; color: var(--ink); outline: none;\n}\n.composer textarea:focus { border-color: var(--accent); }\n.composer .row { display: flex; align-items: center; justify-content: space-between; margin-top: 8px; gap: 8px; }\n.composer label.chk { font-size: 12px; color: var(--muted); display: flex; align-items: center; gap: 6px; cursor: pointer; }\n.composer .btns { display: flex; gap: 6px; }\n.composer button {\n border: 0; border-radius: 8px; font-size: 13px; font-weight: 600; padding: 7px 12px; cursor: pointer;\n}\n.composer .primary { background: var(--accent); color: #fff; }\n.composer .primary:disabled { opacity: .5; cursor: default; }\n.composer .ghost { background: var(--panel-2); color: var(--ink); }\n\n/* panel (comment list) */\n.panel {\n position: fixed; right: 16px; bottom: 80px; top: 16px; width: 340px;\n z-index: 2147483003; pointer-events: auto; display: none; flex-direction: column;\n background: var(--panel); color: var(--ink); border: 1px solid var(--line);\n border-radius: 14px; box-shadow: 0 12px 40px rgba(0,0,0,.22); overflow: hidden;\n}\n.panel.open { display: flex; }\n.panel .phead { padding: 14px 16px; border-bottom: 1px solid var(--line); font-weight: 700; display:flex; justify-content:space-between; align-items:center; }\n.panel .phead .x { cursor:pointer; color: var(--muted); background:none; border:0; font-size:18px; }\n.panel .list { overflow-y: auto; padding: 8px; display: flex; flex-direction: column; gap: 8px; }\n.panel .empty { color: var(--muted); font-size: 13px; padding: 24px 12px; text-align: center; }\n.item {\n border: 1px solid var(--line); border-radius: 10px; padding: 10px; cursor: pointer; background: var(--panel);\n}\n.item:hover { border-color: var(--accent); }\n.item .top { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; }\n.item .num { background: var(--pin); color:#fff; width:20px; height:20px; border-radius:50%; font-size:11px; font-weight:700; display:grid; place-items:center; }\n.item .num.detached { background:#9aa0af; }\n.item .num.done { background:#10935a; }\n.item .who { font-size: 12px; font-weight: 600; }\n.item .body { font-size: 13px; line-height: 1.4; }\n.item .meta { font-size: 11px; color: var(--muted); margin-top: 6px; font-family: ui-monospace, Menlo, monospace; }\n.item .badge { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; padding: 1px 6px; border-radius: 5px; margin-left: auto; }\n.badge.detached { background: #eceef2; color: #6b7180; }\n.badge.done { background: #d8f0e4; color: #10935a; }\n.item .actions { display: flex; gap: 6px; margin-top: 8px; }\n.item .actions button { font-size: 11px; border: 1px solid var(--line); background: var(--panel-2); border-radius: 6px; padding: 4px 8px; cursor: pointer; color: var(--ink); }\n.item img.shot { width: 100%; border-radius: 6px; margin-top: 8px; border: 1px solid var(--line); }\n`;\n","import type { Anchor, ResolveResult } from \"./types.js\";\n\n// ---- config ----------------------------------------------------------------\n\nconst TEXT_MAX = 120;\nconst ATTR_KEYS = [\"role\", \"aria-label\", \"name\", \"type\", \"alt\", \"href\", \"placeholder\", \"title\"];\n/** Minimum composite score to accept a scan match. Below this we treat the element as gone. */\nconst ACCEPT_THRESHOLD = 0.5;\n/** Weights for the composite similarity score (sum need not be 1; we normalize). */\nconst W = { tag: 0.12, text: 0.34, attrs: 0.22, testid: 0.22, cssPath: 0.2, position: 0.1 };\n\n// ---- capture ----------------------------------------------------------------\n\nexport function captureAnchor(el: Element): Anchor {\n const rect = el.getBoundingClientRect();\n return {\n tag: el.tagName.toLowerCase(),\n cssPath: cssPath(el),\n xpath: xPath(el),\n testid: stableId(el),\n text: normText(el.textContent),\n attrs: readAttrs(el),\n nthOfType: nthOfType(el),\n rect: {\n x: Math.round(rect.left + window.scrollX),\n y: Math.round(rect.top + window.scrollY),\n w: Math.round(rect.width),\n h: Math.round(rect.height),\n },\n viewport: { w: window.innerWidth, h: window.innerHeight },\n };\n}\n\n// ---- resolve ----------------------------------------------------------------\n\n/**\n * Try to re-locate the element described by `anchor` on the current page.\n * Returns the best candidate above threshold, or null (→ caller falls back to\n * a coordinate pin on the screenshot). Never returns an element inside our own UI.\n */\nexport function resolveAnchor(anchor: Anchor, root: ParentNode = document): ResolveResult | null {\n // 1. Stable id / testid — the strongest signal. Accept immediately if unique.\n if (anchor.testid) {\n const byTestid = safeQueryAll(root, `[data-testid=\"${cssStr(anchor.testid)}\"], [data-test=\"${cssStr(anchor.testid)}\"]`);\n const byId = document.getElementById(anchor.testid);\n const hits = dedupe([...byTestid, ...(byId ? [byId] : [])]).filter(usable);\n if (hits.length === 1) return { element: hits[0]!, score: 0.98, via: \"testid\" };\n // Multiple matches → fall through to scoring to disambiguate.\n }\n\n // 1.5. A cssPath rooted at a stable id/testid + structural position is\n // high-confidence even when the element's own text/content has changed\n // (e.g. a value that updates on redeploy). Require the tag to still match.\n if (/^(\\[data-testid=|#)/.test(anchor.cssPath)) {\n const hits = safeQueryAll(root, anchor.cssPath).filter(usable);\n if (hits.length === 1 && hits[0]!.tagName.toLowerCase() === anchor.tag) {\n return { element: hits[0]!, score: 0.9, via: \"cssPath\" };\n }\n }\n\n const candidates = new Map<Element, ResolveResult[\"via\"]>();\n const consider = (el: Element | null, via: ResolveResult[\"via\"]) => {\n if (el && usable(el) && !candidates.has(el)) candidates.set(el, via);\n };\n\n // 2. Exact locators.\n consider(safeQuery(root, anchor.cssPath), \"cssPath\");\n consider(byXPath(anchor.xpath), \"xpath\");\n for (const el of safeQueryAll(root, anchor.tag)) consider(el, \"scan\");\n\n // 3. Broaden by text when the tag scan is too narrow (e.g. wrapper changed tag).\n if (anchor.text) {\n for (const el of safeQueryAll(root, \"*\")) {\n if (candidates.size > 4000) break; // safety cap on huge pages\n if (normText(el.textContent) === anchor.text) consider(el, \"scan\");\n }\n }\n\n let best: ResolveResult | null = null;\n for (const [el, via] of candidates) {\n const score = similarity(anchor, el, via);\n if (!best || score > best.score) best = { element: el, score, via };\n }\n return best && best.score >= ACCEPT_THRESHOLD ? best : null;\n}\n\nfunction similarity(a: Anchor, el: Element, via: ResolveResult[\"via\"]): number {\n let sum = 0;\n let total = 0;\n\n const add = (w: number, v: number) => { sum += w * v; total += w; };\n\n add(W.tag, el.tagName.toLowerCase() === a.tag ? 1 : 0);\n\n if (a.text) {\n const t = normText(el.textContent);\n add(W.text, t === a.text ? 1 : t && (t.includes(a.text) || a.text.includes(t)) ? 0.5 : 0);\n }\n\n const attrKeys = Object.keys(a.attrs);\n if (attrKeys.length) {\n let matched = 0;\n for (const k of attrKeys) if (el.getAttribute(k) === a.attrs[k]) matched++;\n add(W.attrs, matched / attrKeys.length);\n }\n\n if (a.testid) add(W.testid, stableId(el) === a.testid ? 1 : 0);\n\n add(W.cssPath, via === \"cssPath\" ? 1 : 0);\n\n // Positional proximity — normalized by the (possibly changed) viewport diagonal.\n const r = el.getBoundingClientRect();\n const cx = r.left + window.scrollX + r.width / 2;\n const cy = r.top + window.scrollY + r.height / 2;\n const ax = a.rect.x + a.rect.w / 2;\n const ay = a.rect.y + a.rect.h / 2;\n const diag = Math.hypot(a.viewport.w, a.viewport.h) || 1;\n const dist = Math.hypot(cx - ax, cy - ay);\n add(W.position, Math.max(0, 1 - dist / diag));\n\n return total ? sum / total : 0;\n}\n\n// ---- locator builders -------------------------------------------------------\n\nfunction cssPath(el: Element): string {\n const segs: string[] = [];\n let node: Element | null = el;\n while (node && node.nodeType === 1 && node !== document.documentElement) {\n const id = node.getAttribute(\"id\");\n const testid = node.getAttribute(\"data-testid\") || node.getAttribute(\"data-test\");\n if (id && isStable(id)) { segs.unshift(`#${cssEsc(id)}`); break; }\n if (testid) { segs.unshift(`[data-testid=\"${cssStr(testid)}\"]`); break; }\n segs.unshift(`${node.tagName.toLowerCase()}:nth-of-type(${nthOfType(node)})`);\n node = node.parentElement;\n if (node === document.body) { segs.unshift(\"body\"); break; }\n }\n return segs.join(\" > \");\n}\n\nfunction xPath(el: Element): string {\n const segs: string[] = [];\n let node: Element | null = el;\n while (node && node.nodeType === 1 && node !== document.documentElement) {\n segs.unshift(`${node.tagName.toLowerCase()}[${nthOfType(node)}]`);\n node = node.parentElement;\n }\n return \"/html/\" + segs.join(\"/\");\n}\n\n// ---- small helpers ----------------------------------------------------------\n\nfunction nthOfType(el: Element): number {\n let i = 1;\n let sib = el.previousElementSibling;\n while (sib) {\n if (sib.tagName === el.tagName) i++;\n sib = sib.previousElementSibling;\n }\n return i;\n}\n\nfunction stableId(el: Element): string | null {\n const testid = el.getAttribute(\"data-testid\") || el.getAttribute(\"data-test\");\n if (testid) return testid;\n const id = el.getAttribute(\"id\");\n return id && isStable(id) ? id : null;\n}\n\n/** Reject framework-generated ids (e.g. \":r3:\", \"ember42\", long hashes). */\nfunction isStable(id: string): boolean {\n if (id.length > 40) return false;\n if (/^(ember|react|radix|headlessui|:r)/i.test(id)) return false;\n if (/[:]/.test(id)) return false;\n return true;\n}\n\nfunction readAttrs(el: Element): Record<string, string> {\n const out: Record<string, string> = {};\n for (const k of ATTR_KEYS) {\n const v = el.getAttribute(k);\n if (v != null && v !== \"\") out[k] = v.length > 200 ? v.slice(0, 200) : v;\n }\n return out;\n}\n\nfunction normText(t: string | null): string {\n return (t || \"\").replace(/\\s+/g, \" \").trim().slice(0, TEXT_MAX);\n}\n\n/** Exclude anything inside our own Shadow-DOM host and non-visible nodes. */\nfunction usable(el: Element): boolean {\n if (el.id === \"loupe-root\" || el.closest(\"#loupe-root\")) return false;\n if (el === document.body || el === document.documentElement) return false;\n return true;\n}\n\nfunction byXPath(xp: string): Element | null {\n try {\n const r = document.evaluate(xp, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);\n return r.singleNodeValue instanceof Element ? r.singleNodeValue : null;\n } catch {\n return null;\n }\n}\n\nfunction safeQuery(root: ParentNode, sel: string): Element | null {\n try { return sel ? root.querySelector(sel) : null; } catch { return null; }\n}\nfunction safeQueryAll(root: ParentNode, sel: string): Element[] {\n try { return sel ? Array.from(root.querySelectorAll(sel)) : []; } catch { return []; }\n}\nfunction dedupe(els: Element[]): Element[] {\n return Array.from(new Set(els));\n}\nfunction cssEsc(s: string): string {\n return (window.CSS && CSS.escape) ? CSS.escape(s) : s.replace(/[\"\\\\]/g, \"\\\\$&\");\n}\n/** Escape a value for use inside a double-quoted attribute selector. */\nfunction cssStr(s: string): string {\n return s.replace(/[\"\\\\]/g, \"\\\\$&\");\n}\n","function changeJpegDpi(uint8Array, dpi) {\n uint8Array[13] = 1;\n uint8Array[14] = dpi >> 8;\n uint8Array[15] = dpi & 255;\n uint8Array[16] = dpi >> 8;\n uint8Array[17] = dpi & 255;\n return uint8Array;\n}\n\nconst _P = \"p\".charCodeAt(0);\nconst _H = \"H\".charCodeAt(0);\nconst _Y = \"Y\".charCodeAt(0);\nconst _S = \"s\".charCodeAt(0);\nlet pngDataTable;\nfunction createPngDataTable() {\n const crcTable = new Int32Array(256);\n for (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) {\n c = c & 1 ? 3988292384 ^ c >>> 1 : c >>> 1;\n }\n crcTable[n] = c;\n }\n return crcTable;\n}\nfunction calcCrc(uint8Array) {\n let c = -1;\n if (!pngDataTable)\n pngDataTable = createPngDataTable();\n for (let n = 0; n < uint8Array.length; n++) {\n c = pngDataTable[(c ^ uint8Array[n]) & 255] ^ c >>> 8;\n }\n return c ^ -1;\n}\nfunction searchStartOfPhys(uint8Array) {\n const length = uint8Array.length - 1;\n for (let i = length; i >= 4; i--) {\n if (uint8Array[i - 4] === 9 && uint8Array[i - 3] === _P && uint8Array[i - 2] === _H && uint8Array[i - 1] === _Y && uint8Array[i] === _S) {\n return i - 3;\n }\n }\n return 0;\n}\nfunction changePngDpi(uint8Array, dpi, overwritepHYs = false) {\n const physChunk = new Uint8Array(13);\n dpi *= 39.3701;\n physChunk[0] = _P;\n physChunk[1] = _H;\n physChunk[2] = _Y;\n physChunk[3] = _S;\n physChunk[4] = dpi >>> 24;\n physChunk[5] = dpi >>> 16;\n physChunk[6] = dpi >>> 8;\n physChunk[7] = dpi & 255;\n physChunk[8] = physChunk[4];\n physChunk[9] = physChunk[5];\n physChunk[10] = physChunk[6];\n physChunk[11] = physChunk[7];\n physChunk[12] = 1;\n const crc = calcCrc(physChunk);\n const crcChunk = new Uint8Array(4);\n crcChunk[0] = crc >>> 24;\n crcChunk[1] = crc >>> 16;\n crcChunk[2] = crc >>> 8;\n crcChunk[3] = crc & 255;\n if (overwritepHYs) {\n const startingIndex = searchStartOfPhys(uint8Array);\n uint8Array.set(physChunk, startingIndex);\n uint8Array.set(crcChunk, startingIndex + 13);\n return uint8Array;\n } else {\n const chunkLength = new Uint8Array(4);\n chunkLength[0] = 0;\n chunkLength[1] = 0;\n chunkLength[2] = 0;\n chunkLength[3] = 9;\n const finalHeader = new Uint8Array(54);\n finalHeader.set(uint8Array, 0);\n finalHeader.set(chunkLength, 33);\n finalHeader.set(physChunk, 37);\n finalHeader.set(crcChunk, 50);\n return finalHeader;\n }\n}\nconst b64PhysSignature1 = \"AAlwSFlz\";\nconst b64PhysSignature2 = \"AAAJcEhZ\";\nconst b64PhysSignature3 = \"AAAACXBI\";\nfunction detectPhysChunkFromDataUrl(dataUrl) {\n let b64index = dataUrl.indexOf(b64PhysSignature1);\n if (b64index === -1) {\n b64index = dataUrl.indexOf(b64PhysSignature2);\n }\n if (b64index === -1) {\n b64index = dataUrl.indexOf(b64PhysSignature3);\n }\n return b64index;\n}\n\nconst PREFIX = \"[modern-screenshot]\";\nconst IN_BROWSER = typeof window !== \"undefined\";\nconst SUPPORT_WEB_WORKER = IN_BROWSER && \"Worker\" in window;\nconst SUPPORT_ATOB = IN_BROWSER && \"atob\" in window;\nconst SUPPORT_BTOA = IN_BROWSER && \"btoa\" in window;\nconst USER_AGENT = IN_BROWSER ? window.navigator?.userAgent : \"\";\nconst IN_CHROME = USER_AGENT.includes(\"Chrome\");\nconst IN_SAFARI = USER_AGENT.includes(\"AppleWebKit\") && !IN_CHROME;\nconst IN_FIREFOX = USER_AGENT.includes(\"Firefox\");\nconst isContext = (value) => value && \"__CONTEXT__\" in value;\nconst isCssFontFaceRule = (rule) => rule.constructor.name === \"CSSFontFaceRule\";\nconst isCSSImportRule = (rule) => rule.constructor.name === \"CSSImportRule\";\nconst isLayerBlockRule = (rule) => rule.constructor.name === \"CSSLayerBlockRule\";\nconst isElementNode = (node) => node.nodeType === 1;\nconst isSVGElementNode = (node) => typeof node.className === \"object\";\nconst isSVGImageElementNode = (node) => node.tagName === \"image\";\nconst isSVGUseElementNode = (node) => node.tagName === \"use\";\nconst isHTMLElementNode = (node) => isElementNode(node) && typeof node.style !== \"undefined\" && !isSVGElementNode(node);\nconst isCommentNode = (node) => node.nodeType === 8;\nconst isTextNode = (node) => node.nodeType === 3;\nconst isImageElement = (node) => node.tagName === \"IMG\";\nconst isVideoElement = (node) => node.tagName === \"VIDEO\";\nconst isCanvasElement = (node) => node.tagName === \"CANVAS\";\nconst isTextareaElement = (node) => node.tagName === \"TEXTAREA\";\nconst isInputElement = (node) => node.tagName === \"INPUT\";\nconst isStyleElement = (node) => node.tagName === \"STYLE\";\nconst isScriptElement = (node) => node.tagName === \"SCRIPT\";\nconst isSelectElement = (node) => node.tagName === \"SELECT\";\nconst isSlotElement = (node) => node.tagName === \"SLOT\";\nconst isIFrameElement = (node) => node.tagName === \"IFRAME\";\nconst consoleWarn = (...args) => console.warn(PREFIX, ...args);\nfunction supportWebp(ownerDocument) {\n const canvas = ownerDocument?.createElement?.(\"canvas\");\n if (canvas) {\n canvas.height = canvas.width = 1;\n }\n return Boolean(canvas) && \"toDataURL\" in canvas && Boolean(canvas.toDataURL(\"image/webp\").includes(\"image/webp\"));\n}\nconst isDataUrl = (url) => url.startsWith(\"data:\");\nfunction resolveUrl(url, baseUrl) {\n if (url.match(/^[a-z]+:\\/\\//i))\n return url;\n if (IN_BROWSER && url.match(/^\\/\\//))\n return window.location.protocol + url;\n if (url.match(/^[a-z]+:/i))\n return url;\n if (!IN_BROWSER)\n return url;\n const doc = getDocument().implementation.createHTMLDocument();\n const base = doc.createElement(\"base\");\n const a = doc.createElement(\"a\");\n doc.head.appendChild(base);\n doc.body.appendChild(a);\n if (baseUrl)\n base.href = baseUrl;\n a.href = url;\n return a.href;\n}\nfunction getDocument(target) {\n return (target && isElementNode(target) ? target?.ownerDocument : target) ?? window.document;\n}\nconst XMLNS = \"http://www.w3.org/2000/svg\";\nfunction createSvg(width, height, ownerDocument) {\n const svg = getDocument(ownerDocument).createElementNS(XMLNS, \"svg\");\n svg.setAttributeNS(null, \"width\", width.toString());\n svg.setAttributeNS(null, \"height\", height.toString());\n svg.setAttributeNS(null, \"viewBox\", `0 0 ${width} ${height}`);\n return svg;\n}\nfunction svgToDataUrl(svg, removeControlCharacter) {\n let xhtml = new XMLSerializer().serializeToString(svg);\n if (removeControlCharacter) {\n xhtml = xhtml.replace(/[\\u0000-\\u0008\\v\\f\\u000E-\\u001F\\uD800-\\uDFFF\\uFFFE\\uFFFF]/gu, \"\");\n }\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(xhtml)}`;\n}\nasync function canvasToBlob(canvas, type = \"image/png\", quality = 1) {\n try {\n return await new Promise((resolve, reject) => {\n canvas.toBlob((blob) => {\n if (blob) {\n resolve(blob);\n } else {\n reject(new Error(\"Blob is null\"));\n }\n }, type, quality);\n });\n } catch (error) {\n if (SUPPORT_ATOB) {\n return dataUrlToBlob(canvas.toDataURL(type, quality));\n }\n throw error;\n }\n}\nfunction dataUrlToBlob(dataUrl) {\n const [header, base64] = dataUrl.split(\",\");\n const type = header.match(/data:(.+);/)?.[1] ?? void 0;\n const decoded = window.atob(base64);\n const length = decoded.length;\n const buffer = new Uint8Array(length);\n for (let i = 0; i < length; i += 1) {\n buffer[i] = decoded.charCodeAt(i);\n }\n return new Blob([buffer], { type });\n}\nfunction readBlob(blob, type) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result);\n reader.onerror = () => reject(reader.error);\n reader.onabort = () => reject(new Error(`Failed read blob to ${type}`));\n if (type === \"dataUrl\") {\n reader.readAsDataURL(blob);\n } else if (type === \"arrayBuffer\") {\n reader.readAsArrayBuffer(blob);\n }\n });\n}\nconst blobToDataUrl = (blob) => readBlob(blob, \"dataUrl\");\nconst blobToArrayBuffer = (blob) => readBlob(blob, \"arrayBuffer\");\nfunction createImage(url, ownerDocument) {\n const img = getDocument(ownerDocument).createElement(\"img\");\n img.decoding = \"sync\";\n img.loading = \"eager\";\n img.src = url;\n return img;\n}\nfunction loadMedia(media, options) {\n return new Promise((resolve) => {\n const { timeout, ownerDocument, onError: userOnError, onWarn } = options ?? {};\n const node = typeof media === \"string\" ? createImage(media, getDocument(ownerDocument)) : media;\n let timer = null;\n let removeEventListeners = null;\n function onResolve() {\n resolve(node);\n timer && clearTimeout(timer);\n removeEventListeners?.();\n }\n if (timeout) {\n timer = setTimeout(onResolve, timeout);\n }\n if (isVideoElement(node)) {\n const currentSrc = node.currentSrc || node.src;\n if (!currentSrc) {\n if (node.poster) {\n return loadMedia(node.poster, options).then(resolve);\n }\n return onResolve();\n }\n if (node.readyState >= 2) {\n return onResolve();\n }\n const onLoadeddata = onResolve;\n const onError = (error) => {\n onWarn?.(\n \"Failed video load\",\n currentSrc,\n error\n );\n userOnError?.(error);\n onResolve();\n };\n removeEventListeners = () => {\n node.removeEventListener(\"loadeddata\", onLoadeddata);\n node.removeEventListener(\"error\", onError);\n };\n node.addEventListener(\"loadeddata\", onLoadeddata, { once: true });\n node.addEventListener(\"error\", onError, { once: true });\n } else {\n const currentSrc = isSVGImageElementNode(node) ? node.href.baseVal : node.currentSrc || node.src;\n if (!currentSrc) {\n return onResolve();\n }\n const onLoad = async () => {\n if (isImageElement(node) && \"decode\" in node) {\n try {\n await node.decode();\n } catch (error) {\n onWarn?.(\n \"Failed to decode image, trying to render anyway\",\n node.dataset.originalSrc || currentSrc,\n error\n );\n }\n }\n onResolve();\n };\n const onError = (error) => {\n onWarn?.(\n \"Failed image load\",\n node.dataset.originalSrc || currentSrc,\n error\n );\n onResolve();\n };\n if (isImageElement(node) && node.complete) {\n return onLoad();\n }\n removeEventListeners = () => {\n node.removeEventListener(\"load\", onLoad);\n node.removeEventListener(\"error\", onError);\n };\n node.addEventListener(\"load\", onLoad, { once: true });\n node.addEventListener(\"error\", onError, { once: true });\n }\n });\n}\nasync function waitUntilLoad(node, options) {\n if (isHTMLElementNode(node)) {\n if (isImageElement(node) || isVideoElement(node)) {\n await loadMedia(node, options);\n } else {\n await Promise.all(\n [\"img\", \"video\"].flatMap((selectors) => {\n return Array.from(node.querySelectorAll(selectors)).map((el) => loadMedia(el, options));\n })\n );\n }\n }\n}\nconst uuid = /* @__PURE__ */ function uuid2() {\n let counter = 0;\n const random = () => `0000${(Math.random() * 36 ** 4 << 0).toString(36)}`.slice(-4);\n return () => {\n counter += 1;\n return `u${random()}${counter}`;\n };\n}();\nfunction splitFontFamily(fontFamily) {\n return fontFamily?.split(\",\").map((val) => val.trim().replace(/\"|'/g, \"\").toLowerCase()).filter(Boolean);\n}\n\nlet uid = 0;\nfunction createLogger(debug) {\n const prefix = `${PREFIX}[#${uid}]`;\n uid++;\n return {\n // eslint-disable-next-line no-console\n time: (label) => debug && console.time(`${prefix} ${label}`),\n // eslint-disable-next-line no-console\n timeEnd: (label) => debug && console.timeEnd(`${prefix} ${label}`),\n warn: (...args) => debug && consoleWarn(...args)\n };\n}\n\nfunction getDefaultRequestInit(bypassingCache) {\n return {\n cache: bypassingCache ? \"no-cache\" : \"force-cache\"\n };\n}\n\nasync function orCreateContext(node, options) {\n return isContext(node) ? node : createContext(node, { ...options, autoDestruct: true });\n}\nasync function createContext(node, options) {\n const { scale = 1, workerUrl, workerNumber = 1 } = options || {};\n const debug = Boolean(options?.debug);\n const features = options?.features ?? true;\n const ownerDocument = node.ownerDocument ?? (IN_BROWSER ? window.document : void 0);\n const ownerWindow = node.ownerDocument?.defaultView ?? (IN_BROWSER ? window : void 0);\n const requests = /* @__PURE__ */ new Map();\n const context = {\n // Options\n width: 0,\n height: 0,\n quality: 1,\n type: \"image/png\",\n scale,\n backgroundColor: null,\n style: null,\n filter: null,\n maximumCanvasSize: 0,\n timeout: 3e4,\n progress: null,\n debug,\n fetch: {\n requestInit: getDefaultRequestInit(options?.fetch?.bypassingCache),\n placeholderImage: \"data:image/png;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\",\n bypassingCache: false,\n ...options?.fetch\n },\n fetchFn: null,\n font: {},\n drawImageInterval: 100,\n workerUrl: null,\n workerNumber,\n onCloneEachNode: null,\n onCloneNode: null,\n onEmbedNode: null,\n onCreateForeignObjectSvg: null,\n includeStyleProperties: null,\n autoDestruct: false,\n ...options,\n // InternalContext\n __CONTEXT__: true,\n log: createLogger(debug),\n node,\n ownerDocument,\n ownerWindow,\n dpi: scale === 1 ? null : 96 * scale,\n svgStyleElement: createStyleElement(ownerDocument),\n svgDefsElement: ownerDocument?.createElementNS(XMLNS, \"defs\"),\n svgStyles: /* @__PURE__ */ new Map(),\n defaultComputedStyles: /* @__PURE__ */ new Map(),\n workers: [\n ...Array.from({\n length: SUPPORT_WEB_WORKER && workerUrl && workerNumber ? workerNumber : 0\n })\n ].map(() => {\n try {\n const worker = new Worker(workerUrl);\n worker.onmessage = async (event) => {\n const { url, result } = event.data;\n if (result) {\n requests.get(url)?.resolve?.(result);\n } else {\n requests.get(url)?.reject?.(new Error(`Error receiving message from worker: ${url}`));\n }\n };\n worker.onmessageerror = (event) => {\n const { url } = event.data;\n requests.get(url)?.reject?.(new Error(`Error receiving message from worker: ${url}`));\n };\n return worker;\n } catch (error) {\n context.log.warn(\"Failed to new Worker\", error);\n return null;\n }\n }).filter(Boolean),\n fontFamilies: /* @__PURE__ */ new Map(),\n fontCssTexts: /* @__PURE__ */ new Map(),\n acceptOfImage: `${[\n supportWebp(ownerDocument) && \"image/webp\",\n \"image/svg+xml\",\n \"image/*\",\n \"*/*\"\n ].filter(Boolean).join(\",\")};q=0.8`,\n requests,\n drawImageCount: 0,\n tasks: [],\n features,\n isEnable: (key) => {\n if (key === \"restoreScrollPosition\") {\n return typeof features === \"boolean\" ? false : features[key] ?? false;\n }\n if (typeof features === \"boolean\") {\n return features;\n }\n return features[key] ?? true;\n },\n shadowRoots: []\n };\n context.log.time(\"wait until load\");\n await waitUntilLoad(node, { timeout: context.timeout, onWarn: context.log.warn });\n context.log.timeEnd(\"wait until load\");\n const { width, height } = resolveBoundingBox(node, context);\n context.width = width;\n context.height = height;\n return context;\n}\nfunction createStyleElement(ownerDocument) {\n if (!ownerDocument)\n return void 0;\n const style = ownerDocument.createElement(\"style\");\n const cssText = style.ownerDocument.createTextNode(`\n.______background-clip--text {\n background-clip: text;\n -webkit-background-clip: text;\n}\n`);\n style.appendChild(cssText);\n return style;\n}\nfunction resolveBoundingBox(node, context) {\n let { width, height } = context;\n if (isElementNode(node) && (!width || !height)) {\n const box = node.getBoundingClientRect();\n width = width || box.width || Number(node.getAttribute(\"width\")) || 0;\n height = height || box.height || Number(node.getAttribute(\"height\")) || 0;\n }\n return { width, height };\n}\n\nasync function imageToCanvas(image, context) {\n const {\n log,\n timeout,\n drawImageCount,\n drawImageInterval\n } = context;\n log.time(\"image to canvas\");\n const loaded = await loadMedia(image, { timeout, onWarn: context.log.warn });\n const { canvas, context2d } = createCanvas(image.ownerDocument, context);\n const drawImage = () => {\n try {\n context2d?.drawImage(loaded, 0, 0, canvas.width, canvas.height);\n } catch (error) {\n context.log.warn(\"Failed to drawImage\", error);\n }\n };\n drawImage();\n if (context.isEnable(\"fixSvgXmlDecode\")) {\n for (let i = 0; i < drawImageCount; i++) {\n await new Promise((resolve) => {\n setTimeout(() => {\n context2d?.clearRect(0, 0, canvas.width, canvas.height);\n drawImage();\n resolve();\n }, i + drawImageInterval);\n });\n }\n }\n context.drawImageCount = 0;\n log.timeEnd(\"image to canvas\");\n return canvas;\n}\nfunction createCanvas(ownerDocument, context) {\n const { width, height, scale, backgroundColor, maximumCanvasSize: max } = context;\n const canvas = ownerDocument.createElement(\"canvas\");\n canvas.width = Math.floor(width * scale);\n canvas.height = Math.floor(height * scale);\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n if (max) {\n if (canvas.width > max || canvas.height > max) {\n if (canvas.width > max && canvas.height > max) {\n if (canvas.width > canvas.height) {\n canvas.height *= max / canvas.width;\n canvas.width = max;\n } else {\n canvas.width *= max / canvas.height;\n canvas.height = max;\n }\n } else if (canvas.width > max) {\n canvas.height *= max / canvas.width;\n canvas.width = max;\n } else {\n canvas.width *= max / canvas.height;\n canvas.height = max;\n }\n }\n }\n const context2d = canvas.getContext(\"2d\");\n if (context2d && backgroundColor) {\n context2d.fillStyle = backgroundColor;\n context2d.fillRect(0, 0, canvas.width, canvas.height);\n }\n return { canvas, context2d };\n}\n\nfunction cloneCanvas(canvas, context) {\n if (canvas.ownerDocument) {\n try {\n const dataURL = canvas.toDataURL();\n if (dataURL !== \"data:,\") {\n return createImage(dataURL, canvas.ownerDocument);\n }\n } catch (error) {\n context.log.warn(\"Failed to clone canvas\", error);\n }\n }\n const cloned = canvas.cloneNode(false);\n const ctx = canvas.getContext(\"2d\");\n const clonedCtx = cloned.getContext(\"2d\");\n try {\n if (ctx && clonedCtx) {\n clonedCtx.putImageData(\n ctx.getImageData(0, 0, canvas.width, canvas.height),\n 0,\n 0\n );\n }\n return cloned;\n } catch (error) {\n context.log.warn(\"Failed to clone canvas\", error);\n }\n return cloned;\n}\n\nfunction cloneIframe(iframe, context) {\n try {\n if (iframe?.contentDocument?.documentElement) {\n return cloneNode(iframe.contentDocument.documentElement, context);\n }\n } catch (error) {\n context.log.warn(\"Failed to clone iframe\", error);\n }\n return iframe.cloneNode(false);\n}\n\nfunction cloneImage(image) {\n const cloned = image.cloneNode(false);\n if (image.currentSrc && image.currentSrc !== image.src) {\n cloned.src = image.currentSrc;\n cloned.srcset = \"\";\n }\n if (cloned.loading === \"lazy\") {\n cloned.loading = \"eager\";\n }\n return cloned;\n}\n\nasync function cloneVideo(video, context) {\n if (video.ownerDocument && !video.currentSrc && video.poster) {\n return createImage(video.poster, video.ownerDocument);\n }\n const cloned = video.cloneNode(false);\n cloned.crossOrigin = \"anonymous\";\n if (video.currentSrc && video.currentSrc !== video.src) {\n cloned.src = video.currentSrc;\n }\n const ownerDocument = cloned.ownerDocument;\n if (ownerDocument) {\n let canPlay = true;\n await loadMedia(cloned, { onError: () => canPlay = false, onWarn: context.log.warn });\n if (!canPlay) {\n if (video.poster) {\n return createImage(video.poster, video.ownerDocument);\n }\n return cloned;\n }\n cloned.currentTime = video.currentTime;\n await new Promise((resolve) => {\n cloned.addEventListener(\"seeked\", resolve, { once: true });\n });\n const canvas = ownerDocument.createElement(\"canvas\");\n canvas.width = video.offsetWidth;\n canvas.height = video.offsetHeight;\n try {\n const ctx = canvas.getContext(\"2d\");\n if (ctx)\n ctx.drawImage(cloned, 0, 0, canvas.width, canvas.height);\n } catch (error) {\n context.log.warn(\"Failed to clone video\", error);\n if (video.poster) {\n return createImage(video.poster, video.ownerDocument);\n }\n return cloned;\n }\n return cloneCanvas(canvas, context);\n }\n return cloned;\n}\n\nfunction cloneElement(node, context) {\n if (isCanvasElement(node)) {\n return cloneCanvas(node, context);\n }\n if (isIFrameElement(node)) {\n return cloneIframe(node, context);\n }\n if (isImageElement(node)) {\n return cloneImage(node);\n }\n if (isVideoElement(node)) {\n return cloneVideo(node, context);\n }\n return node.cloneNode(false);\n}\n\nfunction getSandBox(context) {\n let sandbox = context.sandbox;\n if (!sandbox) {\n const { ownerDocument } = context;\n try {\n if (ownerDocument) {\n sandbox = ownerDocument.createElement(\"iframe\");\n sandbox.id = `__SANDBOX__${uuid()}`;\n sandbox.width = \"0\";\n sandbox.height = \"0\";\n sandbox.style.visibility = \"hidden\";\n sandbox.style.position = \"fixed\";\n ownerDocument.body.appendChild(sandbox);\n sandbox.srcdoc = '<!DOCTYPE html><meta charset=\"UTF-8\"><title></title><body>';\n context.sandbox = sandbox;\n }\n } catch (error) {\n context.log.warn(\"Failed to getSandBox\", error);\n }\n }\n return sandbox;\n}\n\nconst ignoredStyles = [\n \"width\",\n \"height\",\n \"-webkit-text-fill-color\"\n];\nconst includedAttributes = [\n \"stroke\",\n \"fill\"\n];\nfunction getDefaultStyle(node, pseudoElement, context) {\n const { defaultComputedStyles } = context;\n const nodeName = node.nodeName.toLowerCase();\n const isSvgNode = isSVGElementNode(node) && nodeName !== \"svg\";\n const attributes = isSvgNode ? includedAttributes.map((name) => [name, node.getAttribute(name)]).filter(([, value]) => value !== null) : [];\n const key = [\n isSvgNode && \"svg\",\n nodeName,\n attributes.map((name, value) => `${name}=${value}`).join(\",\"),\n pseudoElement\n ].filter(Boolean).join(\":\");\n if (defaultComputedStyles.has(key))\n return defaultComputedStyles.get(key);\n const sandbox = getSandBox(context);\n const sandboxWindow = sandbox?.contentWindow;\n if (!sandboxWindow)\n return /* @__PURE__ */ new Map();\n const sandboxDocument = sandboxWindow?.document;\n let root;\n let el;\n if (isSvgNode) {\n root = sandboxDocument.createElementNS(XMLNS, \"svg\");\n el = root.ownerDocument.createElementNS(root.namespaceURI, nodeName);\n attributes.forEach(([name, value]) => {\n el.setAttributeNS(null, name, value);\n });\n root.appendChild(el);\n } else {\n root = el = sandboxDocument.createElement(nodeName);\n }\n el.textContent = \" \";\n sandboxDocument.body.appendChild(root);\n const computedStyle = sandboxWindow.getComputedStyle(el, pseudoElement);\n const styles = /* @__PURE__ */ new Map();\n for (let len = computedStyle.length, i = 0; i < len; i++) {\n const name = computedStyle.item(i);\n if (ignoredStyles.includes(name))\n continue;\n styles.set(name, computedStyle.getPropertyValue(name));\n }\n sandboxDocument.body.removeChild(root);\n defaultComputedStyles.set(key, styles);\n return styles;\n}\n\nfunction getDiffStyle(style, defaultStyle, includeStyleProperties) {\n const diffStyle = /* @__PURE__ */ new Map();\n const prefixs = [];\n const prefixTree = /* @__PURE__ */ new Map();\n if (includeStyleProperties) {\n for (const name of includeStyleProperties) {\n applyTo(name);\n }\n } else {\n for (let len = style.length, i = 0; i < len; i++) {\n const name = style.item(i);\n applyTo(name);\n }\n }\n for (let len = prefixs.length, i = 0; i < len; i++) {\n prefixTree.get(prefixs[i])?.forEach((value, name) => diffStyle.set(name, value));\n }\n function applyTo(name) {\n const value = style.getPropertyValue(name);\n const priority = style.getPropertyPriority(name);\n const subIndex = name.lastIndexOf(\"-\");\n const prefix = subIndex > -1 ? name.substring(0, subIndex) : void 0;\n if (prefix) {\n let map = prefixTree.get(prefix);\n if (!map) {\n map = /* @__PURE__ */ new Map();\n prefixTree.set(prefix, map);\n }\n map.set(name, [value, priority]);\n }\n if (defaultStyle.get(name) === value && !priority)\n return;\n if (prefix) {\n prefixs.push(prefix);\n } else {\n diffStyle.set(name, [value, priority]);\n }\n }\n return diffStyle;\n}\n\nfunction copyCssStyles(node, cloned, isRoot, context) {\n const { ownerWindow, includeStyleProperties, currentParentNodeStyle } = context;\n const clonedStyle = cloned.style;\n const computedStyle = ownerWindow.getComputedStyle(node);\n const defaultStyle = getDefaultStyle(node, null, context);\n currentParentNodeStyle?.forEach((_, key) => {\n defaultStyle.delete(key);\n });\n const style = getDiffStyle(computedStyle, defaultStyle, includeStyleProperties);\n style.delete(\"transition-property\");\n style.delete(\"all\");\n style.delete(\"d\");\n style.delete(\"content\");\n if (isRoot) {\n style.delete(\"position\");\n style.delete(\"margin-top\");\n style.delete(\"margin-right\");\n style.delete(\"margin-bottom\");\n style.delete(\"margin-left\");\n style.delete(\"margin-block-start\");\n style.delete(\"margin-block-end\");\n style.delete(\"margin-inline-start\");\n style.delete(\"margin-inline-end\");\n style.set(\"box-sizing\", [\"border-box\", \"\"]);\n }\n if (style.get(\"background-clip\")?.[0] === \"text\") {\n cloned.classList.add(\"______background-clip--text\");\n }\n if (IN_CHROME) {\n if (!style.has(\"font-kerning\"))\n style.set(\"font-kerning\", [\"normal\", \"\"]);\n if ((style.get(\"overflow-x\")?.[0] === \"hidden\" || style.get(\"overflow-y\")?.[0] === \"hidden\") && style.get(\"text-overflow\")?.[0] === \"ellipsis\" && node.scrollWidth === node.clientWidth) {\n style.set(\"text-overflow\", [\"clip\", \"\"]);\n }\n }\n for (let len = clonedStyle.length, i = 0; i < len; i++) {\n clonedStyle.removeProperty(clonedStyle.item(i));\n }\n style.forEach(([value, priority], name) => {\n clonedStyle.setProperty(name, value, priority);\n });\n return style;\n}\n\nfunction copyInputValue(node, cloned) {\n if (isTextareaElement(node) || isInputElement(node) || isSelectElement(node)) {\n cloned.setAttribute(\"value\", node.value);\n }\n}\n\nconst pseudoClasses = [\n \"::before\",\n \"::after\"\n // '::placeholder', TODO\n];\nconst scrollbarPseudoClasses = [\n \"::-webkit-scrollbar\",\n \"::-webkit-scrollbar-button\",\n // '::-webkit-scrollbar:horizontal', TODO\n \"::-webkit-scrollbar-thumb\",\n \"::-webkit-scrollbar-track\",\n \"::-webkit-scrollbar-track-piece\",\n // '::-webkit-scrollbar:vertical', TODO\n \"::-webkit-scrollbar-corner\",\n \"::-webkit-resizer\"\n];\nfunction copyPseudoClass(node, cloned, copyScrollbar, context, addWordToFontFamilies) {\n const { ownerWindow, svgStyleElement, svgStyles, currentNodeStyle } = context;\n if (!svgStyleElement || !ownerWindow)\n return;\n function copyBy(pseudoClass) {\n const computedStyle = ownerWindow.getComputedStyle(node, pseudoClass);\n let content = computedStyle.getPropertyValue(\"content\");\n if (!content || content === \"none\")\n return;\n addWordToFontFamilies?.(content);\n content = content.replace(/(')|(\")|(counter\\(.+\\))/g, \"\");\n const klasses = [uuid()];\n const defaultStyle = getDefaultStyle(node, pseudoClass, context);\n currentNodeStyle?.forEach((_, key) => {\n defaultStyle.delete(key);\n });\n const style = getDiffStyle(computedStyle, defaultStyle, context.includeStyleProperties);\n style.delete(\"content\");\n style.delete(\"-webkit-locale\");\n if (style.get(\"background-clip\")?.[0] === \"text\") {\n cloned.classList.add(\"______background-clip--text\");\n }\n const cloneStyle = [\n `content: '${content}';`\n ];\n style.forEach(([value, priority], name) => {\n cloneStyle.push(`${name}: ${value}${priority ? \" !important\" : \"\"};`);\n });\n if (cloneStyle.length === 1)\n return;\n try {\n cloned.className = [cloned.className, ...klasses].join(\" \");\n } catch (err) {\n context.log.warn(\"Failed to copyPseudoClass\", err);\n return;\n }\n const cssText = cloneStyle.join(\"\\n \");\n let allClasses = svgStyles.get(cssText);\n if (!allClasses) {\n allClasses = [];\n svgStyles.set(cssText, allClasses);\n }\n allClasses.push(`.${klasses[0]}${pseudoClass}`);\n }\n pseudoClasses.forEach(copyBy);\n if (copyScrollbar)\n scrollbarPseudoClasses.forEach(copyBy);\n}\n\nconst excludeParentNodes = /* @__PURE__ */ new Set([\n \"symbol\"\n // test/fixtures/svg.symbol.html\n]);\nasync function appendChildNode(node, cloned, child, context, addWordToFontFamilies) {\n if (isElementNode(child) && (isStyleElement(child) || isScriptElement(child)))\n return;\n if (context.filter && !context.filter(child))\n return;\n if (excludeParentNodes.has(cloned.nodeName) || excludeParentNodes.has(child.nodeName)) {\n context.currentParentNodeStyle = void 0;\n } else {\n context.currentParentNodeStyle = context.currentNodeStyle;\n }\n const childCloned = await cloneNode(child, context, false, addWordToFontFamilies);\n if (context.isEnable(\"restoreScrollPosition\")) {\n restoreScrollPosition(node, childCloned);\n }\n cloned.appendChild(childCloned);\n}\nasync function cloneChildNodes(node, cloned, context, addWordToFontFamilies) {\n let firstChild = node.firstChild;\n if (isElementNode(node)) {\n if (node.shadowRoot) {\n firstChild = node.shadowRoot?.firstChild;\n context.shadowRoots.push(node.shadowRoot);\n }\n }\n for (let child = firstChild; child; child = child.nextSibling) {\n if (isCommentNode(child))\n continue;\n if (isElementNode(child) && isSlotElement(child) && typeof child.assignedNodes === \"function\") {\n const nodes = child.assignedNodes();\n for (let i = 0; i < nodes.length; i++) {\n await appendChildNode(node, cloned, nodes[i], context, addWordToFontFamilies);\n }\n } else {\n await appendChildNode(node, cloned, child, context, addWordToFontFamilies);\n }\n }\n}\nfunction restoreScrollPosition(node, chlidCloned) {\n if (!isHTMLElementNode(node) || !isHTMLElementNode(chlidCloned))\n return;\n const { scrollTop, scrollLeft } = node;\n if (!scrollTop && !scrollLeft) {\n return;\n }\n const { transform } = chlidCloned.style;\n const matrix = new DOMMatrix(transform);\n const { a, b, c, d } = matrix;\n matrix.a = 1;\n matrix.b = 0;\n matrix.c = 0;\n matrix.d = 1;\n matrix.translateSelf(-scrollLeft, -scrollTop);\n matrix.a = a;\n matrix.b = b;\n matrix.c = c;\n matrix.d = d;\n chlidCloned.style.transform = matrix.toString();\n}\nfunction applyCssStyleWithOptions(cloned, context) {\n const { backgroundColor, width, height, style: styles } = context;\n const clonedStyle = cloned.style;\n if (backgroundColor)\n clonedStyle.setProperty(\"background-color\", backgroundColor, \"important\");\n if (width)\n clonedStyle.setProperty(\"width\", `${width}px`, \"important\");\n if (height)\n clonedStyle.setProperty(\"height\", `${height}px`, \"important\");\n if (styles) {\n for (const name in styles) clonedStyle[name] = styles[name];\n }\n}\nconst NORMAL_ATTRIBUTE_RE = /^[\\w-:]+$/;\nasync function cloneNode(node, context, isRoot = false, addWordToFontFamilies) {\n const { ownerDocument, ownerWindow, fontFamilies, onCloneEachNode } = context;\n if (ownerDocument && isTextNode(node)) {\n if (addWordToFontFamilies && /\\S/.test(node.data)) {\n addWordToFontFamilies(node.data);\n }\n return ownerDocument.createTextNode(node.data);\n }\n if (ownerDocument && ownerWindow && isElementNode(node) && (isHTMLElementNode(node) || isSVGElementNode(node))) {\n const cloned2 = await cloneElement(node, context);\n if (context.isEnable(\"removeAbnormalAttributes\")) {\n const names = cloned2.getAttributeNames();\n for (let len = names.length, i = 0; i < len; i++) {\n const name = names[i];\n if (!NORMAL_ATTRIBUTE_RE.test(name)) {\n cloned2.removeAttribute(name);\n }\n }\n }\n const style = context.currentNodeStyle = copyCssStyles(node, cloned2, isRoot, context);\n if (isRoot)\n applyCssStyleWithOptions(cloned2, context);\n let copyScrollbar = false;\n if (context.isEnable(\"copyScrollbar\")) {\n const overflow = [\n style.get(\"overflow-x\")?.[0],\n style.get(\"overflow-y\")?.[0]\n ];\n copyScrollbar = overflow.includes(\"scroll\") || (overflow.includes(\"auto\") || overflow.includes(\"overlay\")) && (node.scrollHeight > node.clientHeight || node.scrollWidth > node.clientWidth);\n }\n const textTransform = style.get(\"text-transform\")?.[0];\n const families = splitFontFamily(style.get(\"font-family\")?.[0]);\n const addWordToFontFamilies2 = families ? (word) => {\n if (textTransform === \"uppercase\") {\n word = word.toUpperCase();\n } else if (textTransform === \"lowercase\") {\n word = word.toLowerCase();\n } else if (textTransform === \"capitalize\") {\n word = word[0].toUpperCase() + word.substring(1);\n }\n families.forEach((family) => {\n let fontFamily = fontFamilies.get(family);\n if (!fontFamily) {\n fontFamilies.set(family, fontFamily = /* @__PURE__ */ new Set());\n }\n word.split(\"\").forEach((text) => fontFamily.add(text));\n });\n } : void 0;\n copyPseudoClass(\n node,\n cloned2,\n copyScrollbar,\n context,\n addWordToFontFamilies2\n );\n copyInputValue(node, cloned2);\n if (!isVideoElement(node)) {\n await cloneChildNodes(\n node,\n cloned2,\n context,\n addWordToFontFamilies2\n );\n }\n await onCloneEachNode?.(cloned2);\n return cloned2;\n }\n const cloned = node.cloneNode(false);\n await cloneChildNodes(node, cloned, context);\n await onCloneEachNode?.(cloned);\n return cloned;\n}\n\nfunction destroyContext(context) {\n context.ownerDocument = void 0;\n context.ownerWindow = void 0;\n context.svgStyleElement = void 0;\n context.svgDefsElement = void 0;\n context.svgStyles.clear();\n context.defaultComputedStyles.clear();\n if (context.sandbox) {\n try {\n context.sandbox.remove();\n } catch (err) {\n context.log.warn(\"Failed to destroyContext\", err);\n }\n context.sandbox = void 0;\n }\n context.workers = [];\n context.fontFamilies.clear();\n context.fontCssTexts.clear();\n context.requests.clear();\n context.tasks = [];\n context.shadowRoots = [];\n}\n\nfunction baseFetch(options) {\n const { url, timeout, responseType, ...requestInit } = options;\n const controller = new AbortController();\n const timer = timeout ? setTimeout(() => controller.abort(), timeout) : void 0;\n return fetch(url, { signal: controller.signal, ...requestInit }).then((response) => {\n if (!response.ok) {\n throw new Error(\"Failed fetch, not 2xx response\", { cause: response });\n }\n switch (responseType) {\n case \"arrayBuffer\":\n return response.arrayBuffer();\n case \"dataUrl\":\n return response.blob().then(blobToDataUrl);\n case \"text\":\n default:\n return response.text();\n }\n }).finally(() => clearTimeout(timer));\n}\nfunction contextFetch(context, options) {\n const { url: rawUrl, requestType = \"text\", responseType = \"text\", imageDom } = options;\n let url = rawUrl;\n const {\n timeout,\n acceptOfImage,\n requests,\n fetchFn,\n fetch: {\n requestInit,\n bypassingCache,\n placeholderImage\n },\n font,\n workers,\n fontFamilies\n } = context;\n if (requestType === \"image\" && (IN_SAFARI || IN_FIREFOX)) {\n context.drawImageCount++;\n }\n let request = requests.get(rawUrl);\n if (!request) {\n if (bypassingCache) {\n if (bypassingCache instanceof RegExp && bypassingCache.test(url)) {\n url += (/\\?/.test(url) ? \"&\" : \"?\") + (/* @__PURE__ */ new Date()).getTime();\n }\n }\n const canFontMinify = requestType.startsWith(\"font\") && font && font.minify;\n const fontTexts = /* @__PURE__ */ new Set();\n if (canFontMinify) {\n const families = requestType.split(\";\")[1].split(\",\");\n families.forEach((family) => {\n if (!fontFamilies.has(family))\n return;\n fontFamilies.get(family).forEach((text) => fontTexts.add(text));\n });\n }\n const needFontMinify = canFontMinify && fontTexts.size;\n const baseFetchOptions = {\n url,\n timeout,\n responseType: needFontMinify ? \"arrayBuffer\" : responseType,\n headers: requestType === \"image\" ? { accept: acceptOfImage } : void 0,\n ...requestInit\n };\n request = {\n type: requestType,\n resolve: void 0,\n reject: void 0,\n response: null\n };\n request.response = (async () => {\n if (fetchFn && requestType === \"image\") {\n const result = await fetchFn(rawUrl);\n if (result)\n return result;\n }\n if (!IN_SAFARI && rawUrl.startsWith(\"http\") && workers.length) {\n return new Promise((resolve, reject) => {\n const worker = workers[requests.size & workers.length - 1];\n worker.postMessage({ rawUrl, ...baseFetchOptions });\n request.resolve = resolve;\n request.reject = reject;\n });\n }\n return baseFetch(baseFetchOptions);\n })().catch((error) => {\n requests.delete(rawUrl);\n if (requestType === \"image\" && placeholderImage) {\n context.log.warn(\"Failed to fetch image base64, trying to use placeholder image\", url);\n return typeof placeholderImage === \"string\" ? placeholderImage : placeholderImage(imageDom);\n }\n throw error;\n });\n requests.set(rawUrl, request);\n }\n return request.response;\n}\n\nasync function replaceCssUrlToDataUrl(cssText, baseUrl, context, isImage) {\n if (!hasCssUrl(cssText))\n return cssText;\n for (const [rawUrl, url] of parseCssUrls(cssText, baseUrl)) {\n try {\n const dataUrl = await contextFetch(\n context,\n {\n url,\n requestType: isImage ? \"image\" : \"text\",\n responseType: \"dataUrl\"\n }\n );\n cssText = cssText.replace(toRE(rawUrl), `$1${dataUrl}$3`);\n } catch (error) {\n context.log.warn(\"Failed to fetch css data url\", rawUrl, error);\n }\n }\n return cssText;\n}\nfunction hasCssUrl(cssText) {\n return /url\\((['\"]?)([^'\"]+?)\\1\\)/.test(cssText);\n}\nconst URL_RE = /url\\((['\"]?)([^'\"]+?)\\1\\)/g;\nfunction parseCssUrls(cssText, baseUrl) {\n const result = [];\n cssText.replace(URL_RE, (raw, quotation, url) => {\n result.push([url, resolveUrl(url, baseUrl)]);\n return raw;\n });\n return result.filter(([url]) => !isDataUrl(url));\n}\nfunction toRE(url) {\n const escaped = url.replace(/([.*+?^${}()|\\[\\]\\/\\\\])/g, \"\\\\$1\");\n return new RegExp(`(url\\\\(['\"]?)(${escaped})(['\"]?\\\\))`, \"g\");\n}\n\nconst properties = [\n \"background-image\",\n \"border-image-source\",\n \"-webkit-border-image\",\n \"-webkit-mask-image\",\n \"list-style-image\"\n];\nfunction embedCssStyleImage(style, context) {\n return properties.map((property) => {\n const value = style.getPropertyValue(property);\n if (!value || value === \"none\") {\n return null;\n }\n if (IN_SAFARI || IN_FIREFOX) {\n context.drawImageCount++;\n }\n return replaceCssUrlToDataUrl(value, null, context, true).then((newValue) => {\n if (!newValue || value === newValue)\n return;\n style.setProperty(\n property,\n newValue,\n style.getPropertyPriority(property)\n );\n });\n }).filter(Boolean);\n}\n\nfunction embedImageElement(cloned, context) {\n if (isImageElement(cloned)) {\n const originalSrc = cloned.currentSrc || cloned.src;\n if (!isDataUrl(originalSrc)) {\n return [\n contextFetch(context, {\n url: originalSrc,\n imageDom: cloned,\n requestType: \"image\",\n responseType: \"dataUrl\"\n }).then((url) => {\n if (!url)\n return;\n cloned.srcset = \"\";\n cloned.dataset.originalSrc = originalSrc;\n cloned.src = url || \"\";\n })\n ];\n }\n if (IN_SAFARI || IN_FIREFOX) {\n context.drawImageCount++;\n }\n } else if (isSVGElementNode(cloned) && !isDataUrl(cloned.href.baseVal)) {\n const originalSrc = cloned.href.baseVal;\n return [\n contextFetch(context, {\n url: originalSrc,\n imageDom: cloned,\n requestType: \"image\",\n responseType: \"dataUrl\"\n }).then((url) => {\n if (!url)\n return;\n cloned.dataset.originalSrc = originalSrc;\n cloned.href.baseVal = url || \"\";\n })\n ];\n }\n return [];\n}\n\nfunction embedSvgUse(cloned, context) {\n const { ownerDocument, svgDefsElement } = context;\n const href = cloned.getAttribute(\"href\") ?? cloned.getAttribute(\"xlink:href\");\n if (!href)\n return [];\n const [svgUrl, id] = href.split(\"#\");\n if (id) {\n const query = `#${id}`;\n const definition = context.shadowRoots.reduce(\n (res, root) => {\n return res ?? root.querySelector(`svg ${query}`);\n },\n ownerDocument?.querySelector(`svg ${query}`)\n );\n if (svgUrl) {\n cloned.setAttribute(\"href\", query);\n }\n if (svgDefsElement?.querySelector(query))\n return [];\n if (definition) {\n svgDefsElement?.appendChild(definition.cloneNode(true));\n return [];\n } else if (svgUrl) {\n return [\n contextFetch(context, {\n url: svgUrl,\n responseType: \"text\"\n }).then((svgData) => {\n svgDefsElement?.insertAdjacentHTML(\"beforeend\", svgData);\n })\n ];\n }\n }\n return [];\n}\n\nfunction embedNode(cloned, context) {\n const { tasks } = context;\n if (isElementNode(cloned)) {\n if (isImageElement(cloned) || isSVGImageElementNode(cloned)) {\n tasks.push(...embedImageElement(cloned, context));\n }\n if (isSVGUseElementNode(cloned)) {\n tasks.push(...embedSvgUse(cloned, context));\n }\n }\n if (isHTMLElementNode(cloned)) {\n tasks.push(...embedCssStyleImage(cloned.style, context));\n }\n cloned.childNodes.forEach((child) => {\n embedNode(child, context);\n });\n}\n\nasync function embedWebFont(clone, context) {\n const {\n ownerDocument,\n svgStyleElement,\n fontFamilies,\n fontCssTexts,\n tasks,\n font\n } = context;\n if (!ownerDocument || !svgStyleElement || !fontFamilies.size) {\n return;\n }\n if (font && font.cssText) {\n const cssText = filterPreferredFormat(font.cssText, context);\n svgStyleElement.appendChild(ownerDocument.createTextNode(`${cssText}\n`));\n } else {\n const styleSheets = Array.from(ownerDocument.styleSheets).filter((styleSheet) => {\n try {\n return \"cssRules\" in styleSheet && Boolean(styleSheet.cssRules.length);\n } catch (error) {\n context.log.warn(`Error while reading CSS rules from ${styleSheet.href}`, error);\n return false;\n }\n });\n const tempDoc = ownerDocument.implementation.createHTMLDocument(\"\");\n const tempStyleEl = tempDoc.createElement(\"style\");\n tempDoc.head.appendChild(tempStyleEl);\n const tempStyleSheet = tempStyleEl.sheet;\n await Promise.all(\n styleSheets.flatMap((styleSheet) => {\n return Array.from(styleSheet.cssRules).map(async (cssRule) => {\n if (isCSSImportRule(cssRule)) {\n const baseUrl = cssRule.href;\n let cssText = \"\";\n try {\n cssText = await contextFetch(context, {\n url: baseUrl,\n requestType: \"text\",\n responseType: \"text\"\n });\n } catch (error) {\n context.log.warn(`Error fetch remote css import from ${baseUrl}`, error);\n }\n const replacedCssText = cssText.replace(\n URL_RE,\n (raw, quotation, url) => raw.replace(url, resolveUrl(url, baseUrl))\n );\n for (const rule of parseCss(replacedCssText)) {\n try {\n tempStyleSheet.insertRule(rule, tempStyleSheet.cssRules.length);\n } catch (error) {\n context.log.warn(\"Error inserting rule from remote css import\", { rule, error });\n }\n }\n }\n });\n })\n );\n if (tempStyleSheet.cssRules.length)\n styleSheets.push(tempStyleSheet);\n const cssRules = [];\n styleSheets.forEach((sheet) => {\n unwrapCssLayers(sheet.cssRules, cssRules);\n });\n cssRules.filter((cssRule) => isCssFontFaceRule(cssRule) && hasCssUrl(cssRule.style.getPropertyValue(\"src\")) && splitFontFamily(cssRule.style.getPropertyValue(\"font-family\"))?.some((val) => fontFamilies.has(val))).forEach((value) => {\n const rule = value;\n const cssText = fontCssTexts.get(rule.cssText);\n if (cssText) {\n svgStyleElement.appendChild(ownerDocument.createTextNode(`${cssText}\n`));\n } else {\n tasks.push(\n replaceCssUrlToDataUrl(\n rule.cssText,\n rule.parentStyleSheet ? rule.parentStyleSheet.href : null,\n context\n ).then((cssText2) => {\n cssText2 = filterPreferredFormat(cssText2, context);\n fontCssTexts.set(rule.cssText, cssText2);\n svgStyleElement.appendChild(ownerDocument.createTextNode(`${cssText2}\n`));\n })\n );\n }\n });\n }\n}\nconst COMMENTS_RE = /(\\/\\*[\\s\\S]*?\\*\\/)/g;\nconst KEYFRAMES_RE = /((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})/gi;\nfunction parseCss(source) {\n if (source == null)\n return [];\n const result = [];\n let cssText = source.replace(COMMENTS_RE, \"\");\n while (true) {\n const matches = KEYFRAMES_RE.exec(cssText);\n if (!matches)\n break;\n result.push(matches[0]);\n }\n cssText = cssText.replace(KEYFRAMES_RE, \"\");\n const IMPORT_RE = /@import[\\s\\S]*?url\\([^)]*\\)[\\s\\S]*?;/gi;\n const UNIFIED_RE = new RegExp(\n // eslint-disable-next-line\n \"((\\\\s*?(?:\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/)?\\\\s*?@media[\\\\s\\\\S]*?){([\\\\s\\\\S]*?)}\\\\s*?})|(([\\\\s\\\\S]*?){([\\\\s\\\\S]*?)})\",\n \"gi\"\n );\n while (true) {\n let matches = IMPORT_RE.exec(cssText);\n if (!matches) {\n matches = UNIFIED_RE.exec(cssText);\n if (!matches) {\n break;\n } else {\n IMPORT_RE.lastIndex = UNIFIED_RE.lastIndex;\n }\n } else {\n UNIFIED_RE.lastIndex = IMPORT_RE.lastIndex;\n }\n result.push(matches[0]);\n }\n return result;\n}\nconst URL_WITH_FORMAT_RE = /url\\([^)]+\\)\\s*format\\(([\"']?)([^\"']+)\\1\\)/g;\nconst FONT_SRC_RE = /src:\\s*(?:url\\([^)]+\\)\\s*format\\([^)]+\\)[,;]\\s*)+/g;\nfunction filterPreferredFormat(str, context) {\n const { font } = context;\n const preferredFormat = font ? font?.preferredFormat : void 0;\n return preferredFormat ? str.replace(FONT_SRC_RE, (match) => {\n while (true) {\n const [src, , format] = URL_WITH_FORMAT_RE.exec(match) || [];\n if (!format)\n return \"\";\n if (format === preferredFormat)\n return `src: ${src};`;\n }\n }) : str;\n}\nfunction unwrapCssLayers(rules, out = []) {\n for (const rule of Array.from(rules)) {\n if (isLayerBlockRule(rule)) {\n out.push(...unwrapCssLayers(rule.cssRules));\n } else if (\"cssRules\" in rule) {\n unwrapCssLayers(rule.cssRules, out);\n } else {\n out.push(rule);\n }\n }\n return out;\n}\n\nconst SVG_EXTERNAL_RESOURCE_REGEX = /\\bx?link:?href\\s*=\\s*[\"'](?!data:)[^\"']+[\"']/i;\nfunction svgHasExternalResources(svg) {\n return SVG_EXTERNAL_RESOURCE_REGEX.test(svg.innerHTML);\n}\nasync function domToForeignObjectSvg(node, options) {\n const context = await orCreateContext(node, options);\n if (isElementNode(context.node) && isSVGElementNode(context.node) && !svgHasExternalResources(context.node))\n return context.node;\n const {\n ownerDocument,\n log,\n tasks,\n svgStyleElement,\n svgDefsElement,\n svgStyles,\n font,\n progress,\n autoDestruct,\n onCloneNode,\n onEmbedNode,\n onCreateForeignObjectSvg\n } = context;\n log.time(\"clone node\");\n const clone = await cloneNode(context.node, context, true);\n if (svgStyleElement && ownerDocument) {\n let allCssText = \"\";\n svgStyles.forEach((klasses, cssText) => {\n allCssText += `${klasses.join(\",\\n\")} {\n ${cssText}\n}\n`;\n });\n svgStyleElement.appendChild(ownerDocument.createTextNode(allCssText));\n }\n log.timeEnd(\"clone node\");\n await onCloneNode?.(clone);\n if (font !== false && isElementNode(clone)) {\n log.time(\"embed web font\");\n await embedWebFont(clone, context);\n log.timeEnd(\"embed web font\");\n }\n log.time(\"embed node\");\n embedNode(clone, context);\n const count = tasks.length;\n let current = 0;\n const runTask = async () => {\n while (true) {\n const task = tasks.pop();\n if (!task)\n break;\n try {\n await task;\n } catch (error) {\n context.log.warn(\"Failed to run task\", error);\n }\n progress?.(++current, count);\n }\n };\n progress?.(current, count);\n await Promise.all([...Array.from({ length: 4 })].map(runTask));\n log.timeEnd(\"embed node\");\n await onEmbedNode?.(clone);\n const svg = createForeignObjectSvg(clone, context);\n svgDefsElement && svg.insertBefore(svgDefsElement, svg.children[0]);\n svgStyleElement && svg.insertBefore(svgStyleElement, svg.children[0]);\n autoDestruct && destroyContext(context);\n await onCreateForeignObjectSvg?.(svg);\n return svg;\n}\nfunction createForeignObjectSvg(clone, context) {\n const { width, height } = context;\n const svg = createSvg(width, height, clone.ownerDocument);\n const foreignObject = svg.ownerDocument.createElementNS(svg.namespaceURI, \"foreignObject\");\n foreignObject.setAttributeNS(null, \"x\", \"0%\");\n foreignObject.setAttributeNS(null, \"y\", \"0%\");\n foreignObject.setAttributeNS(null, \"width\", \"100%\");\n foreignObject.setAttributeNS(null, \"height\", \"100%\");\n foreignObject.append(clone);\n svg.appendChild(foreignObject);\n return svg;\n}\n\nasync function domToCanvas(node, options) {\n const context = await orCreateContext(node, options);\n const svg = await domToForeignObjectSvg(context);\n const dataUrl = svgToDataUrl(svg, context.isEnable(\"removeControlCharacter\"));\n if (!context.autoDestruct) {\n context.svgStyleElement = createStyleElement(context.ownerDocument);\n context.svgDefsElement = context.ownerDocument?.createElementNS(XMLNS, \"defs\");\n context.svgStyles.clear();\n }\n const image = createImage(dataUrl, svg.ownerDocument);\n return await imageToCanvas(image, context);\n}\n\nasync function domToBlob(node, options) {\n const context = await orCreateContext(node, options);\n const { log, type, quality, dpi } = context;\n const canvas = await domToCanvas(context);\n log.time(\"canvas to blob\");\n const blob = await canvasToBlob(canvas, type, quality);\n if ([\"image/png\", \"image/jpeg\"].includes(type) && dpi) {\n const arrayBuffer = await blobToArrayBuffer(blob.slice(0, 33));\n let uint8Array = new Uint8Array(arrayBuffer);\n if (type === \"image/png\") {\n uint8Array = changePngDpi(uint8Array, dpi);\n } else if (type === \"image/jpeg\") {\n uint8Array = changeJpegDpi(uint8Array, dpi);\n }\n log.timeEnd(\"canvas to blob\");\n return new Blob([uint8Array, blob.slice(33)], { type });\n }\n log.timeEnd(\"canvas to blob\");\n return blob;\n}\n\nasync function domToDataUrl(node, options) {\n const context = await orCreateContext(node, options);\n const { log, quality, type, dpi } = context;\n const canvas = await domToCanvas(context);\n log.time(\"canvas to data url\");\n let dataUrl = canvas.toDataURL(type, quality);\n if ([\"image/png\", \"image/jpeg\"].includes(type) && dpi && SUPPORT_ATOB && SUPPORT_BTOA) {\n const [format, body] = dataUrl.split(\",\");\n let headerLength = 0;\n let overwritepHYs = false;\n if (type === \"image/png\") {\n const b64Index = detectPhysChunkFromDataUrl(body);\n if (b64Index >= 0) {\n headerLength = Math.ceil((b64Index + 28) / 3) * 4;\n overwritepHYs = true;\n } else {\n headerLength = 33 / 3 * 4;\n }\n } else if (type === \"image/jpeg\") {\n headerLength = 18 / 3 * 4;\n }\n const stringHeader = body.substring(0, headerLength);\n const restOfData = body.substring(headerLength);\n const headerBytes = window.atob(stringHeader);\n const uint8Array = new Uint8Array(headerBytes.length);\n for (let i = 0; i < uint8Array.length; i++) {\n uint8Array[i] = headerBytes.charCodeAt(i);\n }\n const finalArray = type === \"image/png\" ? changePngDpi(uint8Array, dpi, overwritepHYs) : changeJpegDpi(uint8Array, dpi);\n const base64Header = window.btoa(String.fromCharCode(...finalArray));\n dataUrl = [format, \",\", base64Header, restOfData].join(\"\");\n }\n log.timeEnd(\"canvas to data url\");\n return dataUrl;\n}\n\nasync function domToSvg(node, options) {\n const context = await orCreateContext(node, options);\n const { width, height, ownerDocument } = context;\n const dataUrl = await domToDataUrl(context);\n const svg = createSvg(width, height, ownerDocument);\n const svgImage = svg.ownerDocument.createElementNS(svg.namespaceURI, \"image\");\n svgImage.setAttributeNS(null, \"href\", dataUrl);\n svgImage.setAttributeNS(null, \"height\", \"100%\");\n svgImage.setAttributeNS(null, \"width\", \"100%\");\n svg.appendChild(svgImage);\n return svgToDataUrl(svg, context.isEnable(\"removeControlCharacter\"));\n}\n\nasync function domToImage(node, options) {\n const context = await orCreateContext(node, options);\n const { ownerDocument, width, height, scale, type } = context;\n const url = type === \"image/svg+xml\" ? await domToSvg(context) : await domToDataUrl(context);\n const image = createImage(url, ownerDocument);\n image.width = Math.floor(width * scale);\n image.height = Math.floor(height * scale);\n image.style.width = `${width}px`;\n image.style.height = `${height}px`;\n return image;\n}\n\nasync function domToJpeg(node, options) {\n return domToDataUrl(\n await orCreateContext(node, { ...options, type: \"image/jpeg\" })\n );\n}\n\nasync function domToPixel(node, options) {\n const context = await orCreateContext(node, options);\n const canvas = await domToCanvas(context);\n return canvas.getContext(\"2d\").getImageData(0, 0, canvas.width, canvas.height).data;\n}\n\nasync function domToPng(node, options) {\n return domToDataUrl(\n await orCreateContext(node, { ...options, type: \"image/png\" })\n );\n}\n\nasync function domToWebp(node, options) {\n return domToDataUrl(\n await orCreateContext(node, { ...options, type: \"image/webp\" })\n );\n}\n\nexport { createContext, destroyContext, domToBlob, domToCanvas, domToDataUrl, domToForeignObjectSvg, domToImage, domToJpeg, domToPixel, domToPng, domToSvg, domToWebp, loadMedia, waitUntilLoad };\n","import { domToPng } from \"modern-screenshot\";\nimport type { ElementContext, RegionRect } from \"./types.js\";\n\nconst STYLE_KEYS = [\n \"display\", \"position\", \"width\", \"height\", \"margin\", \"padding\",\n \"color\", \"background-color\", \"font-size\", \"font-weight\", \"font-family\",\n \"border\", \"border-radius\", \"box-shadow\", \"flex\", \"grid-template-columns\",\n \"text-align\", \"line-height\", \"opacity\",\n];\n\n/** outerHTML + a curated slice of computed styles — the context handed to Claude. */\nexport function captureElementContext(el: Element): ElementContext {\n const html = el.outerHTML.length > 6000 ? el.outerHTML.slice(0, 6000) + \"…\" : el.outerHTML;\n const cs = getComputedStyle(el);\n const styles: Record<string, string> = {};\n for (const k of STYLE_KEYS) {\n const v = cs.getPropertyValue(k);\n if (v) styles[k] = v.trim();\n }\n return { html, styles };\n}\n\n/** Wait for the page's web fonts to finish loading so they get embedded, not\n * substituted with a fallback (which reflows the capture). Best-effort. */\nasync function fontsReady(): Promise<void> {\n try {\n const fonts = (document as Document & { fonts?: FontFaceSet }).fonts;\n if (fonts?.ready) await fonts.ready;\n } catch {\n /* FontFaceSet unsupported — carry on */\n }\n}\n\n/** Skip Loupe's own UI and redacted elements in any capture. */\nfunction captureFilter(node: Node): boolean {\n if (!(node instanceof Element)) return true;\n if (node.id === \"loupe-root\") return false;\n if (node.hasAttribute(\"data-loupe-redact\")) return false;\n return true;\n}\n\n/**\n * Screenshot the target element. Elements marked [data-loupe-redact] are\n * excluded before anything leaves the browser, and our own UI is never captured.\n */\nexport async function captureScreenshot(el: Element): Promise<string | undefined> {\n try {\n await fontsReady();\n return await domToPng(el as HTMLElement, {\n scale: Math.min(window.devicePixelRatio || 1, 2),\n backgroundColor: getComputedStyle(document.body).backgroundColor || \"#ffffff\",\n // Give cross-origin font/asset fetches time to embed (default is short) so\n // the capture matches the page instead of falling back to system fonts.\n timeout: 30000,\n filter: captureFilter,\n });\n } catch (err) {\n console.warn(\"[loupe] screenshot capture failed\", err);\n return undefined;\n }\n}\n\n/**\n * Screenshot a free-form rectangle (the \"region shot\"). `rect` is in **viewport**\n * coordinates (what's on screen now). The default renders the whole page and crops;\n * the extension overrides this with a real captureVisibleTab crop. Redacted regions\n * are painted over before the pixels leave the browser.\n */\nexport async function captureRegionScreenshot(rect: RegionRect): Promise<string | undefined> {\n try {\n await fontsReady();\n const scale = Math.min(window.devicePixelRatio || 1, 2);\n const full = await domToPng(document.body, {\n scale,\n backgroundColor: getComputedStyle(document.body).backgroundColor || \"#ffffff\",\n timeout: 30000,\n filter: captureFilter,\n });\n // Map the viewport rect into the body image (body's box-origin is bodyRect).\n const bodyRect = document.body.getBoundingClientRect();\n const redact = Array.from(document.querySelectorAll(\"[data-loupe-redact]\")).map((n) =>\n (n as Element).getBoundingClientRect(),\n );\n return await cropRegion(full, rect, bodyRect.left, bodyRect.top, scale, redact);\n } catch (err) {\n console.warn(\"[loupe] region capture failed\", err);\n return undefined;\n }\n}\n\n/** Crop `rect` (viewport coords) out of a full-page data URL whose origin sits at (ox, oy). */\nfunction cropRegion(\n dataUrl: string,\n rect: RegionRect,\n ox: number,\n oy: number,\n scale: number,\n redact: DOMRect[],\n): Promise<string> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n const sw = Math.max(1, Math.round(rect.w * scale));\n const sh = Math.max(1, Math.round(rect.h * scale));\n const canvas = document.createElement(\"canvas\");\n canvas.width = sw;\n canvas.height = sh;\n const ctx = canvas.getContext(\"2d\")!;\n ctx.drawImage(img, (rect.x - ox) * scale, (rect.y - oy) * scale, sw, sh, 0, 0, sw, sh);\n ctx.fillStyle = \"#0f0f14\";\n for (const r of redact) {\n ctx.fillRect((r.left - rect.x) * scale, (r.top - rect.y) * scale, r.width * scale, r.height * scale);\n }\n resolve(canvas.toDataURL(\"image/png\"));\n };\n img.onerror = reject;\n img.src = dataUrl;\n });\n}\n","import type { Comment, StorageAdapter } from \"./types.js\";\n\n/**\n * Prototype storage: everything lives in localStorage, keyed by project + path.\n * The production adapter swaps this for HTTP calls to the backend — the SDK\n * only depends on the StorageAdapter interface, so nothing else changes.\n */\nexport class LocalStorageAdapter implements StorageAdapter {\n private key(projectKey: string, url: string) {\n return `loupe:${projectKey}:${url}`;\n }\n\n private readAll(projectKey: string, url: string): Comment[] {\n try {\n const raw = localStorage.getItem(this.key(projectKey, url));\n return raw ? (JSON.parse(raw) as Comment[]) : [];\n } catch {\n return [];\n }\n }\n\n private writeAll(projectKey: string, url: string, comments: Comment[]) {\n localStorage.setItem(this.key(projectKey, url), JSON.stringify(comments));\n }\n\n async list(projectKey: string, url: string): Promise<Comment[]> {\n return this.readAll(projectKey, url);\n }\n\n async save(comment: Comment): Promise<Comment> {\n const all = this.readAll(comment.projectKey, comment.url);\n all.push(comment);\n this.writeAll(comment.projectKey, comment.url, all);\n return comment;\n }\n\n async update(id: string, patch: Partial<Comment>): Promise<void> {\n // We don't know the url here, so scan the loupe:* keys for the id.\n for (let i = 0; i < localStorage.length; i++) {\n const k = localStorage.key(i);\n if (!k || !k.startsWith(\"loupe:\")) continue;\n const list = JSON.parse(localStorage.getItem(k) || \"[]\") as Comment[];\n const idx = list.findIndex((c) => c.id === id);\n if (idx >= 0) {\n list[idx] = { ...list[idx]!, ...patch };\n localStorage.setItem(k, JSON.stringify(list));\n return;\n }\n }\n }\n\n async remove(id: string): Promise<void> {\n for (let i = 0; i < localStorage.length; i++) {\n const k = localStorage.key(i);\n if (!k || !k.startsWith(\"loupe:\")) continue;\n const list = JSON.parse(localStorage.getItem(k) || \"[]\") as Comment[];\n const next = list.filter((c) => c.id !== id);\n if (next.length !== list.length) {\n localStorage.setItem(k, JSON.stringify(next));\n return;\n }\n }\n }\n}\n","import type { Comment, LoupeUser, StorageAdapter } from \"./types.js\";\n\n/**\n * Talks to the Loupe backend. Selected automatically when `apiBase` is set in\n * init(). Sends the identity headers the backend verifies (HMAC in production).\n */\nexport class HttpAdapter implements StorageAdapter {\n constructor(\n private base: string,\n private user: LoupeUser,\n private userHmac?: string,\n private extraHeaders?: Record<string, string>,\n private credentials?: RequestCredentials,\n ) {\n this.base = base.replace(/\\/$/, \"\");\n }\n\n private headers(): HeadersInit {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\", \"X-Loupe-User\": this.user.id };\n if (this.userHmac) h[\"X-Loupe-Hmac\"] = this.userHmac;\n if (this.extraHeaders) Object.assign(h, this.extraHeaders);\n return h;\n }\n\n /** Base fetch options shared by every request (credentials mode, if set). */\n private opts(init?: RequestInit): RequestInit {\n return this.credentials ? { credentials: this.credentials, ...init } : { ...init };\n }\n\n async list(projectKey: string, url: string): Promise<Comment[]> {\n const q = new URLSearchParams({ projectKey, url });\n const res = await fetch(`${this.base}/v1/comments?${q}`, this.opts({ headers: this.headers() }));\n if (!res.ok) throw new Error(`list failed: ${res.status}`);\n return (await res.json()) as Comment[];\n }\n\n async save(comment: Comment): Promise<Comment> {\n // Upload the screenshot to object storage first, then store only its URL —\n // keeps the comment row (and every later list/read) small.\n if (comment.screenshot?.startsWith(\"data:\")) {\n try {\n const up = await fetch(`${this.base}/v1/blobs`, this.opts({\n method: \"POST\",\n headers: this.headers(),\n body: JSON.stringify({ projectKey: comment.projectKey, data: comment.screenshot }),\n }));\n if (up.ok) comment = { ...comment, screenshot: (await up.json()).url };\n } catch {\n /* fall back to inlining the data URL if upload fails */\n }\n }\n const res = await fetch(`${this.base}/v1/comments`, this.opts({\n method: \"POST\",\n headers: this.headers(),\n body: JSON.stringify(comment),\n }));\n if (!res.ok) throw new Error(`save failed: ${res.status}`);\n return (await res.json()) as Comment;\n }\n\n async update(id: string, patch: Partial<Comment>): Promise<void> {\n const res = await fetch(`${this.base}/v1/comments/${encodeURIComponent(id)}`, this.opts({\n method: \"PATCH\",\n headers: this.headers(),\n body: JSON.stringify(patch),\n }));\n if (!res.ok) throw new Error(`update failed: ${res.status}`);\n }\n\n async remove(id: string): Promise<void> {\n const res = await fetch(`${this.base}/v1/comments/${encodeURIComponent(id)}`, this.opts({\n method: \"DELETE\",\n headers: this.headers(),\n }));\n if (!res.ok && res.status !== 404) throw new Error(`remove failed: ${res.status}`);\n }\n}\n","import { STYLES } from \"./styles.js\";\nimport { captureAnchor, resolveAnchor } from \"./fingerprint.js\";\nimport { captureElementContext, captureScreenshot, captureRegionScreenshot } from \"./capture.js\";\nimport { LocalStorageAdapter } from \"./store.js\";\nimport { HttpAdapter } from \"./http-adapter.js\";\nimport type { Anchor, Comment, LoupeConfig, RegionRect, StorageAdapter } from \"./types.js\";\n\ntype Mode = \"off\" | \"inspect\" | \"region\";\n/** What the composer is about to attach a comment to. */\ntype ComposeTarget =\n | { kind: \"element\"; element: Element }\n | { kind: \"region\"; region: RegionRect; element: Element | null; screenshot?: string };\n\nconst uid = () =>\n (crypto as any).randomUUID ? crypto.randomUUID() : \"c_\" + Math.abs(hash(String(performance.now()))).toString(36);\nfunction hash(s: string) { let h = 0; for (let i = 0; i < s.length; i++) h = (h * 31 + s.charCodeAt(i)) | 0; return h; }\n\nexport class LoupeApp {\n private cfg: LoupeConfig;\n private store: StorageAdapter;\n private root!: HTMLElement;\n private shadow!: ShadowRoot;\n private overlay!: HTMLElement;\n private hl!: HTMLElement;\n private selbox!: HTMLElement;\n private regionBox!: HTMLElement;\n private toolbar!: HTMLElement;\n private composer!: HTMLElement;\n private panel!: HTMLElement;\n private countEl!: HTMLElement;\n\n private comments: Comment[] = [];\n /** comment.id → currently resolved element (or null when detached). */\n private resolved = new Map<string, Element | null>();\n /** comment.id → pin element. */\n private pins = new Map<string, HTMLElement>();\n\n private mode: Mode = \"off\";\n private collapsed = false;\n private targetOffset = { x: 0.5, y: 0.5 };\n private pending: ComposeTarget | null = null;\n private dragStart: { x: number; y: number } | null = null;\n /** region comment whose outline is currently highlighted (tracks scroll). */\n private activeRegionId: string | null = null;\n private regionTimer?: number;\n\n private raf = 0;\n private mo?: MutationObserver;\n private tick?: number;\n\n constructor(cfg: LoupeConfig) {\n this.cfg = cfg;\n // apiBase set → talk to the backend; otherwise persist locally (prototype).\n this.store = cfg.apiBase\n ? new HttpAdapter(cfg.apiBase, cfg.user, cfg.userHmac, cfg.headers, cfg.credentials)\n : new LocalStorageAdapter();\n }\n\n private get url() { return location.pathname + location.search; }\n\n async start() {\n this.buildDom();\n this.comments = await this.store.list(this.cfg.projectKey, this.url);\n this.renderPins();\n this.renderPanel();\n this.observe();\n if (this.cfg.autoOpen) this.setMode(\"inspect\");\n }\n\n // ---- DOM construction -----------------------------------------------------\n\n private buildDom() {\n this.root = document.createElement(\"div\");\n this.root.id = \"loupe-root\";\n document.body.appendChild(this.root);\n this.shadow = this.root.attachShadow({ mode: \"open\" });\n\n const style = document.createElement(\"style\");\n style.textContent = STYLES;\n this.shadow.appendChild(style);\n\n this.overlay = el(\"div\", \"overlay\");\n this.hl = el(\"div\", \"hl\");\n this.hl.appendChild(el(\"span\", \"tip\"));\n this.selbox = el(\"div\", \"selbox\");\n this.regionBox = el(\"div\", \"region-box\");\n this.overlay.append(this.hl, this.selbox, this.regionBox);\n this.shadow.appendChild(this.overlay);\n\n this.composer = el(\"div\", \"composer\");\n this.shadow.appendChild(this.composer);\n\n this.panel = el(\"div\", \"panel\");\n this.shadow.appendChild(this.panel);\n\n this.toolbar = this.buildToolbar();\n this.shadow.appendChild(this.toolbar);\n }\n\n private buildToolbar(): HTMLElement {\n const bar = el(\"div\", \"toolbar\");\n // The brand doubles as a collapse/expand toggle: click it to shrink the bar\n // to just the logo, click again to restore.\n const brand = el(\"span\", \"brand\", \"◎ Loupe\");\n brand.title = \"Collapse / expand the Loupe bar\";\n brand.setAttribute(\"role\", \"button\");\n brand.onclick = () => this.toggleCollapsed();\n const inspectBtn = el(\"button\", \"\", \"✛ Inspect & comment\") as HTMLButtonElement;\n inspectBtn.dataset.role = \"inspect\";\n inspectBtn.onclick = () => this.setMode(this.mode === \"inspect\" ? \"off\" : \"inspect\");\n const regionBtn = el(\"button\") as HTMLButtonElement;\n // Inline SVG (not a font glyph) so the icon renders on every system.\n regionBtn.innerHTML = `${REGION_ICON}<span>Region shot</span>`;\n regionBtn.dataset.role = \"region\";\n regionBtn.title = \"Drag a free-size box, screenshot it, and comment\";\n regionBtn.onclick = () => this.setMode(this.mode === \"region\" ? \"off\" : \"region\");\n const listBtn = el(\"button\", \"\", \"☰ Comments\") as HTMLButtonElement;\n this.countEl = el(\"span\", \"count\", \"0\");\n listBtn.appendChild(this.countEl);\n listBtn.onclick = () => this.togglePanel();\n bar.append(brand, sep(), inspectBtn, regionBtn, listBtn);\n return bar;\n }\n\n // ---- inspector ------------------------------------------------------------\n\n private onMove = (e: MouseEvent) => {\n if (this.mode !== \"inspect\") return;\n const target = this.pick(e.clientX, e.clientY);\n if (!target) { this.hl.style.display = \"none\"; return; }\n const r = target.getBoundingClientRect();\n Object.assign(this.hl.style, {\n display: \"block\", left: r.left + \"px\", top: r.top + \"px\",\n width: r.width + \"px\", height: r.height + \"px\",\n });\n (this.hl.firstChild as HTMLElement).textContent =\n target.tagName.toLowerCase() + (target.id ? \"#\" + target.id : \"\");\n };\n\n private onClick = (e: MouseEvent) => {\n if (this.mode !== \"inspect\") return;\n const target = this.pick(e.clientX, e.clientY);\n if (!target) return;\n e.preventDefault();\n e.stopPropagation();\n const r = target.getBoundingClientRect();\n this.targetOffset = {\n x: r.width ? clamp((e.clientX - r.left) / r.width) : 0.5,\n y: r.height ? clamp((e.clientY - r.top) / r.height) : 0.5,\n };\n this.setMode(\"off\");\n this.openComposer({ kind: \"element\", element: target }, e.clientX, e.clientY);\n };\n\n private onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") { this.cancelDrag(); this.setMode(\"off\"); this.closeComposer(); }\n };\n\n // ---- region (\"free-size screenshot\") selection ----------------------------\n\n private onRegionDown = (e: MouseEvent) => {\n if (this.mode !== \"region\" || e.button !== 0) return;\n e.preventDefault();\n e.stopPropagation();\n this.dragStart = { x: e.clientX, y: e.clientY };\n document.addEventListener(\"mousemove\", this.onRegionMove, true);\n document.addEventListener(\"mouseup\", this.onRegionUp, true);\n this.drawSelection(e.clientX, e.clientY);\n };\n\n private onRegionMove = (e: MouseEvent) => {\n if (!this.dragStart) return;\n e.preventDefault();\n this.drawSelection(e.clientX, e.clientY);\n };\n\n private onRegionUp = (e: MouseEvent) => {\n if (!this.dragStart) return;\n e.preventDefault();\n e.stopPropagation();\n const start = this.dragStart;\n this.cancelDrag();\n const vp: RegionRect = {\n x: Math.min(start.x, e.clientX), y: Math.min(start.y, e.clientY),\n w: Math.abs(e.clientX - start.x), h: Math.abs(e.clientY - start.y),\n };\n if (vp.w < 8 || vp.h < 8) { this.selbox.style.display = \"none\"; return; } // stray click\n this.setMode(\"off\");\n this.finishRegion(vp);\n };\n\n private drawSelection(curX: number, curY: number) {\n const s = this.dragStart!;\n Object.assign(this.selbox.style, {\n display: \"block\",\n left: Math.min(s.x, curX) + \"px\", top: Math.min(s.y, curY) + \"px\",\n width: Math.abs(curX - s.x) + \"px\", height: Math.abs(curY - s.y) + \"px\",\n });\n }\n\n private cancelDrag() {\n this.dragStart = null;\n document.removeEventListener(\"mousemove\", this.onRegionMove, true);\n document.removeEventListener(\"mouseup\", this.onRegionUp, true);\n }\n\n /** Capture the selected viewport rect, then open the composer for a region comment. */\n private async finishRegion(vp: RegionRect) {\n // Anchor the region to the element under its center so it survives reflow.\n const centerEl = this.pick(vp.x + vp.w / 2, vp.y + vp.h / 2);\n let rel: RegionRect[\"rel\"];\n if (centerEl) {\n const er = centerEl.getBoundingClientRect();\n if (er.width > 0 && er.height > 0) {\n rel = {\n fx: (vp.x - er.left) / er.width, fy: (vp.y - er.top) / er.height,\n fw: vp.w / er.width, fh: vp.h / er.height,\n };\n }\n }\n const capture = this.cfg.captureRegion ?? captureRegionScreenshot;\n const screenshot = await capture(vp);\n this.selbox.style.display = \"none\";\n // Document coords are the fallback; `rel` (element-relative) is preferred.\n const region: RegionRect = { x: vp.x + window.scrollX, y: vp.y + window.scrollY, w: vp.w, h: vp.h, rel };\n this.openComposer({ kind: \"region\", region, element: centerEl, screenshot }, vp.x + vp.w, vp.y);\n }\n\n /** elementFromPoint, ignoring our own UI. */\n private pick(x: number, y: number): Element | null {\n const hitHl = this.hl.style.display;\n this.hl.style.display = \"none\"; // never let the highlight itself be the hit\n const elAt = document.elementFromPoint(x, y);\n this.hl.style.display = hitHl;\n if (!elAt) return null;\n if (elAt.id === \"loupe-root\" || (elAt as Element).closest?.(\"#loupe-root\")) return null;\n return elAt;\n }\n\n private setMode(mode: Mode) {\n this.mode = mode;\n this.hl.style.display = \"none\";\n this.selbox.style.display = \"none\";\n this.cancelDrag();\n document.body.style.cursor = mode === \"off\" ? \"\" : \"crosshair\";\n (this.toolbar.querySelector('[data-role=\"inspect\"]') as HTMLElement)?.classList.toggle(\"on\", mode === \"inspect\");\n (this.toolbar.querySelector('[data-role=\"region\"]') as HTMLElement)?.classList.toggle(\"on\", mode === \"region\");\n\n document.removeEventListener(\"mousemove\", this.onMove, true);\n document.removeEventListener(\"click\", this.onClick, true);\n document.removeEventListener(\"mousedown\", this.onRegionDown, true);\n\n if (mode === \"off\") return;\n document.addEventListener(\"keydown\", this.onKey, true);\n this.closeComposer();\n if (mode === \"inspect\") {\n document.addEventListener(\"mousemove\", this.onMove, true);\n document.addEventListener(\"click\", this.onClick, true);\n } else if (mode === \"region\") {\n document.addEventListener(\"mousedown\", this.onRegionDown, true);\n }\n }\n\n // ---- composer -------------------------------------------------------------\n\n private openComposer(target: ComposeTarget, x: number, y: number) {\n this.pending = target;\n const c = this.composer;\n c.innerHTML = \"\";\n const label = el(\"div\", \"target\",\n target.kind === \"element\" ? describe(target.element)\n : `Region · ${Math.round(target.region.w)}×${Math.round(target.region.h)} px`);\n const ta = el(\"textarea\") as HTMLTextAreaElement;\n ta.placeholder = target.kind === \"region\" ? \"What's the issue in this area?\" : \"What should change here?\";\n const row = el(\"div\", \"row\");\n const chk = el(\"label\", \"chk\") as HTMLLabelElement;\n const box = document.createElement(\"input\"); box.type = \"checkbox\";\n // Region shots already captured the pixels; only offer to attach if we got them.\n box.checked = target.kind === \"region\" ? !!target.screenshot : true;\n if (target.kind === \"region\" && !target.screenshot) box.disabled = true;\n chk.append(box, document.createTextNode(\"Attach screenshot\"));\n const btns = el(\"div\", \"btns\");\n const cancel = el(\"button\", \"ghost\", \"Cancel\") as HTMLButtonElement;\n cancel.onclick = () => this.closeComposer();\n const save = el(\"button\", \"primary\", \"Comment\") as HTMLButtonElement;\n save.disabled = true;\n ta.oninput = () => { save.disabled = !ta.value.trim(); };\n save.onclick = () => this.submit(target, ta.value.trim(), box.checked);\n btns.append(cancel, save);\n row.append(chk, btns);\n c.append(label, ta, row);\n\n // Position near the click, clamped to the viewport.\n const w = 300, h = 190;\n const left = Math.min(Math.max(8, x + 12), window.innerWidth - w - 8);\n const top = Math.min(Math.max(8, y + 12), window.innerHeight - h - 8);\n Object.assign(c.style, { display: \"block\", left: left + \"px\", top: top + \"px\" });\n ta.focus();\n }\n\n private closeComposer() {\n this.composer.style.display = \"none\";\n this.pending = null;\n }\n\n private async submit(target: ComposeTarget, body: string, withShot: boolean) {\n if (!body) return;\n const saveBtn = this.composer.querySelector(\".primary\") as HTMLButtonElement;\n if (saveBtn) { saveBtn.disabled = true; saveBtn.textContent = \"Saving…\"; }\n\n let anchor: Anchor, context: Comment[\"context\"], offset: Comment[\"offset\"];\n let screenshot: string | undefined;\n let region: RegionRect | undefined;\n let anchoredEl: Element | null = null;\n\n if (target.kind === \"element\") {\n const capture = this.cfg.captureScreenshot ?? captureScreenshot;\n screenshot = withShot ? await capture(target.element) : undefined;\n anchor = captureAnchor(target.element);\n context = captureElementContext(target.element);\n offset = this.targetOffset;\n anchoredEl = target.element;\n } else {\n screenshot = withShot ? target.screenshot : undefined;\n region = target.region;\n offset = { x: 0, y: 0 };\n // Prefer the real center-element anchor (survives reflow + gives Claude a\n // real element); fall back to a synthetic region anchor when there's none.\n if (target.element) {\n anchor = captureAnchor(target.element);\n context = captureElementContext(target.element);\n anchoredEl = target.element;\n } else {\n anchor = regionAnchor(region);\n context = { html: regionNote(region), styles: {} };\n }\n }\n\n const comment: Comment = {\n id: uid(),\n projectKey: this.cfg.projectKey,\n url: this.url,\n author: this.cfg.user,\n body,\n status: \"open\",\n kind: target.kind,\n anchor,\n context,\n offset,\n region,\n screenshot,\n createdAt: new Date().toISOString(),\n };\n await this.store.save(comment);\n this.comments.push(comment);\n this.resolved.set(comment.id, anchoredEl);\n this.closeComposer();\n this.renderPins();\n this.renderPanel();\n this.flash(comment.id);\n }\n\n // ---- pins + re-anchoring --------------------------------------------------\n\n private renderPins() {\n // Remove pins for deleted comments.\n for (const [id, pin] of this.pins) {\n if (!this.comments.find((c) => c.id === id)) { pin.remove(); this.pins.delete(id); }\n }\n this.comments.forEach((c, i) => {\n let pin = this.pins.get(c.id);\n if (!pin) {\n pin = el(\"button\", \"pin\") as HTMLButtonElement;\n pin.onclick = () => { this.openPanel(); this.flash(c.id); };\n this.overlay.appendChild(pin);\n this.pins.set(c.id, pin);\n }\n pin.textContent = String(i + 1);\n pin.classList.toggle(\"done\", c.status === \"done\");\n });\n this.countEl.textContent = String(this.comments.length);\n this.position();\n }\n\n /** Reposition every pin, re-resolving anchors whose element has gone. */\n private position = () => {\n for (const c of this.comments) {\n const pin = this.pins.get(c.id);\n if (!pin) continue;\n\n let elx = this.resolved.get(c.id) ?? null;\n if (!elx || !elx.isConnected) {\n const r = resolveAnchor(c.anchor);\n elx = r?.element ?? null;\n this.resolved.set(c.id, elx);\n }\n\n if (c.kind === \"region\") {\n // Compute the region's live viewport rect from its anchor element; fall\n // back to stored document coords (older data / no anchor found).\n const box = this.regionRect(c, elx);\n if (box) {\n const onScreen = box.x + box.w > 0 && box.x < window.innerWidth && box.y + box.h > 0 && box.y < window.innerHeight;\n Object.assign(pin.style, { left: box.x + \"px\", top: box.y + \"px\", display: onScreen ? \"grid\" : \"none\" });\n pin.classList.toggle(\"detached\", !elx && !c.region?.rel);\n } else {\n pin.style.display = \"none\";\n pin.classList.add(\"detached\");\n }\n continue;\n }\n\n if (elx) {\n const rect = elx.getBoundingClientRect();\n const px = rect.left + c.offset.x * rect.width;\n const py = rect.top + c.offset.y * rect.height;\n const onScreen = rect.bottom > 0 && rect.top < window.innerHeight && rect.width > 0;\n Object.assign(pin.style, { left: px + \"px\", top: py + \"px\", display: onScreen ? \"grid\" : \"none\" });\n pin.classList.remove(\"detached\");\n } else {\n pin.style.display = \"none\";\n pin.classList.add(\"detached\");\n }\n }\n\n // Keep the highlighted region outline glued to its live rect while scrolling.\n if (this.activeRegionId) {\n const c = this.comments.find((x) => x.id === this.activeRegionId);\n const box = c && this.regionRect(c, this.resolved.get(c.id) ?? null);\n if (box) {\n Object.assign(this.regionBox.style, {\n display: \"block\", left: box.x + \"px\", top: box.y + \"px\", width: box.w + \"px\", height: box.h + \"px\",\n });\n }\n }\n };\n\n /**\n * The current viewport rect for a region comment. Prefers the element-relative\n * fractions (so it tracks reflow across viewports); falls back to the stored\n * document coordinates minus scroll. Returns null if neither is available.\n */\n private regionRect(c: Comment, elx: Element | null): { x: number; y: number; w: number; h: number } | null {\n const rel = c.region?.rel;\n if (elx && rel) {\n const r = elx.getBoundingClientRect();\n return { x: r.left + rel.fx * r.width, y: r.top + rel.fy * r.height, w: rel.fw * r.width, h: rel.fh * r.height };\n }\n if (c.region) {\n return { x: c.region.x - window.scrollX, y: c.region.y - window.scrollY, w: c.region.w, h: c.region.h };\n }\n return null;\n }\n\n private observe() {\n const reposition = () => {\n cancelAnimationFrame(this.raf);\n this.raf = requestAnimationFrame(this.position);\n };\n window.addEventListener(\"scroll\", reposition, true);\n window.addEventListener(\"resize\", reposition);\n let debounce = 0;\n this.mo = new MutationObserver(() => {\n clearTimeout(debounce);\n debounce = window.setTimeout(() => { this.position(); this.renderPanel(); }, 120);\n });\n this.mo.observe(document.body, { childList: true, subtree: true, attributes: true, characterData: true });\n // Safety net for animated / late-loading layouts.\n this.tick = window.setInterval(this.position, 800);\n }\n\n // ---- panel ----------------------------------------------------------------\n\n private openPanel() { this.panel.classList.add(\"open\"); this.renderPanel(); }\n private togglePanel() { this.panel.classList.toggle(\"open\"); this.renderPanel(); }\n\n /** Collapse the toolbar to just the logo (or expand it back). */\n private toggleCollapsed() {\n this.collapsed = !this.collapsed;\n this.toolbar.classList.toggle(\"collapsed\", this.collapsed);\n if (this.collapsed) {\n // Leave any active mode and close the panel/composer when shrinking.\n this.setMode(\"off\");\n this.panel.classList.remove(\"open\");\n this.closeComposer();\n }\n }\n\n private renderPanel() {\n const p = this.panel;\n p.innerHTML = \"\";\n const head = el(\"div\", \"phead\");\n head.append(document.createTextNode(`Comments · ${this.comments.length}`));\n const x = el(\"button\", \"x\", \"×\") as HTMLButtonElement;\n x.onclick = () => p.classList.remove(\"open\");\n head.appendChild(x);\n p.appendChild(head);\n\n const list = el(\"div\", \"list\");\n if (!this.comments.length) {\n list.appendChild(el(\"div\", \"empty\", \"No comments yet. Click “Inspect & comment”, then click any element.\"));\n }\n this.comments.forEach((c, i) => list.appendChild(this.itemView(c, i)));\n p.appendChild(list);\n }\n\n private itemView(c: Comment, i: number): HTMLElement {\n const detached = this.pins.get(c.id)?.classList.contains(\"detached\") && c.status !== \"done\";\n const item = el(\"div\", \"item\");\n const top = el(\"div\", \"top\");\n const num = el(\"span\", \"num\" + (c.status === \"done\" ? \" done\" : detached ? \" detached\" : \"\"), String(i + 1));\n const who = el(\"span\", \"who\", c.author.name);\n top.append(num, who);\n if (c.status === \"done\") top.appendChild(el(\"span\", \"badge done\", \"done\"));\n else if (detached) top.appendChild(el(\"span\", \"badge detached\", \"element moved/removed\"));\n item.appendChild(top);\n\n item.appendChild(el(\"div\", \"body\", c.body));\n item.appendChild(el(\"div\", \"meta\", describeAnchor(c)));\n\n if (c.screenshot) {\n const img = el(\"img\", \"shot\") as HTMLImageElement;\n img.src = c.screenshot;\n item.appendChild(img);\n }\n\n const actions = el(\"div\", \"actions\");\n const doneBtn = el(\"button\", \"\", c.status === \"done\" ? \"Reopen\" : \"Mark done\") as HTMLButtonElement;\n doneBtn.onclick = async (e) => {\n e.stopPropagation();\n const status = c.status === \"done\" ? \"open\" : \"done\";\n c.status = status; await this.store.update(c.id, { status });\n this.renderPins(); this.renderPanel();\n };\n const claudeBtn = el(\"button\", \"\", \"Copy for Claude\") as HTMLButtonElement;\n claudeBtn.onclick = async (e) => { e.stopPropagation(); await this.copyForClaude(c); claudeBtn.textContent = \"Copied ✓\"; };\n const del = el(\"button\", \"\", \"Delete\") as HTMLButtonElement;\n del.onclick = async (e) => {\n e.stopPropagation();\n await this.store.remove(c.id);\n this.comments = this.comments.filter((x) => x.id !== c.id);\n this.resolved.delete(c.id);\n this.renderPins(); this.renderPanel();\n };\n actions.append(doneBtn, claudeBtn, del);\n item.appendChild(actions);\n\n item.onclick = () => this.flash(c.id);\n return item;\n }\n\n private async copyForClaude(c: Comment) {\n const prompt = [\n `# Product feedback from ${c.author.name}`,\n ``,\n `**Comment:** ${c.body}`,\n `**Page:** ${c.url}`,\n `**Element:** \\`${c.anchor.cssPath}\\``,\n c.anchor.testid ? `**Stable id:** \\`${c.anchor.testid}\\`` : ``,\n ``,\n `## Target element`,\n \"```html\",\n c.context.html,\n \"```\",\n ``,\n `## Computed styles`,\n \"```json\",\n JSON.stringify(c.context.styles, null, 2),\n \"```\",\n ].filter(Boolean).join(\"\\n\");\n try { await navigator.clipboard.writeText(prompt); } catch { console.log(\"[loupe] copy failed; prompt:\\n\" + prompt); }\n }\n\n private flash(id: string) {\n const c = this.comments.find((x) => x.id === id);\n const pin = this.pins.get(id);\n\n if (c?.kind === \"region\" && c.region) {\n for (const p of this.pins.values()) p.classList.remove(\"active\");\n pin?.classList.add(\"active\");\n // Show the outline, keep it tracking scroll, then fade it out.\n this.activeRegionId = id;\n window.clearTimeout(this.regionTimer);\n this.regionTimer = window.setTimeout(() => {\n this.activeRegionId = null;\n this.regionBox.style.display = \"none\";\n }, 2400);\n // Scroll to the anchor element when we have it (correct across reflow),\n // otherwise to the stored document position.\n const elx = this.resolved.get(id);\n if (elx) elx.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n else window.scrollTo({ top: Math.max(0, c.region.y - 120), left: Math.max(0, c.region.x - 120), behavior: \"smooth\" });\n this.position();\n return;\n }\n\n if (!pin || pin.classList.contains(\"detached\")) return;\n for (const p of this.pins.values()) p.classList.remove(\"active\");\n pin.classList.add(\"active\");\n const elx = this.resolved.get(id);\n if (elx) elx.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n }\n\n destroy() {\n this.setMode(\"off\");\n this.mo?.disconnect();\n if (this.tick) clearInterval(this.tick);\n window.clearTimeout(this.regionTimer);\n document.removeEventListener(\"keydown\", this.onKey, true);\n this.root?.remove();\n }\n}\n\n// ---- tiny DOM helpers -------------------------------------------------------\n\nfunction el<K extends keyof HTMLElementTagNameMap>(tag: K, cls = \"\", text = \"\"): HTMLElementTagNameMap[K] {\n const n = document.createElement(tag);\n if (cls) n.className = cls;\n if (text) n.textContent = text;\n return n;\n}\nfunction sep() { return el(\"span\", \"sep\"); }\nfunction clamp(n: number) { return Math.max(0, Math.min(1, n)); }\n\n/** Dashed marquee icon for the \"Region shot\" button — inline SVG so it never depends on a font. */\nconst REGION_ICON =\n `<svg class=\"ico\" width=\"15\" height=\"15\" viewBox=\"0 0 15 15\" fill=\"none\" aria-hidden=\"true\">` +\n `<rect x=\"1.5\" y=\"2.5\" width=\"12\" height=\"10\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-dasharray=\"2.4 1.8\"/>` +\n `</svg>`;\n\n/** Synthesize an Anchor for a free region so downstream (dashboard/MCP) stays happy. */\nfunction regionAnchor(region: RegionRect): Anchor {\n return {\n tag: \"region\",\n cssPath: `region ${Math.round(region.w)}×${Math.round(region.h)}`,\n xpath: \"\",\n testid: null,\n text: \"\",\n attrs: {},\n nthOfType: 1,\n rect: { x: Math.round(region.x), y: Math.round(region.y), w: Math.round(region.w), h: Math.round(region.h) },\n viewport: { w: window.innerWidth, h: window.innerHeight },\n };\n}\nfunction regionNote(region: RegionRect): string {\n return `<!-- Loupe free-region annotation: ${Math.round(region.w)}×${Math.round(region.h)}px at document (${Math.round(region.x)}, ${Math.round(region.y)}). No single DOM element — see the attached screenshot. -->`;\n}\n\nfunction describe(elx: Element): string {\n const testid = elx.getAttribute(\"data-testid\") || elx.getAttribute(\"data-test\");\n const tag = elx.tagName.toLowerCase();\n if (testid) return `${tag}[data-testid=\"${testid}\"]`;\n if (elx.id) return `${tag}#${elx.id}`;\n const txt = (elx.textContent || \"\").trim().replace(/\\s+/g, \" \").slice(0, 32);\n return txt ? `${tag} · “${txt}”` : tag;\n}\nfunction describeAnchor(c: Comment): string {\n return c.anchor.testid ? `[data-testid=\"${c.anchor.testid}\"]` : c.anchor.cssPath;\n}\n","import { LoupeApp } from \"./app.js\";\nimport type { LoupeConfig } from \"./types.js\";\n\nexport type { LoupeConfig, LoupeUser, Comment, Anchor, RegionRect } from \"./types.js\";\n\nlet app: LoupeApp | null = null;\n\n/**\n * Initialize Loupe on the current page. Call once, after your app knows who the\n * user is. The toolbar renders only for the identified user.\n *\n * Loupe.init({ projectKey: \"pk_live_…\", user: { id, name, email }, userHmac });\n */\nexport function init(config: LoupeConfig): void {\n if (app) return; // idempotent\n if (!config?.projectKey) { console.error(\"[loupe] init requires a projectKey\"); return; }\n if (!config.user?.id) { console.error(\"[loupe] init requires user.id\"); return; }\n // NOTE: in production the backend verifies config.userHmac before serving data.\n app = new LoupeApp(config);\n const boot = () => app!.start();\n if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", boot);\n else boot();\n}\n\n/** Tear down the toolbar and all listeners. */\nexport function destroy(): void {\n app?.destroy();\n app = null;\n}\n"],"mappings":"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","names":["el","el","el","init","uid","elx"]}
1
+ {"version":3,"sources":["../src/styles.ts","../src/fingerprint.ts","../../../node_modules/modern-screenshot/dist/index.mjs","../src/capture.ts","../src/store.ts","../src/http-adapter.ts","../src/app.ts","../src/index.ts"],"sourcesContent":["// Scoped to the Shadow DOM — none of this leaks to (or is affected by) the host page.\nexport const STYLES = /* css */ `\n:host { all: initial; }\n* { box-sizing: border-box; font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif; }\n\n/* Custom properties must live on :host — inside the Shadow DOM, :root matches\n nothing and no element carries a .loupe class, so they'd never resolve. */\n:host {\n --accent: #4a55d6;\n --pin: #ff5842;\n --ink: #16181f;\n --panel: #ffffff;\n --panel-2: #f4f5f9;\n --line: #e2e5ee;\n --muted: #6b7180;\n}\n\n.overlay {\n position: fixed; inset: 0; z-index: 2147483000; pointer-events: none;\n}\n\n/* inspector highlight */\n.hl {\n position: fixed; pointer-events: none; z-index: 2147483001;\n border: 2px solid var(--accent);\n background: rgba(74, 85, 214, 0.10);\n border-radius: 4px; display: none;\n transition: all 60ms linear;\n}\n.hl .tip {\n position: absolute; top: -24px; left: 0; background: var(--accent); color: #fff;\n font-size: 11px; font-weight: 600; padding: 2px 7px; border-radius: 4px; white-space: nowrap;\n font-family: ui-monospace, Menlo, monospace;\n}\n\n/* region selection (during drag) + active-comment outline */\n.selbox {\n position: fixed; pointer-events: none; z-index: 2147483001; display: none;\n border: 2px dashed var(--accent); background: rgba(74, 85, 214, 0.12); border-radius: 4px;\n}\n.region-box {\n position: fixed; pointer-events: none; z-index: 2147483001; display: none;\n border: 2px solid var(--pin); border-radius: 4px;\n box-shadow: 0 0 0 2px rgba(255, 88, 66, .25), 0 4px 16px rgba(0,0,0,.25);\n}\n\n/* pins */\n.pin {\n position: fixed; pointer-events: auto; z-index: 2147483002;\n width: 26px; height: 26px; border-radius: 50% 50% 50% 2px;\n background: var(--pin); color: #fff; border: 2px solid #fff;\n font-size: 12px; font-weight: 700; cursor: pointer;\n box-shadow: 0 2px 8px rgba(0,0,0,.35);\n display: grid; place-items: center; transform: translate(-4px, -4px);\n transition: transform 80ms ease;\n}\n.pin:hover { transform: translate(-4px, -4px) scale(1.12); }\n.pin.detached { background: #9aa0af; }\n.pin.done { background: #10935a; }\n.pin.active { outline: 3px solid rgba(74,85,214,.4); }\n\n/* toolbar */\n.toolbar {\n position: fixed; bottom: 20px; left: 50%; transform: translateX(-50%);\n z-index: 2147483003; pointer-events: auto;\n display: flex; align-items: center; gap: 4px;\n background: #1b1e27; color: #fff; padding: 6px; border-radius: 12px;\n box-shadow: 0 8px 30px rgba(0,0,0,.4); border: 1px solid #2b2f3b;\n}\n/* every toolbar item (brand + buttons) shares one icon+label layout so they align */\n.toolbar button, .toolbar .brand {\n display: flex; align-items: center; gap: 6px;\n padding: 8px 12px; border-radius: 8px;\n font-size: 13px; font-weight: 500; line-height: 1;\n}\n.toolbar button {\n background: transparent; color: #cfd3de; border: 0; cursor: pointer;\n}\n.toolbar button:hover, .toolbar .brand:hover { background: #2b2f3b; color: #fff; }\n.toolbar .ico { flex: none; display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px; }\n.toolbar .ico svg { width: 16px; height: 16px; display: block; }\n.toolbar .label { white-space: nowrap; }\n.toolbar button.on { background: var(--accent); color: #fff; }\n.toolbar .sep { width: 1px; height: 20px; background: #333846; margin: 0 2px; }\n.toolbar .brand {\n font-weight: 700; letter-spacing: -.01em; cursor: pointer; user-select: none;\n}\n/* collapsed → show only the brand/logo; click it again to expand */\n.toolbar.collapsed { gap: 0; }\n.toolbar.collapsed > *:not(.brand) { display: none; }\n.toolbar .count {\n background: var(--pin); color: #fff; font-size: 11px; font-weight: 700;\n border-radius: 999px; padding: 1px 7px; margin-left: 2px;\n}\n\n/* mobile → compact, icon-only, pinned to the left */\n@media (max-width: 640px) {\n .toolbar { left: 12px; right: auto; transform: none; bottom: 12px; padding: 4px; gap: 2px; }\n .toolbar .label { display: none; }\n .toolbar button, .toolbar .brand { padding: 10px; }\n .toolbar .sep { display: none; }\n .toolbar .count { position: absolute; top: -4px; right: -4px; margin: 0; }\n .toolbar [data-role=\"comments\"] { position: relative; }\n}\n\n/* composer popover */\n.composer {\n position: fixed; z-index: 2147483004; pointer-events: auto; width: 300px;\n background: var(--panel); color: var(--ink); border: 1px solid var(--line);\n border-radius: 12px; box-shadow: 0 12px 40px rgba(0,0,0,.22); padding: 12px; display: none;\n}\n.composer .target {\n font-family: ui-monospace, Menlo, monospace; font-size: 11px; color: var(--accent);\n background: var(--panel-2); border-radius: 6px; padding: 5px 8px; margin-bottom: 8px;\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n}\n.composer textarea {\n width: 100%; min-height: 68px; resize: vertical; border: 1px solid var(--line);\n border-radius: 8px; padding: 8px; font-size: 13px; color: var(--ink); outline: none;\n}\n.composer textarea:focus { border-color: var(--accent); }\n.composer .row { display: flex; align-items: center; justify-content: space-between; margin-top: 8px; gap: 8px; }\n.composer label.chk { font-size: 12px; color: var(--muted); display: flex; align-items: center; gap: 6px; cursor: pointer; }\n.composer .btns { display: flex; gap: 6px; }\n.composer button {\n border: 0; border-radius: 8px; font-size: 13px; font-weight: 600; padding: 7px 12px; cursor: pointer;\n}\n.composer .primary { background: var(--accent); color: #fff; }\n.composer .primary:disabled { opacity: .5; cursor: default; }\n.composer .ghost { background: var(--panel-2); color: var(--ink); }\n\n/* panel (comment list) */\n.panel {\n position: fixed; right: 16px; bottom: 80px; top: 16px; width: 340px;\n z-index: 2147483003; pointer-events: auto; display: none; flex-direction: column;\n background: var(--panel); color: var(--ink); border: 1px solid var(--line);\n border-radius: 14px; box-shadow: 0 12px 40px rgba(0,0,0,.22); overflow: hidden;\n}\n.panel.open { display: flex; }\n.panel .phead { padding: 14px 16px; border-bottom: 1px solid var(--line); font-weight: 700; display:flex; justify-content:space-between; align-items:center; }\n.panel .phead .x { cursor:pointer; color: var(--muted); background:none; border:0; font-size:18px; }\n.panel .list { overflow-y: auto; padding: 8px; display: flex; flex-direction: column; gap: 8px; }\n.panel .empty { color: var(--muted); font-size: 13px; padding: 24px 12px; text-align: center; }\n.item {\n border: 1px solid var(--line); border-radius: 10px; padding: 10px; cursor: pointer; background: var(--panel);\n}\n.item:hover { border-color: var(--accent); }\n.item .top { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; }\n.item .num { background: var(--pin); color:#fff; width:20px; height:20px; border-radius:50%; font-size:11px; font-weight:700; display:grid; place-items:center; }\n.item .num.detached { background:#9aa0af; }\n.item .num.done { background:#10935a; }\n.item .who { font-size: 12px; font-weight: 600; }\n.item .device { font-size: 10px; color: var(--muted); background: var(--panel-2); border-radius: 999px; padding: 1px 7px; white-space: nowrap; }\n.item .body { font-size: 13px; line-height: 1.4; }\n.item .meta { font-size: 11px; color: var(--muted); margin-top: 6px; font-family: ui-monospace, Menlo, monospace; }\n.item .badge { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; padding: 1px 6px; border-radius: 5px; margin-left: auto; }\n.badge.detached { background: #eceef2; color: #6b7180; }\n.badge.done { background: #d8f0e4; color: #10935a; }\n.item .actions { display: flex; gap: 6px; margin-top: 8px; }\n.item .actions button { font-size: 11px; border: 1px solid var(--line); background: var(--panel-2); border-radius: 6px; padding: 4px 8px; cursor: pointer; color: var(--ink); }\n.item img.shot { width: 100%; border-radius: 6px; margin-top: 8px; border: 1px solid var(--line); }\n`;\n","import type { Anchor, ResolveResult } from \"./types.js\";\n\n// ---- config ----------------------------------------------------------------\n\nconst TEXT_MAX = 120;\nconst ATTR_KEYS = [\"role\", \"aria-label\", \"name\", \"type\", \"alt\", \"href\", \"placeholder\", \"title\"];\n/** Minimum composite score to accept a scan match. Below this we treat the element as gone. */\nconst ACCEPT_THRESHOLD = 0.5;\n/** Weights for the composite similarity score (sum need not be 1; we normalize). */\nconst W = { tag: 0.12, text: 0.34, attrs: 0.22, testid: 0.22, cssPath: 0.2, position: 0.1 };\n\n// ---- capture ----------------------------------------------------------------\n\nexport function captureAnchor(el: Element): Anchor {\n const rect = el.getBoundingClientRect();\n return {\n tag: el.tagName.toLowerCase(),\n cssPath: cssPath(el),\n xpath: xPath(el),\n testid: stableId(el),\n text: normText(el.textContent),\n attrs: readAttrs(el),\n nthOfType: nthOfType(el),\n rect: {\n x: Math.round(rect.left + window.scrollX),\n y: Math.round(rect.top + window.scrollY),\n w: Math.round(rect.width),\n h: Math.round(rect.height),\n },\n viewport: { w: window.innerWidth, h: window.innerHeight },\n };\n}\n\n// ---- resolve ----------------------------------------------------------------\n\n/**\n * Try to re-locate the element described by `anchor` on the current page.\n * Returns the best candidate above threshold, or null (→ caller falls back to\n * a coordinate pin on the screenshot). Never returns an element inside our own UI.\n */\nexport function resolveAnchor(anchor: Anchor, root: ParentNode = document): ResolveResult | null {\n // 1. Stable id / testid — the strongest signal. Accept immediately if unique.\n if (anchor.testid) {\n const byTestid = safeQueryAll(root, `[data-testid=\"${cssStr(anchor.testid)}\"], [data-test=\"${cssStr(anchor.testid)}\"]`);\n const byId = document.getElementById(anchor.testid);\n const hits = dedupe([...byTestid, ...(byId ? [byId] : [])]).filter(usable);\n if (hits.length === 1) return { element: hits[0]!, score: 0.98, via: \"testid\" };\n // Multiple matches → fall through to scoring to disambiguate.\n }\n\n // 1.5. A cssPath rooted at a stable id/testid + structural position is\n // high-confidence even when the element's own text/content has changed\n // (e.g. a value that updates on redeploy). Require the tag to still match.\n if (/^(\\[data-testid=|#)/.test(anchor.cssPath)) {\n const hits = safeQueryAll(root, anchor.cssPath).filter(usable);\n if (hits.length === 1 && hits[0]!.tagName.toLowerCase() === anchor.tag) {\n return { element: hits[0]!, score: 0.9, via: \"cssPath\" };\n }\n }\n\n const candidates = new Map<Element, ResolveResult[\"via\"]>();\n const consider = (el: Element | null, via: ResolveResult[\"via\"]) => {\n if (el && usable(el) && !candidates.has(el)) candidates.set(el, via);\n };\n\n // 2. Exact locators.\n consider(safeQuery(root, anchor.cssPath), \"cssPath\");\n consider(byXPath(anchor.xpath), \"xpath\");\n for (const el of safeQueryAll(root, anchor.tag)) consider(el, \"scan\");\n\n // 3. Broaden by text when the tag scan is too narrow (e.g. wrapper changed tag).\n if (anchor.text) {\n for (const el of safeQueryAll(root, \"*\")) {\n if (candidates.size > 4000) break; // safety cap on huge pages\n if (normText(el.textContent) === anchor.text) consider(el, \"scan\");\n }\n }\n\n let best: ResolveResult | null = null;\n for (const [el, via] of candidates) {\n const score = similarity(anchor, el, via);\n if (!best || score > best.score) best = { element: el, score, via };\n }\n return best && best.score >= ACCEPT_THRESHOLD ? best : null;\n}\n\nfunction similarity(a: Anchor, el: Element, via: ResolveResult[\"via\"]): number {\n let sum = 0;\n let total = 0;\n\n const add = (w: number, v: number) => { sum += w * v; total += w; };\n\n add(W.tag, el.tagName.toLowerCase() === a.tag ? 1 : 0);\n\n if (a.text) {\n const t = normText(el.textContent);\n add(W.text, t === a.text ? 1 : t && (t.includes(a.text) || a.text.includes(t)) ? 0.5 : 0);\n }\n\n const attrKeys = Object.keys(a.attrs);\n if (attrKeys.length) {\n let matched = 0;\n for (const k of attrKeys) if (el.getAttribute(k) === a.attrs[k]) matched++;\n add(W.attrs, matched / attrKeys.length);\n }\n\n if (a.testid) add(W.testid, stableId(el) === a.testid ? 1 : 0);\n\n add(W.cssPath, via === \"cssPath\" ? 1 : 0);\n\n // Positional proximity — normalized by the (possibly changed) viewport diagonal.\n const r = el.getBoundingClientRect();\n const cx = r.left + window.scrollX + r.width / 2;\n const cy = r.top + window.scrollY + r.height / 2;\n const ax = a.rect.x + a.rect.w / 2;\n const ay = a.rect.y + a.rect.h / 2;\n const diag = Math.hypot(a.viewport.w, a.viewport.h) || 1;\n const dist = Math.hypot(cx - ax, cy - ay);\n add(W.position, Math.max(0, 1 - dist / diag));\n\n return total ? sum / total : 0;\n}\n\n// ---- locator builders -------------------------------------------------------\n\nfunction cssPath(el: Element): string {\n const segs: string[] = [];\n let node: Element | null = el;\n while (node && node.nodeType === 1 && node !== document.documentElement) {\n const id = node.getAttribute(\"id\");\n const testid = node.getAttribute(\"data-testid\") || node.getAttribute(\"data-test\");\n if (id && isStable(id)) { segs.unshift(`#${cssEsc(id)}`); break; }\n if (testid) { segs.unshift(`[data-testid=\"${cssStr(testid)}\"]`); break; }\n segs.unshift(`${node.tagName.toLowerCase()}:nth-of-type(${nthOfType(node)})`);\n node = node.parentElement;\n if (node === document.body) { segs.unshift(\"body\"); break; }\n }\n return segs.join(\" > \");\n}\n\nfunction xPath(el: Element): string {\n const segs: string[] = [];\n let node: Element | null = el;\n while (node && node.nodeType === 1 && node !== document.documentElement) {\n segs.unshift(`${node.tagName.toLowerCase()}[${nthOfType(node)}]`);\n node = node.parentElement;\n }\n return \"/html/\" + segs.join(\"/\");\n}\n\n// ---- small helpers ----------------------------------------------------------\n\nfunction nthOfType(el: Element): number {\n let i = 1;\n let sib = el.previousElementSibling;\n while (sib) {\n if (sib.tagName === el.tagName) i++;\n sib = sib.previousElementSibling;\n }\n return i;\n}\n\nfunction stableId(el: Element): string | null {\n const testid = el.getAttribute(\"data-testid\") || el.getAttribute(\"data-test\");\n if (testid) return testid;\n const id = el.getAttribute(\"id\");\n return id && isStable(id) ? id : null;\n}\n\n/** Reject framework-generated ids (e.g. \":r3:\", \"ember42\", long hashes). */\nfunction isStable(id: string): boolean {\n if (id.length > 40) return false;\n if (/^(ember|react|radix|headlessui|:r)/i.test(id)) return false;\n if (/[:]/.test(id)) return false;\n return true;\n}\n\nfunction readAttrs(el: Element): Record<string, string> {\n const out: Record<string, string> = {};\n for (const k of ATTR_KEYS) {\n const v = el.getAttribute(k);\n if (v != null && v !== \"\") out[k] = v.length > 200 ? v.slice(0, 200) : v;\n }\n return out;\n}\n\nfunction normText(t: string | null): string {\n return (t || \"\").replace(/\\s+/g, \" \").trim().slice(0, TEXT_MAX);\n}\n\n/** Exclude anything inside our own Shadow-DOM host and non-visible nodes. */\nfunction usable(el: Element): boolean {\n if (el.id === \"loupe-root\" || el.closest(\"#loupe-root\")) return false;\n if (el === document.body || el === document.documentElement) return false;\n return true;\n}\n\nfunction byXPath(xp: string): Element | null {\n try {\n const r = document.evaluate(xp, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);\n return r.singleNodeValue instanceof Element ? r.singleNodeValue : null;\n } catch {\n return null;\n }\n}\n\nfunction safeQuery(root: ParentNode, sel: string): Element | null {\n try { return sel ? root.querySelector(sel) : null; } catch { return null; }\n}\nfunction safeQueryAll(root: ParentNode, sel: string): Element[] {\n try { return sel ? Array.from(root.querySelectorAll(sel)) : []; } catch { return []; }\n}\nfunction dedupe(els: Element[]): Element[] {\n return Array.from(new Set(els));\n}\nfunction cssEsc(s: string): string {\n return (window.CSS && CSS.escape) ? CSS.escape(s) : s.replace(/[\"\\\\]/g, \"\\\\$&\");\n}\n/** Escape a value for use inside a double-quoted attribute selector. */\nfunction cssStr(s: string): string {\n return s.replace(/[\"\\\\]/g, \"\\\\$&\");\n}\n","function changeJpegDpi(uint8Array, dpi) {\n uint8Array[13] = 1;\n uint8Array[14] = dpi >> 8;\n uint8Array[15] = dpi & 255;\n uint8Array[16] = dpi >> 8;\n uint8Array[17] = dpi & 255;\n return uint8Array;\n}\n\nconst _P = \"p\".charCodeAt(0);\nconst _H = \"H\".charCodeAt(0);\nconst _Y = \"Y\".charCodeAt(0);\nconst _S = \"s\".charCodeAt(0);\nlet pngDataTable;\nfunction createPngDataTable() {\n const crcTable = new Int32Array(256);\n for (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) {\n c = c & 1 ? 3988292384 ^ c >>> 1 : c >>> 1;\n }\n crcTable[n] = c;\n }\n return crcTable;\n}\nfunction calcCrc(uint8Array) {\n let c = -1;\n if (!pngDataTable)\n pngDataTable = createPngDataTable();\n for (let n = 0; n < uint8Array.length; n++) {\n c = pngDataTable[(c ^ uint8Array[n]) & 255] ^ c >>> 8;\n }\n return c ^ -1;\n}\nfunction searchStartOfPhys(uint8Array) {\n const length = uint8Array.length - 1;\n for (let i = length; i >= 4; i--) {\n if (uint8Array[i - 4] === 9 && uint8Array[i - 3] === _P && uint8Array[i - 2] === _H && uint8Array[i - 1] === _Y && uint8Array[i] === _S) {\n return i - 3;\n }\n }\n return 0;\n}\nfunction changePngDpi(uint8Array, dpi, overwritepHYs = false) {\n const physChunk = new Uint8Array(13);\n dpi *= 39.3701;\n physChunk[0] = _P;\n physChunk[1] = _H;\n physChunk[2] = _Y;\n physChunk[3] = _S;\n physChunk[4] = dpi >>> 24;\n physChunk[5] = dpi >>> 16;\n physChunk[6] = dpi >>> 8;\n physChunk[7] = dpi & 255;\n physChunk[8] = physChunk[4];\n physChunk[9] = physChunk[5];\n physChunk[10] = physChunk[6];\n physChunk[11] = physChunk[7];\n physChunk[12] = 1;\n const crc = calcCrc(physChunk);\n const crcChunk = new Uint8Array(4);\n crcChunk[0] = crc >>> 24;\n crcChunk[1] = crc >>> 16;\n crcChunk[2] = crc >>> 8;\n crcChunk[3] = crc & 255;\n if (overwritepHYs) {\n const startingIndex = searchStartOfPhys(uint8Array);\n uint8Array.set(physChunk, startingIndex);\n uint8Array.set(crcChunk, startingIndex + 13);\n return uint8Array;\n } else {\n const chunkLength = new Uint8Array(4);\n chunkLength[0] = 0;\n chunkLength[1] = 0;\n chunkLength[2] = 0;\n chunkLength[3] = 9;\n const finalHeader = new Uint8Array(54);\n finalHeader.set(uint8Array, 0);\n finalHeader.set(chunkLength, 33);\n finalHeader.set(physChunk, 37);\n finalHeader.set(crcChunk, 50);\n return finalHeader;\n }\n}\nconst b64PhysSignature1 = \"AAlwSFlz\";\nconst b64PhysSignature2 = \"AAAJcEhZ\";\nconst b64PhysSignature3 = \"AAAACXBI\";\nfunction detectPhysChunkFromDataUrl(dataUrl) {\n let b64index = dataUrl.indexOf(b64PhysSignature1);\n if (b64index === -1) {\n b64index = dataUrl.indexOf(b64PhysSignature2);\n }\n if (b64index === -1) {\n b64index = dataUrl.indexOf(b64PhysSignature3);\n }\n return b64index;\n}\n\nconst PREFIX = \"[modern-screenshot]\";\nconst IN_BROWSER = typeof window !== \"undefined\";\nconst SUPPORT_WEB_WORKER = IN_BROWSER && \"Worker\" in window;\nconst SUPPORT_ATOB = IN_BROWSER && \"atob\" in window;\nconst SUPPORT_BTOA = IN_BROWSER && \"btoa\" in window;\nconst USER_AGENT = IN_BROWSER ? window.navigator?.userAgent : \"\";\nconst IN_CHROME = USER_AGENT.includes(\"Chrome\");\nconst IN_SAFARI = USER_AGENT.includes(\"AppleWebKit\") && !IN_CHROME;\nconst IN_FIREFOX = USER_AGENT.includes(\"Firefox\");\nconst isContext = (value) => value && \"__CONTEXT__\" in value;\nconst isCssFontFaceRule = (rule) => rule.constructor.name === \"CSSFontFaceRule\";\nconst isCSSImportRule = (rule) => rule.constructor.name === \"CSSImportRule\";\nconst isLayerBlockRule = (rule) => rule.constructor.name === \"CSSLayerBlockRule\";\nconst isElementNode = (node) => node.nodeType === 1;\nconst isSVGElementNode = (node) => typeof node.className === \"object\";\nconst isSVGImageElementNode = (node) => node.tagName === \"image\";\nconst isSVGUseElementNode = (node) => node.tagName === \"use\";\nconst isHTMLElementNode = (node) => isElementNode(node) && typeof node.style !== \"undefined\" && !isSVGElementNode(node);\nconst isCommentNode = (node) => node.nodeType === 8;\nconst isTextNode = (node) => node.nodeType === 3;\nconst isImageElement = (node) => node.tagName === \"IMG\";\nconst isVideoElement = (node) => node.tagName === \"VIDEO\";\nconst isCanvasElement = (node) => node.tagName === \"CANVAS\";\nconst isTextareaElement = (node) => node.tagName === \"TEXTAREA\";\nconst isInputElement = (node) => node.tagName === \"INPUT\";\nconst isStyleElement = (node) => node.tagName === \"STYLE\";\nconst isScriptElement = (node) => node.tagName === \"SCRIPT\";\nconst isSelectElement = (node) => node.tagName === \"SELECT\";\nconst isSlotElement = (node) => node.tagName === \"SLOT\";\nconst isIFrameElement = (node) => node.tagName === \"IFRAME\";\nconst consoleWarn = (...args) => console.warn(PREFIX, ...args);\nfunction supportWebp(ownerDocument) {\n const canvas = ownerDocument?.createElement?.(\"canvas\");\n if (canvas) {\n canvas.height = canvas.width = 1;\n }\n return Boolean(canvas) && \"toDataURL\" in canvas && Boolean(canvas.toDataURL(\"image/webp\").includes(\"image/webp\"));\n}\nconst isDataUrl = (url) => url.startsWith(\"data:\");\nfunction resolveUrl(url, baseUrl) {\n if (url.match(/^[a-z]+:\\/\\//i))\n return url;\n if (IN_BROWSER && url.match(/^\\/\\//))\n return window.location.protocol + url;\n if (url.match(/^[a-z]+:/i))\n return url;\n if (!IN_BROWSER)\n return url;\n const doc = getDocument().implementation.createHTMLDocument();\n const base = doc.createElement(\"base\");\n const a = doc.createElement(\"a\");\n doc.head.appendChild(base);\n doc.body.appendChild(a);\n if (baseUrl)\n base.href = baseUrl;\n a.href = url;\n return a.href;\n}\nfunction getDocument(target) {\n return (target && isElementNode(target) ? target?.ownerDocument : target) ?? window.document;\n}\nconst XMLNS = \"http://www.w3.org/2000/svg\";\nfunction createSvg(width, height, ownerDocument) {\n const svg = getDocument(ownerDocument).createElementNS(XMLNS, \"svg\");\n svg.setAttributeNS(null, \"width\", width.toString());\n svg.setAttributeNS(null, \"height\", height.toString());\n svg.setAttributeNS(null, \"viewBox\", `0 0 ${width} ${height}`);\n return svg;\n}\nfunction svgToDataUrl(svg, removeControlCharacter) {\n let xhtml = new XMLSerializer().serializeToString(svg);\n if (removeControlCharacter) {\n xhtml = xhtml.replace(/[\\u0000-\\u0008\\v\\f\\u000E-\\u001F\\uD800-\\uDFFF\\uFFFE\\uFFFF]/gu, \"\");\n }\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(xhtml)}`;\n}\nasync function canvasToBlob(canvas, type = \"image/png\", quality = 1) {\n try {\n return await new Promise((resolve, reject) => {\n canvas.toBlob((blob) => {\n if (blob) {\n resolve(blob);\n } else {\n reject(new Error(\"Blob is null\"));\n }\n }, type, quality);\n });\n } catch (error) {\n if (SUPPORT_ATOB) {\n return dataUrlToBlob(canvas.toDataURL(type, quality));\n }\n throw error;\n }\n}\nfunction dataUrlToBlob(dataUrl) {\n const [header, base64] = dataUrl.split(\",\");\n const type = header.match(/data:(.+);/)?.[1] ?? void 0;\n const decoded = window.atob(base64);\n const length = decoded.length;\n const buffer = new Uint8Array(length);\n for (let i = 0; i < length; i += 1) {\n buffer[i] = decoded.charCodeAt(i);\n }\n return new Blob([buffer], { type });\n}\nfunction readBlob(blob, type) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result);\n reader.onerror = () => reject(reader.error);\n reader.onabort = () => reject(new Error(`Failed read blob to ${type}`));\n if (type === \"dataUrl\") {\n reader.readAsDataURL(blob);\n } else if (type === \"arrayBuffer\") {\n reader.readAsArrayBuffer(blob);\n }\n });\n}\nconst blobToDataUrl = (blob) => readBlob(blob, \"dataUrl\");\nconst blobToArrayBuffer = (blob) => readBlob(blob, \"arrayBuffer\");\nfunction createImage(url, ownerDocument) {\n const img = getDocument(ownerDocument).createElement(\"img\");\n img.decoding = \"sync\";\n img.loading = \"eager\";\n img.src = url;\n return img;\n}\nfunction loadMedia(media, options) {\n return new Promise((resolve) => {\n const { timeout, ownerDocument, onError: userOnError, onWarn } = options ?? {};\n const node = typeof media === \"string\" ? createImage(media, getDocument(ownerDocument)) : media;\n let timer = null;\n let removeEventListeners = null;\n function onResolve() {\n resolve(node);\n timer && clearTimeout(timer);\n removeEventListeners?.();\n }\n if (timeout) {\n timer = setTimeout(onResolve, timeout);\n }\n if (isVideoElement(node)) {\n const currentSrc = node.currentSrc || node.src;\n if (!currentSrc) {\n if (node.poster) {\n return loadMedia(node.poster, options).then(resolve);\n }\n return onResolve();\n }\n if (node.readyState >= 2) {\n return onResolve();\n }\n const onLoadeddata = onResolve;\n const onError = (error) => {\n onWarn?.(\n \"Failed video load\",\n currentSrc,\n error\n );\n userOnError?.(error);\n onResolve();\n };\n removeEventListeners = () => {\n node.removeEventListener(\"loadeddata\", onLoadeddata);\n node.removeEventListener(\"error\", onError);\n };\n node.addEventListener(\"loadeddata\", onLoadeddata, { once: true });\n node.addEventListener(\"error\", onError, { once: true });\n } else {\n const currentSrc = isSVGImageElementNode(node) ? node.href.baseVal : node.currentSrc || node.src;\n if (!currentSrc) {\n return onResolve();\n }\n const onLoad = async () => {\n if (isImageElement(node) && \"decode\" in node) {\n try {\n await node.decode();\n } catch (error) {\n onWarn?.(\n \"Failed to decode image, trying to render anyway\",\n node.dataset.originalSrc || currentSrc,\n error\n );\n }\n }\n onResolve();\n };\n const onError = (error) => {\n onWarn?.(\n \"Failed image load\",\n node.dataset.originalSrc || currentSrc,\n error\n );\n onResolve();\n };\n if (isImageElement(node) && node.complete) {\n return onLoad();\n }\n removeEventListeners = () => {\n node.removeEventListener(\"load\", onLoad);\n node.removeEventListener(\"error\", onError);\n };\n node.addEventListener(\"load\", onLoad, { once: true });\n node.addEventListener(\"error\", onError, { once: true });\n }\n });\n}\nasync function waitUntilLoad(node, options) {\n if (isHTMLElementNode(node)) {\n if (isImageElement(node) || isVideoElement(node)) {\n await loadMedia(node, options);\n } else {\n await Promise.all(\n [\"img\", \"video\"].flatMap((selectors) => {\n return Array.from(node.querySelectorAll(selectors)).map((el) => loadMedia(el, options));\n })\n );\n }\n }\n}\nconst uuid = /* @__PURE__ */ function uuid2() {\n let counter = 0;\n const random = () => `0000${(Math.random() * 36 ** 4 << 0).toString(36)}`.slice(-4);\n return () => {\n counter += 1;\n return `u${random()}${counter}`;\n };\n}();\nfunction splitFontFamily(fontFamily) {\n return fontFamily?.split(\",\").map((val) => val.trim().replace(/\"|'/g, \"\").toLowerCase()).filter(Boolean);\n}\n\nlet uid = 0;\nfunction createLogger(debug) {\n const prefix = `${PREFIX}[#${uid}]`;\n uid++;\n return {\n // eslint-disable-next-line no-console\n time: (label) => debug && console.time(`${prefix} ${label}`),\n // eslint-disable-next-line no-console\n timeEnd: (label) => debug && console.timeEnd(`${prefix} ${label}`),\n warn: (...args) => debug && consoleWarn(...args)\n };\n}\n\nfunction getDefaultRequestInit(bypassingCache) {\n return {\n cache: bypassingCache ? \"no-cache\" : \"force-cache\"\n };\n}\n\nasync function orCreateContext(node, options) {\n return isContext(node) ? node : createContext(node, { ...options, autoDestruct: true });\n}\nasync function createContext(node, options) {\n const { scale = 1, workerUrl, workerNumber = 1 } = options || {};\n const debug = Boolean(options?.debug);\n const features = options?.features ?? true;\n const ownerDocument = node.ownerDocument ?? (IN_BROWSER ? window.document : void 0);\n const ownerWindow = node.ownerDocument?.defaultView ?? (IN_BROWSER ? window : void 0);\n const requests = /* @__PURE__ */ new Map();\n const context = {\n // Options\n width: 0,\n height: 0,\n quality: 1,\n type: \"image/png\",\n scale,\n backgroundColor: null,\n style: null,\n filter: null,\n maximumCanvasSize: 0,\n timeout: 3e4,\n progress: null,\n debug,\n fetch: {\n requestInit: getDefaultRequestInit(options?.fetch?.bypassingCache),\n placeholderImage: \"data:image/png;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\",\n bypassingCache: false,\n ...options?.fetch\n },\n fetchFn: null,\n font: {},\n drawImageInterval: 100,\n workerUrl: null,\n workerNumber,\n onCloneEachNode: null,\n onCloneNode: null,\n onEmbedNode: null,\n onCreateForeignObjectSvg: null,\n includeStyleProperties: null,\n autoDestruct: false,\n ...options,\n // InternalContext\n __CONTEXT__: true,\n log: createLogger(debug),\n node,\n ownerDocument,\n ownerWindow,\n dpi: scale === 1 ? null : 96 * scale,\n svgStyleElement: createStyleElement(ownerDocument),\n svgDefsElement: ownerDocument?.createElementNS(XMLNS, \"defs\"),\n svgStyles: /* @__PURE__ */ new Map(),\n defaultComputedStyles: /* @__PURE__ */ new Map(),\n workers: [\n ...Array.from({\n length: SUPPORT_WEB_WORKER && workerUrl && workerNumber ? workerNumber : 0\n })\n ].map(() => {\n try {\n const worker = new Worker(workerUrl);\n worker.onmessage = async (event) => {\n const { url, result } = event.data;\n if (result) {\n requests.get(url)?.resolve?.(result);\n } else {\n requests.get(url)?.reject?.(new Error(`Error receiving message from worker: ${url}`));\n }\n };\n worker.onmessageerror = (event) => {\n const { url } = event.data;\n requests.get(url)?.reject?.(new Error(`Error receiving message from worker: ${url}`));\n };\n return worker;\n } catch (error) {\n context.log.warn(\"Failed to new Worker\", error);\n return null;\n }\n }).filter(Boolean),\n fontFamilies: /* @__PURE__ */ new Map(),\n fontCssTexts: /* @__PURE__ */ new Map(),\n acceptOfImage: `${[\n supportWebp(ownerDocument) && \"image/webp\",\n \"image/svg+xml\",\n \"image/*\",\n \"*/*\"\n ].filter(Boolean).join(\",\")};q=0.8`,\n requests,\n drawImageCount: 0,\n tasks: [],\n features,\n isEnable: (key) => {\n if (key === \"restoreScrollPosition\") {\n return typeof features === \"boolean\" ? false : features[key] ?? false;\n }\n if (typeof features === \"boolean\") {\n return features;\n }\n return features[key] ?? true;\n },\n shadowRoots: []\n };\n context.log.time(\"wait until load\");\n await waitUntilLoad(node, { timeout: context.timeout, onWarn: context.log.warn });\n context.log.timeEnd(\"wait until load\");\n const { width, height } = resolveBoundingBox(node, context);\n context.width = width;\n context.height = height;\n return context;\n}\nfunction createStyleElement(ownerDocument) {\n if (!ownerDocument)\n return void 0;\n const style = ownerDocument.createElement(\"style\");\n const cssText = style.ownerDocument.createTextNode(`\n.______background-clip--text {\n background-clip: text;\n -webkit-background-clip: text;\n}\n`);\n style.appendChild(cssText);\n return style;\n}\nfunction resolveBoundingBox(node, context) {\n let { width, height } = context;\n if (isElementNode(node) && (!width || !height)) {\n const box = node.getBoundingClientRect();\n width = width || box.width || Number(node.getAttribute(\"width\")) || 0;\n height = height || box.height || Number(node.getAttribute(\"height\")) || 0;\n }\n return { width, height };\n}\n\nasync function imageToCanvas(image, context) {\n const {\n log,\n timeout,\n drawImageCount,\n drawImageInterval\n } = context;\n log.time(\"image to canvas\");\n const loaded = await loadMedia(image, { timeout, onWarn: context.log.warn });\n const { canvas, context2d } = createCanvas(image.ownerDocument, context);\n const drawImage = () => {\n try {\n context2d?.drawImage(loaded, 0, 0, canvas.width, canvas.height);\n } catch (error) {\n context.log.warn(\"Failed to drawImage\", error);\n }\n };\n drawImage();\n if (context.isEnable(\"fixSvgXmlDecode\")) {\n for (let i = 0; i < drawImageCount; i++) {\n await new Promise((resolve) => {\n setTimeout(() => {\n context2d?.clearRect(0, 0, canvas.width, canvas.height);\n drawImage();\n resolve();\n }, i + drawImageInterval);\n });\n }\n }\n context.drawImageCount = 0;\n log.timeEnd(\"image to canvas\");\n return canvas;\n}\nfunction createCanvas(ownerDocument, context) {\n const { width, height, scale, backgroundColor, maximumCanvasSize: max } = context;\n const canvas = ownerDocument.createElement(\"canvas\");\n canvas.width = Math.floor(width * scale);\n canvas.height = Math.floor(height * scale);\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n if (max) {\n if (canvas.width > max || canvas.height > max) {\n if (canvas.width > max && canvas.height > max) {\n if (canvas.width > canvas.height) {\n canvas.height *= max / canvas.width;\n canvas.width = max;\n } else {\n canvas.width *= max / canvas.height;\n canvas.height = max;\n }\n } else if (canvas.width > max) {\n canvas.height *= max / canvas.width;\n canvas.width = max;\n } else {\n canvas.width *= max / canvas.height;\n canvas.height = max;\n }\n }\n }\n const context2d = canvas.getContext(\"2d\");\n if (context2d && backgroundColor) {\n context2d.fillStyle = backgroundColor;\n context2d.fillRect(0, 0, canvas.width, canvas.height);\n }\n return { canvas, context2d };\n}\n\nfunction cloneCanvas(canvas, context) {\n if (canvas.ownerDocument) {\n try {\n const dataURL = canvas.toDataURL();\n if (dataURL !== \"data:,\") {\n return createImage(dataURL, canvas.ownerDocument);\n }\n } catch (error) {\n context.log.warn(\"Failed to clone canvas\", error);\n }\n }\n const cloned = canvas.cloneNode(false);\n const ctx = canvas.getContext(\"2d\");\n const clonedCtx = cloned.getContext(\"2d\");\n try {\n if (ctx && clonedCtx) {\n clonedCtx.putImageData(\n ctx.getImageData(0, 0, canvas.width, canvas.height),\n 0,\n 0\n );\n }\n return cloned;\n } catch (error) {\n context.log.warn(\"Failed to clone canvas\", error);\n }\n return cloned;\n}\n\nfunction cloneIframe(iframe, context) {\n try {\n if (iframe?.contentDocument?.documentElement) {\n return cloneNode(iframe.contentDocument.documentElement, context);\n }\n } catch (error) {\n context.log.warn(\"Failed to clone iframe\", error);\n }\n return iframe.cloneNode(false);\n}\n\nfunction cloneImage(image) {\n const cloned = image.cloneNode(false);\n if (image.currentSrc && image.currentSrc !== image.src) {\n cloned.src = image.currentSrc;\n cloned.srcset = \"\";\n }\n if (cloned.loading === \"lazy\") {\n cloned.loading = \"eager\";\n }\n return cloned;\n}\n\nasync function cloneVideo(video, context) {\n if (video.ownerDocument && !video.currentSrc && video.poster) {\n return createImage(video.poster, video.ownerDocument);\n }\n const cloned = video.cloneNode(false);\n cloned.crossOrigin = \"anonymous\";\n if (video.currentSrc && video.currentSrc !== video.src) {\n cloned.src = video.currentSrc;\n }\n const ownerDocument = cloned.ownerDocument;\n if (ownerDocument) {\n let canPlay = true;\n await loadMedia(cloned, { onError: () => canPlay = false, onWarn: context.log.warn });\n if (!canPlay) {\n if (video.poster) {\n return createImage(video.poster, video.ownerDocument);\n }\n return cloned;\n }\n cloned.currentTime = video.currentTime;\n await new Promise((resolve) => {\n cloned.addEventListener(\"seeked\", resolve, { once: true });\n });\n const canvas = ownerDocument.createElement(\"canvas\");\n canvas.width = video.offsetWidth;\n canvas.height = video.offsetHeight;\n try {\n const ctx = canvas.getContext(\"2d\");\n if (ctx)\n ctx.drawImage(cloned, 0, 0, canvas.width, canvas.height);\n } catch (error) {\n context.log.warn(\"Failed to clone video\", error);\n if (video.poster) {\n return createImage(video.poster, video.ownerDocument);\n }\n return cloned;\n }\n return cloneCanvas(canvas, context);\n }\n return cloned;\n}\n\nfunction cloneElement(node, context) {\n if (isCanvasElement(node)) {\n return cloneCanvas(node, context);\n }\n if (isIFrameElement(node)) {\n return cloneIframe(node, context);\n }\n if (isImageElement(node)) {\n return cloneImage(node);\n }\n if (isVideoElement(node)) {\n return cloneVideo(node, context);\n }\n return node.cloneNode(false);\n}\n\nfunction getSandBox(context) {\n let sandbox = context.sandbox;\n if (!sandbox) {\n const { ownerDocument } = context;\n try {\n if (ownerDocument) {\n sandbox = ownerDocument.createElement(\"iframe\");\n sandbox.id = `__SANDBOX__${uuid()}`;\n sandbox.width = \"0\";\n sandbox.height = \"0\";\n sandbox.style.visibility = \"hidden\";\n sandbox.style.position = \"fixed\";\n ownerDocument.body.appendChild(sandbox);\n sandbox.srcdoc = '<!DOCTYPE html><meta charset=\"UTF-8\"><title></title><body>';\n context.sandbox = sandbox;\n }\n } catch (error) {\n context.log.warn(\"Failed to getSandBox\", error);\n }\n }\n return sandbox;\n}\n\nconst ignoredStyles = [\n \"width\",\n \"height\",\n \"-webkit-text-fill-color\"\n];\nconst includedAttributes = [\n \"stroke\",\n \"fill\"\n];\nfunction getDefaultStyle(node, pseudoElement, context) {\n const { defaultComputedStyles } = context;\n const nodeName = node.nodeName.toLowerCase();\n const isSvgNode = isSVGElementNode(node) && nodeName !== \"svg\";\n const attributes = isSvgNode ? includedAttributes.map((name) => [name, node.getAttribute(name)]).filter(([, value]) => value !== null) : [];\n const key = [\n isSvgNode && \"svg\",\n nodeName,\n attributes.map((name, value) => `${name}=${value}`).join(\",\"),\n pseudoElement\n ].filter(Boolean).join(\":\");\n if (defaultComputedStyles.has(key))\n return defaultComputedStyles.get(key);\n const sandbox = getSandBox(context);\n const sandboxWindow = sandbox?.contentWindow;\n if (!sandboxWindow)\n return /* @__PURE__ */ new Map();\n const sandboxDocument = sandboxWindow?.document;\n let root;\n let el;\n if (isSvgNode) {\n root = sandboxDocument.createElementNS(XMLNS, \"svg\");\n el = root.ownerDocument.createElementNS(root.namespaceURI, nodeName);\n attributes.forEach(([name, value]) => {\n el.setAttributeNS(null, name, value);\n });\n root.appendChild(el);\n } else {\n root = el = sandboxDocument.createElement(nodeName);\n }\n el.textContent = \" \";\n sandboxDocument.body.appendChild(root);\n const computedStyle = sandboxWindow.getComputedStyle(el, pseudoElement);\n const styles = /* @__PURE__ */ new Map();\n for (let len = computedStyle.length, i = 0; i < len; i++) {\n const name = computedStyle.item(i);\n if (ignoredStyles.includes(name))\n continue;\n styles.set(name, computedStyle.getPropertyValue(name));\n }\n sandboxDocument.body.removeChild(root);\n defaultComputedStyles.set(key, styles);\n return styles;\n}\n\nfunction getDiffStyle(style, defaultStyle, includeStyleProperties) {\n const diffStyle = /* @__PURE__ */ new Map();\n const prefixs = [];\n const prefixTree = /* @__PURE__ */ new Map();\n if (includeStyleProperties) {\n for (const name of includeStyleProperties) {\n applyTo(name);\n }\n } else {\n for (let len = style.length, i = 0; i < len; i++) {\n const name = style.item(i);\n applyTo(name);\n }\n }\n for (let len = prefixs.length, i = 0; i < len; i++) {\n prefixTree.get(prefixs[i])?.forEach((value, name) => diffStyle.set(name, value));\n }\n function applyTo(name) {\n const value = style.getPropertyValue(name);\n const priority = style.getPropertyPriority(name);\n const subIndex = name.lastIndexOf(\"-\");\n const prefix = subIndex > -1 ? name.substring(0, subIndex) : void 0;\n if (prefix) {\n let map = prefixTree.get(prefix);\n if (!map) {\n map = /* @__PURE__ */ new Map();\n prefixTree.set(prefix, map);\n }\n map.set(name, [value, priority]);\n }\n if (defaultStyle.get(name) === value && !priority)\n return;\n if (prefix) {\n prefixs.push(prefix);\n } else {\n diffStyle.set(name, [value, priority]);\n }\n }\n return diffStyle;\n}\n\nfunction copyCssStyles(node, cloned, isRoot, context) {\n const { ownerWindow, includeStyleProperties, currentParentNodeStyle } = context;\n const clonedStyle = cloned.style;\n const computedStyle = ownerWindow.getComputedStyle(node);\n const defaultStyle = getDefaultStyle(node, null, context);\n currentParentNodeStyle?.forEach((_, key) => {\n defaultStyle.delete(key);\n });\n const style = getDiffStyle(computedStyle, defaultStyle, includeStyleProperties);\n style.delete(\"transition-property\");\n style.delete(\"all\");\n style.delete(\"d\");\n style.delete(\"content\");\n if (isRoot) {\n style.delete(\"position\");\n style.delete(\"margin-top\");\n style.delete(\"margin-right\");\n style.delete(\"margin-bottom\");\n style.delete(\"margin-left\");\n style.delete(\"margin-block-start\");\n style.delete(\"margin-block-end\");\n style.delete(\"margin-inline-start\");\n style.delete(\"margin-inline-end\");\n style.set(\"box-sizing\", [\"border-box\", \"\"]);\n }\n if (style.get(\"background-clip\")?.[0] === \"text\") {\n cloned.classList.add(\"______background-clip--text\");\n }\n if (IN_CHROME) {\n if (!style.has(\"font-kerning\"))\n style.set(\"font-kerning\", [\"normal\", \"\"]);\n if ((style.get(\"overflow-x\")?.[0] === \"hidden\" || style.get(\"overflow-y\")?.[0] === \"hidden\") && style.get(\"text-overflow\")?.[0] === \"ellipsis\" && node.scrollWidth === node.clientWidth) {\n style.set(\"text-overflow\", [\"clip\", \"\"]);\n }\n }\n for (let len = clonedStyle.length, i = 0; i < len; i++) {\n clonedStyle.removeProperty(clonedStyle.item(i));\n }\n style.forEach(([value, priority], name) => {\n clonedStyle.setProperty(name, value, priority);\n });\n return style;\n}\n\nfunction copyInputValue(node, cloned) {\n if (isTextareaElement(node) || isInputElement(node) || isSelectElement(node)) {\n cloned.setAttribute(\"value\", node.value);\n }\n}\n\nconst pseudoClasses = [\n \"::before\",\n \"::after\"\n // '::placeholder', TODO\n];\nconst scrollbarPseudoClasses = [\n \"::-webkit-scrollbar\",\n \"::-webkit-scrollbar-button\",\n // '::-webkit-scrollbar:horizontal', TODO\n \"::-webkit-scrollbar-thumb\",\n \"::-webkit-scrollbar-track\",\n \"::-webkit-scrollbar-track-piece\",\n // '::-webkit-scrollbar:vertical', TODO\n \"::-webkit-scrollbar-corner\",\n \"::-webkit-resizer\"\n];\nfunction copyPseudoClass(node, cloned, copyScrollbar, context, addWordToFontFamilies) {\n const { ownerWindow, svgStyleElement, svgStyles, currentNodeStyle } = context;\n if (!svgStyleElement || !ownerWindow)\n return;\n function copyBy(pseudoClass) {\n const computedStyle = ownerWindow.getComputedStyle(node, pseudoClass);\n let content = computedStyle.getPropertyValue(\"content\");\n if (!content || content === \"none\")\n return;\n addWordToFontFamilies?.(content);\n content = content.replace(/(')|(\")|(counter\\(.+\\))/g, \"\");\n const klasses = [uuid()];\n const defaultStyle = getDefaultStyle(node, pseudoClass, context);\n currentNodeStyle?.forEach((_, key) => {\n defaultStyle.delete(key);\n });\n const style = getDiffStyle(computedStyle, defaultStyle, context.includeStyleProperties);\n style.delete(\"content\");\n style.delete(\"-webkit-locale\");\n if (style.get(\"background-clip\")?.[0] === \"text\") {\n cloned.classList.add(\"______background-clip--text\");\n }\n const cloneStyle = [\n `content: '${content}';`\n ];\n style.forEach(([value, priority], name) => {\n cloneStyle.push(`${name}: ${value}${priority ? \" !important\" : \"\"};`);\n });\n if (cloneStyle.length === 1)\n return;\n try {\n cloned.className = [cloned.className, ...klasses].join(\" \");\n } catch (err) {\n context.log.warn(\"Failed to copyPseudoClass\", err);\n return;\n }\n const cssText = cloneStyle.join(\"\\n \");\n let allClasses = svgStyles.get(cssText);\n if (!allClasses) {\n allClasses = [];\n svgStyles.set(cssText, allClasses);\n }\n allClasses.push(`.${klasses[0]}${pseudoClass}`);\n }\n pseudoClasses.forEach(copyBy);\n if (copyScrollbar)\n scrollbarPseudoClasses.forEach(copyBy);\n}\n\nconst excludeParentNodes = /* @__PURE__ */ new Set([\n \"symbol\"\n // test/fixtures/svg.symbol.html\n]);\nasync function appendChildNode(node, cloned, child, context, addWordToFontFamilies) {\n if (isElementNode(child) && (isStyleElement(child) || isScriptElement(child)))\n return;\n if (context.filter && !context.filter(child))\n return;\n if (excludeParentNodes.has(cloned.nodeName) || excludeParentNodes.has(child.nodeName)) {\n context.currentParentNodeStyle = void 0;\n } else {\n context.currentParentNodeStyle = context.currentNodeStyle;\n }\n const childCloned = await cloneNode(child, context, false, addWordToFontFamilies);\n if (context.isEnable(\"restoreScrollPosition\")) {\n restoreScrollPosition(node, childCloned);\n }\n cloned.appendChild(childCloned);\n}\nasync function cloneChildNodes(node, cloned, context, addWordToFontFamilies) {\n let firstChild = node.firstChild;\n if (isElementNode(node)) {\n if (node.shadowRoot) {\n firstChild = node.shadowRoot?.firstChild;\n context.shadowRoots.push(node.shadowRoot);\n }\n }\n for (let child = firstChild; child; child = child.nextSibling) {\n if (isCommentNode(child))\n continue;\n if (isElementNode(child) && isSlotElement(child) && typeof child.assignedNodes === \"function\") {\n const nodes = child.assignedNodes();\n for (let i = 0; i < nodes.length; i++) {\n await appendChildNode(node, cloned, nodes[i], context, addWordToFontFamilies);\n }\n } else {\n await appendChildNode(node, cloned, child, context, addWordToFontFamilies);\n }\n }\n}\nfunction restoreScrollPosition(node, chlidCloned) {\n if (!isHTMLElementNode(node) || !isHTMLElementNode(chlidCloned))\n return;\n const { scrollTop, scrollLeft } = node;\n if (!scrollTop && !scrollLeft) {\n return;\n }\n const { transform } = chlidCloned.style;\n const matrix = new DOMMatrix(transform);\n const { a, b, c, d } = matrix;\n matrix.a = 1;\n matrix.b = 0;\n matrix.c = 0;\n matrix.d = 1;\n matrix.translateSelf(-scrollLeft, -scrollTop);\n matrix.a = a;\n matrix.b = b;\n matrix.c = c;\n matrix.d = d;\n chlidCloned.style.transform = matrix.toString();\n}\nfunction applyCssStyleWithOptions(cloned, context) {\n const { backgroundColor, width, height, style: styles } = context;\n const clonedStyle = cloned.style;\n if (backgroundColor)\n clonedStyle.setProperty(\"background-color\", backgroundColor, \"important\");\n if (width)\n clonedStyle.setProperty(\"width\", `${width}px`, \"important\");\n if (height)\n clonedStyle.setProperty(\"height\", `${height}px`, \"important\");\n if (styles) {\n for (const name in styles) clonedStyle[name] = styles[name];\n }\n}\nconst NORMAL_ATTRIBUTE_RE = /^[\\w-:]+$/;\nasync function cloneNode(node, context, isRoot = false, addWordToFontFamilies) {\n const { ownerDocument, ownerWindow, fontFamilies, onCloneEachNode } = context;\n if (ownerDocument && isTextNode(node)) {\n if (addWordToFontFamilies && /\\S/.test(node.data)) {\n addWordToFontFamilies(node.data);\n }\n return ownerDocument.createTextNode(node.data);\n }\n if (ownerDocument && ownerWindow && isElementNode(node) && (isHTMLElementNode(node) || isSVGElementNode(node))) {\n const cloned2 = await cloneElement(node, context);\n if (context.isEnable(\"removeAbnormalAttributes\")) {\n const names = cloned2.getAttributeNames();\n for (let len = names.length, i = 0; i < len; i++) {\n const name = names[i];\n if (!NORMAL_ATTRIBUTE_RE.test(name)) {\n cloned2.removeAttribute(name);\n }\n }\n }\n const style = context.currentNodeStyle = copyCssStyles(node, cloned2, isRoot, context);\n if (isRoot)\n applyCssStyleWithOptions(cloned2, context);\n let copyScrollbar = false;\n if (context.isEnable(\"copyScrollbar\")) {\n const overflow = [\n style.get(\"overflow-x\")?.[0],\n style.get(\"overflow-y\")?.[0]\n ];\n copyScrollbar = overflow.includes(\"scroll\") || (overflow.includes(\"auto\") || overflow.includes(\"overlay\")) && (node.scrollHeight > node.clientHeight || node.scrollWidth > node.clientWidth);\n }\n const textTransform = style.get(\"text-transform\")?.[0];\n const families = splitFontFamily(style.get(\"font-family\")?.[0]);\n const addWordToFontFamilies2 = families ? (word) => {\n if (textTransform === \"uppercase\") {\n word = word.toUpperCase();\n } else if (textTransform === \"lowercase\") {\n word = word.toLowerCase();\n } else if (textTransform === \"capitalize\") {\n word = word[0].toUpperCase() + word.substring(1);\n }\n families.forEach((family) => {\n let fontFamily = fontFamilies.get(family);\n if (!fontFamily) {\n fontFamilies.set(family, fontFamily = /* @__PURE__ */ new Set());\n }\n word.split(\"\").forEach((text) => fontFamily.add(text));\n });\n } : void 0;\n copyPseudoClass(\n node,\n cloned2,\n copyScrollbar,\n context,\n addWordToFontFamilies2\n );\n copyInputValue(node, cloned2);\n if (!isVideoElement(node)) {\n await cloneChildNodes(\n node,\n cloned2,\n context,\n addWordToFontFamilies2\n );\n }\n await onCloneEachNode?.(cloned2);\n return cloned2;\n }\n const cloned = node.cloneNode(false);\n await cloneChildNodes(node, cloned, context);\n await onCloneEachNode?.(cloned);\n return cloned;\n}\n\nfunction destroyContext(context) {\n context.ownerDocument = void 0;\n context.ownerWindow = void 0;\n context.svgStyleElement = void 0;\n context.svgDefsElement = void 0;\n context.svgStyles.clear();\n context.defaultComputedStyles.clear();\n if (context.sandbox) {\n try {\n context.sandbox.remove();\n } catch (err) {\n context.log.warn(\"Failed to destroyContext\", err);\n }\n context.sandbox = void 0;\n }\n context.workers = [];\n context.fontFamilies.clear();\n context.fontCssTexts.clear();\n context.requests.clear();\n context.tasks = [];\n context.shadowRoots = [];\n}\n\nfunction baseFetch(options) {\n const { url, timeout, responseType, ...requestInit } = options;\n const controller = new AbortController();\n const timer = timeout ? setTimeout(() => controller.abort(), timeout) : void 0;\n return fetch(url, { signal: controller.signal, ...requestInit }).then((response) => {\n if (!response.ok) {\n throw new Error(\"Failed fetch, not 2xx response\", { cause: response });\n }\n switch (responseType) {\n case \"arrayBuffer\":\n return response.arrayBuffer();\n case \"dataUrl\":\n return response.blob().then(blobToDataUrl);\n case \"text\":\n default:\n return response.text();\n }\n }).finally(() => clearTimeout(timer));\n}\nfunction contextFetch(context, options) {\n const { url: rawUrl, requestType = \"text\", responseType = \"text\", imageDom } = options;\n let url = rawUrl;\n const {\n timeout,\n acceptOfImage,\n requests,\n fetchFn,\n fetch: {\n requestInit,\n bypassingCache,\n placeholderImage\n },\n font,\n workers,\n fontFamilies\n } = context;\n if (requestType === \"image\" && (IN_SAFARI || IN_FIREFOX)) {\n context.drawImageCount++;\n }\n let request = requests.get(rawUrl);\n if (!request) {\n if (bypassingCache) {\n if (bypassingCache instanceof RegExp && bypassingCache.test(url)) {\n url += (/\\?/.test(url) ? \"&\" : \"?\") + (/* @__PURE__ */ new Date()).getTime();\n }\n }\n const canFontMinify = requestType.startsWith(\"font\") && font && font.minify;\n const fontTexts = /* @__PURE__ */ new Set();\n if (canFontMinify) {\n const families = requestType.split(\";\")[1].split(\",\");\n families.forEach((family) => {\n if (!fontFamilies.has(family))\n return;\n fontFamilies.get(family).forEach((text) => fontTexts.add(text));\n });\n }\n const needFontMinify = canFontMinify && fontTexts.size;\n const baseFetchOptions = {\n url,\n timeout,\n responseType: needFontMinify ? \"arrayBuffer\" : responseType,\n headers: requestType === \"image\" ? { accept: acceptOfImage } : void 0,\n ...requestInit\n };\n request = {\n type: requestType,\n resolve: void 0,\n reject: void 0,\n response: null\n };\n request.response = (async () => {\n if (fetchFn && requestType === \"image\") {\n const result = await fetchFn(rawUrl);\n if (result)\n return result;\n }\n if (!IN_SAFARI && rawUrl.startsWith(\"http\") && workers.length) {\n return new Promise((resolve, reject) => {\n const worker = workers[requests.size & workers.length - 1];\n worker.postMessage({ rawUrl, ...baseFetchOptions });\n request.resolve = resolve;\n request.reject = reject;\n });\n }\n return baseFetch(baseFetchOptions);\n })().catch((error) => {\n requests.delete(rawUrl);\n if (requestType === \"image\" && placeholderImage) {\n context.log.warn(\"Failed to fetch image base64, trying to use placeholder image\", url);\n return typeof placeholderImage === \"string\" ? placeholderImage : placeholderImage(imageDom);\n }\n throw error;\n });\n requests.set(rawUrl, request);\n }\n return request.response;\n}\n\nasync function replaceCssUrlToDataUrl(cssText, baseUrl, context, isImage) {\n if (!hasCssUrl(cssText))\n return cssText;\n for (const [rawUrl, url] of parseCssUrls(cssText, baseUrl)) {\n try {\n const dataUrl = await contextFetch(\n context,\n {\n url,\n requestType: isImage ? \"image\" : \"text\",\n responseType: \"dataUrl\"\n }\n );\n cssText = cssText.replace(toRE(rawUrl), `$1${dataUrl}$3`);\n } catch (error) {\n context.log.warn(\"Failed to fetch css data url\", rawUrl, error);\n }\n }\n return cssText;\n}\nfunction hasCssUrl(cssText) {\n return /url\\((['\"]?)([^'\"]+?)\\1\\)/.test(cssText);\n}\nconst URL_RE = /url\\((['\"]?)([^'\"]+?)\\1\\)/g;\nfunction parseCssUrls(cssText, baseUrl) {\n const result = [];\n cssText.replace(URL_RE, (raw, quotation, url) => {\n result.push([url, resolveUrl(url, baseUrl)]);\n return raw;\n });\n return result.filter(([url]) => !isDataUrl(url));\n}\nfunction toRE(url) {\n const escaped = url.replace(/([.*+?^${}()|\\[\\]\\/\\\\])/g, \"\\\\$1\");\n return new RegExp(`(url\\\\(['\"]?)(${escaped})(['\"]?\\\\))`, \"g\");\n}\n\nconst properties = [\n \"background-image\",\n \"border-image-source\",\n \"-webkit-border-image\",\n \"-webkit-mask-image\",\n \"list-style-image\"\n];\nfunction embedCssStyleImage(style, context) {\n return properties.map((property) => {\n const value = style.getPropertyValue(property);\n if (!value || value === \"none\") {\n return null;\n }\n if (IN_SAFARI || IN_FIREFOX) {\n context.drawImageCount++;\n }\n return replaceCssUrlToDataUrl(value, null, context, true).then((newValue) => {\n if (!newValue || value === newValue)\n return;\n style.setProperty(\n property,\n newValue,\n style.getPropertyPriority(property)\n );\n });\n }).filter(Boolean);\n}\n\nfunction embedImageElement(cloned, context) {\n if (isImageElement(cloned)) {\n const originalSrc = cloned.currentSrc || cloned.src;\n if (!isDataUrl(originalSrc)) {\n return [\n contextFetch(context, {\n url: originalSrc,\n imageDom: cloned,\n requestType: \"image\",\n responseType: \"dataUrl\"\n }).then((url) => {\n if (!url)\n return;\n cloned.srcset = \"\";\n cloned.dataset.originalSrc = originalSrc;\n cloned.src = url || \"\";\n })\n ];\n }\n if (IN_SAFARI || IN_FIREFOX) {\n context.drawImageCount++;\n }\n } else if (isSVGElementNode(cloned) && !isDataUrl(cloned.href.baseVal)) {\n const originalSrc = cloned.href.baseVal;\n return [\n contextFetch(context, {\n url: originalSrc,\n imageDom: cloned,\n requestType: \"image\",\n responseType: \"dataUrl\"\n }).then((url) => {\n if (!url)\n return;\n cloned.dataset.originalSrc = originalSrc;\n cloned.href.baseVal = url || \"\";\n })\n ];\n }\n return [];\n}\n\nfunction embedSvgUse(cloned, context) {\n const { ownerDocument, svgDefsElement } = context;\n const href = cloned.getAttribute(\"href\") ?? cloned.getAttribute(\"xlink:href\");\n if (!href)\n return [];\n const [svgUrl, id] = href.split(\"#\");\n if (id) {\n const query = `#${id}`;\n const definition = context.shadowRoots.reduce(\n (res, root) => {\n return res ?? root.querySelector(`svg ${query}`);\n },\n ownerDocument?.querySelector(`svg ${query}`)\n );\n if (svgUrl) {\n cloned.setAttribute(\"href\", query);\n }\n if (svgDefsElement?.querySelector(query))\n return [];\n if (definition) {\n svgDefsElement?.appendChild(definition.cloneNode(true));\n return [];\n } else if (svgUrl) {\n return [\n contextFetch(context, {\n url: svgUrl,\n responseType: \"text\"\n }).then((svgData) => {\n svgDefsElement?.insertAdjacentHTML(\"beforeend\", svgData);\n })\n ];\n }\n }\n return [];\n}\n\nfunction embedNode(cloned, context) {\n const { tasks } = context;\n if (isElementNode(cloned)) {\n if (isImageElement(cloned) || isSVGImageElementNode(cloned)) {\n tasks.push(...embedImageElement(cloned, context));\n }\n if (isSVGUseElementNode(cloned)) {\n tasks.push(...embedSvgUse(cloned, context));\n }\n }\n if (isHTMLElementNode(cloned)) {\n tasks.push(...embedCssStyleImage(cloned.style, context));\n }\n cloned.childNodes.forEach((child) => {\n embedNode(child, context);\n });\n}\n\nasync function embedWebFont(clone, context) {\n const {\n ownerDocument,\n svgStyleElement,\n fontFamilies,\n fontCssTexts,\n tasks,\n font\n } = context;\n if (!ownerDocument || !svgStyleElement || !fontFamilies.size) {\n return;\n }\n if (font && font.cssText) {\n const cssText = filterPreferredFormat(font.cssText, context);\n svgStyleElement.appendChild(ownerDocument.createTextNode(`${cssText}\n`));\n } else {\n const styleSheets = Array.from(ownerDocument.styleSheets).filter((styleSheet) => {\n try {\n return \"cssRules\" in styleSheet && Boolean(styleSheet.cssRules.length);\n } catch (error) {\n context.log.warn(`Error while reading CSS rules from ${styleSheet.href}`, error);\n return false;\n }\n });\n const tempDoc = ownerDocument.implementation.createHTMLDocument(\"\");\n const tempStyleEl = tempDoc.createElement(\"style\");\n tempDoc.head.appendChild(tempStyleEl);\n const tempStyleSheet = tempStyleEl.sheet;\n await Promise.all(\n styleSheets.flatMap((styleSheet) => {\n return Array.from(styleSheet.cssRules).map(async (cssRule) => {\n if (isCSSImportRule(cssRule)) {\n const baseUrl = cssRule.href;\n let cssText = \"\";\n try {\n cssText = await contextFetch(context, {\n url: baseUrl,\n requestType: \"text\",\n responseType: \"text\"\n });\n } catch (error) {\n context.log.warn(`Error fetch remote css import from ${baseUrl}`, error);\n }\n const replacedCssText = cssText.replace(\n URL_RE,\n (raw, quotation, url) => raw.replace(url, resolveUrl(url, baseUrl))\n );\n for (const rule of parseCss(replacedCssText)) {\n try {\n tempStyleSheet.insertRule(rule, tempStyleSheet.cssRules.length);\n } catch (error) {\n context.log.warn(\"Error inserting rule from remote css import\", { rule, error });\n }\n }\n }\n });\n })\n );\n if (tempStyleSheet.cssRules.length)\n styleSheets.push(tempStyleSheet);\n const cssRules = [];\n styleSheets.forEach((sheet) => {\n unwrapCssLayers(sheet.cssRules, cssRules);\n });\n cssRules.filter((cssRule) => isCssFontFaceRule(cssRule) && hasCssUrl(cssRule.style.getPropertyValue(\"src\")) && splitFontFamily(cssRule.style.getPropertyValue(\"font-family\"))?.some((val) => fontFamilies.has(val))).forEach((value) => {\n const rule = value;\n const cssText = fontCssTexts.get(rule.cssText);\n if (cssText) {\n svgStyleElement.appendChild(ownerDocument.createTextNode(`${cssText}\n`));\n } else {\n tasks.push(\n replaceCssUrlToDataUrl(\n rule.cssText,\n rule.parentStyleSheet ? rule.parentStyleSheet.href : null,\n context\n ).then((cssText2) => {\n cssText2 = filterPreferredFormat(cssText2, context);\n fontCssTexts.set(rule.cssText, cssText2);\n svgStyleElement.appendChild(ownerDocument.createTextNode(`${cssText2}\n`));\n })\n );\n }\n });\n }\n}\nconst COMMENTS_RE = /(\\/\\*[\\s\\S]*?\\*\\/)/g;\nconst KEYFRAMES_RE = /((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})/gi;\nfunction parseCss(source) {\n if (source == null)\n return [];\n const result = [];\n let cssText = source.replace(COMMENTS_RE, \"\");\n while (true) {\n const matches = KEYFRAMES_RE.exec(cssText);\n if (!matches)\n break;\n result.push(matches[0]);\n }\n cssText = cssText.replace(KEYFRAMES_RE, \"\");\n const IMPORT_RE = /@import[\\s\\S]*?url\\([^)]*\\)[\\s\\S]*?;/gi;\n const UNIFIED_RE = new RegExp(\n // eslint-disable-next-line\n \"((\\\\s*?(?:\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/)?\\\\s*?@media[\\\\s\\\\S]*?){([\\\\s\\\\S]*?)}\\\\s*?})|(([\\\\s\\\\S]*?){([\\\\s\\\\S]*?)})\",\n \"gi\"\n );\n while (true) {\n let matches = IMPORT_RE.exec(cssText);\n if (!matches) {\n matches = UNIFIED_RE.exec(cssText);\n if (!matches) {\n break;\n } else {\n IMPORT_RE.lastIndex = UNIFIED_RE.lastIndex;\n }\n } else {\n UNIFIED_RE.lastIndex = IMPORT_RE.lastIndex;\n }\n result.push(matches[0]);\n }\n return result;\n}\nconst URL_WITH_FORMAT_RE = /url\\([^)]+\\)\\s*format\\(([\"']?)([^\"']+)\\1\\)/g;\nconst FONT_SRC_RE = /src:\\s*(?:url\\([^)]+\\)\\s*format\\([^)]+\\)[,;]\\s*)+/g;\nfunction filterPreferredFormat(str, context) {\n const { font } = context;\n const preferredFormat = font ? font?.preferredFormat : void 0;\n return preferredFormat ? str.replace(FONT_SRC_RE, (match) => {\n while (true) {\n const [src, , format] = URL_WITH_FORMAT_RE.exec(match) || [];\n if (!format)\n return \"\";\n if (format === preferredFormat)\n return `src: ${src};`;\n }\n }) : str;\n}\nfunction unwrapCssLayers(rules, out = []) {\n for (const rule of Array.from(rules)) {\n if (isLayerBlockRule(rule)) {\n out.push(...unwrapCssLayers(rule.cssRules));\n } else if (\"cssRules\" in rule) {\n unwrapCssLayers(rule.cssRules, out);\n } else {\n out.push(rule);\n }\n }\n return out;\n}\n\nconst SVG_EXTERNAL_RESOURCE_REGEX = /\\bx?link:?href\\s*=\\s*[\"'](?!data:)[^\"']+[\"']/i;\nfunction svgHasExternalResources(svg) {\n return SVG_EXTERNAL_RESOURCE_REGEX.test(svg.innerHTML);\n}\nasync function domToForeignObjectSvg(node, options) {\n const context = await orCreateContext(node, options);\n if (isElementNode(context.node) && isSVGElementNode(context.node) && !svgHasExternalResources(context.node))\n return context.node;\n const {\n ownerDocument,\n log,\n tasks,\n svgStyleElement,\n svgDefsElement,\n svgStyles,\n font,\n progress,\n autoDestruct,\n onCloneNode,\n onEmbedNode,\n onCreateForeignObjectSvg\n } = context;\n log.time(\"clone node\");\n const clone = await cloneNode(context.node, context, true);\n if (svgStyleElement && ownerDocument) {\n let allCssText = \"\";\n svgStyles.forEach((klasses, cssText) => {\n allCssText += `${klasses.join(\",\\n\")} {\n ${cssText}\n}\n`;\n });\n svgStyleElement.appendChild(ownerDocument.createTextNode(allCssText));\n }\n log.timeEnd(\"clone node\");\n await onCloneNode?.(clone);\n if (font !== false && isElementNode(clone)) {\n log.time(\"embed web font\");\n await embedWebFont(clone, context);\n log.timeEnd(\"embed web font\");\n }\n log.time(\"embed node\");\n embedNode(clone, context);\n const count = tasks.length;\n let current = 0;\n const runTask = async () => {\n while (true) {\n const task = tasks.pop();\n if (!task)\n break;\n try {\n await task;\n } catch (error) {\n context.log.warn(\"Failed to run task\", error);\n }\n progress?.(++current, count);\n }\n };\n progress?.(current, count);\n await Promise.all([...Array.from({ length: 4 })].map(runTask));\n log.timeEnd(\"embed node\");\n await onEmbedNode?.(clone);\n const svg = createForeignObjectSvg(clone, context);\n svgDefsElement && svg.insertBefore(svgDefsElement, svg.children[0]);\n svgStyleElement && svg.insertBefore(svgStyleElement, svg.children[0]);\n autoDestruct && destroyContext(context);\n await onCreateForeignObjectSvg?.(svg);\n return svg;\n}\nfunction createForeignObjectSvg(clone, context) {\n const { width, height } = context;\n const svg = createSvg(width, height, clone.ownerDocument);\n const foreignObject = svg.ownerDocument.createElementNS(svg.namespaceURI, \"foreignObject\");\n foreignObject.setAttributeNS(null, \"x\", \"0%\");\n foreignObject.setAttributeNS(null, \"y\", \"0%\");\n foreignObject.setAttributeNS(null, \"width\", \"100%\");\n foreignObject.setAttributeNS(null, \"height\", \"100%\");\n foreignObject.append(clone);\n svg.appendChild(foreignObject);\n return svg;\n}\n\nasync function domToCanvas(node, options) {\n const context = await orCreateContext(node, options);\n const svg = await domToForeignObjectSvg(context);\n const dataUrl = svgToDataUrl(svg, context.isEnable(\"removeControlCharacter\"));\n if (!context.autoDestruct) {\n context.svgStyleElement = createStyleElement(context.ownerDocument);\n context.svgDefsElement = context.ownerDocument?.createElementNS(XMLNS, \"defs\");\n context.svgStyles.clear();\n }\n const image = createImage(dataUrl, svg.ownerDocument);\n return await imageToCanvas(image, context);\n}\n\nasync function domToBlob(node, options) {\n const context = await orCreateContext(node, options);\n const { log, type, quality, dpi } = context;\n const canvas = await domToCanvas(context);\n log.time(\"canvas to blob\");\n const blob = await canvasToBlob(canvas, type, quality);\n if ([\"image/png\", \"image/jpeg\"].includes(type) && dpi) {\n const arrayBuffer = await blobToArrayBuffer(blob.slice(0, 33));\n let uint8Array = new Uint8Array(arrayBuffer);\n if (type === \"image/png\") {\n uint8Array = changePngDpi(uint8Array, dpi);\n } else if (type === \"image/jpeg\") {\n uint8Array = changeJpegDpi(uint8Array, dpi);\n }\n log.timeEnd(\"canvas to blob\");\n return new Blob([uint8Array, blob.slice(33)], { type });\n }\n log.timeEnd(\"canvas to blob\");\n return blob;\n}\n\nasync function domToDataUrl(node, options) {\n const context = await orCreateContext(node, options);\n const { log, quality, type, dpi } = context;\n const canvas = await domToCanvas(context);\n log.time(\"canvas to data url\");\n let dataUrl = canvas.toDataURL(type, quality);\n if ([\"image/png\", \"image/jpeg\"].includes(type) && dpi && SUPPORT_ATOB && SUPPORT_BTOA) {\n const [format, body] = dataUrl.split(\",\");\n let headerLength = 0;\n let overwritepHYs = false;\n if (type === \"image/png\") {\n const b64Index = detectPhysChunkFromDataUrl(body);\n if (b64Index >= 0) {\n headerLength = Math.ceil((b64Index + 28) / 3) * 4;\n overwritepHYs = true;\n } else {\n headerLength = 33 / 3 * 4;\n }\n } else if (type === \"image/jpeg\") {\n headerLength = 18 / 3 * 4;\n }\n const stringHeader = body.substring(0, headerLength);\n const restOfData = body.substring(headerLength);\n const headerBytes = window.atob(stringHeader);\n const uint8Array = new Uint8Array(headerBytes.length);\n for (let i = 0; i < uint8Array.length; i++) {\n uint8Array[i] = headerBytes.charCodeAt(i);\n }\n const finalArray = type === \"image/png\" ? changePngDpi(uint8Array, dpi, overwritepHYs) : changeJpegDpi(uint8Array, dpi);\n const base64Header = window.btoa(String.fromCharCode(...finalArray));\n dataUrl = [format, \",\", base64Header, restOfData].join(\"\");\n }\n log.timeEnd(\"canvas to data url\");\n return dataUrl;\n}\n\nasync function domToSvg(node, options) {\n const context = await orCreateContext(node, options);\n const { width, height, ownerDocument } = context;\n const dataUrl = await domToDataUrl(context);\n const svg = createSvg(width, height, ownerDocument);\n const svgImage = svg.ownerDocument.createElementNS(svg.namespaceURI, \"image\");\n svgImage.setAttributeNS(null, \"href\", dataUrl);\n svgImage.setAttributeNS(null, \"height\", \"100%\");\n svgImage.setAttributeNS(null, \"width\", \"100%\");\n svg.appendChild(svgImage);\n return svgToDataUrl(svg, context.isEnable(\"removeControlCharacter\"));\n}\n\nasync function domToImage(node, options) {\n const context = await orCreateContext(node, options);\n const { ownerDocument, width, height, scale, type } = context;\n const url = type === \"image/svg+xml\" ? await domToSvg(context) : await domToDataUrl(context);\n const image = createImage(url, ownerDocument);\n image.width = Math.floor(width * scale);\n image.height = Math.floor(height * scale);\n image.style.width = `${width}px`;\n image.style.height = `${height}px`;\n return image;\n}\n\nasync function domToJpeg(node, options) {\n return domToDataUrl(\n await orCreateContext(node, { ...options, type: \"image/jpeg\" })\n );\n}\n\nasync function domToPixel(node, options) {\n const context = await orCreateContext(node, options);\n const canvas = await domToCanvas(context);\n return canvas.getContext(\"2d\").getImageData(0, 0, canvas.width, canvas.height).data;\n}\n\nasync function domToPng(node, options) {\n return domToDataUrl(\n await orCreateContext(node, { ...options, type: \"image/png\" })\n );\n}\n\nasync function domToWebp(node, options) {\n return domToDataUrl(\n await orCreateContext(node, { ...options, type: \"image/webp\" })\n );\n}\n\nexport { createContext, destroyContext, domToBlob, domToCanvas, domToDataUrl, domToForeignObjectSvg, domToImage, domToJpeg, domToPixel, domToPng, domToSvg, domToWebp, loadMedia, waitUntilLoad };\n","import { domToPng } from \"modern-screenshot\";\nimport type { ElementContext, RegionRect } from \"./types.js\";\n\nconst STYLE_KEYS = [\n \"display\", \"position\", \"width\", \"height\", \"margin\", \"padding\",\n \"color\", \"background-color\", \"font-size\", \"font-weight\", \"font-family\",\n \"border\", \"border-radius\", \"box-shadow\", \"flex\", \"grid-template-columns\",\n \"text-align\", \"line-height\", \"opacity\",\n];\n\n/** outerHTML + a curated slice of computed styles — the context handed to Claude. */\nexport function captureElementContext(el: Element): ElementContext {\n const html = el.outerHTML.length > 6000 ? el.outerHTML.slice(0, 6000) + \"…\" : el.outerHTML;\n const cs = getComputedStyle(el);\n const styles: Record<string, string> = {};\n for (const k of STYLE_KEYS) {\n const v = cs.getPropertyValue(k);\n if (v) styles[k] = v.trim();\n }\n return { html, styles };\n}\n\n/** Wait for the page's web fonts to finish loading so they get embedded, not\n * substituted with a fallback (which reflows the capture). Best-effort. */\nasync function fontsReady(): Promise<void> {\n try {\n const fonts = (document as Document & { fonts?: FontFaceSet }).fonts;\n if (fonts?.ready) await fonts.ready;\n } catch {\n /* FontFaceSet unsupported — carry on */\n }\n}\n\n/** Skip Loupe's own UI and redacted elements in any capture. */\nfunction captureFilter(node: Node): boolean {\n if (!(node instanceof Element)) return true;\n if (node.id === \"loupe-root\") return false;\n if (node.hasAttribute(\"data-loupe-redact\")) return false;\n return true;\n}\n\n/**\n * Screenshot the target element. Elements marked [data-loupe-redact] are\n * excluded before anything leaves the browser, and our own UI is never captured.\n */\nexport async function captureScreenshot(el: Element): Promise<string | undefined> {\n try {\n await fontsReady();\n return await domToPng(el as HTMLElement, {\n scale: Math.min(window.devicePixelRatio || 1, 2),\n backgroundColor: getComputedStyle(document.body).backgroundColor || \"#ffffff\",\n // Give cross-origin font/asset fetches time to embed (default is short) so\n // the capture matches the page instead of falling back to system fonts.\n timeout: 30000,\n filter: captureFilter,\n });\n } catch (err) {\n console.warn(\"[loupe] screenshot capture failed\", err);\n return undefined;\n }\n}\n\n/**\n * Screenshot a free-form rectangle (the \"region shot\"). `rect` is in **viewport**\n * coordinates (what's on screen now). The default renders the whole page and crops;\n * the extension overrides this with a real captureVisibleTab crop. Redacted regions\n * are painted over before the pixels leave the browser.\n */\nexport async function captureRegionScreenshot(rect: RegionRect): Promise<string | undefined> {\n try {\n await fontsReady();\n const scale = Math.min(window.devicePixelRatio || 1, 2);\n // Render the SMALLEST element that fully covers the selection, not the whole\n // page. Rendering document.body is heavy and its cross-origin font embedding\n // often times out (→ fallback fonts, reflow); a scoped subtree behaves like\n // the reliable element capture.\n const container = regionContainer(rect);\n const origin = container.getBoundingClientRect();\n const full = await domToPng(container, {\n scale,\n backgroundColor: getComputedStyle(document.body).backgroundColor || \"#ffffff\",\n timeout: 30000,\n filter: captureFilter,\n });\n const redact = Array.from(document.querySelectorAll(\"[data-loupe-redact]\")).map((n) =>\n (n as Element).getBoundingClientRect(),\n );\n return await cropRegion(full, rect, origin.left, origin.top, scale, redact);\n } catch (err) {\n console.warn(\"[loupe] region capture failed\", err);\n return undefined;\n }\n}\n\n/** The smallest on-page element whose box fully covers the selection rectangle. */\nfunction regionContainer(rect: RegionRect): HTMLElement {\n const cx = rect.x + rect.w / 2;\n const cy = rect.y + rect.h / 2;\n let node = document.elementFromPoint(cx, cy) as HTMLElement | null;\n if (node && node.closest(\"#loupe-root\")) node = null; // never our own UI\n const covers = (r: DOMRect) =>\n r.left <= rect.x && r.top <= rect.y && r.right >= rect.x + rect.w && r.bottom >= rect.y + rect.h;\n while (node && node !== document.body && node !== document.documentElement) {\n if (covers(node.getBoundingClientRect())) return node;\n node = node.parentElement;\n }\n return document.body;\n}\n\n/** Crop `rect` (viewport coords) out of a full-page data URL whose origin sits at (ox, oy). */\nfunction cropRegion(\n dataUrl: string,\n rect: RegionRect,\n ox: number,\n oy: number,\n scale: number,\n redact: DOMRect[],\n): Promise<string> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n const sw = Math.max(1, Math.round(rect.w * scale));\n const sh = Math.max(1, Math.round(rect.h * scale));\n const canvas = document.createElement(\"canvas\");\n canvas.width = sw;\n canvas.height = sh;\n const ctx = canvas.getContext(\"2d\")!;\n ctx.drawImage(img, (rect.x - ox) * scale, (rect.y - oy) * scale, sw, sh, 0, 0, sw, sh);\n ctx.fillStyle = \"#0f0f14\";\n for (const r of redact) {\n ctx.fillRect((r.left - rect.x) * scale, (r.top - rect.y) * scale, r.width * scale, r.height * scale);\n }\n resolve(canvas.toDataURL(\"image/png\"));\n };\n img.onerror = reject;\n img.src = dataUrl;\n });\n}\n","import type { Comment, StorageAdapter } from \"./types.js\";\n\n/**\n * Prototype storage: everything lives in localStorage, keyed by project + path.\n * The production adapter swaps this for HTTP calls to the backend — the SDK\n * only depends on the StorageAdapter interface, so nothing else changes.\n */\nexport class LocalStorageAdapter implements StorageAdapter {\n private key(projectKey: string, url: string) {\n return `loupe:${projectKey}:${url}`;\n }\n\n private readAll(projectKey: string, url: string): Comment[] {\n try {\n const raw = localStorage.getItem(this.key(projectKey, url));\n return raw ? (JSON.parse(raw) as Comment[]) : [];\n } catch {\n return [];\n }\n }\n\n private writeAll(projectKey: string, url: string, comments: Comment[]) {\n localStorage.setItem(this.key(projectKey, url), JSON.stringify(comments));\n }\n\n async list(projectKey: string, url: string): Promise<Comment[]> {\n return this.readAll(projectKey, url);\n }\n\n async save(comment: Comment): Promise<Comment> {\n const all = this.readAll(comment.projectKey, comment.url);\n all.push(comment);\n this.writeAll(comment.projectKey, comment.url, all);\n return comment;\n }\n\n async update(id: string, patch: Partial<Comment>): Promise<void> {\n // We don't know the url here, so scan the loupe:* keys for the id.\n for (let i = 0; i < localStorage.length; i++) {\n const k = localStorage.key(i);\n if (!k || !k.startsWith(\"loupe:\")) continue;\n const list = JSON.parse(localStorage.getItem(k) || \"[]\") as Comment[];\n const idx = list.findIndex((c) => c.id === id);\n if (idx >= 0) {\n list[idx] = { ...list[idx]!, ...patch };\n localStorage.setItem(k, JSON.stringify(list));\n return;\n }\n }\n }\n\n async remove(id: string): Promise<void> {\n for (let i = 0; i < localStorage.length; i++) {\n const k = localStorage.key(i);\n if (!k || !k.startsWith(\"loupe:\")) continue;\n const list = JSON.parse(localStorage.getItem(k) || \"[]\") as Comment[];\n const next = list.filter((c) => c.id !== id);\n if (next.length !== list.length) {\n localStorage.setItem(k, JSON.stringify(next));\n return;\n }\n }\n }\n}\n","import type { Comment, LoupeUser, StorageAdapter } from \"./types.js\";\n\n/**\n * Talks to the Loupe backend. Selected automatically when `apiBase` is set in\n * init(). Sends the identity headers the backend verifies (HMAC in production).\n */\nexport class HttpAdapter implements StorageAdapter {\n constructor(\n private base: string,\n private user: LoupeUser,\n private userHmac?: string,\n private extraHeaders?: Record<string, string>,\n private credentials?: RequestCredentials,\n ) {\n this.base = base.replace(/\\/$/, \"\");\n }\n\n private headers(): HeadersInit {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\", \"X-Loupe-User\": this.user.id };\n if (this.userHmac) h[\"X-Loupe-Hmac\"] = this.userHmac;\n if (this.extraHeaders) Object.assign(h, this.extraHeaders);\n return h;\n }\n\n /** Base fetch options shared by every request (credentials mode, if set). */\n private opts(init?: RequestInit): RequestInit {\n return this.credentials ? { credentials: this.credentials, ...init } : { ...init };\n }\n\n async list(projectKey: string, url: string): Promise<Comment[]> {\n const q = new URLSearchParams({ projectKey, url });\n const res = await fetch(`${this.base}/v1/comments?${q}`, this.opts({ headers: this.headers() }));\n if (!res.ok) throw new Error(`list failed: ${res.status}`);\n return (await res.json()) as Comment[];\n }\n\n async save(comment: Comment): Promise<Comment> {\n // Upload the screenshot to object storage first, then store only its URL —\n // keeps the comment row (and every later list/read) small.\n if (comment.screenshot?.startsWith(\"data:\")) {\n try {\n const up = await fetch(`${this.base}/v1/blobs`, this.opts({\n method: \"POST\",\n headers: this.headers(),\n body: JSON.stringify({ projectKey: comment.projectKey, data: comment.screenshot }),\n }));\n if (up.ok) comment = { ...comment, screenshot: (await up.json()).url };\n } catch {\n /* fall back to inlining the data URL if upload fails */\n }\n }\n const res = await fetch(`${this.base}/v1/comments`, this.opts({\n method: \"POST\",\n headers: this.headers(),\n body: JSON.stringify(comment),\n }));\n if (!res.ok) throw new Error(`save failed: ${res.status}`);\n return (await res.json()) as Comment;\n }\n\n async update(id: string, patch: Partial<Comment>): Promise<void> {\n const res = await fetch(`${this.base}/v1/comments/${encodeURIComponent(id)}`, this.opts({\n method: \"PATCH\",\n headers: this.headers(),\n body: JSON.stringify(patch),\n }));\n if (!res.ok) throw new Error(`update failed: ${res.status}`);\n }\n\n async remove(id: string): Promise<void> {\n const res = await fetch(`${this.base}/v1/comments/${encodeURIComponent(id)}`, this.opts({\n method: \"DELETE\",\n headers: this.headers(),\n }));\n if (!res.ok && res.status !== 404) throw new Error(`remove failed: ${res.status}`);\n }\n}\n","import { STYLES } from \"./styles.js\";\nimport { captureAnchor, resolveAnchor } from \"./fingerprint.js\";\nimport { captureElementContext, captureScreenshot, captureRegionScreenshot } from \"./capture.js\";\nimport { LocalStorageAdapter } from \"./store.js\";\nimport { HttpAdapter } from \"./http-adapter.js\";\nimport type { Anchor, Comment, LoupeConfig, RegionRect, StorageAdapter } from \"./types.js\";\n\ntype Mode = \"off\" | \"inspect\" | \"region\";\n/** What the composer is about to attach a comment to. */\ntype ComposeTarget =\n | { kind: \"element\"; element: Element }\n | { kind: \"region\"; region: RegionRect; element: Element | null; screenshot?: string };\n\nconst uid = () =>\n (crypto as any).randomUUID ? crypto.randomUUID() : \"c_\" + Math.abs(hash(String(performance.now()))).toString(36);\nfunction hash(s: string) { let h = 0; for (let i = 0; i < s.length; i++) h = (h * 31 + s.charCodeAt(i)) | 0; return h; }\n\nexport class LoupeApp {\n private cfg: LoupeConfig;\n private store: StorageAdapter;\n private root!: HTMLElement;\n private shadow!: ShadowRoot;\n private overlay!: HTMLElement;\n private hl!: HTMLElement;\n private selbox!: HTMLElement;\n private regionBox!: HTMLElement;\n private toolbar!: HTMLElement;\n private composer!: HTMLElement;\n private panel!: HTMLElement;\n private countEl!: HTMLElement;\n\n private comments: Comment[] = [];\n /** comment.id → currently resolved element (or null when detached). */\n private resolved = new Map<string, Element | null>();\n /** comment.id → pin element. */\n private pins = new Map<string, HTMLElement>();\n\n private mode: Mode = \"off\";\n private collapsed = false;\n private lastUrl = \"\";\n private targetOffset = { x: 0.5, y: 0.5 };\n private pending: ComposeTarget | null = null;\n private dragStart: { x: number; y: number } | null = null;\n /** region comment whose outline is currently highlighted (tracks scroll). */\n private activeRegionId: string | null = null;\n private regionTimer?: number;\n\n private raf = 0;\n private mo?: MutationObserver;\n private tick?: number;\n\n constructor(cfg: LoupeConfig) {\n this.cfg = cfg;\n // apiBase set → talk to the backend; otherwise persist locally (prototype).\n this.store = cfg.apiBase\n ? new HttpAdapter(cfg.apiBase, cfg.user, cfg.userHmac, cfg.headers, cfg.credentials)\n : new LocalStorageAdapter();\n }\n\n private get url() { return location.pathname + location.search; }\n\n async start() {\n this.buildDom();\n this.lastUrl = this.url;\n this.comments = await this.store.list(this.cfg.projectKey, this.url);\n this.renderPins();\n this.renderPanel();\n this.observe();\n this.watchNavigation();\n if (this.cfg.autoOpen) this.setMode(\"inspect\");\n }\n\n /**\n * Reload comments when the page URL changes without a full reload (SPA\n * navigation), so each page only ever shows its own comments.\n */\n private watchNavigation() {\n const onChange = () => {\n if (this.url === this.lastUrl) return;\n this.lastUrl = this.url;\n void this.reloadComments();\n };\n addEventListener(\"popstate\", onChange);\n // history.pushState/replaceState don't emit events — wrap them once.\n for (const key of [\"pushState\", \"replaceState\"] as const) {\n const original = history[key];\n history[key] = function (this: History, ...args: unknown[]) {\n const result = (original as (...a: unknown[]) => unknown).apply(this, args);\n dispatchEvent(new Event(\"loupe:locationchange\"));\n return result;\n } as History[typeof key];\n }\n addEventListener(\"loupe:locationchange\", onChange);\n }\n\n private async reloadComments() {\n try {\n this.comments = await this.store.list(this.cfg.projectKey, this.url);\n this.renderPins();\n this.renderPanel();\n } catch { /* keep the current view on transient errors */ }\n }\n\n // ---- DOM construction -----------------------------------------------------\n\n private buildDom() {\n this.root = document.createElement(\"div\");\n this.root.id = \"loupe-root\";\n document.body.appendChild(this.root);\n this.shadow = this.root.attachShadow({ mode: \"open\" });\n\n const style = document.createElement(\"style\");\n style.textContent = STYLES;\n this.shadow.appendChild(style);\n\n this.overlay = el(\"div\", \"overlay\");\n this.hl = el(\"div\", \"hl\");\n this.hl.appendChild(el(\"span\", \"tip\"));\n this.selbox = el(\"div\", \"selbox\");\n this.regionBox = el(\"div\", \"region-box\");\n this.overlay.append(this.hl, this.selbox, this.regionBox);\n this.shadow.appendChild(this.overlay);\n\n this.composer = el(\"div\", \"composer\");\n this.shadow.appendChild(this.composer);\n\n this.panel = el(\"div\", \"panel\");\n this.shadow.appendChild(this.panel);\n\n this.toolbar = this.buildToolbar();\n this.shadow.appendChild(this.toolbar);\n }\n\n private buildToolbar(): HTMLElement {\n const bar = el(\"div\", \"toolbar\");\n // Every item shares the same \"<icon><label>\" structure so they line up\n // consistently (and the label can be hidden on mobile to go icon-only).\n // The brand doubles as a collapse/expand toggle.\n const brand = el(\"span\", \"brand\");\n brand.innerHTML = `<span class=\"ico\">◎</span><span class=\"label\">Loupe</span>`;\n brand.title = \"Collapse / expand the Loupe bar\";\n brand.setAttribute(\"role\", \"button\");\n brand.onclick = () => this.toggleCollapsed();\n\n const inspectBtn = this.toolBtn(\"✛\", \"Inspect & comment\", \"inspect\");\n inspectBtn.onclick = () => this.setMode(this.mode === \"inspect\" ? \"off\" : \"inspect\");\n\n const regionBtn = this.toolBtn(REGION_ICON, \"Region shot\", \"region\");\n regionBtn.title = \"Drag a free-size box, screenshot it, and comment\";\n regionBtn.onclick = () => this.setMode(this.mode === \"region\" ? \"off\" : \"region\");\n\n const listBtn = this.toolBtn(\"☰\", \"Comments\", \"comments\");\n this.countEl = el(\"span\", \"count\", \"0\");\n listBtn.appendChild(this.countEl);\n listBtn.onclick = () => this.togglePanel();\n\n bar.append(brand, sep(), inspectBtn, regionBtn, listBtn);\n return bar;\n }\n\n /** A toolbar button with a uniform icon + label layout. `icon` may be an SVG string. */\n private toolBtn(icon: string, label: string, role: string): HTMLButtonElement {\n const b = el(\"button\") as HTMLButtonElement;\n b.dataset.role = role;\n b.title = label;\n b.setAttribute(\"aria-label\", label);\n b.innerHTML = `<span class=\"ico\">${icon}</span><span class=\"label\">${label}</span>`;\n return b;\n }\n\n // ---- inspector ------------------------------------------------------------\n\n private onMove = (e: MouseEvent) => {\n if (this.mode !== \"inspect\") return;\n const target = this.pick(e.clientX, e.clientY);\n if (!target) { this.hl.style.display = \"none\"; return; }\n const r = target.getBoundingClientRect();\n Object.assign(this.hl.style, {\n display: \"block\", left: r.left + \"px\", top: r.top + \"px\",\n width: r.width + \"px\", height: r.height + \"px\",\n });\n (this.hl.firstChild as HTMLElement).textContent =\n target.tagName.toLowerCase() + (target.id ? \"#\" + target.id : \"\");\n };\n\n private onClick = (e: MouseEvent) => {\n if (this.mode !== \"inspect\") return;\n const target = this.pick(e.clientX, e.clientY);\n if (!target) return;\n e.preventDefault();\n e.stopPropagation();\n const r = target.getBoundingClientRect();\n this.targetOffset = {\n x: r.width ? clamp((e.clientX - r.left) / r.width) : 0.5,\n y: r.height ? clamp((e.clientY - r.top) / r.height) : 0.5,\n };\n this.setMode(\"off\");\n this.openComposer({ kind: \"element\", element: target }, e.clientX, e.clientY);\n };\n\n private onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") { this.cancelDrag(); this.setMode(\"off\"); this.closeComposer(); }\n };\n\n // ---- region (\"free-size screenshot\") selection ----------------------------\n\n private onRegionDown = (e: MouseEvent) => {\n if (this.mode !== \"region\" || e.button !== 0) return;\n e.preventDefault();\n e.stopPropagation();\n this.dragStart = { x: e.clientX, y: e.clientY };\n document.addEventListener(\"mousemove\", this.onRegionMove, true);\n document.addEventListener(\"mouseup\", this.onRegionUp, true);\n this.drawSelection(e.clientX, e.clientY);\n };\n\n private onRegionMove = (e: MouseEvent) => {\n if (!this.dragStart) return;\n e.preventDefault();\n this.drawSelection(e.clientX, e.clientY);\n };\n\n private onRegionUp = (e: MouseEvent) => {\n if (!this.dragStart) return;\n e.preventDefault();\n e.stopPropagation();\n const start = this.dragStart;\n this.cancelDrag();\n const vp: RegionRect = {\n x: Math.min(start.x, e.clientX), y: Math.min(start.y, e.clientY),\n w: Math.abs(e.clientX - start.x), h: Math.abs(e.clientY - start.y),\n };\n if (vp.w < 8 || vp.h < 8) { this.selbox.style.display = \"none\"; return; } // stray click\n this.setMode(\"off\");\n this.finishRegion(vp);\n };\n\n private drawSelection(curX: number, curY: number) {\n const s = this.dragStart!;\n Object.assign(this.selbox.style, {\n display: \"block\",\n left: Math.min(s.x, curX) + \"px\", top: Math.min(s.y, curY) + \"px\",\n width: Math.abs(curX - s.x) + \"px\", height: Math.abs(curY - s.y) + \"px\",\n });\n }\n\n private cancelDrag() {\n this.dragStart = null;\n document.removeEventListener(\"mousemove\", this.onRegionMove, true);\n document.removeEventListener(\"mouseup\", this.onRegionUp, true);\n }\n\n /** Capture the selected viewport rect, then open the composer for a region comment. */\n private async finishRegion(vp: RegionRect) {\n // Anchor the region to the element under its center so it survives reflow.\n const centerEl = this.pick(vp.x + vp.w / 2, vp.y + vp.h / 2);\n let rel: RegionRect[\"rel\"];\n if (centerEl) {\n const er = centerEl.getBoundingClientRect();\n if (er.width > 0 && er.height > 0) {\n rel = {\n fx: (vp.x - er.left) / er.width, fy: (vp.y - er.top) / er.height,\n fw: vp.w / er.width, fh: vp.h / er.height,\n };\n }\n }\n const capture = this.cfg.captureRegion ?? captureRegionScreenshot;\n const screenshot = await capture(vp);\n this.selbox.style.display = \"none\";\n // Document coords are the fallback; `rel` (element-relative) is preferred.\n const region: RegionRect = { x: vp.x + window.scrollX, y: vp.y + window.scrollY, w: vp.w, h: vp.h, rel };\n this.openComposer({ kind: \"region\", region, element: centerEl, screenshot }, vp.x + vp.w, vp.y);\n }\n\n /** elementFromPoint, ignoring our own UI. */\n private pick(x: number, y: number): Element | null {\n const hitHl = this.hl.style.display;\n this.hl.style.display = \"none\"; // never let the highlight itself be the hit\n const elAt = document.elementFromPoint(x, y);\n this.hl.style.display = hitHl;\n if (!elAt) return null;\n if (elAt.id === \"loupe-root\" || (elAt as Element).closest?.(\"#loupe-root\")) return null;\n return elAt;\n }\n\n private setMode(mode: Mode) {\n this.mode = mode;\n this.hl.style.display = \"none\";\n this.selbox.style.display = \"none\";\n this.cancelDrag();\n document.body.style.cursor = mode === \"off\" ? \"\" : \"crosshair\";\n (this.toolbar.querySelector('[data-role=\"inspect\"]') as HTMLElement)?.classList.toggle(\"on\", mode === \"inspect\");\n (this.toolbar.querySelector('[data-role=\"region\"]') as HTMLElement)?.classList.toggle(\"on\", mode === \"region\");\n\n document.removeEventListener(\"mousemove\", this.onMove, true);\n document.removeEventListener(\"click\", this.onClick, true);\n document.removeEventListener(\"mousedown\", this.onRegionDown, true);\n\n if (mode === \"off\") return;\n document.addEventListener(\"keydown\", this.onKey, true);\n this.closeComposer();\n if (mode === \"inspect\") {\n document.addEventListener(\"mousemove\", this.onMove, true);\n document.addEventListener(\"click\", this.onClick, true);\n } else if (mode === \"region\") {\n document.addEventListener(\"mousedown\", this.onRegionDown, true);\n }\n }\n\n // ---- composer -------------------------------------------------------------\n\n private openComposer(target: ComposeTarget, x: number, y: number) {\n this.pending = target;\n const c = this.composer;\n c.innerHTML = \"\";\n const label = el(\"div\", \"target\",\n target.kind === \"element\" ? describe(target.element)\n : `Region · ${Math.round(target.region.w)}×${Math.round(target.region.h)} px`);\n const ta = el(\"textarea\") as HTMLTextAreaElement;\n ta.placeholder = target.kind === \"region\" ? \"What's the issue in this area?\" : \"What should change here?\";\n const row = el(\"div\", \"row\");\n const chk = el(\"label\", \"chk\") as HTMLLabelElement;\n const box = document.createElement(\"input\"); box.type = \"checkbox\";\n // Region shots already captured the pixels; only offer to attach if we got them.\n box.checked = target.kind === \"region\" ? !!target.screenshot : true;\n if (target.kind === \"region\" && !target.screenshot) box.disabled = true;\n chk.append(box, document.createTextNode(\"Attach screenshot\"));\n const btns = el(\"div\", \"btns\");\n const cancel = el(\"button\", \"ghost\", \"Cancel\") as HTMLButtonElement;\n cancel.onclick = () => this.closeComposer();\n const save = el(\"button\", \"primary\", \"Comment\") as HTMLButtonElement;\n save.disabled = true;\n ta.oninput = () => { save.disabled = !ta.value.trim(); };\n save.onclick = () => this.submit(target, ta.value.trim(), box.checked);\n btns.append(cancel, save);\n row.append(chk, btns);\n c.append(label, ta, row);\n\n // Position near the click, clamped to the viewport.\n const w = 300, h = 190;\n const left = Math.min(Math.max(8, x + 12), window.innerWidth - w - 8);\n const top = Math.min(Math.max(8, y + 12), window.innerHeight - h - 8);\n Object.assign(c.style, { display: \"block\", left: left + \"px\", top: top + \"px\" });\n ta.focus();\n }\n\n private closeComposer() {\n this.composer.style.display = \"none\";\n this.pending = null;\n }\n\n private async submit(target: ComposeTarget, body: string, withShot: boolean) {\n if (!body) return;\n const saveBtn = this.composer.querySelector(\".primary\") as HTMLButtonElement;\n if (saveBtn) { saveBtn.disabled = true; saveBtn.textContent = \"Saving…\"; }\n\n let anchor: Anchor, context: Comment[\"context\"], offset: Comment[\"offset\"];\n let screenshot: string | undefined;\n let region: RegionRect | undefined;\n let anchoredEl: Element | null = null;\n\n if (target.kind === \"element\") {\n const capture = this.cfg.captureScreenshot ?? captureScreenshot;\n screenshot = withShot ? await capture(target.element) : undefined;\n anchor = captureAnchor(target.element);\n context = captureElementContext(target.element);\n offset = this.targetOffset;\n anchoredEl = target.element;\n } else {\n screenshot = withShot ? target.screenshot : undefined;\n region = target.region;\n offset = { x: 0, y: 0 };\n // Prefer the real center-element anchor (survives reflow + gives Claude a\n // real element); fall back to a synthetic region anchor when there's none.\n if (target.element) {\n anchor = captureAnchor(target.element);\n context = captureElementContext(target.element);\n anchoredEl = target.element;\n } else {\n anchor = regionAnchor(region);\n context = { html: regionNote(region), styles: {} };\n }\n }\n\n const comment: Comment = {\n id: uid(),\n projectKey: this.cfg.projectKey,\n url: this.url,\n author: this.cfg.user,\n body,\n status: \"open\",\n kind: target.kind,\n anchor,\n context,\n offset,\n region,\n screenshot,\n // Record the screen the feedback was captured on (desktop / tablet / mobile).\n viewport: { w: window.innerWidth, h: window.innerHeight },\n createdAt: new Date().toISOString(),\n };\n await this.store.save(comment);\n this.comments.push(comment);\n this.resolved.set(comment.id, anchoredEl);\n this.closeComposer();\n this.renderPins();\n this.renderPanel();\n this.flash(comment.id);\n }\n\n // ---- pins + re-anchoring --------------------------------------------------\n\n private renderPins() {\n // Remove pins for deleted comments.\n for (const [id, pin] of this.pins) {\n if (!this.comments.find((c) => c.id === id)) { pin.remove(); this.pins.delete(id); }\n }\n this.comments.forEach((c, i) => {\n let pin = this.pins.get(c.id);\n if (!pin) {\n pin = el(\"button\", \"pin\") as HTMLButtonElement;\n pin.onclick = () => { this.openPanel(); this.flash(c.id); };\n this.overlay.appendChild(pin);\n this.pins.set(c.id, pin);\n }\n pin.textContent = String(i + 1);\n pin.classList.toggle(\"done\", c.status === \"done\");\n });\n this.countEl.textContent = String(this.comments.length);\n this.position();\n }\n\n /** Reposition every pin, re-resolving anchors whose element has gone. */\n private position = () => {\n for (const c of this.comments) {\n const pin = this.pins.get(c.id);\n if (!pin) continue;\n\n let elx = this.resolved.get(c.id) ?? null;\n if (!elx || !elx.isConnected) {\n const r = resolveAnchor(c.anchor);\n elx = r?.element ?? null;\n this.resolved.set(c.id, elx);\n }\n\n if (c.kind === \"region\") {\n // Compute the region's live viewport rect from its anchor element; fall\n // back to stored document coords (older data / no anchor found).\n const box = this.regionRect(c, elx);\n if (box) {\n const onScreen = box.x + box.w > 0 && box.x < window.innerWidth && box.y + box.h > 0 && box.y < window.innerHeight;\n Object.assign(pin.style, { left: box.x + \"px\", top: box.y + \"px\", display: onScreen ? \"grid\" : \"none\" });\n pin.classList.toggle(\"detached\", !elx && !c.region?.rel);\n } else {\n pin.style.display = \"none\";\n pin.classList.add(\"detached\");\n }\n continue;\n }\n\n if (elx) {\n const rect = elx.getBoundingClientRect();\n const px = rect.left + c.offset.x * rect.width;\n const py = rect.top + c.offset.y * rect.height;\n const onScreen = rect.bottom > 0 && rect.top < window.innerHeight && rect.width > 0;\n Object.assign(pin.style, { left: px + \"px\", top: py + \"px\", display: onScreen ? \"grid\" : \"none\" });\n pin.classList.remove(\"detached\");\n } else {\n pin.style.display = \"none\";\n pin.classList.add(\"detached\");\n }\n }\n\n // Keep the highlighted region outline glued to its live rect while scrolling.\n if (this.activeRegionId) {\n const c = this.comments.find((x) => x.id === this.activeRegionId);\n const box = c && this.regionRect(c, this.resolved.get(c.id) ?? null);\n if (box) {\n Object.assign(this.regionBox.style, {\n display: \"block\", left: box.x + \"px\", top: box.y + \"px\", width: box.w + \"px\", height: box.h + \"px\",\n });\n }\n }\n };\n\n /**\n * The current viewport rect for a region comment. Prefers the element-relative\n * fractions (so it tracks reflow across viewports); falls back to the stored\n * document coordinates minus scroll. Returns null if neither is available.\n */\n private regionRect(c: Comment, elx: Element | null): { x: number; y: number; w: number; h: number } | null {\n const rel = c.region?.rel;\n if (elx && rel) {\n const r = elx.getBoundingClientRect();\n return { x: r.left + rel.fx * r.width, y: r.top + rel.fy * r.height, w: rel.fw * r.width, h: rel.fh * r.height };\n }\n if (c.region) {\n return { x: c.region.x - window.scrollX, y: c.region.y - window.scrollY, w: c.region.w, h: c.region.h };\n }\n return null;\n }\n\n private observe() {\n const reposition = () => {\n cancelAnimationFrame(this.raf);\n this.raf = requestAnimationFrame(this.position);\n };\n window.addEventListener(\"scroll\", reposition, true);\n window.addEventListener(\"resize\", reposition);\n let debounce = 0;\n this.mo = new MutationObserver(() => {\n clearTimeout(debounce);\n debounce = window.setTimeout(() => { this.position(); this.renderPanel(); }, 120);\n });\n this.mo.observe(document.body, { childList: true, subtree: true, attributes: true, characterData: true });\n // Safety net for animated / late-loading layouts.\n this.tick = window.setInterval(this.position, 800);\n }\n\n // ---- panel ----------------------------------------------------------------\n\n private openPanel() { this.panel.classList.add(\"open\"); this.renderPanel(); }\n private togglePanel() { this.panel.classList.toggle(\"open\"); this.renderPanel(); }\n\n /** Collapse the toolbar to just the logo (or expand it back). */\n private toggleCollapsed() {\n this.collapsed = !this.collapsed;\n this.toolbar.classList.toggle(\"collapsed\", this.collapsed);\n if (this.collapsed) {\n // Leave any active mode, close the panel/composer, and hide the pins.\n this.setMode(\"off\");\n this.panel.classList.remove(\"open\");\n this.closeComposer();\n this.overlay.style.display = \"none\";\n } else {\n this.overlay.style.display = \"\";\n this.renderPins();\n }\n }\n\n private renderPanel() {\n const p = this.panel;\n p.innerHTML = \"\";\n const head = el(\"div\", \"phead\");\n head.append(document.createTextNode(`Comments · ${this.comments.length}`));\n const x = el(\"button\", \"x\", \"×\") as HTMLButtonElement;\n x.onclick = () => p.classList.remove(\"open\");\n head.appendChild(x);\n p.appendChild(head);\n\n const list = el(\"div\", \"list\");\n if (!this.comments.length) {\n list.appendChild(el(\"div\", \"empty\", \"No comments yet. Click “Inspect & comment”, then click any element.\"));\n }\n this.comments.forEach((c, i) => list.appendChild(this.itemView(c, i)));\n p.appendChild(list);\n }\n\n private itemView(c: Comment, i: number): HTMLElement {\n const detached = this.pins.get(c.id)?.classList.contains(\"detached\") && c.status !== \"done\";\n const item = el(\"div\", \"item\");\n const top = el(\"div\", \"top\");\n const num = el(\"span\", \"num\" + (c.status === \"done\" ? \" done\" : detached ? \" detached\" : \"\"), String(i + 1));\n const who = el(\"span\", \"who\", c.author.name);\n top.append(num, who);\n const vw = c.viewport?.w;\n if (vw) {\n const kind = vw < 768 ? \"mobile\" : vw < 1024 ? \"tablet\" : \"desktop\";\n const icon = vw < 768 ? \"📱\" : vw < 1024 ? \"▦\" : \"🖥\";\n top.appendChild(el(\"span\", \"device\", `${icon} ${kind}`));\n }\n if (c.status === \"done\") top.appendChild(el(\"span\", \"badge done\", \"done\"));\n else if (detached) top.appendChild(el(\"span\", \"badge detached\", \"element moved/removed\"));\n item.appendChild(top);\n\n item.appendChild(el(\"div\", \"body\", c.body));\n item.appendChild(el(\"div\", \"meta\", describeAnchor(c)));\n\n if (c.screenshot) {\n const img = el(\"img\", \"shot\") as HTMLImageElement;\n img.src = c.screenshot;\n item.appendChild(img);\n }\n\n const actions = el(\"div\", \"actions\");\n const doneBtn = el(\"button\", \"\", c.status === \"done\" ? \"Reopen\" : \"Mark done\") as HTMLButtonElement;\n doneBtn.onclick = async (e) => {\n e.stopPropagation();\n const status = c.status === \"done\" ? \"open\" : \"done\";\n c.status = status; await this.store.update(c.id, { status });\n this.renderPins(); this.renderPanel();\n };\n const claudeBtn = el(\"button\", \"\", \"Copy for Claude\") as HTMLButtonElement;\n claudeBtn.onclick = async (e) => { e.stopPropagation(); await this.copyForClaude(c); claudeBtn.textContent = \"Copied ✓\"; };\n const del = el(\"button\", \"\", \"Delete\") as HTMLButtonElement;\n del.onclick = async (e) => {\n e.stopPropagation();\n await this.store.remove(c.id);\n this.comments = this.comments.filter((x) => x.id !== c.id);\n this.resolved.delete(c.id);\n this.renderPins(); this.renderPanel();\n };\n actions.append(doneBtn, claudeBtn, del);\n item.appendChild(actions);\n\n item.onclick = () => this.flash(c.id);\n return item;\n }\n\n private async copyForClaude(c: Comment) {\n const prompt = [\n `# Product feedback from ${c.author.name}`,\n ``,\n `**Comment:** ${c.body}`,\n `**Page:** ${c.url}`,\n `**Element:** \\`${c.anchor.cssPath}\\``,\n c.anchor.testid ? `**Stable id:** \\`${c.anchor.testid}\\`` : ``,\n ``,\n `## Target element`,\n \"```html\",\n c.context.html,\n \"```\",\n ``,\n `## Computed styles`,\n \"```json\",\n JSON.stringify(c.context.styles, null, 2),\n \"```\",\n ].filter(Boolean).join(\"\\n\");\n try { await navigator.clipboard.writeText(prompt); } catch { console.log(\"[loupe] copy failed; prompt:\\n\" + prompt); }\n }\n\n private flash(id: string) {\n const c = this.comments.find((x) => x.id === id);\n const pin = this.pins.get(id);\n\n if (c?.kind === \"region\" && c.region) {\n for (const p of this.pins.values()) p.classList.remove(\"active\");\n pin?.classList.add(\"active\");\n // Show the outline, keep it tracking scroll, then fade it out.\n this.activeRegionId = id;\n window.clearTimeout(this.regionTimer);\n this.regionTimer = window.setTimeout(() => {\n this.activeRegionId = null;\n this.regionBox.style.display = \"none\";\n }, 2400);\n // Scroll to the anchor element when we have it (correct across reflow),\n // otherwise to the stored document position.\n const elx = this.resolved.get(id);\n if (elx) elx.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n else window.scrollTo({ top: Math.max(0, c.region.y - 120), left: Math.max(0, c.region.x - 120), behavior: \"smooth\" });\n this.position();\n return;\n }\n\n if (!pin || pin.classList.contains(\"detached\")) return;\n for (const p of this.pins.values()) p.classList.remove(\"active\");\n pin.classList.add(\"active\");\n const elx = this.resolved.get(id);\n if (elx) elx.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n }\n\n destroy() {\n this.setMode(\"off\");\n this.mo?.disconnect();\n if (this.tick) clearInterval(this.tick);\n window.clearTimeout(this.regionTimer);\n document.removeEventListener(\"keydown\", this.onKey, true);\n this.root?.remove();\n }\n}\n\n// ---- tiny DOM helpers -------------------------------------------------------\n\nfunction el<K extends keyof HTMLElementTagNameMap>(tag: K, cls = \"\", text = \"\"): HTMLElementTagNameMap[K] {\n const n = document.createElement(tag);\n if (cls) n.className = cls;\n if (text) n.textContent = text;\n return n;\n}\nfunction sep() { return el(\"span\", \"sep\"); }\nfunction clamp(n: number) { return Math.max(0, Math.min(1, n)); }\n\n/** Dashed marquee icon for the \"Region shot\" button — inline SVG so it never depends on a font. */\nconst REGION_ICON =\n `<svg class=\"ico\" width=\"15\" height=\"15\" viewBox=\"0 0 15 15\" fill=\"none\" aria-hidden=\"true\">` +\n `<rect x=\"1.5\" y=\"2.5\" width=\"12\" height=\"10\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-dasharray=\"2.4 1.8\"/>` +\n `</svg>`;\n\n/** Synthesize an Anchor for a free region so downstream (dashboard/MCP) stays happy. */\nfunction regionAnchor(region: RegionRect): Anchor {\n return {\n tag: \"region\",\n cssPath: `region ${Math.round(region.w)}×${Math.round(region.h)}`,\n xpath: \"\",\n testid: null,\n text: \"\",\n attrs: {},\n nthOfType: 1,\n rect: { x: Math.round(region.x), y: Math.round(region.y), w: Math.round(region.w), h: Math.round(region.h) },\n viewport: { w: window.innerWidth, h: window.innerHeight },\n };\n}\nfunction regionNote(region: RegionRect): string {\n return `<!-- Loupe free-region annotation: ${Math.round(region.w)}×${Math.round(region.h)}px at document (${Math.round(region.x)}, ${Math.round(region.y)}). No single DOM element — see the attached screenshot. -->`;\n}\n\nfunction describe(elx: Element): string {\n const testid = elx.getAttribute(\"data-testid\") || elx.getAttribute(\"data-test\");\n const tag = elx.tagName.toLowerCase();\n if (testid) return `${tag}[data-testid=\"${testid}\"]`;\n if (elx.id) return `${tag}#${elx.id}`;\n const txt = (elx.textContent || \"\").trim().replace(/\\s+/g, \" \").slice(0, 32);\n return txt ? `${tag} · “${txt}”` : tag;\n}\nfunction describeAnchor(c: Comment): string {\n return c.anchor.testid ? `[data-testid=\"${c.anchor.testid}\"]` : c.anchor.cssPath;\n}\n","import { LoupeApp } from \"./app.js\";\nimport type { LoupeConfig } from \"./types.js\";\n\nexport type { LoupeConfig, LoupeUser, Comment, Anchor, RegionRect } from \"./types.js\";\n\nlet app: LoupeApp | null = null;\n\n/**\n * Initialize Loupe on the current page. Call once, after your app knows who the\n * user is. The toolbar renders only for the identified user.\n *\n * Loupe.init({ projectKey: \"pk_live_…\", user: { id, name, email }, userHmac });\n */\nexport function init(config: LoupeConfig): void {\n if (app) return; // idempotent\n if (!config?.projectKey) { console.error(\"[loupe] init requires a projectKey\"); return; }\n if (!config.user?.id) { console.error(\"[loupe] init requires user.id\"); return; }\n // NOTE: in production the backend verifies config.userHmac before serving data.\n app = new LoupeApp(config);\n const boot = () => app!.start();\n if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", boot);\n else boot();\n}\n\n/** Tear down the toolbar and all listeners. */\nexport function destroy(): void {\n app?.destroy();\n app = null;\n}\n"],"mappings":"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","names":["el","el","el","init","uid","elx"]}