{"version":3,"sources":["../src/index.ts","../src/core/viewport.ts","../src/core/storage.ts","../src/core/local-storage-adapter.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/core/lifecycle.ts","../src/ui/styles.ts","../src/ui/theme.ts","../src/ui/toolbar.ts","../src/ui/transform.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/ui/shortcuts-modal.ts","../src/spa.ts","../src/web-remarq.ts"],"sourcesContent":["export { WebRemarq } from './web-remarq'\nexport { LocalStorageAdapter } from './core/local-storage-adapter'\nexport type {\n  Annotation,\n  AnnotationStatus,\n  AnnotationEvent,\n  AnnotationEventType,\n  Actor,\n  AnnotationStore,\n  ElementFingerprint,\n  CSSModuleClass,\n  WebRemarqOptions,\n  ImportResult,\n  AgentExport,\n  AgentAnnotation,\n  AgentLifecycleEvent,\n  ToolbarPosition,\n  StorageAdapter,\n  StorageChangeEvent,\n} 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, AnnotationEvent, AnnotationStatus, AnnotationStore, StorageAdapter } from './types'\nimport { toBucket } from './viewport'\n\nexport function migrateAnnotation(legacy: any): Annotation {\n  const rawStatus = legacy.status\n  const status: AnnotationStatus =\n    rawStatus === 'resolved' ? 'verified' : rawStatus\n\n  if (Array.isArray(legacy.lifecycle) && legacy.lifecycle.length > 0) {\n    return { ...legacy, status, lifecycle: legacy.lifecycle }\n  }\n\n  const createdTs = typeof legacy.timestamp === 'number' ? legacy.timestamp : Date.now()\n  const lifecycle: AnnotationEvent[] = [\n    { type: 'created', actor: 'designer', timestamp: createdTs },\n  ]\n  if (rawStatus === 'resolved') {\n    lifecycle.push({ type: 'migrated', actor: null, timestamp: Date.now() })\n  }\n\n  return { ...legacy, status, lifecycle }\n}\n\nexport class AnnotationStorage {\n  private cache: Annotation[] = []\n  readonly ready: Promise<void>\n\n  constructor(private adapter: StorageAdapter) {\n    this.ready = this.init()\n  }\n\n  get isMemoryOnly(): boolean {\n    return this.adapter.isMemoryOnly ?? false\n  }\n\n  getAll(): Annotation[] {\n    return [...this.cache]\n  }\n\n  getByRoute(route: string): Annotation[] {\n    return this.cache.filter((a) => a.route === route)\n  }\n\n  getById(id: string): Annotation | undefined {\n    return this.cache.find((a) => a.id === id)\n  }\n\n  async add(annotation: Annotation): Promise<void> {\n    this.cache.push(annotation)\n    await this.adapter.save(annotation)\n  }\n\n  async remove(id: string): Promise<void> {\n    this.cache = this.cache.filter((a) => a.id !== id)\n    await this.adapter.remove(id)\n  }\n\n  async update(id: string, changes: Partial<Annotation>): Promise<void> {\n    const idx = this.cache.findIndex((a) => a.id === id)\n    if (idx === -1) return\n    const updated = { ...this.cache[idx], ...changes }\n    this.cache[idx] = updated\n    await this.adapter.save(updated)\n  }\n\n  async clearAll(): Promise<void> {\n    this.cache = []\n    await this.adapter.clear()\n  }\n\n  exportJSON(): AnnotationStore {\n    return {\n      version: 1,\n      annotations: [...this.cache],\n    }\n  }\n\n  async importJSON(data: AnnotationStore): Promise<void> {\n    this.cache = data.annotations.map(migrateAnnotation)\n    this.migrateViewportBuckets()\n    await this.adapter.clear()\n    for (const ann of this.cache) {\n      await this.adapter.save(ann)\n    }\n  }\n\n  private async init(): Promise<void> {\n    const data = await this.adapter.load()\n    if (data) {\n      this.cache = data.annotations.map(migrateAnnotation)\n      this.migrateViewportBuckets()\n    }\n  }\n\n  private migrateViewportBuckets(): void {\n    for (const ann of this.cache) {\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","import type { Annotation, AnnotationStore, StorageAdapter } from './types';\n\nconst STORAGE_KEY = 'remarq:annotations';\n\nexport class LocalStorageAdapter implements StorageAdapter {\n  isMemoryOnly = false;\n  private extraFields: Record<string, unknown> = {};\n  private memoryStore: AnnotationStore | null = null;\n\n  async load(): Promise<AnnotationStore | null> {\n    if (this.isMemoryOnly) return this.memoryStore;\n    try {\n      const raw = localStorage.getItem(STORAGE_KEY);\n      if (!raw) return null;\n      const parsed = JSON.parse(raw);\n      const { version, annotations, ...rest } = parsed;\n      this.extraFields = rest;\n      const store: AnnotationStore = {\n        version: 1,\n        annotations: Array.isArray(annotations) ? annotations : [],\n      };\n      this.memoryStore = store;\n      return store;\n    } catch {\n      this.isMemoryOnly = true;\n      return this.memoryStore;\n    }\n  }\n\n  async save(annotation: Annotation): Promise<void> {\n    const store = await this.ensureStore();\n    const idx = store.annotations.findIndex((a) => a.id === annotation.id);\n    if (idx === -1) {\n      store.annotations.push(annotation);\n    } else {\n      store.annotations[idx] = annotation;\n    }\n    this.persist(store);\n  }\n\n  async remove(id: string): Promise<void> {\n    const store = await this.ensureStore();\n    store.annotations = store.annotations.filter((a) => a.id !== id);\n    this.persist(store);\n  }\n\n  async clear(): Promise<void> {\n    const store = await this.ensureStore();\n    store.annotations = [];\n    this.persist(store);\n  }\n\n  private async ensureStore(): Promise<AnnotationStore> {\n    if (this.memoryStore) return this.memoryStore;\n    const loaded = await this.load();\n    if (loaded) return loaded;\n    this.memoryStore = { version: 1, annotations: [] };\n    return this.memoryStore;\n  }\n\n  private persist(store: AnnotationStore): void {\n    if (this.isMemoryOnly) return;\n    try {\n      const data = {\n        version: 1,\n        ...this.extraFields,\n        annotations: store.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    lifecycle: ann.lifecycle.map((ev) => {\n      const out: { type: typeof ev.type; actor: typeof ev.actor; timestamp: number; reason?: string } = {\n        type: ev.type,\n        actor: ev.actor,\n        timestamp: ev.timestamp,\n      }\n      if (ev.reason !== undefined) out.reason = ev.reason\n      return out\n    }),\n  }))\n\n  return {\n    version: 1,\n    format: 'agent',\n    viewportBucket,\n    annotations: agentAnnotations,\n  }\n}\n","import type {\n  Annotation,\n  AnnotationEvent,\n  AnnotationEventType,\n  AnnotationStatus,\n  Actor,\n} from './types'\n\nexport type LifecycleAction =\n  | 'acknowledge'\n  | 'claimFix'\n  | 'verify'\n  | 'reject'\n  | 'dismiss'\n  | 'reopen'\n\nexport class InvalidTransitionError extends Error {\n  constructor(from: AnnotationStatus, action: LifecycleAction) {\n    super(`Cannot ${action} from status \"${from}\"`)\n    this.name = 'InvalidTransitionError'\n  }\n}\n\nexport interface EventOpts {\n  actor?: Actor\n  actorName?: string\n  reason?: string\n  timestamp?: number\n}\n\nconst ACTION_TO_EVENT: Record<LifecycleAction, AnnotationEventType> = {\n  acknowledge: 'acknowledged',\n  claimFix: 'fix_claimed',\n  verify: 'verified',\n  reject: 'rejected',\n  dismiss: 'dismissed',\n  reopen: 'reopened',\n}\n\nconst DEFAULT_ACTOR_BY_EVENT: Record<AnnotationEventType, Actor | null> = {\n  created: 'designer',\n  acknowledged: 'developer',\n  fix_claimed: 'agent',\n  verified: 'developer',\n  rejected: 'developer',\n  dismissed: 'developer',\n  reopened: 'developer',\n  migrated: null,\n}\n\nexport function createEvent(type: AnnotationEventType, opts: EventOpts = {}): AnnotationEvent {\n  const event: AnnotationEvent = {\n    type,\n    actor: opts.actor ?? DEFAULT_ACTOR_BY_EVENT[type],\n    timestamp: opts.timestamp ?? Date.now(),\n  }\n  if (opts.actorName !== undefined) event.actorName = opts.actorName\n  if (opts.reason !== undefined) event.reason = opts.reason\n  return event\n}\n\nfunction nextStatus(\n  from: AnnotationStatus,\n  action: LifecycleAction,\n): AnnotationStatus | null {\n  switch (action) {\n    case 'acknowledge':\n      return from === 'pending' ? 'in_progress' : null\n    case 'claimFix':\n      return from === 'pending' || from === 'in_progress' ? 'fixed_unverified' : null\n    case 'verify':\n      return from === 'fixed_unverified' || from === 'in_progress' ? 'verified' : null\n    case 'reject':\n      return from === 'fixed_unverified' ? 'pending' : null\n    case 'dismiss':\n      return from === 'pending' || from === 'in_progress' || from === 'fixed_unverified'\n        ? 'dismissed'\n        : null\n    case 'reopen':\n      return from === 'dismissed' || from === 'verified' ? 'pending' : null\n  }\n}\n\nexport function transition(\n  annotation: Annotation,\n  action: LifecycleAction,\n  opts: EventOpts = {},\n): { status: AnnotationStatus; event: AnnotationEvent } {\n  const next = nextStatus(annotation.status, action)\n  if (next === null) {\n    throw new InvalidTransitionError(annotation.status, action)\n  }\n  const event = createEvent(ACTION_TO_EVENT[action], opts)\n  return { status: next, event }\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  --remarq-status-pending: #f97316;\n  --remarq-status-in-progress: #eab308;\n  --remarq-status-fixed-unverified: #3b82f6;\n  --remarq-status-verified: #22c55e;\n  --remarq-status-dismissed: #6b7280;\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  --remarq-status-pending: #fb923c;\n  --remarq-status-in-progress: #facc15;\n  --remarq-status-fixed-unverified: #60a5fa;\n  --remarq-status-verified: #4ade80;\n  --remarq-status-dismissed: #9ca3af;\n}\n\n.remarq-toolbar {\n  position: fixed;\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-pos-bottom-right { bottom: 16px; right: 16px; }\n.remarq-toolbar.remarq-pos-bottom-left { bottom: 16px; left: 16px; flex-direction: row-reverse; }\n.remarq-toolbar.remarq-pos-top-right { top: 16px; right: 16px; }\n.remarq-toolbar.remarq-pos-top-left { top: 16px; left: 16px; flex-direction: row-reverse; }\n\n.remarq-toolbar.remarq-minimized { padding: 8px; }\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: -6px;\n  right: -6px;\n  width: 18px;\n  height: 18px;\n  padding: 0;\n  border-radius: 50%;\n  background: var(--remarq-pending);\n  color: #ffffff;\n  font-size: 10px;\n  font-weight: 600;\n  line-height: 1;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  box-sizing: border-box;\n}\n\n.remarq-toolbar-badge--verification {\n  top: auto;\n  bottom: -6px;\n  right: -6px;\n  background: var(--remarq-status-fixed-unverified);\n  cursor: pointer;\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--pending { background: var(--remarq-status-pending); }\n.remarq-marker--in-progress { background: var(--remarq-status-in-progress); }\n.remarq-marker--fixed-unverified { background: var(--remarq-status-fixed-unverified); }\n.remarq-marker--verified { background: var(--remarq-status-verified); opacity: 0.7; }\n.remarq-marker--dismissed { background: var(--remarq-status-dismissed); opacity: 0.5; }\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  flex-direction: column;\n  gap: 6px;\n  padding: 8px 12px;\n  border-top: 1px solid var(--remarq-border);\n}\n\n.remarq-popup-actions-row {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 6px;\n}\n\n.remarq-popup-actions-row--transitions {\n  justify-content: flex-start;\n}\n\n.remarq-popup-actions-row--utility {\n  justify-content: flex-end;\n  padding-top: 6px;\n  border-top: 1px dashed var(--remarq-border);\n}\n\n.remarq-popup-actions button {\n  padding: 5px 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-popup-utility-btn {\n  font-size: 11px !important;\n  padding: 3px 10px !important;\n  color: var(--remarq-text-secondary) !important;\n  background: transparent !important;\n  border-color: transparent !important;\n}\n\n.remarq-popup-utility-btn:hover {\n  background: var(--remarq-bg-secondary) !important;\n  color: var(--remarq-text) !important;\n}\n\n.remarq-detached-panel {\n  position: fixed;\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-panel.remarq-pos-bottom-right { bottom: 60px; right: 16px; }\n.remarq-detached-panel.remarq-pos-bottom-left { bottom: 60px; left: 16px; }\n.remarq-detached-panel.remarq-pos-top-right { top: 60px; right: 16px; }\n.remarq-detached-panel.remarq-pos-top-left { top: 60px; left: 16px; }\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-pos-top-right .remarq-export-menu,\n.remarq-pos-top-left .remarq-export-menu {\n  bottom: auto;\n  top: 100%;\n  margin-bottom: 0;\n  margin-top: 4px;\n}\n\n.remarq-pos-bottom-left .remarq-export-menu,\n.remarq-pos-top-left .remarq-export-menu {\n  right: auto;\n  left: 0;\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  pointer-events: none;\n  z-index: 2147483646;\n}\n\n.remarq-spacing-margin {\n  position: absolute;\n  background: rgba(249, 115, 22, 0.2);\n  pointer-events: none;\n  z-index: 1;\n}\n\n.remarq-spacing-padding {\n  position: absolute;\n  background: rgba(34, 197, 94, 0.2);\n  pointer-events: none;\n  z-index: 2;\n}\n\n.remarq-spacing-content {\n  position: absolute;\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: absolute;\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-shortcuts-backdrop {\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: rgba(0, 0, 0, 0.4);\n  z-index: 2147483647;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.remarq-shortcuts-modal {\n  background: var(--remarq-bg);\n  border: 1px solid var(--remarq-border);\n  border-radius: 12px;\n  box-shadow: var(--remarq-shadow);\n  padding: 20px 24px;\n  min-width: 300px;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n  color: var(--remarq-text);\n}\n\n.remarq-shortcuts-title {\n  font-size: 15px;\n  font-weight: 600;\n  margin-bottom: 12px;\n  padding-bottom: 8px;\n  border-bottom: 1px solid var(--remarq-border);\n}\n\n.remarq-shortcuts-row {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  padding: 4px 0;\n  font-size: 13px;\n}\n\n.remarq-shortcuts-key {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  min-width: 28px;\n  padding: 2px 8px;\n  background: var(--remarq-bg-secondary);\n  border: 1px solid var(--remarq-border);\n  border-radius: 4px;\n  font-family: inherit;\n  font-size: 12px;\n  font-weight: 600;\n  white-space: nowrap;\n}\n\n.remarq-shortcuts-context {\n  font-size: 10px;\n  color: var(--remarq-text-secondary);\n  background: var(--remarq-bg-secondary);\n  border-radius: 3px;\n  padding: 1px 6px;\n  margin-left: auto;\n}\n\n.remarq-popup-hint {\n  font-size: 11px;\n  color: var(--remarq-text-secondary);\n  margin-top: 4px;\n}\n\n.remarq-popup-history {\n  margin-top: 8px;\n  font-size: 12px;\n  color: var(--remarq-text-secondary);\n}\n\n.remarq-popup-history summary {\n  cursor: pointer;\n  padding: 4px 0;\n  user-select: none;\n}\n\n.remarq-popup-history-list {\n  list-style: none;\n  margin: 4px 0 0 0;\n  padding: 0;\n}\n\n.remarq-popup-history-list li {\n  padding: 2px 0;\n  font-size: 11px;\n  line-height: 1.4;\n}\n\n.remarq-popup-reason {\n  width: 100%;\n  min-height: 50px;\n  margin-bottom: 8px;\n  padding: 6px;\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: 12px;\n  resize: vertical;\n  box-sizing: border-box;\n}\n\n.remarq-popup-reason-row {\n  display: flex;\n  justify-content: flex-end;\n  gap: 8px;\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","import type { ToolbarPosition } from '../core/types'\n\nexport 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  onHelp: () => void\n  onVerificationBadgeClick?: () => void\n}\n\nconst isMac = typeof navigator !== 'undefined' && /Mac|iPhone|iPad/.test(navigator.platform ?? '')\nconst modKey = isMac ? '\\u2325' : 'Alt'\n\nconst TOOLTIPS: Record<string, string> = {\n  inspect: `Inspect element (${modKey}+I)`,\n  spacing: 'Spacing overlay (S)',\n  copy: 'Copy as Markdown (C)',\n  export: 'Export',\n  import: 'Import JSON',\n  clear: 'Clear all',\n  theme: 'Toggle theme',\n  help: 'Keyboard shortcuts (?)',\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  help: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><circle cx=\"8\" cy=\"8\" r=\"6\"/><path d=\"M6 6.5a2 2 0 0 1 3.5 1.5c0 1-1.5 1-1.5 2\"/><circle cx=\"8\" cy=\"12\" r=\"0.5\" fill=\"currentColor\" stroke=\"none\"/></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 verificationBadgeEl: 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    private position: ToolbarPosition = 'bottom-right',\n  ) {\n    this.toolbarEl = document.createElement('div')\n    this.toolbarEl.className = `remarq-toolbar remarq-pos-${position}`\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.title = 'Needs attention'\n    this.badgeEl.style.display = 'none'\n    this.inspectBtn.appendChild(this.badgeEl)\n\n    this.verificationBadgeEl = document.createElement('span')\n    this.verificationBadgeEl.className = 'remarq-badge remarq-toolbar-badge--verification'\n    this.verificationBadgeEl.title = 'Pending your verification'\n    this.verificationBadgeEl.style.display = 'none'\n    this.verificationBadgeEl.addEventListener('click', (e) => {\n      e.stopPropagation()\n      callbacks.onVerificationBadgeClick?.()\n    })\n    this.inspectBtn.appendChild(this.verificationBadgeEl)\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 helpBtn = this.createButton('help', ICONS.help, () => callbacks.onHelp())\n    const minimizeBtn = this.createButton('minimize', ICONS.minimize, () => this.toggleMinimize())\n\n    this.buttons = [this.inspectBtn, this.spacingBtn, copyBtn, exportBtn, importBtn, clearBtn, themeBtn, helpBtn]\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(helpBtn)\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  setVerificationBadgeCount(count: number): void {\n    this.verificationBadgeEl.textContent = String(count)\n    this.verificationBadgeEl.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","/**\n * Computes the affine transform matrix that maps element-local coordinates\n * to viewport coordinates, accounting for ALL CSS transforms (own + ancestors).\n *\n * Uses DOM probing: temporarily inserts zero-size positioned elements at known\n * corners, reads their viewport positions via getBoundingClientRect(), and derives\n * the 2D affine matrix from 3 corner measurements.\n *\n * Returns identity matrix if the element has no visual transform.\n */\nexport function getElementToViewportMatrix(el: HTMLElement): DOMMatrix {\n  const w = el.offsetWidth;\n  const h = el.offsetHeight;\n\n  if (w === 0 && h === 0) return new DOMMatrix();\n\n  // Quick check: if getBoundingClientRect matches offsetWidth/offsetHeight,\n  // there's no transform — skip probing\n  const rect = el.getBoundingClientRect();\n  if (Math.abs(rect.width - w) < 1 && Math.abs(rect.height - h) < 1) {\n    return new DOMMatrix([1, 0, 0, 1, rect.left, rect.top]);\n  }\n\n  // Ensure element is a positioning context for the probe\n  const savedPosition = el.style.position;\n  const cs = getComputedStyle(el);\n  if (cs.position === \"static\") {\n    el.style.position = \"relative\";\n  }\n\n  const probe = document.createElement(\"div\");\n  probe.style.cssText =\n    \"position:absolute;width:0;height:0;margin:0;padding:0;border:0;pointer-events:none;\";\n  el.appendChild(probe);\n\n  // Top-left corner\n  probe.style.left = \"0px\";\n  probe.style.top = \"0px\";\n  let r = probe.getBoundingClientRect();\n  const tlx = r.left,\n    tly = r.top;\n\n  // Top-right corner\n  probe.style.left = `${w}px`;\n  probe.style.top = \"0px\";\n  r = probe.getBoundingClientRect();\n  const trx = r.left,\n    try_ = r.top;\n\n  // Bottom-left corner\n  probe.style.left = \"0px\";\n  probe.style.top = `${h}px`;\n  r = probe.getBoundingClientRect();\n  const blx = r.left,\n    bly = r.top;\n\n  probe.remove();\n  el.style.position = savedPosition;\n\n  // Derive 2D affine matrix from 3 corners:\n  // screen = matrix * local, where local (0,0)→TL, (w,0)→TR, (0,h)→BL\n  const a = (trx - tlx) / w;\n  const b = (try_ - tly) / w;\n  const c = (blx - tlx) / h;\n  const d = (bly - tly) / h;\n\n  return new DOMMatrix([a, b, c, d, tlx, tly]);\n}\n\n/**\n * Returns true if the element has any visual transform (own or inherited).\n */\nexport function hasVisualTransform(el: HTMLElement): boolean {\n  const rect = el.getBoundingClientRect();\n  const w = el.offsetWidth;\n  const h = el.offsetHeight;\n  return Math.abs(rect.width - w) >= 1 || Math.abs(rect.height - h) >= 1;\n}\n","import { getElementToViewportMatrix } from \"./transform\";\n\nexport 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      const w = target.offsetWidth;\n      const h = target.offsetHeight;\n      const matrix = getElementToViewportMatrix(target);\n\n      this.overlayEl.style.display = \"block\";\n      this.overlayEl.style.left = \"0px\";\n      this.overlayEl.style.top = \"0px\";\n      this.overlayEl.style.width = `${w}px`;\n      this.overlayEl.style.height = `${h}px`;\n      this.overlayEl.style.transform = matrix.toString();\n      this.overlayEl.style.transformOrigin = \"0 0\";\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 =\n    el.getAttribute(\"data-testid\") ||\n    el.getAttribute(\"data-test\") ||\n    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(\n      (c) =>\n        !c.match(/^(sc-|css-)/) &&\n        !c.match(/^[a-zA-Z0-9]{8,}$/) &&\n        !c.match(/__[a-zA-Z0-9]{3,}$/),\n    )\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","import { getElementToViewportMatrix } from \"./transform\";\n\ninterface Sides {\n  top: number;\n  right: number;\n  bottom: number;\n  left: 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    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    this.containerEl.appendChild(this.marginEl);\n    this.containerEl.appendChild(this.paddingEl);\n    this.containerEl.appendChild(this.contentEl);\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 cs = window.getComputedStyle(target);\n      const margin = this.readSides(cs, \"margin\");\n      const padding = this.readSides(cs, \"padding\");\n      const border = this.readBorderSides(cs);\n\n      const w = target.offsetWidth;\n      const h = target.offsetHeight;\n\n      // Get the full transform matrix (handles own + ancestor transforms)\n      const matrix = getElementToViewportMatrix(target);\n\n      // Container positioned via the matrix — maps element-local coords to viewport\n      this.containerEl.style.left = \"0px\";\n      this.containerEl.style.top = \"0px\";\n      this.containerEl.style.width = `${w}px`;\n      this.containerEl.style.height = `${h}px`;\n      this.containerEl.style.transform = matrix.toString();\n      this.containerEl.style.transformOrigin = \"0 0\";\n\n      // All inner boxes use coordinates relative to container (0,0 = border-box top-left)\n\n      // Margin box: expand outward\n      this.positionEl(\n        this.marginEl,\n        -margin.left,\n        -margin.top,\n        w + margin.left + margin.right,\n        h + margin.top + margin.bottom,\n      );\n\n      // Padding box = border-box = container itself\n      this.positionEl(this.paddingEl, 0, 0, w, h);\n\n      // Content box: shrink inward by border + padding\n      const contentLeft = border.left + padding.left;\n      const contentTop = border.top + padding.top;\n      const contentW =\n        w - border.left - border.right - padding.left - padding.right;\n      const contentH =\n        h - border.top - border.bottom - padding.top - padding.bottom;\n      this.positionEl(\n        this.contentEl,\n        contentLeft,\n        contentTop,\n        contentW,\n        contentH,\n      );\n\n      // Clear old labels and gaps\n      this.clearLabels();\n      this.clearGaps();\n\n      // Margin labels (relative to container)\n      this.addMarginPaddingLabels(\n        margin,\n        -margin.left,\n        -margin.top,\n        w + margin.left + margin.right,\n        h + margin.top + margin.bottom,\n        0,\n        0,\n        w,\n        h,\n        \"margin\",\n      );\n\n      // Padding labels (relative to container)\n      this.addMarginPaddingLabels(\n        padding,\n        0,\n        0,\n        w,\n        h,\n        contentLeft,\n        contentTop,\n        contentW,\n        contentH,\n        \"padding\",\n      );\n\n      // Content size label\n      if (contentW > 40 && contentH > 14) {\n        this.addLabel(\n          `${Math.round(contentW)} × ${Math.round(contentH)}`,\n          contentTop + contentH / 2 - 6,\n          contentLeft + contentW / 2,\n          \"content\",\n        );\n      }\n\n      // Gap visualization (rendered outside transformed container)\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(\n    cs: CSSStyleDeclaration,\n    prop: \"margin\" | \"padding\",\n  ): 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(\n        cs[`${prop}Bottom` as keyof CSSStyleDeclaration] as string,\n      ),\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(\n    el: HTMLElement,\n    left: number,\n    top: number,\n    width: number,\n    height: number,\n  ): void {\n    el.style.left = `${left}px`;\n    el.style.top = `${top}px`;\n    el.style.width = `${Math.max(0, width)}px`;\n    el.style.height = `${Math.max(0, height)}px`;\n  }\n\n  private addMarginPaddingLabels(\n    sides: Sides,\n    outerLeft: number,\n    outerTop: number,\n    outerW: number,\n    outerH: number,\n    innerLeft: number,\n    innerTop: number,\n    innerW: number,\n    innerH: number,\n    type: \"margin\" | \"padding\",\n  ): void {\n    if (sides.top > 0) {\n      const y = outerTop + (innerTop - outerTop) / 2 - 6;\n      const x = outerLeft + outerW / 2;\n      this.addLabel(String(Math.round(sides.top)), y, x, type);\n    }\n    if (sides.bottom > 0) {\n      const innerBottom = innerTop + innerH;\n      const outerBottom = outerTop + outerH;\n      const y = innerBottom + (outerBottom - innerBottom) / 2 - 6;\n      const x = outerLeft + outerW / 2;\n      this.addLabel(String(Math.round(sides.bottom)), y, x, type);\n    }\n    if (sides.left > 0) {\n      const y = outerTop + outerH / 2 - 6;\n      const x = outerLeft + (innerLeft - outerLeft) / 2;\n      this.addLabel(String(Math.round(sides.left)), y, x, type);\n    }\n    if (sides.right > 0) {\n      const innerRight = innerLeft + innerW;\n      const outerRight = outerLeft + outerW;\n      const y = outerTop + outerH / 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(\n    text: string,\n    top: number,\n    left: number,\n    type: string,\n  ): 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    const targetCs = window.getComputedStyle(target);\n    if (targetCs.display.includes(\"flex\")) {\n      this.showContainerGaps(target, targetCs);\n      return;\n    }\n\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    if (targetIndex > 0) {\n      this.renderGap(children[targetIndex - 1], target, gap, isRow);\n    }\n    if (targetIndex < children.length - 1) {\n      this.renderGap(target, children[targetIndex + 1], gap, isRow);\n    }\n  }\n\n  private showContainerGaps(\n    container: HTMLElement,\n    cs: CSSStyleDeclaration,\n  ): 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    for (let i = 0; i < children.length - 1; i++) {\n      this.renderGap(children[i], children[i + 1], gap, isRow);\n    }\n  }\n\n  /**\n   * Compute the parent's content box (border-box minus padding and border)\n   * to constrain gap dimensions to the actual content area.\n   */\n  private getParentContentBox(parent: HTMLElement): {\n    left: number;\n    top: number;\n    width: number;\n    height: number;\n  } {\n    const rect = parent.getBoundingClientRect();\n    const cs = window.getComputedStyle(parent);\n    const pl = parsePx(cs.paddingLeft);\n    const pr = parsePx(cs.paddingRight);\n    const pt = parsePx(cs.paddingTop);\n    const pb = parsePx(cs.paddingBottom);\n    const bl = parsePx(cs.borderLeftWidth);\n    const br = parsePx(cs.borderRightWidth);\n    const bt = parsePx(cs.borderTopWidth);\n    const bb = parsePx(cs.borderBottomWidth);\n    return {\n      left: rect.left + bl + pl,\n      top: rect.top + bt + pt,\n      width: rect.width - bl - br - pl - pr,\n      height: rect.height - bt - bb - pt - pb,\n    };\n  }\n\n  private renderGap(\n    before: HTMLElement,\n    after: HTMLElement,\n    gap: number,\n    isRow: boolean,\n  ): void {\n    const rectBefore = before.getBoundingClientRect();\n    const rectAfter = after.getBoundingClientRect();\n    const parent = before.parentElement;\n    const contentBox = parent ? this.getParentContentBox(parent) : null;\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 = contentBox\n        ? contentBox.top\n        : Math.min(rectBefore.top, rectAfter.top);\n      const height = contentBox\n        ? contentBox.height\n        : 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 = contentBox\n        ? contentBox.left\n        : Math.min(rectBefore.left, rectAfter.left);\n      const width = contentBox\n        ? contentBox.width\n        : 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    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 =\n        \"font-size:10px;font-weight:700;pointer-events:none;\";\n      gapEl.appendChild(label);\n    }\n\n    // Gaps are between siblings — render outside the transformed container\n    this.parent.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\nimport type { AnnotationEvent, AnnotationStatus } from '../core/types'\nimport type { LifecycleAction } from '../core/lifecycle'\n\ninterface DetailInfo extends ElementInfo {\n  comment: string\n  status: AnnotationStatus\n  lifecycle: AnnotationEvent[]\n}\n\ninterface DetailCallbacks {\n  onTransition: (action: LifecycleAction, reason?: string) => void\n  onDelete: () => void\n  onClose: () => void\n  onEdit: (newComment: string) => void\n  onCopy: () => void\n}\n\nconst STATUS_LABEL: Record<AnnotationStatus, string> = {\n  pending: 'Pending',\n  in_progress: 'In progress',\n  fixed_unverified: 'Fix claimed',\n  verified: 'Verified',\n  dismissed: 'Dismissed',\n}\n\nconst EVENT_LABEL: Record<AnnotationEvent['type'], string> = {\n  created: 'Created',\n  acknowledged: 'In progress',\n  fix_claimed: 'Fix claimed',\n  verified: 'Verified',\n  rejected: 'Rejected',\n  dismissed: 'Dismissed',\n  reopened: 'Reopened',\n  migrated: 'Migrated',\n}\n\ninterface ActionDef {\n  label: string\n  action: LifecycleAction\n  needsReason?: boolean\n  primary?: boolean\n}\n\nfunction actionsForStatus(status: AnnotationStatus): ActionDef[] {\n  switch (status) {\n    case 'pending':\n      return [\n        { label: 'Acknowledge', action: 'acknowledge', primary: true },\n        { label: 'Dismiss', action: 'dismiss', needsReason: true },\n      ]\n    case 'in_progress':\n      return [\n        { label: 'Mark verified', action: 'verify', primary: true },\n        { label: 'Dismiss', action: 'dismiss', needsReason: true },\n      ]\n    case 'fixed_unverified':\n      return [\n        { label: 'Verify', action: 'verify', primary: true },\n        { label: 'Reject', action: 'reject', needsReason: true },\n        { label: 'Dismiss', action: 'dismiss', needsReason: true },\n      ]\n    case 'verified':\n      return [{ label: 'Reopen', action: 'reopen' }]\n    case 'dismissed':\n      return [{ label: 'Reopen', action: 'reopen' }]\n  }\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  private pendingEditFlush: (() => 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 =\n      `<${info.tag}>${info.text ? ` \"${info.text}\"` : ''} [${STATUS_LABEL[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    body.appendChild(this.buildLifecycleViewer(info.lifecycle))\n\n    const actions = document.createElement('div')\n    actions.className = 'remarq-popup-actions'\n    this.renderActionButtons(actions, info, callbacks)\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  private buildLifecycleViewer(lifecycle: AnnotationEvent[]): HTMLElement {\n    const details = document.createElement('details')\n    details.className = 'remarq-popup-history'\n\n    const summary = document.createElement('summary')\n    summary.textContent = `History (${lifecycle.length})`\n    details.appendChild(summary)\n\n    const list = document.createElement('ul')\n    list.className = 'remarq-popup-history-list'\n\n    for (const ev of lifecycle) {\n      const li = document.createElement('li')\n      const when = new Date(ev.timestamp).toLocaleString()\n      const who = ev.actor ?? 'system'\n      const what = EVENT_LABEL[ev.type] ?? ev.type\n      let text = `${when} · ${who} · ${what}`\n      if (ev.reason) text += ` — ${ev.reason}`\n      li.textContent = text\n      list.appendChild(li)\n    }\n    details.appendChild(list)\n    return details\n  }\n\n  private renderActionButtons(\n    container: HTMLElement,\n    info: DetailInfo,\n    callbacks: DetailCallbacks,\n  ): void {\n    container.replaceChildren()\n\n    const transitions = document.createElement('div')\n    transitions.className = 'remarq-popup-actions-row remarq-popup-actions-row--transitions'\n\n    for (const def of actionsForStatus(info.status)) {\n      const btn = document.createElement('button')\n      btn.textContent = def.label\n      if (def.primary) btn.className = 'remarq-primary'\n      btn.addEventListener('click', () => {\n        if (def.needsReason) {\n          this.showReasonInput(container, info, callbacks, def)\n        } else {\n          this.hide()\n          callbacks.onTransition(def.action)\n        }\n      })\n      transitions.appendChild(btn)\n    }\n    container.appendChild(transitions)\n\n    const utility = document.createElement('div')\n    utility.className = 'remarq-popup-actions-row remarq-popup-actions-row--utility'\n\n    const copyBtn = document.createElement('button')\n    copyBtn.className = 'remarq-popup-utility-btn'\n    copyBtn.textContent = 'Copy'\n    copyBtn.addEventListener('click', () => callbacks.onCopy())\n    utility.appendChild(copyBtn)\n\n    const deleteBtn = document.createElement('button')\n    deleteBtn.className = 'remarq-popup-utility-btn'\n    deleteBtn.textContent = 'Delete'\n    deleteBtn.addEventListener('click', () => {\n      this.hide()\n      callbacks.onDelete()\n    })\n    utility.appendChild(deleteBtn)\n\n    const closeBtn = document.createElement('button')\n    closeBtn.className = 'remarq-popup-utility-btn'\n    closeBtn.textContent = 'Close'\n    closeBtn.addEventListener('click', () => {\n      this.hide()\n      callbacks.onClose()\n    })\n    utility.appendChild(closeBtn)\n\n    container.appendChild(utility)\n  }\n\n  private showReasonInput(\n    container: HTMLElement,\n    info: DetailInfo,\n    callbacks: DetailCallbacks,\n    def: ActionDef,\n  ): void {\n    container.replaceChildren()\n\n    const textarea = document.createElement('textarea')\n    textarea.placeholder = `Reason for ${def.label.toLowerCase()} (optional)…`\n    textarea.className = 'remarq-popup-reason'\n    container.appendChild(textarea)\n\n    const row = document.createElement('div')\n    row.className = 'remarq-popup-reason-row'\n\n    const cancel = document.createElement('button')\n    cancel.textContent = 'Cancel'\n    cancel.addEventListener('click', () => {\n      this.renderActionButtons(container, info, callbacks)\n    })\n\n    const submit = document.createElement('button')\n    submit.className = 'remarq-primary'\n    submit.textContent = 'Submit'\n    submit.addEventListener('click', () => {\n      const reason = textarea.value.trim() || undefined\n      this.hide()\n      callbacks.onTransition(def.action, reason)\n    })\n\n    row.appendChild(cancel)\n    row.appendChild(submit)\n    container.appendChild(row)\n\n    textarea.focus()\n  }\n\n  hide(): void {\n    if (this.pendingEditFlush) {\n      this.pendingEditFlush()\n      this.pendingEditFlush = null\n    }\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 restoreView = (): void => {\n      if (!textarea.isConnected) return\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    const commitEdit = (): void => {\n      this.pendingEditFlush = null\n      const newComment = textarea.value.trim()\n      if (newComment && newComment !== info.comment) {\n        info.comment = newComment\n        callbacks.onEdit(newComment)\n      }\n      restoreView()\n    }\n\n    const cancelEdit = (): void => {\n      this.pendingEditFlush = null\n      restoreView()\n    }\n\n    this.pendingEditFlush = commitEdit\n\n    textarea.addEventListener('keydown', (e: KeyboardEvent) => {\n      if (e.key === 'Enter' && !e.shiftKey) {\n        e.preventDefault()\n        commitEdit()\n      }\n      if (e.key === 'Escape') {\n        e.stopPropagation()\n        cancelEdit()\n      }\n    })\n\n    textarea.addEventListener('blur', () => {\n      // Defer so click-outside-to-close has a chance to fire hide() first,\n      // which already calls pendingEditFlush. If popup is still open after\n      // the deferred tick, commit normally.\n      setTimeout(() => {\n        if (textarea.isConnected) commitEdit()\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, AnnotationStatus } from '../core/types'\n\ninterface MarkerEntry {\n  annotation: Annotation\n  target: HTMLElement\n  markerEl: HTMLElement\n}\n\nconst STATUS_COLOR: Record<AnnotationStatus, string> = {\n  pending: 'var(--remarq-status-pending)',\n  in_progress: 'var(--remarq-status-in-progress)',\n  fixed_unverified: 'var(--remarq-status-fixed-unverified)',\n  verified: 'var(--remarq-status-verified)',\n  dismissed: 'var(--remarq-status-dismissed)',\n}\n\nfunction statusClass(status: AnnotationStatus): string {\n  return `remarq-marker--${status.replace('_', '-')}`\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 ${statusClass(annotation.status)}`\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: AnnotationStatus): void {\n    const entry = this.markers.get(id)\n    if (entry) {\n      entry.annotation.status = status\n      entry.markerEl.className = `remarq-marker ${statusClass(status)}`\n      entry.markerEl.setAttribute('data-status', status)\n      this.applyOutline(entry.target, status)\n    }\n  }\n\n  scrollToMarker(id: string): void {\n    const entry = this.markers.get(id)\n    if (!entry) return\n    try {\n      entry.target.scrollIntoView({ behavior: 'smooth', block: 'center' })\n    } catch {\n      // ignore\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: AnnotationStatus): void {\n    const color = STATUS_COLOR[status]\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\nlet fadeTimer: 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      fadeTimer = setTimeout(() => hideToast(), 300)\n    }\n  }, duration)\n}\n\nexport function hideToast(): void {\n  if (currentTimer) {\n    clearTimeout(currentTimer)\n    currentTimer = null\n  }\n  if (fadeTimer) {\n    clearTimeout(fadeTimer)\n    fadeTimer = null\n  }\n  if (currentToast) {\n    currentToast.remove()\n    currentToast = null\n  }\n}\n","import type { Annotation, ToolbarPosition } 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    private position: ToolbarPosition = 'bottom-right',\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 remarq-pos-${this.position}`\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","const isMac = typeof navigator !== 'undefined' && /Mac|iPhone|iPad/.test(navigator.platform ?? '')\nconst modKey = isMac ? '\\u2325' : 'Alt'  // ⌥ on Mac\n\nconst SHORTCUTS = [\n  { key: `${modKey}+I`, description: 'Toggle inspect mode' },\n  { key: 'S', description: 'Toggle spacing overlay', context: 'inspect' },\n  { key: `${modKey}+C`, description: 'Copy all annotations to clipboard' },\n  { key: `${modKey}+D`, description: 'Delete all annotations' },\n  { key: 'Esc', description: 'Exit inspect mode / close popup' },\n  { key: '?', description: 'Show this help' },\n  { key: 'Enter', description: 'Submit annotation', context: 'popup' },\n  { key: 'Shift+Enter', description: 'New line', context: 'popup' },\n]\n\nlet modalEl: HTMLElement | null = null\nlet keyHandler: ((e: KeyboardEvent) => void) | null = null\n\nexport function showShortcutsModal(container: HTMLElement): void {\n  if (modalEl) {\n    hideShortcutsModal()\n    return\n  }\n\n  const backdrop = document.createElement('div')\n  backdrop.className = 'remarq-shortcuts-backdrop'\n\n  const modal = document.createElement('div')\n  modal.className = 'remarq-shortcuts-modal'\n\n  const title = document.createElement('div')\n  title.className = 'remarq-shortcuts-title'\n  title.textContent = 'Keyboard Shortcuts'\n  modal.appendChild(title)\n\n  for (const s of SHORTCUTS) {\n    const row = document.createElement('div')\n    row.className = 'remarq-shortcuts-row'\n\n    const key = document.createElement('kbd')\n    key.className = 'remarq-shortcuts-key'\n    key.textContent = s.key\n\n    const desc = document.createElement('span')\n    desc.textContent = s.description\n\n    row.appendChild(key)\n    row.appendChild(desc)\n\n    if ('context' in s && s.context) {\n      const badge = document.createElement('span')\n      badge.className = 'remarq-shortcuts-context'\n      badge.textContent = s.context\n      row.appendChild(badge)\n    }\n\n    modal.appendChild(row)\n  }\n\n  backdrop.appendChild(modal)\n  container.appendChild(backdrop)\n  modalEl = backdrop\n\n  backdrop.addEventListener('click', (e) => {\n    if (e.target === backdrop) hideShortcutsModal()\n  })\n\n  keyHandler = (e: KeyboardEvent) => {\n    if (e.key === 'Escape' || e.key === '?') {\n      hideShortcutsModal()\n    }\n  }\n  document.addEventListener('keydown', keyHandler)\n}\n\nexport function hideShortcutsModal(): void {\n  if (modalEl) {\n    modalEl.remove()\n    modalEl = null\n  }\n  if (keyHandler) {\n    document.removeEventListener('keydown', keyHandler)\n    keyHandler = null\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 { Actor, Annotation, ImportResult, WebRemarqOptions } from './core/types'\nimport { AnnotationStorage } from './core/storage'\nimport { LocalStorageAdapter } from './core/local-storage-adapter'\nimport { createFingerprint } from './core/fingerprint'\nimport { matchElement } from './core/matcher'\nimport { generateAgentExport } from './core/agent-export'\nimport { transition, type LifecycleAction } from './core/lifecycle'\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 { showShortcutsModal, hideShortcutsModal } from './ui/shortcuts-modal'\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 needsAttention = anns.filter(\n    (a) => a.status === 'pending' || a.status === 'in_progress',\n  ).length\n  const needsVerification = anns.filter((a) => a.status === 'fixed_unverified').length\n  toolbar.setBadgeCount(needsAttention)\n  toolbar.setVerificationBadgeCount(needsVerification)\n}\n\nfunction jumpToFirstUnverified(): void {\n  if (!storage || !markers) return\n  const ann = storage.getByRoute(currentRoute()).find((a) => a.status === 'fixed_unverified')\n  if (!ann) return\n  markers.scrollToMarker(ann.id)\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 now = Date.now()\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: now,\n        status: 'pending',\n        lifecycle: [{ type: 'created', actor: 'designer', timestamp: now }],\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  if (options.shortcuts === false) return\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.altKey && e.code === 'KeyI') {\n    e.preventDefault()\n    setInspecting(!inspecting)\n    if (!inspecting) {\n      overlay.hide()\n      spacingOverlay.hide()\n    }\n  }\n\n  if (e.altKey && e.code === 'KeyC') {\n    e.preventDefault()\n    copyToClipboard()\n  }\n\n  if (e.altKey && e.code === 'KeyD') {\n    e.preventDefault()\n    elementCache.clear()\n    storage.clearAll()\n    refreshMarkers()\n    showToast(themeManager.container, 'All annotations cleared')\n  }\n\n  if (e.key === '?') {\n    showShortcutsModal(themeManager.container)\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      lifecycle: ann.lifecycle,\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      onTransition: (action, reason) => {\n        applyTransition(ann.id, action, reason ? { reason } : undefined)\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 fresh = storage.getById(ann.id) ?? ann\n        const fp = fresh.fingerprint\n        const lines = [\n          `[${fresh.status}] \"${fresh.comment}\"`,\n          `Element: <${fp.tagName}>${fp.textContent ? ` \"${fp.textContent}\"` : ''}`,\n          `Route: ${fresh.route}`,\n          `Viewport: ${fresh.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) {\n    showToast(themeManager.container, 'No annotations to copy')\n    return\n  }\n  if (navigator.clipboard?.writeText) {\n    navigator.clipboard.writeText(md).then(() => {\n      showToast(themeManager.container, 'Copied to clipboard')\n    }).catch(() => {\n      fallbackCopy(md)\n    })\n  } else {\n    fallbackCopy(md)\n  }\n}\n\nfunction fallbackCopy(text: string): void {\n  const textarea = document.createElement('textarea')\n  textarea.value = text\n  textarea.style.position = 'fixed'\n  textarea.style.opacity = '0'\n  document.body.appendChild(textarea)\n  textarea.select()\n  try {\n    document.execCommand('copy')\n    showToast(themeManager.container, 'Copied to clipboard')\n  } catch {\n    showToast(themeManager.container, 'Failed to copy')\n  }\n  textarea.remove()\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\ninterface TransitionOpts {\n  actor?: Actor\n  actorName?: string\n  reason?: string\n}\n\nfunction applyTransition(id: string, action: LifecycleAction, opts: TransitionOpts = {}): void {\n  if (!storage) return\n  const ann = storage.getById(id)\n  if (!ann) return\n  const { status, event } = transition(ann, action, opts)\n  const lifecycle = [...ann.lifecycle, event]\n  storage.update(id, { status, lifecycle })\n  markers?.updateStatus(id, status)\n  refreshMarkers()\n}\n\nfunction setupMutationObserver(): void {\n  mutationObserver = new MutationObserver((mutations) => {\n    let hasExternalMutation = false\n    for (const m of mutations) {\n      if (m.target instanceof HTMLElement && m.target.closest('[data-remarq-theme]')) continue\n      hasExternalMutation = true\n      break\n    }\n    if (hasExternalMutation) 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    if (!document.body) {\n      document.addEventListener('DOMContentLoaded', () => WebRemarq.init(opts), { once: true })\n      return\n    }\n    options = opts ?? {}\n\n    try {\n      injectStyles()\n      storage = new AnnotationStorage(options.storage ?? new LocalStorageAdapter())\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      const position = options.position ?? 'bottom-right'\n\n      detachedPanel = new DetachedPanel(themeManager.container, (id) => {\n        elementCache.delete(id)\n        storage.remove(id)\n        refreshMarkers()\n      }, position)\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        onHelp: () => showShortcutsModal(themeManager.container),\n        onVerificationBadgeClick: jumpToFirstUnverified,\n      }, position)\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      storage.ready.then(() => {\n        if (storage.isMemoryOnly) {\n          toolbar.setMemoryWarning(true)\n        }\n        refreshMarkers()\n      })\n\n      console.debug(`[web-remarq] Initialized on route: ${currentRoute()}`)\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      hideShortcutsModal()\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  acknowledge(id: string, opts?: TransitionOpts): void {\n    applyTransition(id, 'acknowledge', opts)\n  },\n\n  claimFix(id: string, opts?: TransitionOpts): void {\n    applyTransition(id, 'claimFix', opts)\n  },\n\n  verify(id: string, opts?: TransitionOpts): void {\n    applyTransition(id, 'verify', opts)\n  },\n\n  reject(id: string, opts?: TransitionOpts): void {\n    applyTransition(id, 'reject', opts)\n  },\n\n  dismiss(id: string, opts?: TransitionOpts): void {\n    applyTransition(id, 'dismiss', opts)\n  },\n\n  reopen(id: string, opts?: TransitionOpts): void {\n    applyTransition(id, 'reopen', opts)\n  },\n\n  /** @deprecated Use verify() instead. */\n  markResolved(id: string): void {\n    applyTransition(id, 'verify')\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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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":["_a","_a","_a","options","_a","_a","parent","buildDomPath","options","_a","_a","e","_a","_a","_a","popup","_a","_a","_a","_a","isMac","modKey","_a"]}