web-remarq 0.3.2 → 0.4.2

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/core/viewport.ts","../src/core/storage.ts","../src/core/hash-detect.ts","../src/core/source-detect.ts","../src/core/fingerprint.ts","../src/core/matcher.ts","../src/core/agent-export.ts","../src/ui/styles.ts","../src/ui/theme.ts","../src/ui/toolbar.ts","../src/ui/overlay.ts","../src/ui/spacing-overlay.ts","../src/ui/popup.ts","../src/ui/markers.ts","../src/ui/detached-panel.ts","../src/spa.ts","../src/web-remarq.ts"],"sourcesContent":["export { WebRemarq } from './web-remarq'\nexport type { Annotation, AnnotationStore, ElementFingerprint, CSSModuleClass, WebRemarqOptions, ImportResult, AgentExport, AgentAnnotation } from './core/types'\n","type BucketChangeCallback = () => void\n\nlet currentBucket: number = 0\nlet onBucketChange: BucketChangeCallback | null = null\nlet resizeHandler: (() => void) | null = null\n\nexport function toBucket(width: number): number {\n return Math.floor(width / 100) * 100\n}\n\nfunction debounce(fn: () => void, ms: number): () => void {\n let timer: ReturnType<typeof setTimeout>\n return () => {\n clearTimeout(timer)\n timer = setTimeout(fn, ms)\n }\n}\n\nexport function initViewportListener(callback: BucketChangeCallback): void {\n currentBucket = toBucket(window.innerWidth)\n onBucketChange = callback\n\n resizeHandler = debounce(() => {\n const newBucket = toBucket(window.innerWidth)\n if (newBucket !== currentBucket) {\n currentBucket = newBucket\n onBucketChange?.()\n }\n }, 300)\n\n window.addEventListener('resize', resizeHandler)\n}\n\nexport function destroyViewportListener(): void {\n if (resizeHandler) {\n window.removeEventListener('resize', resizeHandler)\n resizeHandler = null\n }\n onBucketChange = null\n}\n","import type { Annotation, AnnotationStore } from './types'\nimport { toBucket } from './viewport'\n\nconst STORAGE_KEY = 'remarq:annotations'\n\nexport class AnnotationStorage {\n private annotations: Annotation[] = []\n private extraFields: Record<string, unknown> = {}\n isMemoryOnly = false\n\n constructor() {\n this.load()\n }\n\n getAll(): Annotation[] {\n return [...this.annotations]\n }\n\n getByRoute(route: string): Annotation[] {\n return this.annotations.filter((a) => a.route === route)\n }\n\n add(annotation: Annotation): void {\n this.annotations.push(annotation)\n this.save()\n }\n\n remove(id: string): void {\n this.annotations = this.annotations.filter((a) => a.id !== id)\n this.save()\n }\n\n update(id: string, changes: Partial<Annotation>): void {\n const idx = this.annotations.findIndex((a) => a.id === id)\n if (idx !== -1) {\n this.annotations[idx] = { ...this.annotations[idx], ...changes }\n this.save()\n }\n }\n\n clearAll(): void {\n this.annotations = []\n this.save()\n }\n\n exportJSON(): AnnotationStore {\n return {\n version: 1,\n annotations: [...this.annotations],\n }\n }\n\n importJSON(data: AnnotationStore): void {\n this.annotations = [...data.annotations]\n this.migrateViewportBuckets()\n this.save()\n }\n\n private migrateViewportBuckets(): void {\n for (const ann of this.annotations) {\n if (ann.viewportBucket == null && ann.viewport) {\n const width = parseInt(ann.viewport.split('x')[0], 10)\n ann.viewportBucket = toBucket(width)\n }\n }\n }\n\n private load(): void {\n try {\n const raw = localStorage.getItem(STORAGE_KEY)\n if (raw) {\n const parsed = JSON.parse(raw)\n const { version, annotations, ...rest } = parsed\n this.annotations = annotations ?? []\n this.extraFields = rest\n this.migrateViewportBuckets()\n }\n } catch {\n this.isMemoryOnly = true\n }\n }\n\n private save(): void {\n if (this.isMemoryOnly) return\n try {\n const data = {\n version: 1,\n ...this.extraFields,\n annotations: this.annotations,\n }\n localStorage.setItem(STORAGE_KEY, JSON.stringify(data))\n } catch {\n this.isMemoryOnly = true\n }\n }\n}\n","import type { CSSModuleClass } from './types'\n\nconst CSS_MODULES_RE = /^(.+)__([a-zA-Z0-9]{3,})$/\nconst CSS_MODULES_3SEG_RE = /^([^_]+(?:[_-][^_]+)*)__([a-zA-Z][a-zA-Z0-9]*)__([a-zA-Z0-9]{3,})$/\nconst STYLED_COMPONENTS_RE = /^sc-/\nconst EMOTION_RE = /^css-[a-zA-Z0-9]+$/\nconst PURE_HASH_RE = /^(?=.*[a-zA-Z])(?=.*\\d)[a-zA-Z0-9]{8,}$/\n\nexport function isHashedClass(className: string): boolean {\n if (STYLED_COMPONENTS_RE.test(className)) return true\n if (EMOTION_RE.test(className)) return true\n if (CSS_MODULES_RE.test(className)) return true\n if (PURE_HASH_RE.test(className)) return true\n return false\n}\n\nexport function stripHash(className: string): string {\n const match = className.match(CSS_MODULES_RE)\n if (match) {\n const prefix = className.slice(0, className.lastIndexOf('__'))\n return prefix\n }\n return className\n}\n\nexport function filterClasses(\n classes: string[],\n classFilter?: (className: string) => boolean,\n): string[] {\n const result: string[] = []\n\n for (const cls of classes) {\n if (STYLED_COMPONENTS_RE.test(cls)) continue\n if (EMOTION_RE.test(cls)) continue\n if (PURE_HASH_RE.test(cls)) continue\n\n let stable = stripHash(cls)\n\n if (classFilter && !classFilter(stable)) continue\n\n result.push(stable)\n }\n\n return result\n}\n\nexport function decomposeCSSModules(classes: string[]): CSSModuleClass[] {\n const result: CSSModuleClass[] = []\n for (const cls of classes) {\n const match = cls.match(CSS_MODULES_3SEG_RE)\n if (match) {\n result.push({\n raw: cls,\n moduleHint: match[1],\n localName: match[2],\n })\n }\n }\n return result\n}\n","import type { SourceDetectionResult } from './types'\n\n/**\n * Level 1: Read data-remarq-source/data-remarq-component attrs\n * injected by @web-remarq/babel-plugin or @web-remarq/unplugin.\n */\nexport function detectRemarqPlugin(el: HTMLElement): SourceDetectionResult {\n const source = el.getAttribute('data-remarq-source')\n if (!source) return { source: null, component: null }\n return {\n source,\n component: el.getAttribute('data-remarq-component'),\n }\n}\n\n/**\n * Level 2a: Read data-source or data-locator attrs\n * from locator.js or similar external tools.\n */\nexport function detectExternalSource(el: HTMLElement): SourceDetectionResult {\n const source = el.dataset.source ?? el.getAttribute('data-locator')\n if (!source) return { source: null, component: null }\n return { source, component: null }\n}\n\n/**\n * Level 2b: Read React fiber _debugSource (dev mode only).\n * Unstable/best-effort — React internals are not public API.\n * Walks up the fiber tree because _debugSource lives on component fibers,\n * not on host (DOM element) fibers.\n */\nexport function detectReactFiber(el: HTMLElement): SourceDetectionResult {\n const key = Object.keys(el).find(k => k.startsWith('__reactFiber$'))\n if (!key) return { source: null, component: null }\n\n let current = (el as unknown as Record<string, unknown>)[key] as Record<string, unknown> | null\n // Walk up fiber tree to find nearest fiber with _debugSource (max 15 levels)\n let depth = 0\n while (current && depth < 15) {\n const debugSource = current._debugSource as { fileName?: string; lineNumber?: number; columnNumber?: number } | undefined\n if (debugSource?.fileName) {\n const source = `${debugSource.fileName}:${debugSource.lineNumber ?? 0}:${debugSource.columnNumber ?? 0}`\n\n // Try to get component name from fiber.type\n const fiberType = current.type as { displayName?: string; name?: string } | string | undefined\n const component = typeof fiberType === 'object' && fiberType\n ? (fiberType.displayName ?? fiberType.name ?? null)\n : null\n\n return { source, component }\n }\n current = current.return as Record<string, unknown> | null\n depth++\n }\n\n return { source: null, component: null }\n}\n\n/**\n * Runs Level 2 detectors in order. Returns first non-null result.\n */\nexport function detectSource(el: HTMLElement): SourceDetectionResult {\n const external = detectExternalSource(el)\n if (external.source) return external\n\n const fiber = detectReactFiber(el)\n if (fiber.source) return fiber\n\n return { source: null, component: null }\n}\n","import type { ElementFingerprint, WebRemarqOptions } from './types'\nimport { filterClasses, isHashedClass, decomposeCSSModules } from './hash-detect'\nimport { detectRemarqPlugin, detectSource } from './source-detect'\n\nconst TEXT_MAX_LENGTH = 50\n\nexport function createFingerprint(\n el: HTMLElement,\n options?: Pick<WebRemarqOptions, 'classFilter' | 'dataAttribute'>,\n): ElementFingerprint {\n const dataAttr = options?.dataAttribute ?? 'data-annotate'\n\n return {\n dataAnnotate: el.getAttribute(dataAttr) ?? null,\n dataTestId: el.getAttribute('data-testid')\n ?? el.getAttribute('data-test')\n ?? el.getAttribute('data-cy')\n ?? null,\n id: getStableId(el),\n tagName: el.tagName.toLowerCase(),\n textContent: getTextContent(el),\n role: el.getAttribute('role') ?? null,\n ariaLabel: el.getAttribute('aria-label') ?? null,\n stableClasses: filterClasses(\n Array.from(el.classList),\n options?.classFilter,\n ),\n domPath: buildDomPath(el),\n siblingIndex: getSiblingIndex(el),\n parentAnchor: findParentAnchor(el, dataAttr),\n rawClasses: Array.from(el.classList),\n cssModules: decomposeCSSModules(Array.from(el.classList)),\n ...resolveSourceFields(el),\n }\n}\n\nfunction resolveSourceFields(el: HTMLElement): {\n sourceLocation: string | null\n componentName: string | null\n detectedSource: string | null\n detectedComponent: string | null\n} {\n const plugin = detectRemarqPlugin(el)\n if (plugin.source) {\n return {\n sourceLocation: plugin.source,\n componentName: plugin.component,\n detectedSource: null,\n detectedComponent: null,\n }\n }\n\n const detected = detectSource(el)\n return {\n sourceLocation: null,\n componentName: null,\n detectedSource: detected.source,\n detectedComponent: detected.component,\n }\n}\n\nfunction getStableId(el: HTMLElement): string | null {\n const id = el.id\n if (!id) return null\n if (isHashedClass(id)) return null\n return id\n}\n\nfunction getTextContent(el: HTMLElement): string | null {\n // Use only direct text nodes, not nested children's text\n let text = ''\n for (const node of Array.from(el.childNodes)) {\n if (node.nodeType === Node.TEXT_NODE) {\n text += node.textContent ?? ''\n }\n }\n text = text.trim()\n\n // If no direct text, try first meaningful child's text (for wrappers like <span><b>Text</b></span>)\n if (!text && el.children.length <= 3) {\n text = el.textContent?.trim() ?? ''\n }\n\n if (!text) return null\n return text.length > TEXT_MAX_LENGTH ? text.slice(0, TEXT_MAX_LENGTH) : text\n}\n\nfunction buildDomPath(el: HTMLElement): string {\n const parts: string[] = []\n let current: HTMLElement | null = el\n\n while (current && current !== document.body && parts.length < 5) {\n let segment = current.tagName.toLowerCase()\n const stable = filterClasses(Array.from(current.classList))\n if (stable.length > 0) {\n segment += '.' + stable.slice(0, 2).join('.')\n }\n parts.unshift(segment)\n current = current.parentElement\n }\n\n return parts.join(' > ')\n}\n\nfunction getSiblingIndex(el: HTMLElement): number {\n const parent = el.parentElement\n if (!parent) return 0\n const children = Array.from(parent.children)\n return children.indexOf(el)\n}\n\nfunction findParentAnchor(el: HTMLElement, dataAttr: string): string | null {\n let current = el.parentElement\n while (current && current !== document.body) {\n const value = current.getAttribute(dataAttr)\n if (value) return value\n current = current.parentElement\n }\n return null\n}\n","import type { ElementFingerprint, WebRemarqOptions } from './types'\nimport { filterClasses } from './hash-detect'\n\nconst MATCH_THRESHOLD = 50\n\nexport function levenshteinSimilarity(a: string, b: string): number {\n if (a === b) return 1\n if (!a.length || !b.length) return 0\n\n const matrix: number[][] = []\n for (let i = 0; i <= a.length; i++) {\n matrix[i] = [i]\n }\n for (let j = 0; j <= b.length; j++) {\n matrix[0][j] = j\n }\n\n for (let i = 1; i <= a.length; i++) {\n for (let j = 1; j <= b.length; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1\n matrix[i][j] = Math.min(\n matrix[i - 1][j] + 1,\n matrix[i][j - 1] + 1,\n matrix[i - 1][j - 1] + cost,\n )\n }\n }\n\n const distance = matrix[a.length][b.length]\n return 1 - distance / Math.max(a.length, b.length)\n}\n\nfunction textSimilarity(a: string | null, b: string | null): number {\n if (!a || !b) return 0\n const na = a.trim().toLowerCase()\n const nb = b.trim().toLowerCase()\n if (na === nb) return 1\n if (na.includes(nb) || nb.includes(na)) return 1\n return levenshteinSimilarity(na, nb)\n}\n\nfunction jaccardSimilarity(a: string[], b: string[]): number {\n if (!a.length && !b.length) return 0\n const setA = new Set(a)\n const setB = new Set(b)\n let intersection = 0\n for (const item of setA) {\n if (setB.has(item)) intersection++\n }\n const union = new Set([...a, ...b]).size\n return union === 0 ? 0 : intersection / union\n}\n\nfunction scoreCandidate(el: HTMLElement, fp: ElementFingerprint, dataAttr: string): number {\n let score = 0\n\n // dataAnnotate match (+100)\n const elAnnotate = el.getAttribute(dataAttr)\n if (fp.dataAnnotate && elAnnotate === fp.dataAnnotate) {\n score += 100\n }\n\n // textContent match (+35 scaled)\n const elText = el.textContent?.trim().slice(0, 50) ?? null\n const textSim = textSimilarity(fp.textContent, elText)\n if (textSim > 0.7) {\n score += textSim * 35\n }\n\n // role + ariaLabel match (+30)\n if (fp.role && el.getAttribute('role') === fp.role &&\n fp.ariaLabel && el.getAttribute('aria-label') === fp.ariaLabel) {\n score += 30\n }\n\n // parentAnchor match (+15)\n if (fp.parentAnchor) {\n let parent = el.parentElement\n while (parent && parent !== document.body) {\n if (parent.getAttribute(dataAttr) === fp.parentAnchor) {\n score += 15\n break\n }\n parent = parent.parentElement\n }\n }\n\n // stableClasses overlap (+30 scaled)\n if (fp.stableClasses.length > 0) {\n const elClasses = filterClasses(Array.from(el.classList))\n const jaccard = jaccardSimilarity(fp.stableClasses, elClasses)\n score += jaccard * 30\n }\n\n // domPath match (+20 scaled)\n if (fp.domPath) {\n const elPath = buildDomPath(el)\n const pathSim = levenshteinSimilarity(fp.domPath, elPath)\n score += pathSim * 20\n }\n\n // siblingIndex match (+5)\n const parent = el.parentElement\n if (parent) {\n const idx = Array.from(parent.children).indexOf(el)\n if (idx === fp.siblingIndex) {\n score += 5\n }\n }\n\n return score\n}\n\nfunction buildDomPath(el: HTMLElement): string {\n const parts: string[] = []\n let current: HTMLElement | null = el\n while (current && current !== document.body && parts.length < 5) {\n let segment = current.tagName.toLowerCase()\n const stable = filterClasses(Array.from(current.classList))\n if (stable.length > 0) {\n segment += '.' + stable.slice(0, 2).join('.')\n }\n parts.unshift(segment)\n current = current.parentElement\n }\n return parts.join(' > ')\n}\n\nexport function matchElement(\n fp: ElementFingerprint,\n options?: Pick<WebRemarqOptions, 'dataAttribute'>,\n): HTMLElement | null {\n const dataAttr = options?.dataAttribute ?? 'data-annotate'\n\n // 1. Exact match by data-annotate\n if (fp.dataAnnotate) {\n const el = document.querySelector<HTMLElement>(`[${dataAttr}=\"${fp.dataAnnotate}\"]`)\n if (el) return el\n }\n\n // 2. Exact match by data-testid\n if (fp.dataTestId) {\n const el = document.querySelector<HTMLElement>(\n `[data-testid=\"${fp.dataTestId}\"], [data-test=\"${fp.dataTestId}\"], [data-cy=\"${fp.dataTestId}\"]`,\n )\n if (el) return el\n }\n\n // 3. Exact match by id\n if (fp.id) {\n const el = document.getElementById(fp.id) as HTMLElement | null\n if (el) return el\n }\n\n // 4. Fuzzy match by tagName + weighted scoring\n const candidates = document.querySelectorAll<HTMLElement>(fp.tagName)\n let bestEl: HTMLElement | null = null\n let bestScore = 0\n\n for (const candidate of candidates) {\n const score = scoreCandidate(candidate, fp, dataAttr)\n if (score > bestScore) {\n bestScore = score\n bestEl = candidate\n }\n }\n\n return bestScore >= MATCH_THRESHOLD ? bestEl : null\n}\n","import type {\n Annotation,\n AgentExport,\n AgentAnnotation,\n AgentAnnotationSource,\n AgentSearchHints,\n GrepQuery,\n ElementFingerprint,\n} from './types'\n\nfunction parseSourceLocation(raw: string): { file: string; line: number; column: number } | null {\n const parts = raw.split(':')\n if (parts.length < 2) return null\n // file path may contain \":\" on Windows (C:\\...), so rejoin all but last 2\n const column = parseInt(parts.pop()!, 10)\n const line = parseInt(parts.pop()!, 10)\n const file = parts.join(':')\n if (!file || isNaN(line)) return null\n return { file, line, column: isNaN(column) ? 0 : column }\n}\n\nfunction resolveSource(fp: ElementFingerprint): AgentAnnotationSource | null {\n // Level 1: plugin source\n if (fp.sourceLocation) {\n const parsed = parseSourceLocation(fp.sourceLocation)\n if (parsed) return { ...parsed, component: fp.componentName ?? null }\n }\n\n // Level 2: detected source\n if (fp.detectedSource) {\n const parsed = parseSourceLocation(fp.detectedSource)\n if (parsed) return { ...parsed, component: fp.detectedComponent ?? null }\n }\n\n return null\n}\n\nconst TEMPLATE_GLOB = '*.{tsx,jsx,vue,svelte,html}'\nconst CSS_MODULE_GLOB = '*.module.{css,scss,less}'\nconst COMPONENT_GLOB = '*.{tsx,jsx,vue,ts,js}'\n\nfunction buildSearchHints(fp: ElementFingerprint): AgentSearchHints {\n const grepQueries: GrepQuery[] = []\n\n // High confidence — unique selectors\n if (fp.dataAnnotate) {\n grepQueries.push({ query: `data-annotate=\"${fp.dataAnnotate}\"`, glob: TEMPLATE_GLOB, confidence: 'high' })\n }\n if (fp.dataTestId) {\n grepQueries.push({ query: `data-testid=\"${fp.dataTestId}\"`, glob: TEMPLATE_GLOB, confidence: 'high' })\n }\n if (fp.id) {\n grepQueries.push({ query: `id=\"${fp.id}\"`, glob: TEMPLATE_GLOB, confidence: 'high' })\n }\n if (fp.ariaLabel) {\n grepQueries.push({ query: `aria-label=\"${fp.ariaLabel}\"`, glob: TEMPLATE_GLOB, confidence: 'high' })\n }\n\n // Medium confidence — text, CSS modules, role\n if (fp.textContent) {\n grepQueries.push({ query: `\"${fp.textContent}\"`, glob: TEMPLATE_GLOB, confidence: 'medium' })\n }\n if (fp.role) {\n grepQueries.push({ query: `role=\"${fp.role}\"`, glob: TEMPLATE_GLOB, confidence: 'medium' })\n }\n if (fp.cssModules?.length) {\n for (const mod of fp.cssModules) {\n grepQueries.push({ query: `.${mod.localName}`, glob: CSS_MODULE_GLOB, confidence: 'medium' })\n grepQueries.push({ query: `styles.${mod.localName}`, glob: COMPONENT_GLOB, confidence: 'medium' })\n }\n }\n\n // Low confidence — classes, domPath\n if (fp.stableClasses.length) {\n for (const cls of fp.stableClasses.slice(0, 3)) {\n grepQueries.push({ query: `\"${cls}\"`, glob: TEMPLATE_GLOB, confidence: 'low' })\n }\n }\n\n return {\n grepQueries,\n domContext: fp.domPath,\n tagName: fp.tagName,\n classes: fp.rawClasses ?? fp.stableClasses,\n }\n}\n\nexport function generateAgentExport(annotations: Annotation[], viewportBucket: number): AgentExport {\n const agentAnnotations: AgentAnnotation[] = annotations.map(ann => ({\n id: ann.id,\n route: ann.route,\n comment: ann.comment,\n status: ann.status,\n timestamp: ann.timestamp,\n source: resolveSource(ann.fingerprint),\n searchHints: buildSearchHints(ann.fingerprint),\n }))\n\n return {\n version: 1,\n format: 'agent',\n viewportBucket,\n annotations: agentAnnotations,\n }\n}\n","const STYLES_ID = 'data-remarq-styles'\n\nconst CSS = `\n[data-remarq-theme=\"light\"] {\n --remarq-bg: #ffffff;\n --remarq-bg-secondary: #f5f5f5;\n --remarq-text: #1a1a1a;\n --remarq-text-secondary: #666666;\n --remarq-border: #e2e8f0;\n --remarq-accent: #3b82f6;\n --remarq-pending: #f97316;\n --remarq-resolved: #22c55e;\n --remarq-overlay: rgba(59, 130, 246, 0.15);\n --remarq-shadow: 0 4px 12px rgba(0,0,0,0.15);\n}\n\n[data-remarq-theme=\"dark\"] {\n --remarq-bg: #1e1e1e;\n --remarq-bg-secondary: #2a2a2a;\n --remarq-text: #e5e5e5;\n --remarq-text-secondary: #999999;\n --remarq-border: #333333;\n --remarq-accent: #60a5fa;\n --remarq-pending: #fb923c;\n --remarq-resolved: #4ade80;\n --remarq-overlay: rgba(96, 165, 250, 0.15);\n --remarq-shadow: 0 4px 12px rgba(0,0,0,0.4);\n}\n\n.remarq-toolbar {\n position: fixed;\n bottom: 16px;\n right: 16px;\n z-index: 2147483647;\n display: flex;\n gap: 4px;\n padding: 8px;\n background: var(--remarq-bg);\n border: 1px solid var(--remarq-border);\n border-radius: 8px;\n box-shadow: var(--remarq-shadow);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 13px;\n color: var(--remarq-text);\n}\n\n.remarq-toolbar.remarq-minimized { padding: 4px; }\n\n.remarq-toolbar-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--remarq-text);\n cursor: pointer;\n position: relative;\n}\n\n.remarq-toolbar-btn:hover { background: var(--remarq-bg-secondary); }\n.remarq-toolbar-btn.remarq-active { background: var(--remarq-accent); color: #ffffff; }\n\n.remarq-badge {\n position: absolute;\n top: -4px;\n right: -4px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: 8px;\n background: var(--remarq-pending);\n color: #ffffff;\n font-size: 10px;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.remarq-overlay {\n position: fixed;\n pointer-events: none;\n background: var(--remarq-overlay);\n border: 2px solid var(--remarq-accent);\n border-radius: 2px;\n z-index: 2147483646;\n transition: all 0.05s ease-out;\n}\n\n.remarq-tooltip {\n position: fixed;\n z-index: 2147483647;\n padding: 4px 8px;\n background: var(--remarq-bg);\n border: 1px solid var(--remarq-border);\n border-radius: 4px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 12px;\n color: var(--remarq-text);\n box-shadow: var(--remarq-shadow);\n pointer-events: none;\n white-space: nowrap;\n max-width: 300px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.remarq-marker {\n position: absolute;\n z-index: 2147483645;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 11px;\n font-weight: 700;\n color: #ffffff;\n cursor: pointer;\n box-shadow: 0 2px 4px rgba(0,0,0,0.2);\n transition: transform 0.1s ease;\n}\n\n.remarq-marker:hover { transform: scale(1.2); }\n.remarq-marker[data-status=\"pending\"] { background: var(--remarq-pending); }\n.remarq-marker[data-status=\"resolved\"] { background: var(--remarq-resolved); opacity: 0.7; }\n\n.remarq-popup {\n position: absolute;\n z-index: 2147483647;\n width: 300px;\n background: var(--remarq-bg);\n border: 1px solid var(--remarq-border);\n border-radius: 8px;\n box-shadow: var(--remarq-shadow);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 13px;\n color: var(--remarq-text);\n}\n\n.remarq-popup-header {\n padding: 8px 12px;\n border-bottom: 1px solid var(--remarq-border);\n font-size: 12px;\n color: var(--remarq-text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.remarq-popup-body { padding: 12px; }\n\n.remarq-popup textarea {\n width: 100%;\n min-height: 60px;\n padding: 8px;\n border: 1px solid var(--remarq-border);\n border-radius: 4px;\n background: var(--remarq-bg-secondary);\n color: var(--remarq-text);\n font-family: inherit;\n font-size: 13px;\n resize: vertical;\n box-sizing: border-box;\n}\n\n.remarq-popup textarea:focus { outline: none; border-color: var(--remarq-accent); }\n\n.remarq-popup-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px 12px;\n border-top: 1px solid var(--remarq-border);\n}\n\n.remarq-popup-actions button {\n padding: 4px 12px;\n border: 1px solid var(--remarq-border);\n border-radius: 4px;\n background: var(--remarq-bg);\n color: var(--remarq-text);\n cursor: pointer;\n font-size: 12px;\n}\n\n.remarq-popup-actions button.remarq-primary {\n background: var(--remarq-accent);\n border-color: var(--remarq-accent);\n color: #ffffff;\n}\n\n.remarq-detached-panel {\n position: fixed;\n bottom: 60px;\n right: 16px;\n z-index: 2147483646;\n width: 280px;\n max-height: 300px;\n overflow-y: auto;\n background: var(--remarq-bg);\n border: 1px solid var(--remarq-border);\n border-radius: 8px;\n box-shadow: var(--remarq-shadow);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 13px;\n color: var(--remarq-text);\n}\n\n.remarq-detached-header {\n padding: 8px 12px;\n border-bottom: 1px solid var(--remarq-border);\n font-weight: 600;\n font-size: 12px;\n color: var(--remarq-text-secondary);\n}\n\n.remarq-detached-item {\n padding: 8px 12px;\n border-bottom: 1px solid var(--remarq-border);\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 8px;\n}\n\n.remarq-detached-item:last-child { border-bottom: none; }\n.remarq-detached-info { flex: 1; min-width: 0; }\n.remarq-detached-comment { margin-bottom: 4px; }\n\n.remarq-detached-element {\n font-size: 11px;\n color: var(--remarq-text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.remarq-detached-delete {\n border: none;\n background: none;\n color: var(--remarq-text-secondary);\n cursor: pointer;\n padding: 2px;\n font-size: 14px;\n line-height: 1;\n flex-shrink: 0;\n}\n\n.remarq-detached-delete:hover { color: #ef4444; }\n\n.remarq-export-menu {\n position: absolute;\n bottom: 100%;\n right: 0;\n margin-bottom: 4px;\n background: var(--remarq-bg);\n border: 1px solid var(--remarq-border);\n border-radius: 6px;\n box-shadow: var(--remarq-shadow);\n overflow: hidden;\n}\n\n.remarq-export-menu button {\n display: block;\n width: 100%;\n padding: 8px 16px;\n border: none;\n background: transparent;\n color: var(--remarq-text);\n cursor: pointer;\n font-size: 12px;\n text-align: left;\n white-space: nowrap;\n}\n\n.remarq-export-menu button:hover { background: var(--remarq-bg-secondary); }\n\n.remarq-detached-header + .remarq-detached-header {\n border-top: 2px solid var(--remarq-border);\n}\n\n.remarq-detached-item[style*=\"cursor\"]:hover {\n background: var(--remarq-bg-secondary);\n}\n\n.remarq-toast {\n position: fixed;\n bottom: 60px;\n left: 50%;\n transform: translateX(-50%);\n z-index: 2147483647;\n padding: 8px 16px;\n background: var(--remarq-bg);\n border: 1px solid var(--remarq-border);\n border-radius: 6px;\n box-shadow: var(--remarq-shadow);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 13px;\n color: var(--remarq-text);\n transition: opacity 0.3s ease;\n}\n\n.remarq-toast-fade {\n opacity: 0;\n}\n\n.remarq-spacing {\n position: fixed;\n top: 0;\n left: 0;\n pointer-events: none;\n z-index: 2147483646;\n}\n\n.remarq-spacing-margin {\n position: fixed;\n background: rgba(249, 115, 22, 0.2);\n pointer-events: none;\n z-index: 1;\n}\n\n.remarq-spacing-padding {\n position: fixed;\n background: rgba(34, 197, 94, 0.2);\n pointer-events: none;\n z-index: 2;\n}\n\n.remarq-spacing-content {\n position: fixed;\n background: rgba(59, 130, 246, 0.3);\n border: 1px dashed rgba(96, 165, 250, 0.8);\n pointer-events: none;\n z-index: 3;\n}\n\n.remarq-spacing-gap {\n position: fixed;\n background: rgba(168, 85, 247, 0.25);\n border: 1px dashed rgba(168, 85, 247, 0.5);\n pointer-events: none;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.remarq-spacing-label {\n position: fixed;\n font-size: 11px;\n font-weight: 700;\n pointer-events: none;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n line-height: 1;\n padding: 1px 3px;\n border-radius: 2px;\n}\n\n.remarq-spacing-label-margin { color: #fff; background: rgba(249, 115, 22, 0.85); }\n.remarq-spacing-label-padding { color: #fff; background: rgba(34, 197, 94, 0.85); }\n.remarq-spacing-label-content { color: #fff; background: rgba(59, 130, 246, 0.85); font-size: 10px; }\n.remarq-spacing-label-gap { color: #fff; background: rgba(168, 85, 247, 0.85); font-size: 10px; }\n\n.remarq-toolbar-btn:disabled { opacity: 0.3; cursor: default; }\n.remarq-toolbar-btn:disabled:hover { background: transparent; }\n`\n\nexport function injectStyles(): void {\n if (document.querySelector(`style[${STYLES_ID}]`)) return\n\n try {\n const style = document.createElement('style')\n style.setAttribute(STYLES_ID, '')\n style.textContent = CSS\n document.head.appendChild(style)\n } catch {\n // CSP fallback: try blob URL via <link>\n try {\n const blob = new Blob([CSS], { type: 'text/css' })\n const link = document.createElement('link')\n link.rel = 'stylesheet'\n link.href = URL.createObjectURL(blob)\n link.setAttribute(STYLES_ID, '')\n document.head.appendChild(link)\n } catch {\n console.warn('[web-remarq] Could not inject styles')\n }\n }\n}\n\nexport function removeStyles(): void {\n const el = document.querySelector(`[${STYLES_ID}]`)\n el?.remove()\n}\n","const THEME_KEY = 'remarq:theme'\n\nexport type Theme = 'light' | 'dark'\n\nexport class ThemeManager {\n container: HTMLElement\n private theme: Theme\n\n constructor(parent: HTMLElement, initialTheme?: Theme) {\n const persisted = this.loadTheme()\n this.theme = initialTheme ?? persisted ?? 'light'\n\n this.container = document.createElement('div')\n this.container.setAttribute('data-remarq-theme', this.theme)\n parent.appendChild(this.container)\n\n this.persist()\n }\n\n getTheme(): Theme {\n return this.theme\n }\n\n setTheme(theme: Theme): void {\n this.theme = theme\n this.container.setAttribute('data-remarq-theme', theme)\n this.persist()\n }\n\n toggle(): void {\n this.setTheme(this.theme === 'light' ? 'dark' : 'light')\n }\n\n destroy(): void {\n this.container.remove()\n }\n\n private persist(): void {\n try {\n localStorage.setItem(THEME_KEY, this.theme)\n } catch {\n // ignore\n }\n }\n\n private loadTheme(): Theme | null {\n try {\n const value = localStorage.getItem(THEME_KEY)\n if (value === 'light' || value === 'dark') return value\n } catch {\n // ignore\n }\n return null\n }\n}\n","export interface ToolbarCallbacks {\n onInspect: () => void\n onCopy: () => void\n onExportMd: () => void\n onExportJson: () => void\n onImport: () => void\n onClear: () => void\n onThemeToggle: () => void\n onSpacingToggle: () => void\n}\n\nconst TOOLTIPS: Record<string, string> = {\n inspect: 'Inspect element',\n spacing: 'Spacing overlay (S)',\n copy: 'Copy as Markdown',\n export: 'Export',\n import: 'Import JSON',\n clear: 'Clear all',\n theme: 'Toggle theme',\n minimize: 'Minimize',\n}\n\nconst ICONS = {\n inspect: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><circle cx=\"7\" cy=\"7\" r=\"4\"/><line x1=\"10\" y1=\"10\" x2=\"14\" y2=\"14\"/></svg>',\n spacing: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M2 2h12M2 14h12M2 2v12M14 2v12\"/><path d=\"M5 5h6v6H5z\" stroke-dasharray=\"2 1\"/></svg>',\n copy: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><rect x=\"5\" y=\"5\" width=\"8\" height=\"9\" rx=\"1\"/><path d=\"M3 11V3a1 1 0 0 1 1-1h6\"/></svg>',\n export: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M8 2v8M4 6l4-4 4 4M2 12h12\"/></svg>',\n import: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M8 10V2M4 6l4 4 4-4M2 12h12\"/></svg>',\n clear: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M3 4h10M6 4V3h4v1M5 4v9h6V4\"/></svg>',\n theme: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><circle cx=\"8\" cy=\"8\" r=\"3\"/><path d=\"M8 1v2M8 13v2M1 8h2M13 8h2\"/></svg>',\n minimize: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M4 8h8\"/></svg>',\n}\n\nexport class Toolbar {\n private toolbarEl: HTMLElement\n private badgeEl: HTMLElement\n private inspectBtn: HTMLElement\n private spacingBtn: HTMLButtonElement\n private exportMenu: HTMLElement | null = null\n private fileInput: HTMLInputElement\n private minimized = false\n private buttons: HTMLElement[] = []\n\n constructor(\n private container: HTMLElement,\n private callbacks: ToolbarCallbacks,\n ) {\n this.toolbarEl = document.createElement('div')\n this.toolbarEl.className = 'remarq-toolbar'\n\n this.inspectBtn = this.createButton('inspect', ICONS.inspect, () => callbacks.onInspect())\n this.badgeEl = document.createElement('span')\n this.badgeEl.className = 'remarq-badge'\n this.badgeEl.style.display = 'none'\n this.inspectBtn.appendChild(this.badgeEl)\n\n this.spacingBtn = this.createButton('spacing', ICONS.spacing, () => callbacks.onSpacingToggle()) as HTMLButtonElement\n this.spacingBtn.disabled = true\n\n const copyBtn = this.createButton('copy', ICONS.copy, () => callbacks.onCopy())\n const exportBtn = this.createButton('export', ICONS.export, (e) => this.toggleExportMenu(e))\n\n this.fileInput = document.createElement('input')\n this.fileInput.type = 'file'\n this.fileInput.accept = '.json'\n this.fileInput.style.display = 'none'\n this.fileInput.addEventListener('change', () => {\n callbacks.onImport()\n this.fileInput.value = ''\n })\n const importBtn = this.createButton('import', ICONS.import, () => this.fileInput.click())\n\n const clearBtn = this.createButton('clear', ICONS.clear, () => callbacks.onClear())\n const themeBtn = this.createButton('theme', ICONS.theme, () => callbacks.onThemeToggle())\n const minimizeBtn = this.createButton('minimize', ICONS.minimize, () => this.toggleMinimize())\n\n this.buttons = [this.inspectBtn, this.spacingBtn, copyBtn, exportBtn, importBtn, clearBtn, themeBtn]\n\n this.toolbarEl.appendChild(this.inspectBtn)\n this.toolbarEl.appendChild(this.spacingBtn)\n this.toolbarEl.appendChild(copyBtn)\n this.toolbarEl.appendChild(exportBtn)\n this.toolbarEl.appendChild(importBtn)\n this.toolbarEl.appendChild(clearBtn)\n this.toolbarEl.appendChild(themeBtn)\n this.toolbarEl.appendChild(minimizeBtn)\n this.toolbarEl.appendChild(this.fileInput)\n\n container.appendChild(this.toolbarEl)\n }\n\n setInspectActive(active: boolean): void {\n this.inspectBtn.classList.toggle('remarq-active', active)\n }\n\n setSpacingActive(active: boolean): void {\n this.spacingBtn.classList.toggle('remarq-active', active)\n }\n\n setSpacingEnabled(enabled: boolean): void {\n this.spacingBtn.disabled = !enabled\n if (!enabled) {\n this.spacingBtn.classList.remove('remarq-active')\n }\n }\n\n setBadgeCount(count: number): void {\n this.badgeEl.textContent = String(count)\n this.badgeEl.style.display = count > 0 ? 'flex' : 'none'\n }\n\n getFileInput(): HTMLInputElement {\n return this.fileInput\n }\n\n setMemoryWarning(show: boolean): void {\n this.toolbarEl.title = show ? 'localStorage unavailable — annotations stored in memory only' : ''\n }\n\n destroy(): void {\n this.closeExportMenu()\n this.toolbarEl.remove()\n }\n\n private createButton(action: string, icon: string, handler: (e: Event) => void): HTMLElement {\n const btn = document.createElement('button')\n btn.className = 'remarq-toolbar-btn'\n btn.setAttribute('data-remarq-action', action)\n btn.title = TOOLTIPS[action] ?? ''\n btn.innerHTML = icon\n btn.addEventListener('click', handler)\n return btn\n }\n\n private toggleMinimize(): void {\n this.minimized = !this.minimized\n this.toolbarEl.classList.toggle('remarq-minimized', this.minimized)\n for (const btn of this.buttons) {\n btn.style.display = this.minimized ? 'none' : ''\n }\n }\n\n private toggleExportMenu(e: Event): void {\n if (this.exportMenu) {\n this.closeExportMenu()\n return\n }\n\n this.exportMenu = document.createElement('div')\n this.exportMenu.className = 'remarq-export-menu'\n\n const mdBtn = document.createElement('button')\n mdBtn.textContent = 'MD (file)'\n mdBtn.addEventListener('click', () => {\n this.callbacks.onExportMd()\n this.closeExportMenu()\n })\n\n const jsonBtn = document.createElement('button')\n jsonBtn.textContent = 'JSON (file)'\n jsonBtn.addEventListener('click', () => {\n this.callbacks.onExportJson()\n this.closeExportMenu()\n })\n\n this.exportMenu.appendChild(mdBtn)\n this.exportMenu.appendChild(jsonBtn)\n\n const exportBtn = (e.currentTarget as HTMLElement)\n exportBtn.style.position = 'relative'\n exportBtn.appendChild(this.exportMenu)\n }\n\n private closeExportMenu(): void {\n if (this.exportMenu) {\n this.exportMenu.remove()\n this.exportMenu = null\n }\n }\n}\n","export class Overlay {\n private overlayEl: HTMLElement\n private tooltipEl: HTMLElement\n\n constructor(private container: HTMLElement) {\n this.overlayEl = document.createElement('div')\n this.overlayEl.className = 'remarq-overlay'\n this.overlayEl.style.display = 'none'\n\n this.tooltipEl = document.createElement('div')\n this.tooltipEl.className = 'remarq-tooltip'\n this.tooltipEl.style.display = 'none'\n\n container.appendChild(this.overlayEl)\n container.appendChild(this.tooltipEl)\n }\n\n show(target: HTMLElement): void {\n try {\n const rect = target.getBoundingClientRect()\n\n this.overlayEl.style.display = 'block'\n this.overlayEl.style.top = `${rect.top}px`\n this.overlayEl.style.left = `${rect.left}px`\n this.overlayEl.style.width = `${rect.width}px`\n this.overlayEl.style.height = `${rect.height}px`\n\n this.tooltipEl.textContent = describeElement(target)\n this.tooltipEl.style.display = 'block'\n this.tooltipEl.style.top = `${rect.top - 28}px`\n this.tooltipEl.style.left = `${rect.left}px`\n } catch {\n this.hide()\n }\n }\n\n updateTooltipPosition(x: number, y: number): void {\n this.tooltipEl.style.left = `${x + 12}px`\n this.tooltipEl.style.top = `${y - 28}px`\n }\n\n hideHighlight(): void {\n this.overlayEl.style.display = 'none'\n }\n\n hide(): void {\n this.overlayEl.style.display = 'none'\n this.tooltipEl.style.display = 'none'\n }\n\n destroy(): void {\n this.overlayEl.remove()\n this.tooltipEl.remove()\n }\n}\n\nfunction describeElement(el: HTMLElement): string {\n const tag = el.tagName.toLowerCase()\n const parts: string[] = [`<${tag}>`]\n\n // data-annotate or data-testid\n const dataAnnotate = el.getAttribute('data-annotate')\n const dataTestId = el.getAttribute('data-testid') || el.getAttribute('data-test') || el.getAttribute('data-cy')\n if (dataAnnotate) {\n parts.push(`[${dataAnnotate}]`)\n } else if (dataTestId) {\n parts.push(`[${dataTestId}]`)\n }\n\n // id\n if (el.id) {\n parts.push(`#${el.id}`)\n }\n\n // Meaningful classes (skip hashed ones, max 2)\n const classes = Array.from(el.classList)\n .filter((c) => !c.match(/^(sc-|css-)/) && !c.match(/^[a-zA-Z0-9]{8,}$/) && !c.match(/__[a-zA-Z0-9]{3,}$/))\n .slice(0, 2)\n if (classes.length) {\n parts.push(`.${classes.join('.')}`)\n }\n\n // Direct text content only (not nested)\n const directText = getDirectText(el)\n if (directText) {\n parts.push(`\"${directText}\"`)\n }\n\n return parts.join(' ')\n}\n\nfunction getDirectText(el: HTMLElement): string {\n let text = ''\n for (const node of Array.from(el.childNodes)) {\n if (node.nodeType === Node.TEXT_NODE) {\n text += node.textContent ?? ''\n }\n }\n text = text.trim()\n\n // Fallback: if no direct text and few children, use shallow textContent\n if (!text && el.children.length <= 2) {\n text = el.textContent?.trim() ?? ''\n }\n\n return text.slice(0, 30)\n}\n","interface Sides {\n top: number\n right: number\n bottom: number\n left: number\n}\n\ninterface BoxRect {\n top: number\n left: number\n width: number\n height: number\n}\n\nfunction parsePx(value: string): number {\n return parseFloat(value) || 0\n}\n\nexport class SpacingOverlay {\n private containerEl: HTMLElement\n private marginEl: HTMLElement\n private paddingEl: HTMLElement\n private contentEl: HTMLElement\n private labels: HTMLElement[] = []\n private gapEls: HTMLElement[] = []\n private lastTarget: HTMLElement | null = null\n private scrollHandler = () => {\n if (this.lastTarget) {\n const target = this.lastTarget\n this.lastTarget = null\n this.show(target)\n }\n }\n\n constructor(private parent: HTMLElement) {\n // Capture phase to catch scroll on any container, not just window\n window.addEventListener('scroll', this.scrollHandler, true)\n this.containerEl = document.createElement('div')\n this.containerEl.className = 'remarq-spacing'\n this.containerEl.style.display = 'none'\n\n this.marginEl = document.createElement('div')\n this.marginEl.className = 'remarq-spacing-margin'\n\n this.paddingEl = document.createElement('div')\n this.paddingEl.className = 'remarq-spacing-padding'\n\n this.contentEl = document.createElement('div')\n this.contentEl.className = 'remarq-spacing-content'\n\n // Order matters: content on top of padding on top of margin\n this.containerEl.appendChild(this.marginEl)\n this.containerEl.appendChild(this.paddingEl)\n this.containerEl.appendChild(this.contentEl)\n\n\n parent.appendChild(this.containerEl)\n }\n\n show(target: HTMLElement): void {\n if (target === this.lastTarget) return\n this.lastTarget = target\n\n try {\n const rect = target.getBoundingClientRect()\n const cs = window.getComputedStyle(target)\n\n const margin = this.readSides(cs, 'margin')\n const padding = this.readSides(cs, 'padding')\n const border = this.readBorderSides(cs)\n\n // Margin box: expand outward from border-box\n const marginBox: BoxRect = {\n top: rect.top - margin.top,\n left: rect.left - margin.left,\n width: rect.width + margin.left + margin.right,\n height: rect.height + margin.top + margin.bottom,\n }\n\n // Padding box = rect (border-box)\n const paddingBox: BoxRect = {\n top: rect.top,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n }\n\n // Content box: shrink inward by border + padding\n const contentBox: BoxRect = {\n top: rect.top + border.top + padding.top,\n left: rect.left + border.left + padding.left,\n width: rect.width - border.left - border.right - padding.left - padding.right,\n height: rect.height - border.top - border.bottom - padding.top - padding.bottom,\n }\n\n this.positionEl(this.marginEl, marginBox)\n this.positionEl(this.paddingEl, paddingBox)\n this.positionEl(this.contentEl, contentBox)\n\n // Clear old labels and gaps\n this.clearLabels()\n this.clearGaps()\n\n // Margin labels\n this.addSideLabels(margin, marginBox, paddingBox, 'margin')\n\n // Padding labels\n this.addSideLabels(padding, paddingBox, contentBox, 'padding')\n\n // Content size label\n if (contentBox.width > 40 && contentBox.height > 14) {\n this.addLabel(\n `${Math.round(contentBox.width)} × ${Math.round(contentBox.height)}`,\n contentBox.top + contentBox.height / 2 - 6,\n contentBox.left + contentBox.width / 2,\n 'content',\n )\n }\n\n // Gap visualization\n this.showGaps(target)\n\n this.containerEl.style.display = 'block'\n } catch {\n this.hide()\n }\n }\n\n hide(): void {\n this.containerEl.style.display = 'none'\n this.lastTarget = null\n this.clearLabels()\n this.clearGaps()\n }\n\n destroy(): void {\n window.removeEventListener('scroll', this.scrollHandler, true)\n this.clearLabels()\n this.clearGaps()\n this.containerEl.remove()\n }\n\n private readSides(cs: CSSStyleDeclaration, prop: 'margin' | 'padding'): Sides {\n return {\n top: parsePx(cs[`${prop}Top` as keyof CSSStyleDeclaration] as string),\n right: parsePx(cs[`${prop}Right` as keyof CSSStyleDeclaration] as string),\n bottom: parsePx(cs[`${prop}Bottom` as keyof CSSStyleDeclaration] as string),\n left: parsePx(cs[`${prop}Left` as keyof CSSStyleDeclaration] as string),\n }\n }\n\n private readBorderSides(cs: CSSStyleDeclaration): Sides {\n return {\n top: parsePx(cs.borderTopWidth),\n right: parsePx(cs.borderRightWidth),\n bottom: parsePx(cs.borderBottomWidth),\n left: parsePx(cs.borderLeftWidth),\n }\n }\n\n private positionEl(el: HTMLElement, box: BoxRect): void {\n el.style.top = `${box.top}px`\n el.style.left = `${box.left}px`\n el.style.width = `${Math.max(0, box.width)}px`\n el.style.height = `${Math.max(0, box.height)}px`\n }\n\n private addSideLabels(sides: Sides, outerBox: BoxRect, innerBox: BoxRect, type: 'margin' | 'padding'): void {\n // Top label\n if (sides.top > 0) {\n const y = outerBox.top + (innerBox.top - outerBox.top) / 2 - 6\n const x = outerBox.left + outerBox.width / 2\n this.addLabel(String(Math.round(sides.top)), y, x, type)\n }\n\n // Bottom label\n if (sides.bottom > 0) {\n const innerBottom = innerBox.top + innerBox.height\n const outerBottom = outerBox.top + outerBox.height\n const y = innerBottom + (outerBottom - innerBottom) / 2 - 6\n const x = outerBox.left + outerBox.width / 2\n this.addLabel(String(Math.round(sides.bottom)), y, x, type)\n }\n\n // Left label\n if (sides.left > 0) {\n const y = outerBox.top + outerBox.height / 2 - 6\n const x = outerBox.left + (innerBox.left - outerBox.left) / 2\n this.addLabel(String(Math.round(sides.left)), y, x, type)\n }\n\n // Right label\n if (sides.right > 0) {\n const innerRight = innerBox.left + innerBox.width\n const outerRight = outerBox.left + outerBox.width\n const y = outerBox.top + outerBox.height / 2 - 6\n const x = innerRight + (outerRight - innerRight) / 2\n this.addLabel(String(Math.round(sides.right)), y, x, type)\n }\n }\n\n private addLabel(text: string, top: number, left: number, type: string): void {\n const label = document.createElement('div')\n label.className = `remarq-spacing-label remarq-spacing-label-${type}`\n label.textContent = text\n label.style.top = `${top}px`\n label.style.left = `${left}px`\n label.style.transform = 'translateX(-50%)'\n this.containerEl.appendChild(label)\n this.labels.push(label)\n }\n\n private clearLabels(): void {\n for (const label of this.labels) label.remove()\n this.labels = []\n }\n\n private showGaps(target: HTMLElement): void {\n // Case 1: Target IS a flex container — show gaps between its own children\n const targetCs = window.getComputedStyle(target)\n if (targetCs.display.includes('flex')) {\n this.showContainerGaps(target, targetCs)\n return\n }\n\n // Case 2: Target is a child of a flex container — show adjacent gaps\n const parent = target.parentElement\n if (!parent) return\n\n const parentCs = window.getComputedStyle(parent)\n if (!parentCs.display.includes('flex')) return\n\n const rowGap = parsePx(parentCs.rowGap)\n const columnGap = parsePx(parentCs.columnGap)\n const direction = parentCs.flexDirection\n const isRow = direction === 'row' || direction === 'row-reverse'\n const gap = isRow ? columnGap : rowGap\n\n if (gap <= 0) return\n\n const children = Array.from(parent.children) as HTMLElement[]\n const targetIndex = children.indexOf(target)\n if (targetIndex === -1) return\n\n // Show gap before target (between prev sibling and target)\n if (targetIndex > 0) {\n this.renderGap(children[targetIndex - 1], target, gap, isRow)\n }\n\n // Show gap after target (between target and next sibling)\n if (targetIndex < children.length - 1) {\n this.renderGap(target, children[targetIndex + 1], gap, isRow)\n }\n }\n\n private showContainerGaps(container: HTMLElement, cs: CSSStyleDeclaration): void {\n const rowGap = parsePx(cs.rowGap)\n const columnGap = parsePx(cs.columnGap)\n const direction = cs.flexDirection\n const isRow = direction === 'row' || direction === 'row-reverse'\n const gap = isRow ? columnGap : rowGap\n\n if (gap <= 0) return\n\n const children = Array.from(container.children) as HTMLElement[]\n // Show all gaps between children (since we're hovering the container itself)\n for (let i = 0; i < children.length - 1; i++) {\n this.renderGap(children[i], children[i + 1], gap, isRow)\n }\n }\n\n private renderGap(before: HTMLElement, after: HTMLElement, gap: number, isRow: boolean): void {\n const rectBefore = before.getBoundingClientRect()\n const rectAfter = after.getBoundingClientRect()\n\n const gapEl = document.createElement('div')\n gapEl.className = 'remarq-spacing-gap'\n\n if (isRow) {\n const left = Math.min(rectBefore.right, rectAfter.right)\n const right = Math.max(rectBefore.left, rectAfter.left)\n const top = Math.min(rectBefore.top, rectAfter.top)\n const height = Math.max(rectBefore.height, rectAfter.height)\n\n gapEl.style.top = `${top}px`\n gapEl.style.left = `${left}px`\n gapEl.style.width = `${Math.abs(right - left)}px`\n gapEl.style.height = `${height}px`\n } else {\n const top = Math.min(rectBefore.bottom, rectAfter.bottom)\n const bottom = Math.max(rectBefore.top, rectAfter.top)\n const left = Math.min(rectBefore.left, rectAfter.left)\n const width = Math.max(rectBefore.width, rectAfter.width)\n\n gapEl.style.top = `${top}px`\n gapEl.style.left = `${left}px`\n gapEl.style.width = `${width}px`\n gapEl.style.height = `${Math.abs(bottom - top)}px`\n }\n\n // Label inside gap (skip if too small)\n if (gap >= 10) {\n const label = document.createElement('span')\n label.className = 'remarq-spacing-label-gap'\n label.textContent = `gap: ${Math.round(gap)}`\n label.style.cssText = 'font-size:10px;font-weight:700;pointer-events:none;'\n gapEl.appendChild(label)\n }\n\n this.containerEl.appendChild(gapEl)\n this.gapEls.push(gapEl)\n }\n\n private clearGaps(): void {\n for (const el of this.gapEls) el.remove()\n this.gapEls = []\n }\n}\n","interface ElementInfo {\n tag: string\n text: string\n}\n\ninterface DetailInfo extends ElementInfo {\n comment: string\n status: 'pending' | 'resolved'\n}\n\ninterface DetailCallbacks {\n onResolve: () => void\n onDelete: () => void\n onClose: () => void\n}\n\ninterface Position {\n top: number // absolute page Y below the element\n left: number // absolute page X\n anchorBottom: number // absolute page Y above the element (for flipping)\n}\n\nconst POPUP_WIDTH = 300\nconst POPUP_MARGIN = 8\n\nexport class Popup {\n private popupEl: HTMLElement | null = null\n private keyHandler: ((e: KeyboardEvent) => void) | null = null\n\n constructor(private container: HTMLElement) {}\n\n show(\n info: ElementInfo,\n position: Position,\n onSubmit: (comment: string) => void,\n onCancel: () => void,\n ): void {\n this.hide()\n\n const popup = document.createElement('div')\n popup.className = 'remarq-popup'\n\n const header = document.createElement('div')\n header.className = 'remarq-popup-header'\n header.textContent = `<${info.tag}>${info.text ? ` \"${info.text}\"` : ''}`\n\n const body = document.createElement('div')\n body.className = 'remarq-popup-body'\n\n const textarea = document.createElement('textarea')\n textarea.placeholder = 'Add your comment...'\n\n body.appendChild(textarea)\n\n const actions = document.createElement('div')\n actions.className = 'remarq-popup-actions'\n\n const cancelBtn = document.createElement('button')\n cancelBtn.textContent = 'Cancel'\n cancelBtn.addEventListener('click', () => {\n this.hide()\n onCancel()\n })\n\n const addBtn = document.createElement('button')\n addBtn.className = 'remarq-primary'\n addBtn.textContent = 'Add'\n addBtn.addEventListener('click', () => {\n const comment = textarea.value.trim()\n if (!comment) return\n this.hide()\n onSubmit(comment)\n })\n\n actions.appendChild(cancelBtn)\n actions.appendChild(addBtn)\n\n popup.appendChild(header)\n popup.appendChild(body)\n popup.appendChild(actions)\n\n this.container.appendChild(popup)\n this.popupEl = popup\n\n // Measure after layout, then position\n requestAnimationFrame(() => {\n this.adjustPosition(popup, position)\n textarea.focus()\n })\n\n // Cmd/Ctrl+Enter to submit\n this.keyHandler = (e: KeyboardEvent) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n const comment = textarea.value.trim()\n if (!comment) return\n this.hide()\n onSubmit(comment)\n }\n if (e.key === 'Escape') {\n this.hide()\n onCancel()\n }\n }\n document.addEventListener('keydown', this.keyHandler)\n }\n\n showDetail(\n info: DetailInfo,\n position: Position,\n callbacks: DetailCallbacks,\n ): void {\n this.hide()\n\n const popup = document.createElement('div')\n popup.className = 'remarq-popup'\n\n const header = document.createElement('div')\n header.className = 'remarq-popup-header'\n header.textContent = `<${info.tag}>${info.text ? ` \"${info.text}\"` : ''} [${info.status}]`\n\n const body = document.createElement('div')\n body.className = 'remarq-popup-body'\n body.textContent = info.comment\n\n const actions = document.createElement('div')\n actions.className = 'remarq-popup-actions'\n\n if (info.status === 'pending') {\n const resolveBtn = document.createElement('button')\n resolveBtn.className = 'remarq-primary'\n resolveBtn.textContent = 'Resolve'\n resolveBtn.addEventListener('click', () => {\n this.hide()\n callbacks.onResolve()\n })\n actions.appendChild(resolveBtn)\n }\n\n const deleteBtn = document.createElement('button')\n deleteBtn.textContent = 'Delete'\n deleteBtn.addEventListener('click', () => {\n this.hide()\n callbacks.onDelete()\n })\n actions.appendChild(deleteBtn)\n\n const closeBtn = document.createElement('button')\n closeBtn.textContent = 'Close'\n closeBtn.addEventListener('click', () => {\n this.hide()\n callbacks.onClose()\n })\n actions.appendChild(closeBtn)\n\n popup.appendChild(header)\n popup.appendChild(body)\n popup.appendChild(actions)\n\n this.container.appendChild(popup)\n this.popupEl = popup\n\n // Measure after layout, then position\n requestAnimationFrame(() => {\n this.adjustPosition(popup, position)\n })\n\n this.keyHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this.hide()\n callbacks.onClose()\n }\n }\n document.addEventListener('keydown', this.keyHandler)\n }\n\n hide(): void {\n if (this.popupEl) {\n this.popupEl.remove()\n this.popupEl = null\n }\n if (this.keyHandler) {\n document.removeEventListener('keydown', this.keyHandler)\n this.keyHandler = null\n }\n }\n\n destroy(): void {\n this.hide()\n }\n\n private adjustPosition(popup: HTMLElement, position: Position): void {\n const popupHeight = popup.offsetHeight\n const viewportBottom = window.scrollY + window.innerHeight\n const viewportRight = window.scrollX + window.innerWidth\n\n let top = position.top\n let left = position.left\n\n // Flip above element if overflows viewport bottom\n if (top + popupHeight > viewportBottom - POPUP_MARGIN) {\n top = position.anchorBottom - popupHeight\n }\n\n // Clamp: don't go above visible area\n if (top < window.scrollY + POPUP_MARGIN) {\n top = window.scrollY + POPUP_MARGIN\n }\n\n // Clamp right edge\n if (left + POPUP_WIDTH > viewportRight - POPUP_MARGIN) {\n left = viewportRight - POPUP_WIDTH - POPUP_MARGIN\n }\n\n // Clamp left edge\n if (left < window.scrollX + POPUP_MARGIN) {\n left = window.scrollX + POPUP_MARGIN\n }\n\n popup.style.top = `${top}px`\n popup.style.left = `${left}px`\n }\n}\n","import type { Annotation } from '../core/types'\n\ninterface MarkerEntry {\n annotation: Annotation\n target: HTMLElement\n markerEl: HTMLElement\n}\n\nexport class MarkerManager {\n private markers = new Map<string, MarkerEntry>()\n private rafId: number | null = null\n private counter = 0\n\n constructor(\n private container: HTMLElement,\n private onClick?: (annotationId: string) => void,\n ) {\n this.startPositionLoop()\n }\n\n addMarker(annotation: Annotation, target: HTMLElement): void {\n this.counter++\n const markerEl = document.createElement('div')\n markerEl.className = 'remarq-marker'\n markerEl.setAttribute('data-status', annotation.status)\n markerEl.setAttribute('data-annotation-id', annotation.id)\n markerEl.textContent = String(this.counter)\n markerEl.title = annotation.comment\n\n markerEl.addEventListener('click', () => {\n this.onClick?.(annotation.id)\n })\n\n this.container.appendChild(markerEl)\n this.markers.set(annotation.id, { annotation, target, markerEl })\n this.updatePosition(annotation.id)\n }\n\n removeMarker(id: string): void {\n const entry = this.markers.get(id)\n if (entry) {\n entry.markerEl.remove()\n this.markers.delete(id)\n }\n }\n\n updateStatus(id: string, status: 'pending' | 'resolved'): void {\n const entry = this.markers.get(id)\n if (entry) {\n entry.annotation.status = status\n entry.markerEl.setAttribute('data-status', status)\n }\n }\n\n clear(): void {\n for (const entry of this.markers.values()) {\n entry.markerEl.remove()\n }\n this.markers.clear()\n this.counter = 0\n }\n\n destroy(): void {\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId)\n this.rafId = null\n }\n this.clear()\n }\n\n private updatePosition(id: string): void {\n const entry = this.markers.get(id)\n if (!entry) return\n try {\n const rect = entry.target.getBoundingClientRect()\n entry.markerEl.style.top = `${window.scrollY + rect.top - 12}px`\n entry.markerEl.style.left = `${window.scrollX + rect.right - 12}px`\n } catch {\n // element may have been removed\n }\n }\n\n private startPositionLoop(): void {\n const update = () => {\n for (const id of this.markers.keys()) {\n this.updatePosition(id)\n }\n this.rafId = requestAnimationFrame(update)\n }\n this.rafId = requestAnimationFrame(update)\n }\n}\n","import type { Annotation } from '../core/types'\n\nexport class DetachedPanel {\n private panelEl: HTMLElement | null = null\n private toastEl: HTMLElement | null = null\n private toastTimer: ReturnType<typeof setTimeout> | null = null\n\n constructor(\n private container: HTMLElement,\n private onDelete?: (id: string) => void,\n ) {}\n\n update(otherBreakpoint: Annotation[], detached: Annotation[]): void {\n this.remove()\n if (otherBreakpoint.length === 0 && detached.length === 0) return\n\n const panel = document.createElement('div')\n panel.className = 'remarq-detached-panel'\n\n if (otherBreakpoint.length > 0) {\n this.renderSection(panel, `Other viewport (${otherBreakpoint.length})`, otherBreakpoint, 'other')\n }\n\n if (detached.length > 0) {\n this.renderSection(panel, `Detached (${detached.length})`, detached, 'detached')\n }\n\n this.container.appendChild(panel)\n this.panelEl = panel\n }\n\n destroy(): void {\n this.remove()\n this.hideToast()\n }\n\n private renderSection(\n panel: HTMLElement,\n title: string,\n annotations: Annotation[],\n type: 'other' | 'detached',\n ): void {\n const header = document.createElement('div')\n header.className = 'remarq-detached-header'\n header.textContent = title\n panel.appendChild(header)\n\n for (const ann of annotations) {\n const item = document.createElement('div')\n item.className = 'remarq-detached-item'\n\n const info = document.createElement('div')\n info.className = 'remarq-detached-info'\n\n const comment = document.createElement('div')\n comment.className = 'remarq-detached-comment'\n comment.textContent = ann.comment\n\n const elDesc = document.createElement('div')\n elDesc.className = 'remarq-detached-element'\n const fp = ann.fingerprint\n let desc = `<${fp.tagName}>`\n if (fp.textContent) desc += ` \"${fp.textContent}\"`\n if (fp.dataAnnotate) desc += ` [${fp.dataAnnotate}]`\n if (type === 'other') desc += ` — ${ann.viewportBucket}px`\n elDesc.textContent = desc\n\n info.appendChild(comment)\n info.appendChild(elDesc)\n item.appendChild(info)\n\n if (type === 'other') {\n item.style.cursor = 'pointer'\n item.addEventListener('click', () => {\n this.showToast(`Annotation created at ${ann.viewportBucket}px width. Resize viewport to view.`)\n })\n } else {\n const deleteBtn = document.createElement('button')\n deleteBtn.className = 'remarq-detached-delete'\n deleteBtn.textContent = '\\u00d7'\n deleteBtn.addEventListener('click', () => {\n this.onDelete?.(ann.id)\n })\n item.appendChild(deleteBtn)\n }\n\n panel.appendChild(item)\n }\n }\n\n private showToast(message: string): void {\n this.hideToast()\n\n const toast = document.createElement('div')\n toast.className = 'remarq-toast'\n toast.textContent = message\n this.container.appendChild(toast)\n this.toastEl = toast\n\n this.toastTimer = setTimeout(() => {\n if (this.toastEl) {\n this.toastEl.classList.add('remarq-toast-fade')\n setTimeout(() => this.hideToast(), 300)\n }\n }, 3000)\n }\n\n private hideToast(): void {\n if (this.toastTimer) {\n clearTimeout(this.toastTimer)\n this.toastTimer = null\n }\n if (this.toastEl) {\n this.toastEl.remove()\n this.toastEl = null\n }\n }\n\n private remove(): void {\n if (this.panelEl) {\n this.panelEl.remove()\n this.panelEl = null\n }\n }\n}\n","type RouteChangeListener = (route: string) => void\n\nexport class RouteObserver {\n private listeners: Set<RouteChangeListener> = new Set()\n private originalPushState: typeof history.pushState\n private originalReplaceState: typeof history.replaceState\n private boundOnPopState: () => void\n private boundOnHashChange: () => void\n\n constructor() {\n this.originalPushState = history.pushState.bind(history)\n this.originalReplaceState = history.replaceState.bind(history)\n this.boundOnPopState = () => this.notify()\n this.boundOnHashChange = () => this.notify()\n\n this.patchHistory()\n\n window.addEventListener('popstate', this.boundOnPopState)\n window.addEventListener('hashchange', this.boundOnHashChange)\n }\n\n currentRoute(): string {\n return location.pathname + location.hash\n }\n\n onChange(listener: RouteChangeListener): () => void {\n this.listeners.add(listener)\n return () => {\n this.listeners.delete(listener)\n }\n }\n\n destroy(): void {\n window.removeEventListener('popstate', this.boundOnPopState)\n window.removeEventListener('hashchange', this.boundOnHashChange)\n history.pushState = this.originalPushState\n history.replaceState = this.originalReplaceState\n this.listeners.clear()\n }\n\n private notify(): void {\n const route = this.currentRoute()\n for (const listener of this.listeners) {\n listener(route)\n }\n }\n\n private patchHistory(): void {\n const self = this\n\n history.pushState = function (...args: Parameters<typeof history.pushState>) {\n self.originalPushState.apply(this, args)\n self.notify()\n }\n\n history.replaceState = function (...args: Parameters<typeof history.replaceState>) {\n self.originalReplaceState.apply(this, args)\n self.notify()\n }\n }\n}\n","import type { Annotation, ImportResult, WebRemarqOptions } from './core/types'\nimport { AnnotationStorage } from './core/storage'\nimport { createFingerprint } from './core/fingerprint'\nimport { matchElement } from './core/matcher'\nimport { generateAgentExport } from './core/agent-export'\nimport { injectStyles, removeStyles } from './ui/styles'\nimport { ThemeManager } from './ui/theme'\nimport { Toolbar } from './ui/toolbar'\nimport { Overlay } from './ui/overlay'\nimport { SpacingOverlay } from './ui/spacing-overlay'\nimport { Popup } from './ui/popup'\nimport { MarkerManager } from './ui/markers'\nimport { DetachedPanel } from './ui/detached-panel'\nimport { RouteObserver } from './spa'\nimport { toBucket, initViewportListener, destroyViewportListener } from './core/viewport'\n\nlet initialized = false\nlet options: WebRemarqOptions = {}\nlet storage: AnnotationStorage\nlet themeManager: ThemeManager\nlet toolbar: Toolbar\nlet overlay: Overlay\nlet popup: Popup\nlet markers: MarkerManager\nlet detachedPanel: DetachedPanel\nlet routeObserver: RouteObserver\nlet inspecting = false\nlet spacingMode = false\nlet spacingOverlay: SpacingOverlay\nlet mutationObserver: MutationObserver | null = null\nlet unsubRoute: (() => void) | null = null\nlet refreshScheduled = false\n\n// WeakRef cache: annotation id → element (survives GC of element)\nconst elementCache = new Map<string, WeakRef<HTMLElement>>()\n\nfunction describeTarget(el: HTMLElement): string {\n const parts: string[] = []\n\n // id\n if (el.id) parts.push(`#${el.id}`)\n\n // data attributes\n const dataAnnotate = el.getAttribute(options.dataAttribute ?? 'data-annotate')\n const dataTestId = el.getAttribute('data-testid') || el.getAttribute('data-test') || el.getAttribute('data-cy')\n if (dataAnnotate) parts.push(`[${dataAnnotate}]`)\n else if (dataTestId) parts.push(`[${dataTestId}]`)\n\n // Meaningful classes (max 2)\n const classes = Array.from(el.classList)\n .filter((c) => !c.match(/^(sc-|css-)/) && !c.match(/^[a-zA-Z0-9]{8,}$/) && !c.match(/__[a-zA-Z0-9]{3,}$/))\n .slice(0, 2)\n if (classes.length) parts.push(`.${classes.join('.')}`)\n\n // Direct text only\n let text = ''\n for (const node of Array.from(el.childNodes)) {\n if (node.nodeType === Node.TEXT_NODE) text += node.textContent ?? ''\n }\n text = text.trim()\n if (!text && el.children.length <= 2) text = el.textContent?.trim() ?? ''\n if (text) parts.push(`\"${text.slice(0, 30)}\"`)\n\n return parts.join(' ') || ''\n}\n\nfunction currentRoute(): string {\n return location.pathname + location.hash\n}\n\nfunction generateId(): string {\n return `ann-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`\n}\n\nfunction cacheElement(annotationId: string, el: HTMLElement): void {\n elementCache.set(annotationId, new WeakRef(el))\n}\n\nfunction getCachedElement(annotationId: string): HTMLElement | null {\n const ref = elementCache.get(annotationId)\n if (!ref) return null\n const el = ref.deref()\n if (!el || !el.isConnected) {\n elementCache.delete(annotationId)\n return null\n }\n return el\n}\n\nfunction resolveElement(ann: Annotation): HTMLElement | null {\n // 1. Check cache first\n const cached = getCachedElement(ann.id)\n if (cached) return cached\n\n // 2. Fall back to fingerprint matching\n const el = matchElement(ann.fingerprint, { dataAttribute: options.dataAttribute })\n if (el) {\n cacheElement(ann.id, el)\n console.debug(`[web-remarq] Matched \"${ann.comment}\" via fingerprint on <${el.tagName.toLowerCase()}>`)\n } else {\n console.debug(`[web-remarq] Could not match \"${ann.comment}\"`, ann.fingerprint)\n }\n return el\n}\n\nfunction refreshMarkers(): void {\n markers.clear()\n const attached: { ann: Annotation; el: HTMLElement }[] = []\n const otherBreakpoint: Annotation[] = []\n const detached: Annotation[] = []\n const route = currentRoute()\n const anns = storage.getByRoute(route)\n const bucket = toBucket(window.innerWidth) // always read fresh\n\n for (const ann of anns) {\n const el = resolveElement(ann)\n if (el) {\n attached.push({ ann, el })\n } else if (bucket !== ann.viewportBucket) {\n otherBreakpoint.push(ann)\n } else {\n detached.push(ann)\n }\n }\n\n for (const { ann, el } of attached) {\n markers.addMarker(ann, el)\n }\n\n detachedPanel.update(otherBreakpoint, detached)\n\n const pendingCount = anns.filter((a) => a.status === 'pending').length\n toolbar.setBadgeCount(pendingCount)\n}\n\n// Debounced refresh — MutationObserver can fire rapidly\nfunction scheduleRefresh(): void {\n if (refreshScheduled) return\n refreshScheduled = true\n requestAnimationFrame(() => {\n refreshScheduled = false\n refreshMarkers()\n })\n}\n\nfunction handleInspectClick(e: MouseEvent): void {\n if (!inspecting) return\n\n const target = e.target as HTMLElement\n if (!target || target.closest('[data-remarq-theme]')) return\n\n e.preventDefault()\n e.stopPropagation()\n\n setInspecting(false)\n\n const rect = target.getBoundingClientRect()\n popup.show(\n {\n tag: target.tagName.toLowerCase(),\n text: describeTarget(target),\n },\n {\n top: window.scrollY + rect.bottom + 8,\n left: window.scrollX + rect.left,\n anchorBottom: window.scrollY + rect.top - 8,\n },\n (comment) => {\n const fp = createFingerprint(target, {\n classFilter: options.classFilter,\n dataAttribute: options.dataAttribute,\n })\n const ann: Annotation = {\n id: generateId(),\n comment,\n fingerprint: fp,\n route: currentRoute(),\n viewport: `${window.innerWidth}x${window.innerHeight}`,\n viewportBucket: toBucket(window.innerWidth),\n timestamp: Date.now(),\n status: 'pending',\n }\n // Cache the element immediately — no need to re-match\n cacheElement(ann.id, target)\n storage.add(ann)\n refreshMarkers()\n },\n () => {\n // cancel\n },\n )\n}\n\nfunction handleInspectHover(e: MouseEvent): void {\n if (!inspecting) return\n const target = e.target as HTMLElement\n if (!target || target.closest('[data-remarq-theme]')) return\n\n if (spacingMode) {\n overlay.show(target)\n overlay.hideHighlight()\n spacingOverlay.show(target)\n } else {\n overlay.show(target)\n }\n overlay.updateTooltipPosition(e.clientX, e.clientY)\n}\n\nfunction handleInspectKeydown(e: KeyboardEvent): void {\n // Ignore when typing in inputs\n const tag = (e.target as HTMLElement)?.tagName\n if (tag === 'INPUT' || tag === 'TEXTAREA' || (e.target as HTMLElement)?.isContentEditable) return\n\n if (e.key === 'Escape' && inspecting) {\n setInspecting(false)\n overlay.hide()\n spacingOverlay.hide()\n }\n\n if (e.key === 's' && inspecting) {\n spacingMode = !spacingMode\n toolbar.setSpacingActive(spacingMode)\n if (!spacingMode) spacingOverlay.hide()\n }\n}\n\nfunction setInspecting(value: boolean): void {\n inspecting = value\n toolbar.setInspectActive(value)\n toolbar.setSpacingEnabled(value)\n if (!value) {\n overlay.hide()\n spacingOverlay?.hide()\n spacingMode = false\n toolbar.setSpacingActive(false)\n }\n}\n\nfunction handleMarkerClick(annotationId: string): void {\n const ann = storage.getAll().find((a) => a.id === annotationId)\n if (!ann) return\n\n const el = resolveElement(ann)\n if (!el) return\n\n const rect = el.getBoundingClientRect()\n\n popup.showDetail(\n {\n tag: ann.fingerprint.tagName,\n text: ann.fingerprint.textContent ?? '',\n comment: ann.comment,\n status: ann.status,\n },\n {\n top: window.scrollY + rect.bottom + 8,\n left: window.scrollX + rect.left,\n anchorBottom: window.scrollY + rect.top - 8,\n },\n {\n onResolve: () => {\n storage.update(ann.id, { status: 'resolved' })\n refreshMarkers()\n },\n onDelete: () => {\n elementCache.delete(ann.id)\n storage.remove(ann.id)\n refreshMarkers()\n },\n onClose: () => {},\n },\n )\n}\n\nfunction generateMarkdown(): string {\n const route = currentRoute()\n const anns = storage.getByRoute(route)\n if (!anns.length) return ''\n\n const lines = [`## Annotations — ${route} (${anns.length})`, '']\n\n anns.forEach((ann, i) => {\n const fp = ann.fingerprint\n\n lines.push(`### ${i + 1}. [${ann.status}] \"${ann.comment}\"`)\n\n let elDesc = `Element: <${fp.tagName}>`\n if (fp.textContent) elDesc += ` \"${fp.textContent}\"`\n lines.push(elDesc)\n lines.push(`Viewport: ${ann.viewportBucket}px`)\n lines.push('')\n\n if (fp.sourceLocation) {\n lines.push(`Source: \\`${fp.sourceLocation}\\`${fp.componentName ? ` (${fp.componentName})` : ''}`)\n lines.push('')\n } else if (fp.detectedSource) {\n lines.push(`Source (detected): \\`${fp.detectedSource}\\`${fp.detectedComponent ? ` (${fp.detectedComponent})` : ''}`)\n lines.push('')\n }\n\n lines.push('Search hints:')\n\n if (fp.dataAnnotate) {\n lines.push(`- \\`data-annotate=\"${fp.dataAnnotate}\"\\` — in template files`)\n }\n if (fp.dataTestId) {\n lines.push(`- \\`data-testid=\"${fp.dataTestId}\"\\` — in template files`)\n }\n if (fp.id) {\n lines.push(`- \\`id=\"${fp.id}\"\\` — in template files`)\n }\n if (fp.ariaLabel) {\n lines.push(`- \\`aria-label=\"${fp.ariaLabel}\"\\` — in template files`)\n }\n if (fp.textContent) {\n lines.push(`- \\`\"${fp.textContent}\"\\` — text content in templates`)\n }\n if (fp.cssModules?.length) {\n for (const mod of fp.cssModules) {\n lines.push(`- \\`.${mod.localName}\\` — in CSS Module file (likely \\`${mod.moduleHint}.module.*\\`)`)\n lines.push(`- \\`styles.${mod.localName}\\` — in component JS/TS`)\n }\n }\n if (fp.domPath) {\n lines.push(`- DOM: ${fp.domPath}`)\n }\n const classes = fp.rawClasses ?? fp.stableClasses\n if (classes.length) {\n lines.push(`- Classes: ${classes.join(' ')}`)\n }\n\n lines.push('')\n })\n\n return lines.join('\\n')\n}\n\nfunction downloadFile(content: string, filename: string, type: string): void {\n const blob = new Blob([content], { type })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename\n a.click()\n URL.revokeObjectURL(url)\n}\n\nfunction exportMarkdown(): void {\n const md = generateMarkdown()\n if (!md) return\n downloadFile(md, `remarq-annotations-${Date.now()}.md`, 'text/markdown')\n}\n\nfunction exportJSON(): void {\n const data = storage.exportJSON()\n const json = JSON.stringify(data, null, 2)\n downloadFile(json, `remarq-annotations-${Date.now()}.json`, 'application/json')\n}\n\nfunction copyToClipboard(): void {\n const md = generateMarkdown()\n if (!md) return\n navigator.clipboard.writeText(md).catch(() => {\n console.warn('[web-remarq] Clipboard write failed')\n })\n}\n\nfunction exportAgent(): void {\n const anns = storage.getAll()\n if (!anns.length) return\n const data = generateAgentExport(anns, toBucket(window.innerWidth))\n const json = JSON.stringify(data, null, 2)\n downloadFile(json, `remarq-agent-${Date.now()}.json`, 'application/json')\n}\n\nfunction copyAgentToClipboard(): void {\n const anns = storage.getAll()\n if (!anns.length) return\n const data = generateAgentExport(anns, toBucket(window.innerWidth))\n const json = JSON.stringify(data, null, 2)\n navigator.clipboard.writeText(json).catch(() => {\n console.warn('[web-remarq] Clipboard write failed')\n })\n}\n\nfunction setupMutationObserver(): void {\n mutationObserver = new MutationObserver((mutations) => {\n for (const m of mutations) {\n if (m.target instanceof HTMLElement && m.target.closest('[data-remarq-theme]')) return\n }\n scheduleRefresh()\n })\n\n mutationObserver.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['id', 'class', 'data-annotate', 'data-testid', 'data-test', 'data-cy'],\n })\n}\n\nexport const WebRemarq = {\n init(opts?: WebRemarqOptions): void {\n if (initialized) return\n options = opts ?? {}\n\n try {\n injectStyles()\n storage = new AnnotationStorage()\n themeManager = new ThemeManager(document.body, options.theme)\n overlay = new Overlay(themeManager.container)\n spacingOverlay = new SpacingOverlay(themeManager.container)\n popup = new Popup(themeManager.container)\n markers = new MarkerManager(themeManager.container, handleMarkerClick)\n detachedPanel = new DetachedPanel(themeManager.container, (id) => {\n elementCache.delete(id)\n storage.remove(id)\n refreshMarkers()\n })\n\n toolbar = new Toolbar(themeManager.container, {\n onInspect: () => setInspecting(!inspecting),\n onSpacingToggle: () => {\n if (!inspecting) return\n spacingMode = !spacingMode\n toolbar.setSpacingActive(spacingMode)\n if (!spacingMode) spacingOverlay.hide()\n },\n onCopy: copyToClipboard,\n onExportMd: exportMarkdown,\n onExportJson: exportJSON,\n onImport: () => {\n const file = toolbar.getFileInput().files?.[0]\n if (file) {\n WebRemarq.import(file)\n }\n },\n onClear: () => {\n elementCache.clear()\n storage.clearAll()\n refreshMarkers()\n },\n onThemeToggle: () => themeManager.toggle(),\n })\n\n if (storage.isMemoryOnly) {\n toolbar.setMemoryWarning(true)\n }\n\n routeObserver = new RouteObserver()\n unsubRoute = routeObserver.onChange(() => refreshMarkers())\n\n document.addEventListener('click', handleInspectClick, true)\n document.addEventListener('mousemove', handleInspectHover)\n document.addEventListener('keydown', handleInspectKeydown)\n\n setupMutationObserver()\n initViewportListener(() => refreshMarkers())\n\n console.debug(`[web-remarq] Initialized on route: ${currentRoute()}`)\n refreshMarkers()\n initialized = true\n } catch (err) {\n console.error('[web-remarq] Init failed:', err)\n }\n },\n\n destroy(): void {\n if (!initialized) return\n try {\n document.removeEventListener('click', handleInspectClick, true)\n document.removeEventListener('mousemove', handleInspectHover)\n document.removeEventListener('keydown', handleInspectKeydown)\n mutationObserver?.disconnect()\n mutationObserver = null\n destroyViewportListener()\n unsubRoute?.()\n routeObserver?.destroy()\n markers?.destroy()\n detachedPanel?.destroy()\n popup?.destroy()\n overlay?.destroy()\n spacingOverlay?.destroy()\n toolbar?.destroy()\n themeManager?.destroy()\n removeStyles()\n elementCache.clear()\n inspecting = false\n spacingMode = false\n initialized = false\n } catch (err) {\n console.error('[web-remarq] Destroy failed:', err)\n }\n },\n\n setTheme(theme: 'light' | 'dark'): void {\n themeManager?.setTheme(theme)\n },\n\n export(format: 'md' | 'json' | 'agent'): void {\n if (format === 'md') exportMarkdown()\n else if (format === 'json') exportJSON()\n else exportAgent()\n },\n\n copy(format?: 'md' | 'agent'): void {\n if (format === 'agent') copyAgentToClipboard()\n else copyToClipboard()\n },\n\n async import(file: File): Promise<ImportResult> {\n const text = await file.text()\n const data = JSON.parse(text)\n storage.importJSON(data)\n refreshMarkers()\n\n const allAnns = storage.getAll()\n const bucket = toBucket(window.innerWidth)\n let matched = 0\n let otherBreakpoint = 0\n let detached = 0\n for (const ann of allAnns) {\n if (resolveElement(ann)) {\n matched++\n } else if (bucket !== ann.viewportBucket) {\n otherBreakpoint++\n } else {\n detached++\n }\n }\n return { total: allAnns.length, matched, otherBreakpoint, detached }\n },\n\n getAnnotations(route?: string): Annotation[] {\n if (!storage) return []\n return route ? storage.getByRoute(route) : storage.getAll()\n },\n\n clearAll(): void {\n elementCache.clear()\n storage?.clearAll()\n if (initialized) refreshMarkers()\n },\n}\n"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","names":["options","parent","buildDomPath","options","e","popup"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/core/viewport.ts","../src/core/storage.ts","../src/core/hash-detect.ts","../src/core/source-detect.ts","../src/core/fingerprint.ts","../src/core/matcher.ts","../src/core/agent-export.ts","../src/ui/styles.ts","../src/ui/theme.ts","../src/ui/toolbar.ts","../src/ui/overlay.ts","../src/ui/spacing-overlay.ts","../src/ui/popup.ts","../src/ui/markers.ts","../src/ui/toast.ts","../src/ui/detached-panel.ts","../src/spa.ts","../src/web-remarq.ts"],"sourcesContent":["export { WebRemarq } from './web-remarq'\nexport type { Annotation, AnnotationStore, ElementFingerprint, CSSModuleClass, WebRemarqOptions, ImportResult, AgentExport, AgentAnnotation } from './core/types'\n","type BucketChangeCallback = () => void\n\nlet currentBucket: number = 0\nlet onBucketChange: BucketChangeCallback | null = null\nlet resizeHandler: (() => void) | null = null\n\nexport function toBucket(width: number): number {\n return Math.floor(width / 100) * 100\n}\n\nfunction debounce(fn: () => void, ms: number): () => void {\n let timer: ReturnType<typeof setTimeout>\n return () => {\n clearTimeout(timer)\n timer = setTimeout(fn, ms)\n }\n}\n\nexport function initViewportListener(callback: BucketChangeCallback): void {\n currentBucket = toBucket(window.innerWidth)\n onBucketChange = callback\n\n resizeHandler = debounce(() => {\n const newBucket = toBucket(window.innerWidth)\n if (newBucket !== currentBucket) {\n currentBucket = newBucket\n onBucketChange?.()\n }\n }, 300)\n\n window.addEventListener('resize', resizeHandler)\n}\n\nexport function destroyViewportListener(): void {\n if (resizeHandler) {\n window.removeEventListener('resize', resizeHandler)\n resizeHandler = null\n }\n onBucketChange = null\n}\n","import type { Annotation, AnnotationStore } from './types'\nimport { toBucket } from './viewport'\n\nconst STORAGE_KEY = 'remarq:annotations'\n\nexport class AnnotationStorage {\n private annotations: Annotation[] = []\n private extraFields: Record<string, unknown> = {}\n isMemoryOnly = false\n\n constructor() {\n this.load()\n }\n\n getAll(): Annotation[] {\n return [...this.annotations]\n }\n\n getByRoute(route: string): Annotation[] {\n return this.annotations.filter((a) => a.route === route)\n }\n\n add(annotation: Annotation): void {\n this.annotations.push(annotation)\n this.save()\n }\n\n remove(id: string): void {\n this.annotations = this.annotations.filter((a) => a.id !== id)\n this.save()\n }\n\n update(id: string, changes: Partial<Annotation>): void {\n const idx = this.annotations.findIndex((a) => a.id === id)\n if (idx !== -1) {\n this.annotations[idx] = { ...this.annotations[idx], ...changes }\n this.save()\n }\n }\n\n clearAll(): void {\n this.annotations = []\n this.save()\n }\n\n exportJSON(): AnnotationStore {\n return {\n version: 1,\n annotations: [...this.annotations],\n }\n }\n\n importJSON(data: AnnotationStore): void {\n this.annotations = [...data.annotations]\n this.migrateViewportBuckets()\n this.save()\n }\n\n private migrateViewportBuckets(): void {\n for (const ann of this.annotations) {\n if (ann.viewportBucket == null && ann.viewport) {\n const width = parseInt(ann.viewport.split('x')[0], 10)\n ann.viewportBucket = toBucket(width)\n }\n }\n }\n\n private load(): void {\n try {\n const raw = localStorage.getItem(STORAGE_KEY)\n if (raw) {\n const parsed = JSON.parse(raw)\n const { version, annotations, ...rest } = parsed\n this.annotations = annotations ?? []\n this.extraFields = rest\n this.migrateViewportBuckets()\n }\n } catch {\n this.isMemoryOnly = true\n }\n }\n\n private save(): void {\n if (this.isMemoryOnly) return\n try {\n const data = {\n version: 1,\n ...this.extraFields,\n annotations: this.annotations,\n }\n localStorage.setItem(STORAGE_KEY, JSON.stringify(data))\n } catch {\n this.isMemoryOnly = true\n }\n }\n}\n","import type { CSSModuleClass } from './types'\n\nconst CSS_MODULES_RE = /^(.+)__([a-zA-Z0-9]{3,})$/\nconst CSS_MODULES_3SEG_RE = /^([^_]+(?:[_-][^_]+)*)__([a-zA-Z][a-zA-Z0-9]*)__([a-zA-Z0-9]{3,})$/\nconst STYLED_COMPONENTS_RE = /^sc-/\nconst EMOTION_RE = /^css-[a-zA-Z0-9]+$/\nconst PURE_HASH_RE = /^(?=.*[a-zA-Z])(?=.*\\d)[a-zA-Z0-9]{8,}$/\n\nexport function isHashedClass(className: string): boolean {\n if (STYLED_COMPONENTS_RE.test(className)) return true\n if (EMOTION_RE.test(className)) return true\n if (CSS_MODULES_RE.test(className)) return true\n if (PURE_HASH_RE.test(className)) return true\n return false\n}\n\nexport function stripHash(className: string): string {\n const match = className.match(CSS_MODULES_RE)\n if (match) {\n const prefix = className.slice(0, className.lastIndexOf('__'))\n return prefix\n }\n return className\n}\n\nexport function filterClasses(\n classes: string[],\n classFilter?: (className: string) => boolean,\n): string[] {\n const result: string[] = []\n\n for (const cls of classes) {\n if (STYLED_COMPONENTS_RE.test(cls)) continue\n if (EMOTION_RE.test(cls)) continue\n if (PURE_HASH_RE.test(cls)) continue\n\n let stable = stripHash(cls)\n\n if (classFilter && !classFilter(stable)) continue\n\n result.push(stable)\n }\n\n return result\n}\n\nexport function decomposeCSSModules(classes: string[]): CSSModuleClass[] {\n const result: CSSModuleClass[] = []\n for (const cls of classes) {\n const match = cls.match(CSS_MODULES_3SEG_RE)\n if (match) {\n result.push({\n raw: cls,\n moduleHint: match[1],\n localName: match[2],\n })\n }\n }\n return result\n}\n","import type { SourceDetectionResult } from './types'\n\n/**\n * Level 1: Read data-remarq-source/data-remarq-component attrs\n * injected by @web-remarq/babel-plugin or @web-remarq/unplugin.\n */\nexport function detectRemarqPlugin(el: HTMLElement): SourceDetectionResult {\n const source = el.getAttribute('data-remarq-source')\n if (!source) return { source: null, component: null }\n return {\n source,\n component: el.getAttribute('data-remarq-component'),\n }\n}\n\n/**\n * Level 2a: Read data-source or data-locator attrs\n * from locator.js or similar external tools.\n */\nexport function detectExternalSource(el: HTMLElement): SourceDetectionResult {\n const source = el.dataset.source ?? el.getAttribute('data-locator')\n if (!source) return { source: null, component: null }\n return { source, component: null }\n}\n\n/**\n * Level 2b: Read React fiber _debugSource (dev mode only).\n * Unstable/best-effort — React internals are not public API.\n * Walks up the fiber tree because _debugSource lives on component fibers,\n * not on host (DOM element) fibers.\n */\nexport function detectReactFiber(el: HTMLElement): SourceDetectionResult {\n const key = Object.keys(el).find(k => k.startsWith('__reactFiber$'))\n if (!key) return { source: null, component: null }\n\n let current = (el as unknown as Record<string, unknown>)[key] as Record<string, unknown> | null\n // Walk up fiber tree to find nearest fiber with _debugSource (max 15 levels)\n let depth = 0\n while (current && depth < 15) {\n const debugSource = current._debugSource as { fileName?: string; lineNumber?: number; columnNumber?: number } | undefined\n if (debugSource?.fileName) {\n const source = `${debugSource.fileName}:${debugSource.lineNumber ?? 0}:${debugSource.columnNumber ?? 0}`\n\n // Try to get component name from fiber.type\n const fiberType = current.type as { displayName?: string; name?: string } | string | undefined\n const component = typeof fiberType === 'object' && fiberType\n ? (fiberType.displayName ?? fiberType.name ?? null)\n : null\n\n return { source, component }\n }\n current = current.return as Record<string, unknown> | null\n depth++\n }\n\n return { source: null, component: null }\n}\n\n/**\n * Runs Level 2 detectors in order. Returns first non-null result.\n */\nexport function detectSource(el: HTMLElement): SourceDetectionResult {\n const external = detectExternalSource(el)\n if (external.source) return external\n\n const fiber = detectReactFiber(el)\n if (fiber.source) return fiber\n\n return { source: null, component: null }\n}\n","import type { ElementFingerprint, WebRemarqOptions } from './types'\nimport { filterClasses, isHashedClass, decomposeCSSModules } from './hash-detect'\nimport { detectRemarqPlugin, detectSource } from './source-detect'\n\nconst TEXT_MAX_LENGTH = 50\n\nexport function createFingerprint(\n el: HTMLElement,\n options?: Pick<WebRemarqOptions, 'classFilter' | 'dataAttribute'>,\n): ElementFingerprint {\n const dataAttr = options?.dataAttribute ?? 'data-annotate'\n\n return {\n dataAnnotate: el.getAttribute(dataAttr) ?? null,\n dataTestId: el.getAttribute('data-testid')\n ?? el.getAttribute('data-test')\n ?? el.getAttribute('data-cy')\n ?? null,\n id: getStableId(el),\n tagName: el.tagName.toLowerCase(),\n textContent: getTextContent(el),\n role: el.getAttribute('role') ?? null,\n ariaLabel: el.getAttribute('aria-label') ?? null,\n stableClasses: filterClasses(\n Array.from(el.classList),\n options?.classFilter,\n ),\n domPath: buildDomPath(el),\n siblingIndex: getSiblingIndex(el),\n parentAnchor: findParentAnchor(el, dataAttr),\n rawClasses: Array.from(el.classList),\n cssModules: decomposeCSSModules(Array.from(el.classList)),\n ...resolveSourceFields(el),\n }\n}\n\nfunction resolveSourceFields(el: HTMLElement): {\n sourceLocation: string | null\n componentName: string | null\n detectedSource: string | null\n detectedComponent: string | null\n} {\n const plugin = detectRemarqPlugin(el)\n if (plugin.source) {\n return {\n sourceLocation: plugin.source,\n componentName: plugin.component,\n detectedSource: null,\n detectedComponent: null,\n }\n }\n\n const detected = detectSource(el)\n return {\n sourceLocation: null,\n componentName: null,\n detectedSource: detected.source,\n detectedComponent: detected.component,\n }\n}\n\nfunction getStableId(el: HTMLElement): string | null {\n const id = el.id\n if (!id) return null\n if (isHashedClass(id)) return null\n return id\n}\n\nfunction getTextContent(el: HTMLElement): string | null {\n // Use only direct text nodes, not nested children's text\n let text = ''\n for (const node of Array.from(el.childNodes)) {\n if (node.nodeType === Node.TEXT_NODE) {\n text += node.textContent ?? ''\n }\n }\n text = text.trim()\n\n // If no direct text, try first meaningful child's text (for wrappers like <span><b>Text</b></span>)\n if (!text && el.children.length <= 3) {\n text = el.textContent?.trim() ?? ''\n }\n\n if (!text) return null\n return text.length > TEXT_MAX_LENGTH ? text.slice(0, TEXT_MAX_LENGTH) : text\n}\n\nfunction buildDomPath(el: HTMLElement): string {\n const parts: string[] = []\n let current: HTMLElement | null = el\n\n while (current && current !== document.body && parts.length < 5) {\n let segment = current.tagName.toLowerCase()\n const stable = filterClasses(Array.from(current.classList))\n if (stable.length > 0) {\n segment += '.' + stable.slice(0, 2).join('.')\n }\n parts.unshift(segment)\n current = current.parentElement\n }\n\n return parts.join(' > ')\n}\n\nfunction getSiblingIndex(el: HTMLElement): number {\n const parent = el.parentElement\n if (!parent) return 0\n const children = Array.from(parent.children)\n return children.indexOf(el)\n}\n\nfunction findParentAnchor(el: HTMLElement, dataAttr: string): string | null {\n let current = el.parentElement\n while (current && current !== document.body) {\n const value = current.getAttribute(dataAttr)\n if (value) return value\n current = current.parentElement\n }\n return null\n}\n","import type { ElementFingerprint, WebRemarqOptions } from './types'\nimport { filterClasses } from './hash-detect'\n\nconst MATCH_THRESHOLD = 50\n\nexport function levenshteinSimilarity(a: string, b: string): number {\n if (a === b) return 1\n if (!a.length || !b.length) return 0\n\n const matrix: number[][] = []\n for (let i = 0; i <= a.length; i++) {\n matrix[i] = [i]\n }\n for (let j = 0; j <= b.length; j++) {\n matrix[0][j] = j\n }\n\n for (let i = 1; i <= a.length; i++) {\n for (let j = 1; j <= b.length; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1\n matrix[i][j] = Math.min(\n matrix[i - 1][j] + 1,\n matrix[i][j - 1] + 1,\n matrix[i - 1][j - 1] + cost,\n )\n }\n }\n\n const distance = matrix[a.length][b.length]\n return 1 - distance / Math.max(a.length, b.length)\n}\n\nfunction textSimilarity(a: string | null, b: string | null): number {\n if (!a || !b) return 0\n const na = a.trim().toLowerCase()\n const nb = b.trim().toLowerCase()\n if (na === nb) return 1\n if (na.includes(nb) || nb.includes(na)) return 1\n return levenshteinSimilarity(na, nb)\n}\n\nfunction jaccardSimilarity(a: string[], b: string[]): number {\n if (!a.length && !b.length) return 0\n const setA = new Set(a)\n const setB = new Set(b)\n let intersection = 0\n for (const item of setA) {\n if (setB.has(item)) intersection++\n }\n const union = new Set([...a, ...b]).size\n return union === 0 ? 0 : intersection / union\n}\n\nfunction scoreCandidate(el: HTMLElement, fp: ElementFingerprint, dataAttr: string): number {\n let score = 0\n\n // dataAnnotate match (+100)\n const elAnnotate = el.getAttribute(dataAttr)\n if (fp.dataAnnotate && elAnnotate === fp.dataAnnotate) {\n score += 100\n }\n\n // textContent match (+35 scaled)\n const elText = el.textContent?.trim().slice(0, 50) ?? null\n const textSim = textSimilarity(fp.textContent, elText)\n if (textSim > 0.7) {\n score += textSim * 35\n }\n\n // role + ariaLabel match (+30)\n if (fp.role && el.getAttribute('role') === fp.role &&\n fp.ariaLabel && el.getAttribute('aria-label') === fp.ariaLabel) {\n score += 30\n }\n\n // parentAnchor match (+15)\n if (fp.parentAnchor) {\n let parent = el.parentElement\n while (parent && parent !== document.body) {\n if (parent.getAttribute(dataAttr) === fp.parentAnchor) {\n score += 15\n break\n }\n parent = parent.parentElement\n }\n }\n\n // stableClasses overlap (+30 scaled)\n if (fp.stableClasses.length > 0) {\n const elClasses = filterClasses(Array.from(el.classList))\n const jaccard = jaccardSimilarity(fp.stableClasses, elClasses)\n score += jaccard * 30\n }\n\n // domPath match (+20 scaled)\n if (fp.domPath) {\n const elPath = buildDomPath(el)\n const pathSim = levenshteinSimilarity(fp.domPath, elPath)\n score += pathSim * 20\n }\n\n // siblingIndex match (+5)\n const parent = el.parentElement\n if (parent) {\n const idx = Array.from(parent.children).indexOf(el)\n if (idx === fp.siblingIndex) {\n score += 5\n }\n }\n\n return score\n}\n\nfunction buildDomPath(el: HTMLElement): string {\n const parts: string[] = []\n let current: HTMLElement | null = el\n while (current && current !== document.body && parts.length < 5) {\n let segment = current.tagName.toLowerCase()\n const stable = filterClasses(Array.from(current.classList))\n if (stable.length > 0) {\n segment += '.' + stable.slice(0, 2).join('.')\n }\n parts.unshift(segment)\n current = current.parentElement\n }\n return parts.join(' > ')\n}\n\nexport function matchElement(\n fp: ElementFingerprint,\n options?: Pick<WebRemarqOptions, 'dataAttribute'>,\n): HTMLElement | null {\n const dataAttr = options?.dataAttribute ?? 'data-annotate'\n\n // 1. Exact match by data-annotate\n if (fp.dataAnnotate) {\n const el = document.querySelector<HTMLElement>(`[${dataAttr}=\"${fp.dataAnnotate}\"]`)\n if (el) return el\n }\n\n // 2. Exact match by data-testid\n if (fp.dataTestId) {\n const el = document.querySelector<HTMLElement>(\n `[data-testid=\"${fp.dataTestId}\"], [data-test=\"${fp.dataTestId}\"], [data-cy=\"${fp.dataTestId}\"]`,\n )\n if (el) return el\n }\n\n // 3. Exact match by id\n if (fp.id) {\n const el = document.getElementById(fp.id) as HTMLElement | null\n if (el) return el\n }\n\n // 4. Fuzzy match by tagName + weighted scoring\n const candidates = document.querySelectorAll<HTMLElement>(fp.tagName)\n let bestEl: HTMLElement | null = null\n let bestScore = 0\n\n for (const candidate of candidates) {\n const score = scoreCandidate(candidate, fp, dataAttr)\n if (score > bestScore) {\n bestScore = score\n bestEl = candidate\n }\n }\n\n return bestScore >= MATCH_THRESHOLD ? bestEl : null\n}\n","import type {\n Annotation,\n AgentExport,\n AgentAnnotation,\n AgentAnnotationSource,\n AgentSearchHints,\n GrepQuery,\n ElementFingerprint,\n} from './types'\n\nfunction parseSourceLocation(raw: string): { file: string; line: number; column: number } | null {\n const parts = raw.split(':')\n if (parts.length < 2) return null\n // file path may contain \":\" on Windows (C:\\...), so rejoin all but last 2\n const column = parseInt(parts.pop()!, 10)\n const line = parseInt(parts.pop()!, 10)\n const file = parts.join(':')\n if (!file || isNaN(line)) return null\n return { file, line, column: isNaN(column) ? 0 : column }\n}\n\nfunction resolveSource(fp: ElementFingerprint): AgentAnnotationSource | null {\n // Level 1: plugin source\n if (fp.sourceLocation) {\n const parsed = parseSourceLocation(fp.sourceLocation)\n if (parsed) return { ...parsed, component: fp.componentName ?? null }\n }\n\n // Level 2: detected source\n if (fp.detectedSource) {\n const parsed = parseSourceLocation(fp.detectedSource)\n if (parsed) return { ...parsed, component: fp.detectedComponent ?? null }\n }\n\n return null\n}\n\nconst TEMPLATE_GLOB = '*.{tsx,jsx,vue,svelte,html}'\nconst CSS_MODULE_GLOB = '*.module.{css,scss,less}'\nconst COMPONENT_GLOB = '*.{tsx,jsx,vue,ts,js}'\n\nfunction buildSearchHints(fp: ElementFingerprint): AgentSearchHints {\n const grepQueries: GrepQuery[] = []\n\n // High confidence — unique selectors\n if (fp.dataAnnotate) {\n grepQueries.push({ query: `data-annotate=\"${fp.dataAnnotate}\"`, glob: TEMPLATE_GLOB, confidence: 'high' })\n }\n if (fp.dataTestId) {\n grepQueries.push({ query: `data-testid=\"${fp.dataTestId}\"`, glob: TEMPLATE_GLOB, confidence: 'high' })\n }\n if (fp.id) {\n grepQueries.push({ query: `id=\"${fp.id}\"`, glob: TEMPLATE_GLOB, confidence: 'high' })\n }\n if (fp.ariaLabel) {\n grepQueries.push({ query: `aria-label=\"${fp.ariaLabel}\"`, glob: TEMPLATE_GLOB, confidence: 'high' })\n }\n\n // Medium confidence — text, CSS modules, role\n if (fp.textContent) {\n grepQueries.push({ query: `\"${fp.textContent}\"`, glob: TEMPLATE_GLOB, confidence: 'medium' })\n }\n if (fp.role) {\n grepQueries.push({ query: `role=\"${fp.role}\"`, glob: TEMPLATE_GLOB, confidence: 'medium' })\n }\n if (fp.cssModules?.length) {\n for (const mod of fp.cssModules) {\n grepQueries.push({ query: `.${mod.localName}`, glob: CSS_MODULE_GLOB, confidence: 'medium' })\n grepQueries.push({ query: `styles.${mod.localName}`, glob: COMPONENT_GLOB, confidence: 'medium' })\n }\n }\n\n // Low confidence — classes, domPath\n if (fp.stableClasses.length) {\n for (const cls of fp.stableClasses.slice(0, 3)) {\n grepQueries.push({ query: `\"${cls}\"`, glob: TEMPLATE_GLOB, confidence: 'low' })\n }\n }\n\n return {\n grepQueries,\n domContext: fp.domPath,\n tagName: fp.tagName,\n classes: fp.rawClasses ?? fp.stableClasses,\n }\n}\n\nexport function generateAgentExport(annotations: Annotation[], viewportBucket: number): AgentExport {\n const agentAnnotations: AgentAnnotation[] = annotations.map(ann => ({\n id: ann.id,\n route: ann.route,\n comment: ann.comment,\n status: ann.status,\n timestamp: ann.timestamp,\n source: resolveSource(ann.fingerprint),\n searchHints: buildSearchHints(ann.fingerprint),\n }))\n\n return {\n version: 1,\n format: 'agent',\n viewportBucket,\n annotations: agentAnnotations,\n }\n}\n","const STYLES_ID = 'data-remarq-styles'\n\nconst CSS = `\n[data-remarq-theme=\"light\"] {\n --remarq-bg: #ffffff;\n --remarq-bg-secondary: #f5f5f5;\n --remarq-text: #1a1a1a;\n --remarq-text-secondary: #666666;\n --remarq-border: #e2e8f0;\n --remarq-accent: #3b82f6;\n --remarq-pending: #f97316;\n --remarq-resolved: #22c55e;\n --remarq-overlay: rgba(59, 130, 246, 0.15);\n --remarq-shadow: 0 4px 12px rgba(0,0,0,0.15);\n}\n\n[data-remarq-theme=\"dark\"] {\n --remarq-bg: #1e1e1e;\n --remarq-bg-secondary: #2a2a2a;\n --remarq-text: #e5e5e5;\n --remarq-text-secondary: #999999;\n --remarq-border: #333333;\n --remarq-accent: #60a5fa;\n --remarq-pending: #fb923c;\n --remarq-resolved: #4ade80;\n --remarq-overlay: rgba(96, 165, 250, 0.15);\n --remarq-shadow: 0 4px 12px rgba(0,0,0,0.4);\n}\n\n.remarq-toolbar {\n position: fixed;\n bottom: 16px;\n right: 16px;\n z-index: 2147483647;\n display: flex;\n gap: 4px;\n padding: 8px;\n background: var(--remarq-bg);\n border: 1px solid var(--remarq-border);\n border-radius: 8px;\n box-shadow: var(--remarq-shadow);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 13px;\n color: var(--remarq-text);\n}\n\n.remarq-toolbar.remarq-minimized { padding: 4px; }\n\n.remarq-toolbar-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--remarq-text);\n cursor: pointer;\n position: relative;\n}\n\n.remarq-toolbar-btn:hover { background: var(--remarq-bg-secondary); }\n.remarq-toolbar-btn.remarq-active { background: var(--remarq-accent); color: #ffffff; }\n\n.remarq-badge {\n position: absolute;\n top: -4px;\n right: -4px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: 8px;\n background: var(--remarq-pending);\n color: #ffffff;\n font-size: 10px;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.remarq-overlay {\n position: fixed;\n pointer-events: none;\n background: var(--remarq-overlay);\n border: 2px solid var(--remarq-accent);\n border-radius: 2px;\n z-index: 2147483646;\n transition: all 0.05s ease-out;\n}\n\n.remarq-tooltip {\n position: fixed;\n z-index: 2147483647;\n padding: 4px 8px;\n background: var(--remarq-bg);\n border: 1px solid var(--remarq-border);\n border-radius: 4px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 12px;\n color: var(--remarq-text);\n box-shadow: var(--remarq-shadow);\n pointer-events: none;\n white-space: nowrap;\n max-width: 300px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.remarq-marker {\n position: absolute;\n z-index: 2147483645;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 11px;\n font-weight: 700;\n color: #ffffff;\n cursor: pointer;\n box-shadow: 0 2px 4px rgba(0,0,0,0.2);\n transition: transform 0.1s ease;\n}\n\n.remarq-marker:hover { transform: scale(1.2); }\n.remarq-marker[data-status=\"pending\"] { background: var(--remarq-pending); }\n.remarq-marker[data-status=\"resolved\"] { background: var(--remarq-resolved); opacity: 0.7; }\n\n.remarq-popup {\n position: absolute;\n z-index: 2147483647;\n width: 300px;\n background: var(--remarq-bg);\n border: 1px solid var(--remarq-border);\n border-radius: 8px;\n box-shadow: var(--remarq-shadow);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 13px;\n color: var(--remarq-text);\n}\n\n.remarq-popup-header {\n padding: 8px 12px;\n border-bottom: 1px solid var(--remarq-border);\n font-size: 12px;\n color: var(--remarq-text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.remarq-popup-body { padding: 12px; }\n\n.remarq-popup textarea {\n width: 100%;\n min-height: 60px;\n padding: 8px;\n border: 1px solid var(--remarq-border);\n border-radius: 4px;\n background: var(--remarq-bg-secondary);\n color: var(--remarq-text);\n font-family: inherit;\n font-size: 13px;\n resize: vertical;\n box-sizing: border-box;\n}\n\n.remarq-popup textarea:focus { outline: none; border-color: var(--remarq-accent); }\n\n.remarq-popup-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px 12px;\n border-top: 1px solid var(--remarq-border);\n}\n\n.remarq-popup-actions button {\n padding: 4px 12px;\n border: 1px solid var(--remarq-border);\n border-radius: 4px;\n background: var(--remarq-bg);\n color: var(--remarq-text);\n cursor: pointer;\n font-size: 12px;\n}\n\n.remarq-popup-actions button.remarq-primary {\n background: var(--remarq-accent);\n border-color: var(--remarq-accent);\n color: #ffffff;\n}\n\n.remarq-detached-panel {\n position: fixed;\n bottom: 60px;\n right: 16px;\n z-index: 2147483646;\n width: 280px;\n max-height: 300px;\n overflow-y: auto;\n background: var(--remarq-bg);\n border: 1px solid var(--remarq-border);\n border-radius: 8px;\n box-shadow: var(--remarq-shadow);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 13px;\n color: var(--remarq-text);\n}\n\n.remarq-detached-header {\n padding: 8px 12px;\n border-bottom: 1px solid var(--remarq-border);\n font-weight: 600;\n font-size: 12px;\n color: var(--remarq-text-secondary);\n}\n\n.remarq-detached-item {\n padding: 8px 12px;\n border-bottom: 1px solid var(--remarq-border);\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 8px;\n}\n\n.remarq-detached-item:last-child { border-bottom: none; }\n.remarq-detached-info { flex: 1; min-width: 0; }\n.remarq-detached-comment { margin-bottom: 4px; }\n\n.remarq-detached-element {\n font-size: 11px;\n color: var(--remarq-text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.remarq-detached-delete {\n border: none;\n background: none;\n color: var(--remarq-text-secondary);\n cursor: pointer;\n padding: 2px;\n font-size: 14px;\n line-height: 1;\n flex-shrink: 0;\n}\n\n.remarq-detached-delete:hover { color: #ef4444; }\n\n.remarq-export-menu {\n position: absolute;\n bottom: 100%;\n right: 0;\n margin-bottom: 4px;\n background: var(--remarq-bg);\n border: 1px solid var(--remarq-border);\n border-radius: 6px;\n box-shadow: var(--remarq-shadow);\n overflow: hidden;\n}\n\n.remarq-export-menu button {\n display: block;\n width: 100%;\n padding: 8px 16px;\n border: none;\n background: transparent;\n color: var(--remarq-text);\n cursor: pointer;\n font-size: 12px;\n text-align: left;\n white-space: nowrap;\n}\n\n.remarq-export-menu button:hover { background: var(--remarq-bg-secondary); }\n\n.remarq-detached-header + .remarq-detached-header {\n border-top: 2px solid var(--remarq-border);\n}\n\n.remarq-detached-item[style*=\"cursor\"]:hover {\n background: var(--remarq-bg-secondary);\n}\n\n.remarq-toast {\n position: fixed;\n bottom: 60px;\n left: 50%;\n transform: translateX(-50%);\n z-index: 2147483647;\n padding: 8px 16px;\n background: var(--remarq-bg);\n border: 1px solid var(--remarq-border);\n border-radius: 6px;\n box-shadow: var(--remarq-shadow);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 13px;\n color: var(--remarq-text);\n transition: opacity 0.3s ease;\n}\n\n.remarq-toast-fade {\n opacity: 0;\n}\n\n.remarq-spacing {\n position: fixed;\n top: 0;\n left: 0;\n pointer-events: none;\n z-index: 2147483646;\n}\n\n.remarq-spacing-margin {\n position: fixed;\n background: rgba(249, 115, 22, 0.2);\n pointer-events: none;\n z-index: 1;\n}\n\n.remarq-spacing-padding {\n position: fixed;\n background: rgba(34, 197, 94, 0.2);\n pointer-events: none;\n z-index: 2;\n}\n\n.remarq-spacing-content {\n position: fixed;\n background: rgba(59, 130, 246, 0.3);\n border: 1px dashed rgba(96, 165, 250, 0.8);\n pointer-events: none;\n z-index: 3;\n}\n\n.remarq-spacing-gap {\n position: fixed;\n background: rgba(168, 85, 247, 0.25);\n border: 1px dashed rgba(168, 85, 247, 0.5);\n pointer-events: none;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.remarq-spacing-label {\n position: fixed;\n font-size: 11px;\n font-weight: 700;\n pointer-events: none;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n line-height: 1;\n padding: 1px 3px;\n border-radius: 2px;\n}\n\n.remarq-spacing-label-margin { color: #fff; background: rgba(249, 115, 22, 0.85); }\n.remarq-spacing-label-padding { color: #fff; background: rgba(34, 197, 94, 0.85); }\n.remarq-spacing-label-content { color: #fff; background: rgba(59, 130, 246, 0.85); font-size: 10px; }\n.remarq-spacing-label-gap { color: #fff; background: rgba(168, 85, 247, 0.85); font-size: 10px; }\n\n.remarq-toolbar-btn:disabled { opacity: 0.3; cursor: default; }\n.remarq-toolbar-btn:disabled:hover { background: transparent; }\n\n.remarq-popup-hint {\n font-size: 11px;\n color: var(--remarq-text-secondary);\n margin-top: 4px;\n}\n`\n\nexport function injectStyles(): void {\n if (document.querySelector(`style[${STYLES_ID}]`)) return\n\n try {\n const style = document.createElement('style')\n style.setAttribute(STYLES_ID, '')\n style.textContent = CSS\n document.head.appendChild(style)\n } catch {\n // CSP fallback: try blob URL via <link>\n try {\n const blob = new Blob([CSS], { type: 'text/css' })\n const link = document.createElement('link')\n link.rel = 'stylesheet'\n link.href = URL.createObjectURL(blob)\n link.setAttribute(STYLES_ID, '')\n document.head.appendChild(link)\n } catch {\n console.warn('[web-remarq] Could not inject styles')\n }\n }\n}\n\nexport function removeStyles(): void {\n const el = document.querySelector(`[${STYLES_ID}]`)\n el?.remove()\n}\n","const THEME_KEY = 'remarq:theme'\n\nexport type Theme = 'light' | 'dark'\n\nexport class ThemeManager {\n container: HTMLElement\n private theme: Theme\n\n constructor(parent: HTMLElement, initialTheme?: Theme) {\n const persisted = this.loadTheme()\n this.theme = initialTheme ?? persisted ?? 'light'\n\n this.container = document.createElement('div')\n this.container.setAttribute('data-remarq-theme', this.theme)\n parent.appendChild(this.container)\n\n this.persist()\n }\n\n getTheme(): Theme {\n return this.theme\n }\n\n setTheme(theme: Theme): void {\n this.theme = theme\n this.container.setAttribute('data-remarq-theme', theme)\n this.persist()\n }\n\n toggle(): void {\n this.setTheme(this.theme === 'light' ? 'dark' : 'light')\n }\n\n destroy(): void {\n this.container.remove()\n }\n\n private persist(): void {\n try {\n localStorage.setItem(THEME_KEY, this.theme)\n } catch {\n // ignore\n }\n }\n\n private loadTheme(): Theme | null {\n try {\n const value = localStorage.getItem(THEME_KEY)\n if (value === 'light' || value === 'dark') return value\n } catch {\n // ignore\n }\n return null\n }\n}\n","export interface ToolbarCallbacks {\n onInspect: () => void\n onCopy: () => void\n onExportMd: () => void\n onExportJson: () => void\n onImport: () => void\n onClear: () => void\n onThemeToggle: () => void\n onSpacingToggle: () => void\n}\n\nconst TOOLTIPS: Record<string, string> = {\n inspect: 'Inspect element',\n spacing: 'Spacing overlay (S)',\n copy: 'Copy as Markdown',\n export: 'Export',\n import: 'Import JSON',\n clear: 'Clear all',\n theme: 'Toggle theme',\n minimize: 'Minimize',\n}\n\nconst ICONS = {\n inspect: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><circle cx=\"7\" cy=\"7\" r=\"4\"/><line x1=\"10\" y1=\"10\" x2=\"14\" y2=\"14\"/></svg>',\n spacing: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M2 2h12M2 14h12M2 2v12M14 2v12\"/><path d=\"M5 5h6v6H5z\" stroke-dasharray=\"2 1\"/></svg>',\n copy: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><rect x=\"5\" y=\"5\" width=\"8\" height=\"9\" rx=\"1\"/><path d=\"M3 11V3a1 1 0 0 1 1-1h6\"/></svg>',\n export: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M8 2v8M4 6l4-4 4 4M2 12h12\"/></svg>',\n import: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M8 10V2M4 6l4 4 4-4M2 12h12\"/></svg>',\n clear: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M3 4h10M6 4V3h4v1M5 4v9h6V4\"/></svg>',\n theme: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><circle cx=\"8\" cy=\"8\" r=\"3\"/><path d=\"M8 1v2M8 13v2M1 8h2M13 8h2\"/></svg>',\n minimize: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M4 8h8\"/></svg>',\n}\n\nexport class Toolbar {\n private toolbarEl: HTMLElement\n private badgeEl: HTMLElement\n private inspectBtn: HTMLElement\n private spacingBtn: HTMLButtonElement\n private exportMenu: HTMLElement | null = null\n private fileInput: HTMLInputElement\n private minimized = false\n private buttons: HTMLElement[] = []\n\n constructor(\n private container: HTMLElement,\n private callbacks: ToolbarCallbacks,\n ) {\n this.toolbarEl = document.createElement('div')\n this.toolbarEl.className = 'remarq-toolbar'\n\n this.inspectBtn = this.createButton('inspect', ICONS.inspect, () => callbacks.onInspect())\n this.badgeEl = document.createElement('span')\n this.badgeEl.className = 'remarq-badge'\n this.badgeEl.style.display = 'none'\n this.inspectBtn.appendChild(this.badgeEl)\n\n this.spacingBtn = this.createButton('spacing', ICONS.spacing, () => callbacks.onSpacingToggle()) as HTMLButtonElement\n this.spacingBtn.disabled = true\n\n const copyBtn = this.createButton('copy', ICONS.copy, () => callbacks.onCopy())\n const exportBtn = this.createButton('export', ICONS.export, (e) => this.toggleExportMenu(e))\n\n this.fileInput = document.createElement('input')\n this.fileInput.type = 'file'\n this.fileInput.accept = '.json'\n this.fileInput.style.display = 'none'\n this.fileInput.addEventListener('change', () => {\n callbacks.onImport()\n this.fileInput.value = ''\n })\n const importBtn = this.createButton('import', ICONS.import, () => this.fileInput.click())\n\n const clearBtn = this.createButton('clear', ICONS.clear, () => callbacks.onClear())\n const themeBtn = this.createButton('theme', ICONS.theme, () => callbacks.onThemeToggle())\n const minimizeBtn = this.createButton('minimize', ICONS.minimize, () => this.toggleMinimize())\n\n this.buttons = [this.inspectBtn, this.spacingBtn, copyBtn, exportBtn, importBtn, clearBtn, themeBtn]\n\n this.toolbarEl.appendChild(this.inspectBtn)\n this.toolbarEl.appendChild(this.spacingBtn)\n this.toolbarEl.appendChild(copyBtn)\n this.toolbarEl.appendChild(exportBtn)\n this.toolbarEl.appendChild(importBtn)\n this.toolbarEl.appendChild(clearBtn)\n this.toolbarEl.appendChild(themeBtn)\n this.toolbarEl.appendChild(minimizeBtn)\n this.toolbarEl.appendChild(this.fileInput)\n\n container.appendChild(this.toolbarEl)\n }\n\n setInspectActive(active: boolean): void {\n this.inspectBtn.classList.toggle('remarq-active', active)\n }\n\n setSpacingActive(active: boolean): void {\n this.spacingBtn.classList.toggle('remarq-active', active)\n }\n\n setSpacingEnabled(enabled: boolean): void {\n this.spacingBtn.disabled = !enabled\n if (!enabled) {\n this.spacingBtn.classList.remove('remarq-active')\n }\n }\n\n setBadgeCount(count: number): void {\n this.badgeEl.textContent = String(count)\n this.badgeEl.style.display = count > 0 ? 'flex' : 'none'\n }\n\n getFileInput(): HTMLInputElement {\n return this.fileInput\n }\n\n setMemoryWarning(show: boolean): void {\n this.toolbarEl.title = show ? 'localStorage unavailable — annotations stored in memory only' : ''\n }\n\n destroy(): void {\n this.closeExportMenu()\n this.toolbarEl.remove()\n }\n\n private createButton(action: string, icon: string, handler: (e: Event) => void): HTMLElement {\n const btn = document.createElement('button')\n btn.className = 'remarq-toolbar-btn'\n btn.setAttribute('data-remarq-action', action)\n btn.title = TOOLTIPS[action] ?? ''\n btn.innerHTML = icon\n btn.addEventListener('click', handler)\n return btn\n }\n\n private toggleMinimize(): void {\n this.minimized = !this.minimized\n this.toolbarEl.classList.toggle('remarq-minimized', this.minimized)\n for (const btn of this.buttons) {\n btn.style.display = this.minimized ? 'none' : ''\n }\n }\n\n private toggleExportMenu(e: Event): void {\n if (this.exportMenu) {\n this.closeExportMenu()\n return\n }\n\n this.exportMenu = document.createElement('div')\n this.exportMenu.className = 'remarq-export-menu'\n\n const mdBtn = document.createElement('button')\n mdBtn.textContent = 'MD (file)'\n mdBtn.addEventListener('click', () => {\n this.callbacks.onExportMd()\n this.closeExportMenu()\n })\n\n const jsonBtn = document.createElement('button')\n jsonBtn.textContent = 'JSON (file)'\n jsonBtn.addEventListener('click', () => {\n this.callbacks.onExportJson()\n this.closeExportMenu()\n })\n\n this.exportMenu.appendChild(mdBtn)\n this.exportMenu.appendChild(jsonBtn)\n\n const exportBtn = (e.currentTarget as HTMLElement)\n exportBtn.style.position = 'relative'\n exportBtn.appendChild(this.exportMenu)\n }\n\n private closeExportMenu(): void {\n if (this.exportMenu) {\n this.exportMenu.remove()\n this.exportMenu = null\n }\n }\n}\n","export class Overlay {\n private overlayEl: HTMLElement\n private tooltipEl: HTMLElement\n\n constructor(private container: HTMLElement) {\n this.overlayEl = document.createElement('div')\n this.overlayEl.className = 'remarq-overlay'\n this.overlayEl.style.display = 'none'\n\n this.tooltipEl = document.createElement('div')\n this.tooltipEl.className = 'remarq-tooltip'\n this.tooltipEl.style.display = 'none'\n\n container.appendChild(this.overlayEl)\n container.appendChild(this.tooltipEl)\n }\n\n show(target: HTMLElement): void {\n try {\n const rect = target.getBoundingClientRect()\n\n this.overlayEl.style.display = 'block'\n this.overlayEl.style.top = `${rect.top}px`\n this.overlayEl.style.left = `${rect.left}px`\n this.overlayEl.style.width = `${rect.width}px`\n this.overlayEl.style.height = `${rect.height}px`\n\n this.tooltipEl.textContent = describeElement(target)\n this.tooltipEl.style.display = 'block'\n this.positionTooltip(rect.left, rect.top - 28)\n } catch {\n this.hide()\n }\n }\n\n updateTooltipPosition(x: number, y: number): void {\n this.positionTooltip(x + 12, y - 28)\n }\n\n hideHighlight(): void {\n this.overlayEl.style.display = 'none'\n }\n\n hide(): void {\n this.overlayEl.style.display = 'none'\n this.tooltipEl.style.display = 'none'\n }\n\n destroy(): void {\n this.overlayEl.remove()\n this.tooltipEl.remove()\n }\n\n private positionTooltip(left: number, top: number): void {\n // Temporarily position at origin to measure\n this.tooltipEl.style.left = '0px'\n this.tooltipEl.style.top = '0px'\n const tooltipWidth = this.tooltipEl.offsetWidth\n const tooltipHeight = this.tooltipEl.offsetHeight\n\n // Clamp to viewport\n const maxLeft = window.innerWidth - tooltipWidth - 8\n const maxTop = window.innerHeight - tooltipHeight - 8\n\n this.tooltipEl.style.left = `${Math.max(8, Math.min(left, maxLeft))}px`\n this.tooltipEl.style.top = `${Math.max(8, Math.min(top, maxTop))}px`\n }\n}\n\nfunction describeElement(el: HTMLElement): string {\n const tag = el.tagName.toLowerCase()\n const parts: string[] = [`<${tag}>`]\n\n // data-annotate or data-testid\n const dataAnnotate = el.getAttribute('data-annotate')\n const dataTestId = el.getAttribute('data-testid') || el.getAttribute('data-test') || el.getAttribute('data-cy')\n if (dataAnnotate) {\n parts.push(`[${dataAnnotate}]`)\n } else if (dataTestId) {\n parts.push(`[${dataTestId}]`)\n }\n\n // id\n if (el.id) {\n parts.push(`#${el.id}`)\n }\n\n // Meaningful classes (skip hashed ones, max 2)\n const classes = Array.from(el.classList)\n .filter((c) => !c.match(/^(sc-|css-)/) && !c.match(/^[a-zA-Z0-9]{8,}$/) && !c.match(/__[a-zA-Z0-9]{3,}$/))\n .slice(0, 2)\n if (classes.length) {\n parts.push(`.${classes.join('.')}`)\n }\n\n // Direct text content only (not nested)\n const directText = getDirectText(el)\n if (directText) {\n parts.push(`\"${directText}\"`)\n }\n\n return parts.join(' ')\n}\n\nfunction getDirectText(el: HTMLElement): string {\n let text = ''\n for (const node of Array.from(el.childNodes)) {\n if (node.nodeType === Node.TEXT_NODE) {\n text += node.textContent ?? ''\n }\n }\n text = text.trim()\n\n // Fallback: if no direct text and few children, use shallow textContent\n if (!text && el.children.length <= 2) {\n text = el.textContent?.trim() ?? ''\n }\n\n return text.slice(0, 30)\n}\n","interface Sides {\n top: number\n right: number\n bottom: number\n left: number\n}\n\ninterface BoxRect {\n top: number\n left: number\n width: number\n height: number\n}\n\nfunction parsePx(value: string): number {\n return parseFloat(value) || 0\n}\n\nexport class SpacingOverlay {\n private containerEl: HTMLElement\n private marginEl: HTMLElement\n private paddingEl: HTMLElement\n private contentEl: HTMLElement\n private labels: HTMLElement[] = []\n private gapEls: HTMLElement[] = []\n private lastTarget: HTMLElement | null = null\n private scrollHandler = () => {\n if (this.lastTarget) {\n const target = this.lastTarget\n this.lastTarget = null\n this.show(target)\n }\n }\n\n constructor(private parent: HTMLElement) {\n // Capture phase to catch scroll on any container, not just window\n window.addEventListener('scroll', this.scrollHandler, true)\n this.containerEl = document.createElement('div')\n this.containerEl.className = 'remarq-spacing'\n this.containerEl.style.display = 'none'\n\n this.marginEl = document.createElement('div')\n this.marginEl.className = 'remarq-spacing-margin'\n\n this.paddingEl = document.createElement('div')\n this.paddingEl.className = 'remarq-spacing-padding'\n\n this.contentEl = document.createElement('div')\n this.contentEl.className = 'remarq-spacing-content'\n\n // Order matters: content on top of padding on top of margin\n this.containerEl.appendChild(this.marginEl)\n this.containerEl.appendChild(this.paddingEl)\n this.containerEl.appendChild(this.contentEl)\n\n\n parent.appendChild(this.containerEl)\n }\n\n show(target: HTMLElement): void {\n if (target === this.lastTarget) return\n this.lastTarget = target\n\n try {\n const rect = target.getBoundingClientRect()\n const cs = window.getComputedStyle(target)\n\n const margin = this.readSides(cs, 'margin')\n const padding = this.readSides(cs, 'padding')\n const border = this.readBorderSides(cs)\n\n // Margin box: expand outward from border-box\n const marginBox: BoxRect = {\n top: rect.top - margin.top,\n left: rect.left - margin.left,\n width: rect.width + margin.left + margin.right,\n height: rect.height + margin.top + margin.bottom,\n }\n\n // Padding box = rect (border-box)\n const paddingBox: BoxRect = {\n top: rect.top,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n }\n\n // Content box: shrink inward by border + padding\n const contentBox: BoxRect = {\n top: rect.top + border.top + padding.top,\n left: rect.left + border.left + padding.left,\n width: rect.width - border.left - border.right - padding.left - padding.right,\n height: rect.height - border.top - border.bottom - padding.top - padding.bottom,\n }\n\n this.positionEl(this.marginEl, marginBox)\n this.positionEl(this.paddingEl, paddingBox)\n this.positionEl(this.contentEl, contentBox)\n\n // Clear old labels and gaps\n this.clearLabels()\n this.clearGaps()\n\n // Margin labels\n this.addSideLabels(margin, marginBox, paddingBox, 'margin')\n\n // Padding labels\n this.addSideLabels(padding, paddingBox, contentBox, 'padding')\n\n // Content size label\n if (contentBox.width > 40 && contentBox.height > 14) {\n this.addLabel(\n `${Math.round(contentBox.width)} × ${Math.round(contentBox.height)}`,\n contentBox.top + contentBox.height / 2 - 6,\n contentBox.left + contentBox.width / 2,\n 'content',\n )\n }\n\n // Gap visualization\n this.showGaps(target)\n\n this.containerEl.style.display = 'block'\n } catch {\n this.hide()\n }\n }\n\n hide(): void {\n this.containerEl.style.display = 'none'\n this.lastTarget = null\n this.clearLabels()\n this.clearGaps()\n }\n\n destroy(): void {\n window.removeEventListener('scroll', this.scrollHandler, true)\n this.clearLabels()\n this.clearGaps()\n this.containerEl.remove()\n }\n\n private readSides(cs: CSSStyleDeclaration, prop: 'margin' | 'padding'): Sides {\n return {\n top: parsePx(cs[`${prop}Top` as keyof CSSStyleDeclaration] as string),\n right: parsePx(cs[`${prop}Right` as keyof CSSStyleDeclaration] as string),\n bottom: parsePx(cs[`${prop}Bottom` as keyof CSSStyleDeclaration] as string),\n left: parsePx(cs[`${prop}Left` as keyof CSSStyleDeclaration] as string),\n }\n }\n\n private readBorderSides(cs: CSSStyleDeclaration): Sides {\n return {\n top: parsePx(cs.borderTopWidth),\n right: parsePx(cs.borderRightWidth),\n bottom: parsePx(cs.borderBottomWidth),\n left: parsePx(cs.borderLeftWidth),\n }\n }\n\n private positionEl(el: HTMLElement, box: BoxRect): void {\n el.style.top = `${box.top}px`\n el.style.left = `${box.left}px`\n el.style.width = `${Math.max(0, box.width)}px`\n el.style.height = `${Math.max(0, box.height)}px`\n }\n\n private addSideLabels(sides: Sides, outerBox: BoxRect, innerBox: BoxRect, type: 'margin' | 'padding'): void {\n // Top label\n if (sides.top > 0) {\n const y = outerBox.top + (innerBox.top - outerBox.top) / 2 - 6\n const x = outerBox.left + outerBox.width / 2\n this.addLabel(String(Math.round(sides.top)), y, x, type)\n }\n\n // Bottom label\n if (sides.bottom > 0) {\n const innerBottom = innerBox.top + innerBox.height\n const outerBottom = outerBox.top + outerBox.height\n const y = innerBottom + (outerBottom - innerBottom) / 2 - 6\n const x = outerBox.left + outerBox.width / 2\n this.addLabel(String(Math.round(sides.bottom)), y, x, type)\n }\n\n // Left label\n if (sides.left > 0) {\n const y = outerBox.top + outerBox.height / 2 - 6\n const x = outerBox.left + (innerBox.left - outerBox.left) / 2\n this.addLabel(String(Math.round(sides.left)), y, x, type)\n }\n\n // Right label\n if (sides.right > 0) {\n const innerRight = innerBox.left + innerBox.width\n const outerRight = outerBox.left + outerBox.width\n const y = outerBox.top + outerBox.height / 2 - 6\n const x = innerRight + (outerRight - innerRight) / 2\n this.addLabel(String(Math.round(sides.right)), y, x, type)\n }\n }\n\n private addLabel(text: string, top: number, left: number, type: string): void {\n const label = document.createElement('div')\n label.className = `remarq-spacing-label remarq-spacing-label-${type}`\n label.textContent = text\n label.style.top = `${top}px`\n label.style.left = `${left}px`\n label.style.transform = 'translateX(-50%)'\n this.containerEl.appendChild(label)\n this.labels.push(label)\n }\n\n private clearLabels(): void {\n for (const label of this.labels) label.remove()\n this.labels = []\n }\n\n private showGaps(target: HTMLElement): void {\n // Case 1: Target IS a flex container — show gaps between its own children\n const targetCs = window.getComputedStyle(target)\n if (targetCs.display.includes('flex')) {\n this.showContainerGaps(target, targetCs)\n return\n }\n\n // Case 2: Target is a child of a flex container — show adjacent gaps\n const parent = target.parentElement\n if (!parent) return\n\n const parentCs = window.getComputedStyle(parent)\n if (!parentCs.display.includes('flex')) return\n\n const rowGap = parsePx(parentCs.rowGap)\n const columnGap = parsePx(parentCs.columnGap)\n const direction = parentCs.flexDirection\n const isRow = direction === 'row' || direction === 'row-reverse'\n const gap = isRow ? columnGap : rowGap\n\n if (gap <= 0) return\n\n const children = Array.from(parent.children) as HTMLElement[]\n const targetIndex = children.indexOf(target)\n if (targetIndex === -1) return\n\n // Show gap before target (between prev sibling and target)\n if (targetIndex > 0) {\n this.renderGap(children[targetIndex - 1], target, gap, isRow)\n }\n\n // Show gap after target (between target and next sibling)\n if (targetIndex < children.length - 1) {\n this.renderGap(target, children[targetIndex + 1], gap, isRow)\n }\n }\n\n private showContainerGaps(container: HTMLElement, cs: CSSStyleDeclaration): void {\n const rowGap = parsePx(cs.rowGap)\n const columnGap = parsePx(cs.columnGap)\n const direction = cs.flexDirection\n const isRow = direction === 'row' || direction === 'row-reverse'\n const gap = isRow ? columnGap : rowGap\n\n if (gap <= 0) return\n\n const children = Array.from(container.children) as HTMLElement[]\n // Show all gaps between children (since we're hovering the container itself)\n for (let i = 0; i < children.length - 1; i++) {\n this.renderGap(children[i], children[i + 1], gap, isRow)\n }\n }\n\n private renderGap(before: HTMLElement, after: HTMLElement, gap: number, isRow: boolean): void {\n const rectBefore = before.getBoundingClientRect()\n const rectAfter = after.getBoundingClientRect()\n\n const gapEl = document.createElement('div')\n gapEl.className = 'remarq-spacing-gap'\n\n if (isRow) {\n const left = Math.min(rectBefore.right, rectAfter.right)\n const right = Math.max(rectBefore.left, rectAfter.left)\n const top = Math.min(rectBefore.top, rectAfter.top)\n const height = Math.max(rectBefore.height, rectAfter.height)\n\n gapEl.style.top = `${top}px`\n gapEl.style.left = `${left}px`\n gapEl.style.width = `${Math.abs(right - left)}px`\n gapEl.style.height = `${height}px`\n } else {\n const top = Math.min(rectBefore.bottom, rectAfter.bottom)\n const bottom = Math.max(rectBefore.top, rectAfter.top)\n const left = Math.min(rectBefore.left, rectAfter.left)\n const width = Math.max(rectBefore.width, rectAfter.width)\n\n gapEl.style.top = `${top}px`\n gapEl.style.left = `${left}px`\n gapEl.style.width = `${width}px`\n gapEl.style.height = `${Math.abs(bottom - top)}px`\n }\n\n // Label inside gap (skip if too small)\n if (gap >= 10) {\n const label = document.createElement('span')\n label.className = 'remarq-spacing-label-gap'\n label.textContent = `gap: ${Math.round(gap)}`\n label.style.cssText = 'font-size:10px;font-weight:700;pointer-events:none;'\n gapEl.appendChild(label)\n }\n\n this.containerEl.appendChild(gapEl)\n this.gapEls.push(gapEl)\n }\n\n private clearGaps(): void {\n for (const el of this.gapEls) el.remove()\n this.gapEls = []\n }\n}\n","interface ElementInfo {\n tag: string\n text: string\n}\n\ninterface DetailInfo extends ElementInfo {\n comment: string\n status: 'pending' | 'resolved'\n}\n\ninterface DetailCallbacks {\n onResolve: () => void\n onDelete: () => void\n onClose: () => void\n onEdit: (newComment: string) => void\n onCopy: () => void\n}\n\ninterface Position {\n top: number // absolute page Y below the element\n left: number // absolute page X\n anchorBottom: number // absolute page Y above the element (for flipping)\n}\n\nconst POPUP_WIDTH = 300\nconst POPUP_MARGIN = 8\n\nexport class Popup {\n private popupEl: HTMLElement | null = null\n private keyHandler: ((e: KeyboardEvent) => void) | null = null\n private outsideClickHandler: ((e: MouseEvent) => void) | null = null\n\n constructor(private container: HTMLElement) {}\n\n show(\n info: ElementInfo,\n position: Position,\n onSubmit: (comment: string) => void,\n onCancel: () => void,\n ): void {\n this.hide()\n\n const popup = document.createElement('div')\n popup.className = 'remarq-popup'\n\n const header = document.createElement('div')\n header.className = 'remarq-popup-header'\n header.textContent = `<${info.tag}>${info.text ? ` \"${info.text}\"` : ''}`\n\n const body = document.createElement('div')\n body.className = 'remarq-popup-body'\n\n const textarea = document.createElement('textarea')\n textarea.placeholder = 'Add your comment...'\n\n const hint = document.createElement('div')\n hint.className = 'remarq-popup-hint'\n hint.textContent = 'Enter to submit \\u00b7 Shift+Enter for new line'\n\n body.appendChild(textarea)\n body.appendChild(hint)\n\n const actions = document.createElement('div')\n actions.className = 'remarq-popup-actions'\n\n const cancelBtn = document.createElement('button')\n cancelBtn.textContent = 'Cancel'\n cancelBtn.addEventListener('click', () => {\n this.hide()\n onCancel()\n })\n\n const addBtn = document.createElement('button')\n addBtn.className = 'remarq-primary'\n addBtn.textContent = 'Add'\n addBtn.addEventListener('click', () => {\n const comment = textarea.value.trim()\n if (!comment) return\n this.hide()\n onSubmit(comment)\n })\n\n actions.appendChild(cancelBtn)\n actions.appendChild(addBtn)\n\n popup.appendChild(header)\n popup.appendChild(body)\n popup.appendChild(actions)\n\n this.container.appendChild(popup)\n this.popupEl = popup\n\n // Measure after layout, then position\n requestAnimationFrame(() => {\n this.adjustPosition(popup, position)\n textarea.focus()\n })\n\n this.keyHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this.hide()\n onCancel()\n return\n }\n // Enter submits from textarea (Shift+Enter = newline)\n if (e.key === 'Enter' && !e.shiftKey && e.target === textarea) {\n e.preventDefault()\n const comment = textarea.value.trim()\n if (!comment) return\n this.hide()\n onSubmit(comment)\n return\n }\n // Keep Cmd/Ctrl+Enter as alternative\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n const comment = textarea.value.trim()\n if (!comment) return\n this.hide()\n onSubmit(comment)\n }\n }\n document.addEventListener('keydown', this.keyHandler)\n\n setTimeout(() => {\n this.outsideClickHandler = (e: MouseEvent) => {\n const target = e.target as HTMLElement\n if (target && !target.closest('.remarq-popup')) {\n this.hide()\n onCancel()\n }\n }\n document.addEventListener('mousedown', this.outsideClickHandler)\n }, 0)\n }\n\n showDetail(\n info: DetailInfo,\n position: Position,\n callbacks: DetailCallbacks,\n ): void {\n this.hide()\n\n const popup = document.createElement('div')\n popup.className = 'remarq-popup'\n\n const header = document.createElement('div')\n header.className = 'remarq-popup-header'\n header.textContent = `<${info.tag}>${info.text ? ` \"${info.text}\"` : ''} [${info.status}]`\n\n const body = document.createElement('div')\n body.className = 'remarq-popup-body'\n\n const makeCommentEl = (): HTMLElement => {\n const el = document.createElement('div')\n el.textContent = info.comment\n el.style.cursor = 'pointer'\n el.title = 'Click to edit'\n el.addEventListener('click', () => this.enterEditMode(el, info, callbacks))\n return el\n }\n body.appendChild(makeCommentEl())\n\n const actions = document.createElement('div')\n actions.className = 'remarq-popup-actions'\n\n if (info.status === 'pending') {\n const resolveBtn = document.createElement('button')\n resolveBtn.className = 'remarq-primary'\n resolveBtn.textContent = 'Resolve'\n resolveBtn.addEventListener('click', () => {\n this.hide()\n callbacks.onResolve()\n })\n actions.appendChild(resolveBtn)\n }\n\n const copyBtn = document.createElement('button')\n copyBtn.textContent = 'Copy'\n copyBtn.addEventListener('click', () => {\n callbacks.onCopy()\n })\n actions.appendChild(copyBtn)\n\n const deleteBtn = document.createElement('button')\n deleteBtn.textContent = 'Delete'\n deleteBtn.addEventListener('click', () => {\n this.hide()\n callbacks.onDelete()\n })\n actions.appendChild(deleteBtn)\n\n const closeBtn = document.createElement('button')\n closeBtn.textContent = 'Close'\n closeBtn.addEventListener('click', () => {\n this.hide()\n callbacks.onClose()\n })\n actions.appendChild(closeBtn)\n\n popup.appendChild(header)\n popup.appendChild(body)\n popup.appendChild(actions)\n\n this.container.appendChild(popup)\n this.popupEl = popup\n\n // Measure after layout, then position\n requestAnimationFrame(() => {\n this.adjustPosition(popup, position)\n })\n\n this.keyHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this.hide()\n callbacks.onClose()\n }\n }\n document.addEventListener('keydown', this.keyHandler)\n\n setTimeout(() => {\n this.outsideClickHandler = (e: MouseEvent) => {\n const target = e.target as HTMLElement\n if (target && !target.closest('.remarq-popup')) {\n this.hide()\n callbacks.onClose()\n }\n }\n document.addEventListener('mousedown', this.outsideClickHandler)\n }, 0)\n }\n\n hide(): void {\n if (this.popupEl) {\n this.popupEl.remove()\n this.popupEl = null\n }\n if (this.keyHandler) {\n document.removeEventListener('keydown', this.keyHandler)\n this.keyHandler = null\n }\n if (this.outsideClickHandler) {\n document.removeEventListener('mousedown', this.outsideClickHandler)\n this.outsideClickHandler = null\n }\n }\n\n destroy(): void {\n this.hide()\n }\n\n private enterEditMode(\n commentEl: HTMLElement,\n info: DetailInfo,\n callbacks: DetailCallbacks,\n ): void {\n const textarea = document.createElement('textarea')\n textarea.value = info.comment\n textarea.className = 'remarq-popup-edit-textarea'\n textarea.style.width = '100%'\n textarea.style.minHeight = '60px'\n textarea.style.padding = '8px'\n textarea.style.border = '1px solid var(--remarq-border)'\n textarea.style.borderRadius = '4px'\n textarea.style.background = 'var(--remarq-bg-secondary)'\n textarea.style.color = 'var(--remarq-text)'\n textarea.style.fontFamily = 'inherit'\n textarea.style.fontSize = '13px'\n textarea.style.resize = 'vertical'\n textarea.style.boxSizing = 'border-box'\n\n commentEl.replaceWith(textarea)\n textarea.focus()\n textarea.selectionStart = textarea.value.length\n\n const saveEdit = () => {\n const newComment = textarea.value.trim()\n if (newComment && newComment !== info.comment) {\n info.comment = newComment\n callbacks.onEdit(newComment)\n }\n const restored = document.createElement('div')\n restored.textContent = info.comment\n restored.style.cursor = 'pointer'\n restored.title = 'Click to edit'\n restored.addEventListener('click', () => this.enterEditMode(restored, info, callbacks))\n textarea.replaceWith(restored)\n }\n\n textarea.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n saveEdit()\n }\n if (e.key === 'Escape') {\n e.stopPropagation()\n const restored = document.createElement('div')\n restored.textContent = info.comment\n restored.style.cursor = 'pointer'\n restored.title = 'Click to edit'\n restored.addEventListener('click', () => this.enterEditMode(restored, info, callbacks))\n textarea.replaceWith(restored)\n }\n })\n\n textarea.addEventListener('blur', () => {\n setTimeout(() => {\n if (textarea.isConnected) {\n saveEdit()\n }\n }, 50)\n })\n }\n\n private adjustPosition(popup: HTMLElement, position: Position): void {\n const popupHeight = popup.offsetHeight\n const viewportBottom = window.scrollY + window.innerHeight\n const viewportRight = window.scrollX + window.innerWidth\n\n let top = position.top\n let left = position.left\n\n // Flip above element if overflows viewport bottom\n if (top + popupHeight > viewportBottom - POPUP_MARGIN) {\n top = position.anchorBottom - popupHeight\n }\n\n // Clamp: don't go above visible area\n if (top < window.scrollY + POPUP_MARGIN) {\n top = window.scrollY + POPUP_MARGIN\n }\n\n // Clamp right edge\n if (left + POPUP_WIDTH > viewportRight - POPUP_MARGIN) {\n left = viewportRight - POPUP_WIDTH - POPUP_MARGIN\n }\n\n // Clamp left edge\n if (left < window.scrollX + POPUP_MARGIN) {\n left = window.scrollX + POPUP_MARGIN\n }\n\n popup.style.top = `${top}px`\n popup.style.left = `${left}px`\n }\n}\n","import type { Annotation } from '../core/types'\n\ninterface MarkerEntry {\n annotation: Annotation\n target: HTMLElement\n markerEl: HTMLElement\n}\n\nexport class MarkerManager {\n private markers = new Map<string, MarkerEntry>()\n private rafId: number | null = null\n private counter = 0\n\n constructor(\n private container: HTMLElement,\n private onClick?: (annotationId: string) => void,\n ) {\n this.startPositionLoop()\n }\n\n addMarker(annotation: Annotation, target: HTMLElement): void {\n this.counter++\n const markerEl = document.createElement('div')\n markerEl.className = 'remarq-marker'\n markerEl.setAttribute('data-status', annotation.status)\n markerEl.setAttribute('data-annotation-id', annotation.id)\n markerEl.textContent = String(this.counter)\n markerEl.title = annotation.comment\n\n markerEl.addEventListener('click', () => {\n this.onClick?.(annotation.id)\n })\n\n this.container.appendChild(markerEl)\n this.markers.set(annotation.id, { annotation, target, markerEl })\n this.applyOutline(target, annotation.status)\n this.updatePosition(annotation.id)\n }\n\n removeMarker(id: string): void {\n const entry = this.markers.get(id)\n if (entry) {\n entry.markerEl.remove()\n this.removeOutline(entry.target)\n this.markers.delete(id)\n }\n }\n\n updateStatus(id: string, status: 'pending' | 'resolved'): void {\n const entry = this.markers.get(id)\n if (entry) {\n entry.annotation.status = status\n entry.markerEl.setAttribute('data-status', status)\n }\n }\n\n clear(): void {\n for (const entry of this.markers.values()) {\n entry.markerEl.remove()\n this.removeOutline(entry.target)\n }\n this.markers.clear()\n this.counter = 0\n }\n\n destroy(): void {\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId)\n this.rafId = null\n }\n this.clear()\n }\n\n private applyOutline(target: HTMLElement, status: 'pending' | 'resolved'): void {\n // Use rgba for resolved to get lower opacity without affecting element content\n const color = status === 'pending' ? '#f97316' : 'rgba(34, 197, 94, 0.5)'\n target.style.outline = `2px solid ${color}`\n target.style.outlineOffset = '2px'\n }\n\n private removeOutline(target: HTMLElement): void {\n target.style.outline = ''\n target.style.outlineOffset = ''\n }\n\n private updatePosition(id: string): void {\n const entry = this.markers.get(id)\n if (!entry) return\n try {\n const rect = entry.target.getBoundingClientRect()\n entry.markerEl.style.top = `${window.scrollY + rect.top - 12}px`\n entry.markerEl.style.left = `${window.scrollX + rect.right - 12}px`\n } catch {\n // element may have been removed\n }\n }\n\n private startPositionLoop(): void {\n const update = () => {\n for (const id of this.markers.keys()) {\n this.updatePosition(id)\n }\n this.rafId = requestAnimationFrame(update)\n }\n this.rafId = requestAnimationFrame(update)\n }\n}\n","let currentToast: HTMLElement | null = null\nlet currentTimer: ReturnType<typeof setTimeout> | null = null\n\nexport function showToast(container: HTMLElement, message: string, duration = 3000): void {\n hideToast()\n\n const toast = document.createElement('div')\n toast.className = 'remarq-toast'\n toast.textContent = message\n container.appendChild(toast)\n currentToast = toast\n\n currentTimer = setTimeout(() => {\n if (currentToast) {\n currentToast.classList.add('remarq-toast-fade')\n setTimeout(() => hideToast(), 300)\n }\n }, duration)\n}\n\nexport function hideToast(): void {\n if (currentTimer) {\n clearTimeout(currentTimer)\n currentTimer = null\n }\n if (currentToast) {\n currentToast.remove()\n currentToast = null\n }\n}\n","import type { Annotation } from '../core/types'\nimport { showToast, hideToast } from './toast'\n\nexport class DetachedPanel {\n private panelEl: HTMLElement | null = null\n\n constructor(\n private container: HTMLElement,\n private onDelete?: (id: string) => void,\n ) {}\n\n update(otherBreakpoint: Annotation[], detached: Annotation[]): void {\n this.remove()\n if (otherBreakpoint.length === 0 && detached.length === 0) return\n\n const panel = document.createElement('div')\n panel.className = 'remarq-detached-panel'\n\n if (otherBreakpoint.length > 0) {\n this.renderSection(panel, `Other viewport (${otherBreakpoint.length})`, otherBreakpoint, 'other')\n }\n\n if (detached.length > 0) {\n this.renderSection(panel, `Detached (${detached.length})`, detached, 'detached')\n }\n\n this.container.appendChild(panel)\n this.panelEl = panel\n }\n\n destroy(): void {\n this.remove()\n hideToast()\n }\n\n private renderSection(\n panel: HTMLElement,\n title: string,\n annotations: Annotation[],\n type: 'other' | 'detached',\n ): void {\n const header = document.createElement('div')\n header.className = 'remarq-detached-header'\n header.textContent = title\n panel.appendChild(header)\n\n for (const ann of annotations) {\n const item = document.createElement('div')\n item.className = 'remarq-detached-item'\n\n const info = document.createElement('div')\n info.className = 'remarq-detached-info'\n\n const comment = document.createElement('div')\n comment.className = 'remarq-detached-comment'\n comment.textContent = ann.comment\n\n const elDesc = document.createElement('div')\n elDesc.className = 'remarq-detached-element'\n const fp = ann.fingerprint\n let desc = `<${fp.tagName}>`\n if (fp.textContent) desc += ` \"${fp.textContent}\"`\n if (fp.dataAnnotate) desc += ` [${fp.dataAnnotate}]`\n if (type === 'other') desc += ` — ${ann.viewportBucket}px`\n elDesc.textContent = desc\n\n info.appendChild(comment)\n info.appendChild(elDesc)\n item.appendChild(info)\n\n if (type === 'other') {\n item.style.cursor = 'pointer'\n item.addEventListener('click', () => {\n showToast(this.container, `Annotation created at ${ann.viewportBucket}px width. Resize viewport to view.`)\n })\n } else {\n const deleteBtn = document.createElement('button')\n deleteBtn.className = 'remarq-detached-delete'\n deleteBtn.textContent = '\\u00d7'\n deleteBtn.addEventListener('click', () => {\n this.onDelete?.(ann.id)\n })\n item.appendChild(deleteBtn)\n }\n\n panel.appendChild(item)\n }\n }\n\n private remove(): void {\n if (this.panelEl) {\n this.panelEl.remove()\n this.panelEl = null\n }\n }\n}\n","type RouteChangeListener = (route: string) => void\n\nexport class RouteObserver {\n private listeners: Set<RouteChangeListener> = new Set()\n private originalPushState: typeof history.pushState\n private originalReplaceState: typeof history.replaceState\n private boundOnPopState: () => void\n private boundOnHashChange: () => void\n\n constructor() {\n this.originalPushState = history.pushState.bind(history)\n this.originalReplaceState = history.replaceState.bind(history)\n this.boundOnPopState = () => this.notify()\n this.boundOnHashChange = () => this.notify()\n\n this.patchHistory()\n\n window.addEventListener('popstate', this.boundOnPopState)\n window.addEventListener('hashchange', this.boundOnHashChange)\n }\n\n currentRoute(): string {\n return location.pathname + location.hash\n }\n\n onChange(listener: RouteChangeListener): () => void {\n this.listeners.add(listener)\n return () => {\n this.listeners.delete(listener)\n }\n }\n\n destroy(): void {\n window.removeEventListener('popstate', this.boundOnPopState)\n window.removeEventListener('hashchange', this.boundOnHashChange)\n history.pushState = this.originalPushState\n history.replaceState = this.originalReplaceState\n this.listeners.clear()\n }\n\n private notify(): void {\n const route = this.currentRoute()\n for (const listener of this.listeners) {\n listener(route)\n }\n }\n\n private patchHistory(): void {\n const self = this\n\n history.pushState = function (...args: Parameters<typeof history.pushState>) {\n self.originalPushState.apply(this, args)\n self.notify()\n }\n\n history.replaceState = function (...args: Parameters<typeof history.replaceState>) {\n self.originalReplaceState.apply(this, args)\n self.notify()\n }\n }\n}\n","import type { Annotation, ImportResult, WebRemarqOptions } from './core/types'\nimport { AnnotationStorage } from './core/storage'\nimport { createFingerprint } from './core/fingerprint'\nimport { matchElement } from './core/matcher'\nimport { generateAgentExport } from './core/agent-export'\nimport { injectStyles, removeStyles } from './ui/styles'\nimport { ThemeManager } from './ui/theme'\nimport { Toolbar } from './ui/toolbar'\nimport { Overlay } from './ui/overlay'\nimport { SpacingOverlay } from './ui/spacing-overlay'\nimport { Popup } from './ui/popup'\nimport { MarkerManager } from './ui/markers'\nimport { DetachedPanel } from './ui/detached-panel'\nimport { showToast, hideToast } from './ui/toast'\nimport { RouteObserver } from './spa'\nimport { toBucket, initViewportListener, destroyViewportListener } from './core/viewport'\n\nlet initialized = false\nlet options: WebRemarqOptions = {}\nlet storage: AnnotationStorage\nlet themeManager: ThemeManager\nlet toolbar: Toolbar\nlet overlay: Overlay\nlet popup: Popup\nlet markers: MarkerManager\nlet detachedPanel: DetachedPanel\nlet routeObserver: RouteObserver\nlet inspecting = false\nlet spacingMode = false\nlet spacingOverlay: SpacingOverlay\nlet mutationObserver: MutationObserver | null = null\nlet unsubRoute: (() => void) | null = null\nlet refreshScheduled = false\nlet savedCursor = ''\n\n// WeakRef cache: annotation id → element (survives GC of element)\nconst elementCache = new Map<string, WeakRef<HTMLElement>>()\n\nfunction describeTarget(el: HTMLElement): string {\n const parts: string[] = []\n\n // id\n if (el.id) parts.push(`#${el.id}`)\n\n // data attributes\n const dataAnnotate = el.getAttribute(options.dataAttribute ?? 'data-annotate')\n const dataTestId = el.getAttribute('data-testid') || el.getAttribute('data-test') || el.getAttribute('data-cy')\n if (dataAnnotate) parts.push(`[${dataAnnotate}]`)\n else if (dataTestId) parts.push(`[${dataTestId}]`)\n\n // Meaningful classes (max 2)\n const classes = Array.from(el.classList)\n .filter((c) => !c.match(/^(sc-|css-)/) && !c.match(/^[a-zA-Z0-9]{8,}$/) && !c.match(/__[a-zA-Z0-9]{3,}$/))\n .slice(0, 2)\n if (classes.length) parts.push(`.${classes.join('.')}`)\n\n // Direct text only\n let text = ''\n for (const node of Array.from(el.childNodes)) {\n if (node.nodeType === Node.TEXT_NODE) text += node.textContent ?? ''\n }\n text = text.trim()\n if (!text && el.children.length <= 2) text = el.textContent?.trim() ?? ''\n if (text) parts.push(`\"${text.slice(0, 30)}\"`)\n\n return parts.join(' ') || ''\n}\n\nfunction currentRoute(): string {\n return location.pathname + location.hash\n}\n\nfunction generateId(): string {\n return `ann-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`\n}\n\nfunction cacheElement(annotationId: string, el: HTMLElement): void {\n elementCache.set(annotationId, new WeakRef(el))\n}\n\nfunction getCachedElement(annotationId: string): HTMLElement | null {\n const ref = elementCache.get(annotationId)\n if (!ref) return null\n const el = ref.deref()\n if (!el || !el.isConnected) {\n elementCache.delete(annotationId)\n return null\n }\n return el\n}\n\nfunction resolveElement(ann: Annotation): HTMLElement | null {\n // 1. Check cache first\n const cached = getCachedElement(ann.id)\n if (cached) return cached\n\n // 2. Fall back to fingerprint matching\n const el = matchElement(ann.fingerprint, { dataAttribute: options.dataAttribute })\n if (el) {\n cacheElement(ann.id, el)\n console.debug(`[web-remarq] Matched \"${ann.comment}\" via fingerprint on <${el.tagName.toLowerCase()}>`)\n } else {\n console.debug(`[web-remarq] Could not match \"${ann.comment}\"`, ann.fingerprint)\n }\n return el\n}\n\nfunction refreshMarkers(): void {\n markers.clear()\n const attached: { ann: Annotation; el: HTMLElement }[] = []\n const otherBreakpoint: Annotation[] = []\n const detached: Annotation[] = []\n const route = currentRoute()\n const anns = storage.getByRoute(route)\n const bucket = toBucket(window.innerWidth) // always read fresh\n\n for (const ann of anns) {\n const el = resolveElement(ann)\n if (el) {\n attached.push({ ann, el })\n } else if (bucket !== ann.viewportBucket) {\n otherBreakpoint.push(ann)\n } else {\n detached.push(ann)\n }\n }\n\n for (const { ann, el } of attached) {\n markers.addMarker(ann, el)\n }\n\n detachedPanel.update(otherBreakpoint, detached)\n\n const pendingCount = anns.filter((a) => a.status === 'pending').length\n toolbar.setBadgeCount(pendingCount)\n}\n\n// Debounced refresh — MutationObserver can fire rapidly\nfunction scheduleRefresh(): void {\n if (refreshScheduled) return\n refreshScheduled = true\n requestAnimationFrame(() => {\n refreshScheduled = false\n refreshMarkers()\n })\n}\n\nfunction handleInspectClick(e: MouseEvent): void {\n if (!inspecting) return\n\n const target = e.target as HTMLElement\n if (!target || target.closest('[data-remarq-theme]')) return\n\n e.preventDefault()\n e.stopPropagation()\n\n setInspecting(false)\n\n const rect = target.getBoundingClientRect()\n popup.show(\n {\n tag: target.tagName.toLowerCase(),\n text: describeTarget(target),\n },\n {\n top: window.scrollY + rect.bottom + 8,\n left: window.scrollX + rect.left,\n anchorBottom: window.scrollY + rect.top - 8,\n },\n (comment) => {\n const fp = createFingerprint(target, {\n classFilter: options.classFilter,\n dataAttribute: options.dataAttribute,\n })\n const ann: Annotation = {\n id: generateId(),\n comment,\n fingerprint: fp,\n route: currentRoute(),\n viewport: `${window.innerWidth}x${window.innerHeight}`,\n viewportBucket: toBucket(window.innerWidth),\n timestamp: Date.now(),\n status: 'pending',\n }\n // Cache the element immediately — no need to re-match\n cacheElement(ann.id, target)\n storage.add(ann)\n refreshMarkers()\n showToast(themeManager.container, 'Annotation added')\n },\n () => {\n // cancel\n },\n )\n}\n\nfunction handleInspectHover(e: MouseEvent): void {\n if (!inspecting) return\n const target = e.target as HTMLElement\n if (!target || target.closest('[data-remarq-theme]')) return\n\n if (spacingMode) {\n overlay.show(target)\n overlay.hideHighlight()\n spacingOverlay.show(target)\n } else {\n overlay.show(target)\n }\n overlay.updateTooltipPosition(e.clientX, e.clientY)\n}\n\nfunction handleInspectKeydown(e: KeyboardEvent): void {\n // Ignore when typing in inputs\n const tag = (e.target as HTMLElement)?.tagName\n if (tag === 'INPUT' || tag === 'TEXTAREA' || (e.target as HTMLElement)?.isContentEditable) return\n\n if (e.key === 'Escape' && inspecting) {\n setInspecting(false)\n overlay.hide()\n spacingOverlay.hide()\n }\n\n if (e.key === 's' && inspecting) {\n spacingMode = !spacingMode\n toolbar.setSpacingActive(spacingMode)\n if (!spacingMode) spacingOverlay.hide()\n }\n\n if (e.key === 'i') {\n setInspecting(!inspecting)\n if (!inspecting) {\n overlay.hide()\n spacingOverlay.hide()\n }\n }\n}\n\nfunction setInspecting(value: boolean): void {\n if (value && !inspecting) {\n savedCursor = document.body.style.cursor\n document.body.style.cursor = 'crosshair'\n }\n if (!value && inspecting) {\n document.body.style.cursor = savedCursor\n }\n inspecting = value\n toolbar.setInspectActive(value)\n toolbar.setSpacingEnabled(value)\n if (!value) {\n overlay.hide()\n spacingOverlay?.hide()\n spacingMode = false\n toolbar.setSpacingActive(false)\n }\n}\n\nfunction handleMarkerClick(annotationId: string): void {\n const ann = storage.getAll().find((a) => a.id === annotationId)\n if (!ann) return\n\n const el = resolveElement(ann)\n if (!el) return\n\n const rect = el.getBoundingClientRect()\n\n popup.showDetail(\n {\n tag: ann.fingerprint.tagName,\n text: ann.fingerprint.textContent ?? '',\n comment: ann.comment,\n status: ann.status,\n },\n {\n top: window.scrollY + rect.bottom + 8,\n left: window.scrollX + rect.left,\n anchorBottom: window.scrollY + rect.top - 8,\n },\n {\n onResolve: () => {\n storage.update(ann.id, { status: 'resolved' })\n refreshMarkers()\n },\n onDelete: () => {\n elementCache.delete(ann.id)\n storage.remove(ann.id)\n refreshMarkers()\n },\n onClose: () => {},\n onEdit: (newComment: string) => {\n storage.update(ann.id, { comment: newComment })\n refreshMarkers()\n },\n onCopy: () => {\n const fp = ann.fingerprint\n const lines = [\n `[${ann.status}] \"${ann.comment}\"`,\n `Element: <${fp.tagName}>${fp.textContent ? ` \"${fp.textContent}\"` : ''}`,\n `Route: ${ann.route}`,\n `Viewport: ${ann.viewportBucket}px`,\n ]\n if (fp.sourceLocation) lines.push(`Source: ${fp.sourceLocation}`)\n navigator.clipboard.writeText(lines.join('\\n')).then(() => {\n showToast(themeManager.container, 'Annotation copied')\n }).catch(() => {\n console.warn('[web-remarq] Clipboard write failed')\n })\n },\n },\n )\n}\n\nfunction generateMarkdown(): string {\n const route = currentRoute()\n const anns = storage.getByRoute(route)\n if (!anns.length) return ''\n\n const lines = [`## Annotations — ${route} (${anns.length})`, '']\n\n anns.forEach((ann, i) => {\n const fp = ann.fingerprint\n\n lines.push(`### ${i + 1}. [${ann.status}] \"${ann.comment}\"`)\n\n let elDesc = `Element: <${fp.tagName}>`\n if (fp.textContent) elDesc += ` \"${fp.textContent}\"`\n lines.push(elDesc)\n lines.push(`Viewport: ${ann.viewportBucket}px`)\n lines.push('')\n\n if (fp.sourceLocation) {\n lines.push(`Source: \\`${fp.sourceLocation}\\`${fp.componentName ? ` (${fp.componentName})` : ''}`)\n lines.push('')\n } else if (fp.detectedSource) {\n lines.push(`Source (detected): \\`${fp.detectedSource}\\`${fp.detectedComponent ? ` (${fp.detectedComponent})` : ''}`)\n lines.push('')\n }\n\n lines.push('Search hints:')\n\n if (fp.dataAnnotate) {\n lines.push(`- \\`data-annotate=\"${fp.dataAnnotate}\"\\` — in template files`)\n }\n if (fp.dataTestId) {\n lines.push(`- \\`data-testid=\"${fp.dataTestId}\"\\` — in template files`)\n }\n if (fp.id) {\n lines.push(`- \\`id=\"${fp.id}\"\\` — in template files`)\n }\n if (fp.ariaLabel) {\n lines.push(`- \\`aria-label=\"${fp.ariaLabel}\"\\` — in template files`)\n }\n if (fp.textContent) {\n lines.push(`- \\`\"${fp.textContent}\"\\` — text content in templates`)\n }\n if (fp.cssModules?.length) {\n for (const mod of fp.cssModules) {\n lines.push(`- \\`.${mod.localName}\\` — in CSS Module file (likely \\`${mod.moduleHint}.module.*\\`)`)\n lines.push(`- \\`styles.${mod.localName}\\` — in component JS/TS`)\n }\n }\n if (fp.domPath) {\n lines.push(`- DOM: ${fp.domPath}`)\n }\n const classes = fp.rawClasses ?? fp.stableClasses\n if (classes.length) {\n lines.push(`- Classes: ${classes.join(' ')}`)\n }\n\n lines.push('')\n })\n\n return lines.join('\\n')\n}\n\nfunction downloadFile(content: string, filename: string, type: string): void {\n const blob = new Blob([content], { type })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename\n a.click()\n URL.revokeObjectURL(url)\n}\n\nfunction exportMarkdown(): void {\n const md = generateMarkdown()\n if (!md) return\n downloadFile(md, `remarq-annotations-${Date.now()}.md`, 'text/markdown')\n showToast(themeManager.container, 'Exported as Markdown')\n}\n\nfunction exportJSON(): void {\n const data = storage.exportJSON()\n const json = JSON.stringify(data, null, 2)\n downloadFile(json, `remarq-annotations-${Date.now()}.json`, 'application/json')\n showToast(themeManager.container, 'Exported as JSON')\n}\n\nfunction copyToClipboard(): void {\n const md = generateMarkdown()\n if (!md) return\n navigator.clipboard.writeText(md).then(() => {\n showToast(themeManager.container, 'Copied to clipboard')\n }).catch(() => {\n console.warn('[web-remarq] Clipboard write failed')\n })\n}\n\nfunction exportAgent(): void {\n const anns = storage.getAll()\n if (!anns.length) return\n const data = generateAgentExport(anns, toBucket(window.innerWidth))\n const json = JSON.stringify(data, null, 2)\n downloadFile(json, `remarq-agent-${Date.now()}.json`, 'application/json')\n}\n\nfunction copyAgentToClipboard(): void {\n const anns = storage.getAll()\n if (!anns.length) return\n const data = generateAgentExport(anns, toBucket(window.innerWidth))\n const json = JSON.stringify(data, null, 2)\n navigator.clipboard.writeText(json).catch(() => {\n console.warn('[web-remarq] Clipboard write failed')\n })\n}\n\nfunction setupMutationObserver(): void {\n mutationObserver = new MutationObserver((mutations) => {\n for (const m of mutations) {\n if (m.target instanceof HTMLElement && m.target.closest('[data-remarq-theme]')) return\n }\n scheduleRefresh()\n })\n\n mutationObserver.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['id', 'class', 'data-annotate', 'data-testid', 'data-test', 'data-cy'],\n })\n}\n\nexport const WebRemarq = {\n init(opts?: WebRemarqOptions): void {\n if (initialized) return\n options = opts ?? {}\n\n try {\n injectStyles()\n storage = new AnnotationStorage()\n themeManager = new ThemeManager(document.body, options.theme)\n overlay = new Overlay(themeManager.container)\n spacingOverlay = new SpacingOverlay(themeManager.container)\n popup = new Popup(themeManager.container)\n markers = new MarkerManager(themeManager.container, handleMarkerClick)\n detachedPanel = new DetachedPanel(themeManager.container, (id) => {\n elementCache.delete(id)\n storage.remove(id)\n refreshMarkers()\n })\n\n toolbar = new Toolbar(themeManager.container, {\n onInspect: () => setInspecting(!inspecting),\n onSpacingToggle: () => {\n if (!inspecting) return\n spacingMode = !spacingMode\n toolbar.setSpacingActive(spacingMode)\n if (!spacingMode) spacingOverlay.hide()\n },\n onCopy: copyToClipboard,\n onExportMd: exportMarkdown,\n onExportJson: exportJSON,\n onImport: () => {\n const file = toolbar.getFileInput().files?.[0]\n if (file) {\n WebRemarq.import(file)\n }\n },\n onClear: () => {\n elementCache.clear()\n storage.clearAll()\n refreshMarkers()\n showToast(themeManager.container, 'All annotations cleared')\n },\n onThemeToggle: () => themeManager.toggle(),\n })\n\n if (storage.isMemoryOnly) {\n toolbar.setMemoryWarning(true)\n }\n\n routeObserver = new RouteObserver()\n unsubRoute = routeObserver.onChange(() => refreshMarkers())\n\n document.addEventListener('click', handleInspectClick, true)\n document.addEventListener('mousemove', handleInspectHover)\n document.addEventListener('keydown', handleInspectKeydown)\n\n setupMutationObserver()\n initViewportListener(() => refreshMarkers())\n\n console.debug(`[web-remarq] Initialized on route: ${currentRoute()}`)\n refreshMarkers()\n initialized = true\n } catch (err) {\n console.error('[web-remarq] Init failed:', err)\n }\n },\n\n destroy(): void {\n if (!initialized) return\n try {\n document.removeEventListener('click', handleInspectClick, true)\n document.removeEventListener('mousemove', handleInspectHover)\n document.removeEventListener('keydown', handleInspectKeydown)\n mutationObserver?.disconnect()\n mutationObserver = null\n if (inspecting) {\n document.body.style.cursor = savedCursor\n }\n hideToast()\n destroyViewportListener()\n unsubRoute?.()\n routeObserver?.destroy()\n markers?.destroy()\n detachedPanel?.destroy()\n popup?.destroy()\n overlay?.destroy()\n spacingOverlay?.destroy()\n toolbar?.destroy()\n themeManager?.destroy()\n removeStyles()\n elementCache.clear()\n inspecting = false\n spacingMode = false\n initialized = false\n } catch (err) {\n console.error('[web-remarq] Destroy failed:', err)\n }\n },\n\n setTheme(theme: 'light' | 'dark'): void {\n themeManager?.setTheme(theme)\n },\n\n export(format: 'md' | 'json' | 'agent'): void {\n if (format === 'md') exportMarkdown()\n else if (format === 'json') exportJSON()\n else exportAgent()\n },\n\n copy(format?: 'md' | 'agent'): void {\n if (format === 'agent') copyAgentToClipboard()\n else copyToClipboard()\n },\n\n async import(file: File): Promise<ImportResult> {\n const text = await file.text()\n const data = JSON.parse(text)\n storage.importJSON(data)\n refreshMarkers()\n\n const allAnns = storage.getAll()\n const bucket = toBucket(window.innerWidth)\n let matched = 0\n let otherBreakpoint = 0\n let detached = 0\n for (const ann of allAnns) {\n if (resolveElement(ann)) {\n matched++\n } else if (bucket !== ann.viewportBucket) {\n otherBreakpoint++\n } else {\n detached++\n }\n }\n return { total: allAnns.length, matched, otherBreakpoint, detached }\n },\n\n getAnnotations(route?: string): Annotation[] {\n if (!storage) return []\n return route ? storage.getByRoute(route) : storage.getAll()\n },\n\n clearAll(): void {\n elementCache.clear()\n storage?.clearAll()\n if (initialized) refreshMarkers()\n },\n}\n"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","names":["options","parent","buildDomPath","options","e","popup"]}