@useclickly/react 0.2.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +67 -19
  2. package/dist/Clickly.d.ts +25 -0
  3. package/dist/Clickly.d.ts.map +1 -0
  4. package/dist/hooks/useDraggable.d.ts +28 -0
  5. package/dist/hooks/useDraggable.d.ts.map +1 -0
  6. package/dist/hooks/usePersistedState.d.ts +6 -0
  7. package/dist/hooks/usePersistedState.d.ts.map +1 -0
  8. package/dist/index.cjs +2650 -370
  9. package/dist/index.cjs.map +1 -1
  10. package/dist/index.d.cts +3 -3
  11. package/dist/index.d.ts +12 -69
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +2581 -327
  14. package/dist/index.js.map +1 -1
  15. package/dist/internal/AnnotationList.d.ts +11 -0
  16. package/dist/internal/AnnotationList.d.ts.map +1 -0
  17. package/dist/internal/AnnotationPins.d.ts +7 -0
  18. package/dist/internal/AnnotationPins.d.ts.map +1 -0
  19. package/dist/internal/AnnotationPopup.d.ts +5 -0
  20. package/dist/internal/AnnotationPopup.d.ts.map +1 -0
  21. package/dist/internal/ClicklyRoot.d.ts +15 -0
  22. package/dist/internal/ClicklyRoot.d.ts.map +1 -0
  23. package/dist/internal/CollapsedFAB.d.ts +10 -0
  24. package/dist/internal/CollapsedFAB.d.ts.map +1 -0
  25. package/dist/internal/SettingsPopover.d.ts +11 -0
  26. package/dist/internal/SettingsPopover.d.ts.map +1 -0
  27. package/dist/internal/Toolbar.d.ts +8 -0
  28. package/dist/internal/Toolbar.d.ts.map +1 -0
  29. package/dist/internal/globalStyles.d.ts +13 -0
  30. package/dist/internal/globalStyles.d.ts.map +1 -0
  31. package/dist/internal/icons.d.ts +12 -0
  32. package/dist/internal/icons.d.ts.map +1 -0
  33. package/dist/internal/styles.d.ts +7 -0
  34. package/dist/internal/styles.d.ts.map +1 -0
  35. package/dist/output/markdown.d.ts +5 -0
  36. package/dist/output/markdown.d.ts.map +1 -0
  37. package/dist/output/markdown.test.d.ts +2 -0
  38. package/dist/output/markdown.test.d.ts.map +1 -0
  39. package/dist/state/annotations.d.ts +21 -0
  40. package/dist/state/annotations.d.ts.map +1 -0
  41. package/dist/state/annotations.test.d.ts +2 -0
  42. package/dist/state/annotations.test.d.ts.map +1 -0
  43. package/dist/state/settings.d.ts +14 -0
  44. package/dist/state/settings.d.ts.map +1 -0
  45. package/dist/state/settings.test.d.ts +2 -0
  46. package/dist/state/settings.test.d.ts.map +1 -0
  47. package/dist/state/useEngineState.d.ts +7 -0
  48. package/dist/state/useEngineState.d.ts.map +1 -0
  49. package/dist/test/setup.d.ts +7 -0
  50. package/dist/test/setup.d.ts.map +1 -0
  51. package/package.json +12 -12
  52. package/LICENSE +0 -21
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks/useDraggable.ts","../src/state/useEngineState.ts","../src/state/annotations.ts","../src/state/settings.ts","../src/output/markdown.ts","../src/internal/icons.tsx","../src/internal/SettingsPopover.tsx","../src/internal/AnnotationList.tsx","../src/internal/Toolbar.tsx","../src/internal/CollapsedFAB.tsx","../src/internal/AnnotationPopup.tsx","../src/internal/AnnotationPins.tsx","../src/internal/ClicklyRoot.tsx","../src/internal/styles.ts","../src/internal/globalStyles.ts","../src/Clickly.tsx"],"names":["useState","useRef","useCallback","useEffect","useSyncExternalStore","create","useShallow","jsx","jsxs","Fragment","collectMetadata","nanoid","useMemo","createShadowHost","SelectionEngine","Overlay","createPortal"],"mappings":"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","file":"index.cjs","sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface Position {\n x: number;\n y: number;\n}\n\ninterface DraggableApi {\n position: Position;\n setPosition: (p: Position) => void;\n /** Spread onto the drag handle. */\n handleProps: {\n onPointerDown: (e: React.PointerEvent) => void;\n style: React.CSSProperties;\n };\n isDragging: boolean;\n}\n\n/**\n * In-session drag positioning. Position resets to `defaultPos` whenever\n * the consumer remounts (e.g. toolbar collapse → expand cycle).\n *\n * We deliberately do NOT persist across reloads — users expect the\n * toolbar to come back at its default anchor, not where they last left\n * it three sessions ago. Drag is for \"get out of my way right now\".\n */\nexport function useDraggable(\n defaultPos: Position,\n size: { width: number; height: number },\n): DraggableApi {\n const [position, setPosition] = useState<Position>(defaultPos);\n const [isDragging, setDragging] = useState(false);\n const startRef = useRef<{ pointer: Position; pos: Position } | null>(null);\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent) => {\n e.preventDefault();\n (e.target as Element).setPointerCapture?.(e.pointerId);\n startRef.current = {\n pointer: { x: e.clientX, y: e.clientY },\n pos: position,\n };\n setDragging(true);\n },\n [position],\n );\n\n useEffect(() => {\n if (!isDragging) return;\n const onMove = (e: PointerEvent) => {\n const s = startRef.current;\n if (!s) return;\n const dx = e.clientX - s.pointer.x;\n const dy = e.clientY - s.pointer.y;\n const maxX = window.innerWidth - size.width - 8;\n const maxY = window.innerHeight - size.height - 8;\n setPosition({\n x: clamp(s.pos.x + dx, 8, Math.max(8, maxX)),\n y: clamp(s.pos.y + dy, 8, Math.max(8, maxY)),\n });\n };\n const onUp = () => {\n setDragging(false);\n startRef.current = null;\n };\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n return () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n };\n }, [isDragging, size.height, size.width]);\n\n return {\n position,\n setPosition,\n handleProps: {\n onPointerDown,\n style: { cursor: isDragging ? \"grabbing\" : \"grab\", touchAction: \"none\" },\n },\n isDragging,\n };\n}\n\nfunction clamp(n: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(hi, n));\n}\n","import { useSyncExternalStore } from \"react\";\nimport type { EngineState, SelectionEngine } from \"@useclickly/core\";\n\n/**\n * React-friendly accessor for the SelectionEngine's external store.\n * Engine is already a `Subscribable<EngineState>` — zero adapter code.\n */\nexport function useEngineState(engine: SelectionEngine | null): EngineState {\n return useSyncExternalStore(\n (cb) => (engine ? engine.subscribe(cb) : () => {}),\n () => (engine ? engine.getSnapshot() : IDLE),\n () => IDLE,\n );\n}\n\nconst IDLE: EngineState = { kind: \"idle\" };\n","import type { Annotation } from \"@useclickly/core\";\nimport { create } from \"zustand\";\nimport { useShallow } from \"zustand/react/shallow\";\n\nexport interface AnnotationsStore {\n byId: Record<string, Annotation>;\n order: string[];\n\n add: (a: Annotation) => void;\n remove: (id: string) => void;\n update: (id: string, patch: Partial<Annotation>) => void;\n clear: () => void;\n\n /** Imperative read. Hooks should use `useAnnotationsList()` instead. */\n list: () => Annotation[];\n}\n\nexport const useAnnotations = create<AnnotationsStore>((set, get) => ({\n byId: {},\n order: [],\n\n add: (a) =>\n set((s) => ({\n byId: { ...s.byId, [a.id]: a },\n order: s.order.includes(a.id) ? s.order : [...s.order, a.id],\n })),\n\n remove: (id) =>\n set((s) => {\n if (!(id in s.byId)) return s;\n const next = { ...s.byId };\n delete next[id];\n return { byId: next, order: s.order.filter((x) => x !== id) };\n }),\n\n update: (id, patch) =>\n set((s) => {\n const cur = s.byId[id];\n if (!cur) return s;\n return { byId: { ...s.byId, [id]: { ...cur, ...patch } } };\n }),\n\n clear: () => set({ byId: {}, order: [] }),\n\n list: () => {\n const { byId, order } = get();\n return order.map((id) => byId[id]).filter(Boolean) as Annotation[];\n },\n}));\n\n/**\n * Subscribe to the annotation list with shallow equality — re-renders\n * only when items add/remove/reorder/update. Always use this from\n * component code; never call `useAnnotations(s => s.list())`, which\n * returns a new array reference on every store change and infinite-loops\n * `useSyncExternalStore`.\n */\nexport function useAnnotationsList(): Annotation[] {\n return useAnnotations(\n useShallow((s) => s.order.map((id) => s.byId[id]).filter(Boolean) as Annotation[]),\n );\n}\n","import { create } from \"zustand\";\n\nexport type OutputDetail = \"compact\" | \"standard\" | \"detailed\" | \"forensic\";\n\nexport interface Settings {\n outputDetail: OutputDetail;\n copyOnAdd: boolean;\n showReactComponents: boolean;\n markerColor: string;\n}\n\nexport interface SettingsStore extends Settings {\n set: (patch: Partial<Settings>) => void;\n reset: () => void;\n}\n\nexport const DEFAULTS: Settings = {\n outputDetail: \"standard\",\n copyOnAdd: true,\n showReactComponents: true,\n markerColor: \"#06b6d4\",\n};\n\nconst STORAGE_KEY = \"clickly:settings\";\n\nfunction load(): Settings {\n if (typeof localStorage === \"undefined\") return DEFAULTS;\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (!raw) return DEFAULTS;\n const parsed = JSON.parse(raw) as Partial<Settings>;\n return { ...DEFAULTS, ...parsed };\n } catch {\n return DEFAULTS;\n }\n}\n\nfunction persist(s: Settings) {\n if (typeof localStorage === \"undefined\") return;\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(s));\n } catch {\n /* quota / privacy mode */\n }\n}\n\nexport const useSettings = create<SettingsStore>((set) => ({\n ...load(),\n set: (patch) =>\n set((cur) => {\n const next = { ...cur, ...patch };\n persist(next);\n return next;\n }),\n reset: () => {\n persist(DEFAULTS);\n set(DEFAULTS);\n },\n}));\n","import type { Annotation } from \"@useclickly/core\";\nimport type { OutputDetail } from \"../state/settings\";\n\n/**\n * Phase 5 placeholder formatter. Phase 8 ships the full AFS-compliant\n * implementation with four detail tiers and JSON export. Kept here so\n * the Copy button does something useful during development.\n */\nexport function annotationsToMarkdown(\n annotations: Annotation[],\n detail: OutputDetail = \"standard\",\n): string {\n if (!annotations.length) return \"(no annotations)\";\n return annotations.map((a, i) => formatOne(a, i + 1, detail)).join(\"\\n\\n\");\n}\n\nfunction formatOne(a: Annotation, index: number, detail: OutputDetail): string {\n const lines: string[] = [];\n lines.push(`## Annotation #${index}`);\n lines.push(`**Element:** \\`${a.element}${a.cssClasses ? \".\" + a.cssClasses.split(\" \").join(\".\") : \"\"}\\``);\n lines.push(`**Path:** \\`${a.elementPath}\\``);\n if (detail !== \"compact\" && a.boundingBox) {\n const b = a.boundingBox;\n lines.push(`**Position:** ${Math.round(b.x)}px, ${Math.round(b.y)}px (${Math.round(b.width)}×${Math.round(b.height)}px)`);\n }\n if (detail === \"detailed\" || detail === \"forensic\") {\n if (a.reactComponents) lines.push(`**React:** ${a.reactComponents}`);\n if (a.nearbyText) lines.push(`**Nearby text:** ${truncate(a.nearbyText, 120)}`);\n }\n if (detail === \"forensic\" && a.computedStyles) {\n lines.push(\"**Computed styles:**\\n```\\n\" + a.computedStyles + \"\\n```\");\n }\n lines.push(`**Feedback:** ${a.comment}`);\n if (a.severity) lines.push(`**Severity:** ${a.severity}`);\n return lines.join(\"\\n\");\n}\n\nfunction truncate(s: string, n: number): string {\n return s.length <= n ? s : s.slice(0, n - 1) + \"…\";\n}\n","// Inline SVG icons — no icon-library dep. 16x16 stroked, currentColor.\n\nfunction Icon({\n children,\n size = 16,\n}: {\n children: React.ReactNode;\n size?: number;\n}) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n {children}\n </svg>\n );\n}\n\nexport const IconCursor = () => (\n <Icon>\n <path d=\"M4 4l6 16 2-7 7-2z\" />\n </Icon>\n);\n\nexport const IconLayers = () => (\n <Icon>\n <path d=\"M12 2l9 5-9 5-9-5 9-5z\" />\n <path d=\"M3 12l9 5 9-5\" />\n <path d=\"M3 17l9 5 9-5\" />\n </Icon>\n);\n\nexport const IconSquare = () => (\n <Icon>\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" strokeDasharray=\"3 3\" />\n </Icon>\n);\n\nexport const IconCopy = () => (\n <Icon>\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" />\n <path d=\"M5 15V5a2 2 0 0 1 2-2h10\" />\n </Icon>\n);\n\nexport const IconTrash = () => (\n <Icon>\n <path d=\"M3 6h18M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2m3 0v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6h14z\" />\n </Icon>\n);\n\nexport const IconSettings = () => (\n <Icon>\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n <path d=\"M19.4 15a1.7 1.7 0 0 0 .34 1.87l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.7 1.7 0 0 0-1.87-.34 1.7 1.7 0 0 0-1.03 1.55V21a2 2 0 1 1-4 0v-.09a1.7 1.7 0 0 0-1.11-1.55 1.7 1.7 0 0 0-1.87.34l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06A1.7 1.7 0 0 0 4.6 15 1.7 1.7 0 0 0 3.04 14H3a2 2 0 1 1 0-4h.09A1.7 1.7 0 0 0 4.64 8.9a1.7 1.7 0 0 0-.34-1.87l-.06-.06A2 2 0 1 1 7.07 4.14l.06.06A1.7 1.7 0 0 0 9 4.54 1.7 1.7 0 0 0 10 3.03V3a2 2 0 1 1 4 0v.09a1.7 1.7 0 0 0 1 1.51 1.7 1.7 0 0 0 1.87-.34l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06A1.7 1.7 0 0 0 19.4 9a1.7 1.7 0 0 0 1.55 1H21a2 2 0 1 1 0 4h-.09a1.7 1.7 0 0 0-1.5 1z\" />\n </Icon>\n);\n\nexport const IconGrip = () => (\n <Icon>\n <circle cx=\"9\" cy=\"6\" r=\"1\" />\n <circle cx=\"9\" cy=\"12\" r=\"1\" />\n <circle cx=\"9\" cy=\"18\" r=\"1\" />\n <circle cx=\"15\" cy=\"6\" r=\"1\" />\n <circle cx=\"15\" cy=\"12\" r=\"1\" />\n <circle cx=\"15\" cy=\"18\" r=\"1\" />\n </Icon>\n);\n\nexport const IconClose = () => (\n <Icon>\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </Icon>\n);\n\nexport const IconCheck = () => (\n <Icon>\n <path d=\"M5 12l5 5L20 7\" />\n </Icon>\n);\n\nexport const IconList = () => (\n <Icon>\n <path d=\"M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01\" />\n </Icon>\n);\n\nexport const IconPower = () => (\n <Icon>\n <path d=\"M12 2v10M18.36 5.64a9 9 0 1 1-12.73 0\" />\n </Icon>\n);\n","import { useEffect, useRef } from \"react\";\nimport { useSettings, type OutputDetail } from \"../state/settings\";\n\ninterface Props {\n anchor: { x: number; y: number };\n width: number;\n onClose: () => void;\n}\n\nexport function SettingsPopover({ anchor, width, onClose }: Props) {\n const ref = useRef<HTMLDivElement>(null);\n const s = useSettings();\n\n useEffect(() => {\n const onDown = (e: PointerEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) onClose();\n };\n window.addEventListener(\"pointerdown\", onDown, true);\n return () => window.removeEventListener(\"pointerdown\", onDown, true);\n }, [onClose]);\n\n // Position above the toolbar.\n const top = Math.max(8, anchor.y - 200);\n const left = Math.min(window.innerWidth - 268, anchor.x + width - 260);\n\n return (\n <div ref={ref} className=\"clickly-popover\" style={{ left, top }}>\n <h4>Settings</h4>\n\n <div className=\"field\">\n <label htmlFor=\"clickly-detail\">Output detail</label>\n <select\n id=\"clickly-detail\"\n value={s.outputDetail}\n onChange={(e) => s.set({ outputDetail: e.target.value as OutputDetail })}\n >\n <option value=\"compact\">Compact</option>\n <option value=\"standard\">Standard</option>\n <option value=\"detailed\">Detailed</option>\n <option value=\"forensic\">Forensic</option>\n </select>\n </div>\n\n <div className=\"field\">\n <label htmlFor=\"clickly-copy\">Copy on add</label>\n <input\n id=\"clickly-copy\"\n type=\"checkbox\"\n checked={s.copyOnAdd}\n onChange={(e) => s.set({ copyOnAdd: e.target.checked })}\n />\n </div>\n\n <div className=\"field\">\n <label htmlFor=\"clickly-react\">React components</label>\n <input\n id=\"clickly-react\"\n type=\"checkbox\"\n checked={s.showReactComponents}\n onChange={(e) => s.set({ showReactComponents: e.target.checked })}\n />\n </div>\n\n <div className=\"field\">\n <label htmlFor=\"clickly-color\">Marker color</label>\n <input\n id=\"clickly-color\"\n type=\"color\"\n value={s.markerColor}\n onChange={(e) => s.set({ markerColor: e.target.value })}\n />\n </div>\n </div>\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport { useAnnotations, useAnnotationsList } from \"../state/annotations\";\nimport { IconClose } from \"./icons\";\n\ninterface Props {\n anchor: { x: number; y: number };\n width: number;\n onClose: () => void;\n}\n\nexport function AnnotationList({ anchor, width, onClose }: Props) {\n const items = useAnnotationsList();\n const remove = useAnnotations((s) => s.remove);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const onDown = (e: PointerEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) onClose();\n };\n window.addEventListener(\"pointerdown\", onDown, true);\n return () => window.removeEventListener(\"pointerdown\", onDown, true);\n }, [onClose]);\n\n const top = Math.max(8, anchor.y - 8 - Math.min(window.innerHeight * 0.5, items.length * 60 + 40));\n const left = Math.min(window.innerWidth - 328, anchor.x);\n\n return (\n <div ref={ref} className=\"clickly-list\" style={{ left, top }}>\n {items.length === 0 ? (\n <div className=\"empty\">No annotations yet.</div>\n ) : (\n items.map((a, i) => (\n <div key={a.id} className=\"row\">\n <span className=\"num\">#{i + 1}</span>\n <div className=\"body\">\n <div className=\"selector\">{a.elementPath}</div>\n <p>{a.comment}</p>\n </div>\n <button className=\"remove\" onClick={() => remove(a.id)} title=\"Remove\">\n <IconClose />\n </button>\n </div>\n ))\n )}\n </div>\n );\n}\n","import { useRef, useState } from \"react\";\nimport type { SelectionEngine, SelectionMode } from \"@useclickly/core\";\nimport { useDraggable } from \"../hooks/useDraggable\";\nimport { useEngineState } from \"../state/useEngineState\";\nimport { useAnnotations, useAnnotationsList } from \"../state/annotations\";\nimport { useSettings } from \"../state/settings\";\nimport { annotationsToMarkdown } from \"../output/markdown\";\nimport {\n IconCheck,\n IconClose,\n IconCopy,\n IconCursor,\n IconGrip,\n IconLayers,\n IconList,\n IconSettings,\n IconSquare,\n IconTrash,\n} from \"./icons\";\nimport { SettingsPopover } from \"./SettingsPopover\";\nimport { AnnotationList } from \"./AnnotationList\";\n\nconst TOOLBAR_SIZE = { width: 360, height: 40 };\n\ninterface Props {\n engine: SelectionEngine;\n onCollapse: () => void;\n}\n\nexport function Toolbar({ engine, onCollapse }: Props) {\n const state = useEngineState(engine);\n const annotations = useAnnotationsList();\n const clearAnnotations = useAnnotations((s) => s.clear);\n const outputDetail = useSettings((s) => s.outputDetail);\n\n const [showSettings, setShowSettings] = useState(false);\n const [showList, setShowList] = useState(false);\n const anchorRef = useRef<HTMLDivElement>(null);\n\n const { position, handleProps } = useDraggable(\n {\n x: Math.max(8, window.innerWidth - TOOLBAR_SIZE.width - 16),\n y: Math.max(8, window.innerHeight - TOOLBAR_SIZE.height - 16),\n },\n TOOLBAR_SIZE,\n );\n\n const isActive = state.kind !== \"idle\";\n const currentMode: SelectionMode | null =\n state.kind === \"inspect\" || state.kind === \"pressed\" || state.kind === \"dragging\"\n ? state.mode\n : null;\n const pinnedCount =\n state.kind === \"inspect\" || state.kind === \"pressed\" || state.kind === \"dragging\"\n ? state.pinned.length\n : 0;\n\n const setMode = (m: SelectionMode) => {\n if (!isActive) engine.activate(m);\n else engine.setMode(m);\n };\n\n const onCopy = async () => {\n const md = annotationsToMarkdown(annotations, outputDetail);\n try {\n await navigator.clipboard.writeText(md);\n } catch {\n /* ignore */\n }\n };\n\n const onClear = () => {\n if (annotations.length === 0) return;\n if (confirm(`Clear ${annotations.length} annotation(s)?`)) clearAnnotations();\n };\n\n return (\n <div\n ref={anchorRef}\n className=\"clickly-toolbar\"\n style={{ left: position.x, top: position.y, width: TOOLBAR_SIZE.width }}\n aria-label=\"Clickly toolbar\"\n >\n <div className=\"grip\" {...handleProps} title=\"Drag to move\">\n <IconGrip />\n </div>\n\n <button\n className={`clickly-btn icon-only${currentMode === \"single\" ? \" is-active\" : \"\"}`}\n onClick={() => setMode(\"single\")}\n title=\"Single (1)\"\n >\n <IconCursor />\n </button>\n <button\n className={`clickly-btn icon-only${currentMode === \"multi\" ? \" is-active\" : \"\"}`}\n onClick={() => setMode(\"multi\")}\n title=\"Multi-select (2 / shift-click)\"\n >\n <IconLayers />\n </button>\n <button\n className={`clickly-btn icon-only${currentMode === \"area\" ? \" is-active\" : \"\"}`}\n onClick={() => setMode(\"area\")}\n title=\"Area drag (3)\"\n >\n <IconSquare />\n </button>\n\n <div className=\"divider\" />\n\n {pinnedCount > 0 && (\n <>\n <button\n className=\"clickly-btn primary-pinned\"\n onClick={() => engine.annotatePinned()}\n title={`Annotate the ${pinnedCount} pinned element(s) (Enter)`}\n >\n <IconCheck />\n Annotate ({pinnedCount})\n </button>\n <button\n className=\"clickly-btn icon-only\"\n onClick={() => engine.clearPinned()}\n title=\"Clear pinned (Esc)\"\n >\n <IconClose />\n </button>\n <div className=\"divider\" />\n </>\n )}\n\n <button\n className=\"clickly-btn\"\n onClick={() => setShowList((v) => !v)}\n title=\"Annotations (L)\"\n >\n <IconList />\n {annotations.length > 0 && (\n <span className=\"clickly-counter\">{annotations.length}</span>\n )}\n </button>\n\n <button\n className=\"clickly-btn icon-only\"\n onClick={onCopy}\n title=\"Copy markdown (C)\"\n disabled={annotations.length === 0}\n >\n <IconCopy />\n </button>\n <button\n className=\"clickly-btn icon-only\"\n onClick={onClear}\n title=\"Clear (X)\"\n disabled={annotations.length === 0}\n >\n <IconTrash />\n </button>\n\n <div className=\"divider\" />\n\n <button\n className=\"clickly-btn icon-only\"\n onClick={() => setShowSettings((v) => !v)}\n title=\"Settings\"\n >\n <IconSettings />\n </button>\n <button\n className=\"clickly-btn icon-only\"\n onClick={onCollapse}\n title=\"Collapse (Esc)\"\n >\n <IconClose />\n </button>\n\n {showSettings && (\n <SettingsPopover\n anchor={{ x: position.x, y: position.y }}\n width={TOOLBAR_SIZE.width}\n onClose={() => setShowSettings(false)}\n />\n )}\n\n {showList && (\n <AnnotationList\n anchor={{ x: position.x, y: position.y }}\n width={TOOLBAR_SIZE.width}\n onClose={() => setShowList(false)}\n />\n )}\n </div>\n );\n}\n","import { useAnnotationsList } from \"../state/annotations\";\nimport { IconCursor } from \"./icons\";\n\ninterface Props {\n onExpand: () => void;\n}\n\n/**\n * Default state — a small round button anchored bottom-right.\n * Click to expand the full toolbar.\n */\nexport function CollapsedFAB({ onExpand }: Props) {\n const annotations = useAnnotationsList();\n return (\n <button\n className=\"clickly-fab\"\n onClick={onExpand}\n title=\"Open Clickly (⌘/Ctrl+Shift+F)\"\n aria-label=\"Open Clickly toolbar\"\n >\n <IconCursor />\n {annotations.length > 0 && (\n <span className=\"clickly-fab-badge\">{annotations.length}</span>\n )}\n </button>\n );\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { nanoid } from \"nanoid\";\nimport {\n collectMetadata,\n type Annotation,\n type SelectionEngine,\n} from \"@useclickly/core\";\nimport { useEngineState } from \"../state/useEngineState\";\nimport { useAnnotations } from \"../state/annotations\";\nimport { useSettings } from \"../state/settings\";\nimport { annotationsToMarkdown } from \"../output/markdown\";\n\nconst POPUP_W = 320;\nconst POPUP_H_EST = 200;\n\nexport function AnnotationPopup({ engine }: { engine: SelectionEngine }) {\n const state = useEngineState(engine);\n const addAnnotation = useAnnotations((s) => s.add);\n const copyOnAdd = useSettings((s) => s.copyOnAdd);\n const outputDetail = useSettings((s) => s.outputDetail);\n\n const [comment, setComment] = useState(\"\");\n const taRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n if (state.kind === \"annotating\") {\n setComment(\"\");\n requestAnimationFrame(() => taRef.current?.focus());\n }\n }, [state.kind]);\n\n const onKey = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n cancel();\n }\n if (e.key === \"Enter\" && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n submit();\n }\n };\n\n const cancel = () => engine.commit();\n\n const submit = () => {\n if (state.kind !== \"annotating\") return;\n const sel = engine.resolveSelection();\n if (!sel) return;\n\n const elements: Element[] =\n sel.kind === \"single\" ? [sel.element] : sel.elements;\n if (elements.length === 0) return;\n\n // For multi / area selections, create one annotation per element — they\n // all share the same comment but each pins its own element on the page.\n const sharedComment = comment.trim() || \"(no comment)\";\n const isMulti = sel.kind !== \"single\";\n for (const el of elements) {\n const md = collectMetadata(el, { detail: outputDetail });\n const annotation: Annotation = {\n id: \"ann_\" + nanoid(8),\n comment: sharedComment,\n element: md.element,\n elementPath: md.elementPath,\n fullPath: md.fullPath,\n timestamp: Date.now(),\n x: md.boundingBox.x + md.boundingBox.width / 2,\n y: md.boundingBox.y + window.scrollY,\n url: location.href,\n boundingBox: md.boundingBox,\n cssClasses: md.cssClasses || undefined,\n computedStyles: stringifyStyles(md.computedStyles),\n accessibility: md.accessibility || undefined,\n nearbyText: md.nearbyText || undefined,\n selectedText: md.selectedText || undefined,\n isFixed: md.isFixed || undefined,\n isMultiSelect: isMulti,\n kind: \"feedback\",\n status: \"pending\",\n };\n addAnnotation(annotation);\n }\n\n if (copyOnAdd) {\n const all = useAnnotations.getState().list();\n navigator.clipboard\n ?.writeText(annotationsToMarkdown(all, outputDetail))\n .catch(() => undefined);\n }\n\n engine.commit();\n };\n\n const placement = useMemo(() => {\n if (state.kind !== \"annotating\") return null;\n const sel = engine.resolveSelection();\n if (!sel) return null;\n const rect = anchorRect(sel);\n if (!rect) return null;\n let top = rect.bottom + 8;\n let left = rect.left;\n if (top + POPUP_H_EST > window.innerHeight) {\n top = Math.max(8, rect.top - POPUP_H_EST - 8);\n }\n if (left + POPUP_W > window.innerWidth) {\n left = Math.max(8, window.innerWidth - POPUP_W - 8);\n }\n return { top, left, label: describeSelection(sel) };\n }, [state, engine]);\n\n if (state.kind !== \"annotating\" || !placement) return null;\n\n return (\n <div className=\"clickly-popup\" style={{ top: placement.top, left: placement.left }}>\n <div className=\"target-info\">\n <span>{placement.label}</span>\n <span>{state.selection.kind}</span>\n </div>\n <textarea\n ref={taRef}\n value={comment}\n placeholder=\"Describe the issue or change… (⌘/Ctrl + Enter to submit)\"\n onChange={(e) => setComment(e.target.value)}\n onKeyDown={onKey}\n />\n <div className=\"row\">\n <button className=\"ghost\" onClick={cancel}>\n Cancel\n </button>\n <button className=\"primary\" onClick={submit}>\n Add\n </button>\n </div>\n </div>\n );\n}\n\n/* ─── small helpers ────────────────────────────────────────────── */\n\nfunction stringifyStyles(styles: Record<string, string>): string | undefined {\n const entries = Object.entries(styles);\n if (entries.length === 0) return undefined;\n return entries.map(([k, v]) => `${k}: ${v}`).join(\"; \");\n}\n\nfunction anchorRect(\n sel: ReturnType<SelectionEngine[\"resolveSelection\"]>,\n): DOMRect | null {\n if (!sel) return null;\n if (sel.kind === \"single\") return sel.element.getBoundingClientRect();\n if (sel.kind === \"area\") {\n return new DOMRect(sel.rect.x, sel.rect.y, sel.rect.width, sel.rect.height);\n }\n if (sel.elements.length === 0) return null;\n return sel.elements[0]!.getBoundingClientRect();\n}\n\nfunction describeSelection(\n sel: NonNullable<ReturnType<SelectionEngine[\"resolveSelection\"]>>,\n): string {\n if (sel.kind === \"single\") {\n const m = collectMetadata(sel.element, { detail: \"compact\" });\n return m.elementPath;\n }\n if (sel.kind === \"area\") return `area · ${sel.elements.length} element(s)`;\n return `${sel.elements.length} element(s)`;\n}\n","import { useEffect, useState } from \"react\";\nimport type { Annotation } from \"@useclickly/core\";\nimport { useAnnotations, useAnnotationsList } from \"../state/annotations\";\n\n/**\n * Persistent numbered markers anchored to annotated elements. Updates\n * on scroll/resize (RAF-coalesced) and re-resolves the live element by\n * its stored `elementPath` selector on each render — so pins follow\n * the actual element when layout changes, falling back to the stored\n * bounding box if the selector no longer matches.\n */\nexport function AnnotationPins() {\n const annotations = useAnnotationsList();\n // Bump on scroll/resize to recompute positions. RAF-coalesced.\n const [, setVersion] = useState(0);\n useEffect(() => {\n let raf: number | null = null;\n const update = () => {\n if (raf !== null) return;\n raf = requestAnimationFrame(() => {\n raf = null;\n setVersion((v) => v + 1);\n });\n };\n window.addEventListener(\"scroll\", update, { capture: true, passive: true });\n window.addEventListener(\"resize\", update, { passive: true });\n return () => {\n if (raf !== null) cancelAnimationFrame(raf);\n window.removeEventListener(\"scroll\", update, { capture: true } as EventListenerOptions);\n window.removeEventListener(\"resize\", update);\n };\n }, []);\n\n return (\n <>\n {annotations.map((a, i) => (\n <Pin key={a.id} number={i + 1} annotation={a} />\n ))}\n </>\n );\n}\n\nfunction Pin({ number, annotation }: { number: number; annotation: Annotation }) {\n const remove = useAnnotations((s) => s.remove);\n const [hovered, setHovered] = useState(false);\n\n const pos = resolvePosition(annotation);\n if (!pos) return null;\n\n return (\n <div\n className=\"clickly-pin\"\n style={{ left: pos.x, top: pos.y }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n role=\"button\"\n tabIndex={0}\n title={annotation.comment}\n >\n <span className=\"clickly-pin-num\">{number}</span>\n {hovered && (\n <div className=\"clickly-pin-bubble\">\n <div className=\"clickly-pin-comment\">{annotation.comment}</div>\n <div className=\"clickly-pin-meta\">{annotation.elementPath}</div>\n <button\n className=\"clickly-pin-remove\"\n onClick={(e) => {\n e.stopPropagation();\n remove(annotation.id);\n }}\n >\n Remove\n </button>\n </div>\n )}\n </div>\n );\n}\n\nfunction resolvePosition(a: Annotation): { x: number; y: number } | null {\n // Prefer the live element via its short selector.\n if (a.elementPath) {\n try {\n const el = document.querySelector(a.elementPath);\n if (el) {\n const r = el.getBoundingClientRect();\n if (r.width || r.height) return { x: r.right - 11, y: r.top - 11 };\n }\n } catch {\n /* invalid selector — fall through to bbox */\n }\n }\n // Fallback: stored bounding box (won't follow layout changes, but lets\n // the pin still appear if the element was removed from the DOM).\n if (a.boundingBox) {\n return {\n x: a.boundingBox.x + a.boundingBox.width - 11,\n y: a.boundingBox.y - 11,\n };\n }\n return null;\n}\n","import { useEffect, useState } from \"react\";\nimport type { SelectionEngine } from \"@useclickly/core\";\nimport { Toolbar } from \"./Toolbar\";\nimport { CollapsedFAB } from \"./CollapsedFAB\";\nimport { AnnotationPopup } from \"./AnnotationPopup\";\nimport { AnnotationPins } from \"./AnnotationPins\";\nimport { useAnnotations } from \"../state/annotations\";\nimport { annotationsToMarkdown } from \"../output/markdown\";\nimport { useSettings } from \"../state/settings\";\nimport { useEngineState } from \"../state/useEngineState\";\n\n/**\n * Top-level React subtree rendered (via createPortal) inside the\n * shadow root. Owns:\n *\n * - the expanded ↔ collapsed UI state\n * - all keyboard shortcuts (delegating engine actions to the engine)\n * - the body `data-clickly-active` attribute used to flip the page\n * cursor to crosshair while inspecting\n */\nexport function ClicklyRoot({\n engine,\n host,\n}: {\n engine: SelectionEngine;\n host: HTMLElement;\n}) {\n const [expanded, setExpanded] = useState(false);\n const clearAnnotations = useAnnotations((s) => s.clear);\n const outputDetail = useSettings((s) => s.outputDetail);\n const markerColor = useSettings((s) => s.markerColor);\n const engineState = useEngineState(engine);\n\n // Apply user-chosen marker color → updates the shadow root's CSS vars.\n useEffect(() => {\n host.style.setProperty(\"--clickly-hover\", markerColor);\n }, [host, markerColor]);\n\n // Activate engine while expanded; deactivate when collapsed.\n useEffect(() => {\n if (expanded) {\n if (engine.getSnapshot().kind === \"idle\") engine.activate(\"single\");\n } else {\n if (engine.getSnapshot().kind !== \"idle\") engine.deactivate();\n }\n }, [expanded, engine]);\n\n // Body attributes — host page can target our active state + mode in\n // CSS. We use these to disable text selection + swap the cursor while\n // inspecting (see internal/globalStyles.ts).\n useEffect(() => {\n const active = engineState.kind !== \"idle\";\n if (active) document.body.setAttribute(\"data-clickly-active\", \"\");\n else document.body.removeAttribute(\"data-clickly-active\");\n\n const mode =\n engineState.kind === \"inspect\" ||\n engineState.kind === \"pressed\" ||\n engineState.kind === \"dragging\"\n ? engineState.mode\n : null;\n if (mode) document.body.setAttribute(\"data-clickly-mode\", mode);\n else document.body.removeAttribute(\"data-clickly-mode\");\n\n // Suppress the crosshair while the popup is open — typing in the\n // comment textarea should not feel like an inspection.\n if (engineState.kind === \"annotating\") {\n document.body.setAttribute(\"data-clickly-annotating\", \"\");\n } else {\n document.body.removeAttribute(\"data-clickly-annotating\");\n }\n\n return () => {\n document.body.removeAttribute(\"data-clickly-active\");\n document.body.removeAttribute(\"data-clickly-mode\");\n document.body.removeAttribute(\"data-clickly-annotating\");\n };\n }, [engineState]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const tag = (e.target as HTMLElement | null)?.tagName;\n if (tag === \"INPUT\" || tag === \"TEXTAREA\") return;\n if ((e.target as HTMLElement | null)?.isContentEditable) return;\n const active = document.activeElement;\n if (active && (active.tagName === \"TEXTAREA\" || active.tagName === \"INPUT\")) return;\n\n // Toggle FAB ↔ toolbar\n if (e.key.toLowerCase() === \"f\" && e.shiftKey && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n setExpanded((v) => !v);\n return;\n }\n\n // Escape:\n // - if popup open (annotating) → engine handles cancel\n // - else collapse the toolbar\n if (e.key === \"Escape\") {\n if (engine.getSnapshot().kind === \"annotating\") return;\n if (expanded) setExpanded(false);\n return;\n }\n\n if (!expanded) return;\n\n if (e.key === \"1\") engine.setMode(\"single\");\n if (e.key === \"2\") engine.setMode(\"multi\");\n if (e.key === \"3\") engine.setMode(\"area\");\n\n // Enter: commit pinned selection → open popup\n if (e.key === \"Enter\") {\n const s = engine.getSnapshot();\n if (s.kind === \"inspect\" && s.pinned.length > 0) {\n e.preventDefault();\n engine.annotatePinned();\n }\n }\n\n if (e.key === \"c\" || e.key === \"C\") {\n const list = useAnnotations.getState().list();\n if (list.length === 0) return;\n e.preventDefault();\n navigator.clipboard?.writeText(annotationsToMarkdown(list, outputDetail));\n }\n if (e.key === \"x\" || e.key === \"X\") {\n if (useAnnotations.getState().list().length === 0) return;\n e.preventDefault();\n clearAnnotations();\n }\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [clearAnnotations, outputDetail, expanded, engine]);\n\n return (\n <div className=\"clickly-ui\">\n {/* Pins persist regardless of expanded state, so users always see\n which elements they've annotated. */}\n <AnnotationPins />\n {expanded ? (\n <>\n <Toolbar engine={engine} onCollapse={() => setExpanded(false)} />\n <AnnotationPopup engine={engine} />\n </>\n ) : (\n <CollapsedFAB onExpand={() => setExpanded(true)} />\n )}\n </div>\n );\n}\n","/**\n * CSS injected into the shadow root by the React layer. Separate from\n * the overlay-marker CSS in `@useclickly/core/styles` so each package owns\n * its surface.\n */\nexport const REACT_UI_CSS = `\n.clickly-ui, .clickly-ui * { box-sizing: border-box; }\n\n/* ─── Floating action button (collapsed state) ──────────────────── */\n\n.clickly-fab {\n position: fixed;\n right: 16px;\n bottom: 16px;\n width: 48px;\n height: 48px;\n border: none;\n border-radius: 999px;\n background: #0f172a;\n color: #f8fafc;\n display: grid;\n place-items: center;\n cursor: pointer;\n pointer-events: auto;\n user-select: none;\n box-shadow:\n 0 8px 24px rgba(0,0,0,0.30),\n 0 0 0 1px rgba(255,255,255,0.06) inset;\n transition: transform 140ms ease, box-shadow 140ms ease;\n z-index: 1;\n}\n.clickly-fab:hover {\n transform: scale(1.06);\n box-shadow:\n 0 10px 28px rgba(0,0,0,0.36),\n 0 0 0 1px rgba(255,255,255,0.10) inset;\n}\n.clickly-fab:active { transform: scale(0.96); }\n.clickly-fab svg { width: 18px; height: 18px; color: #f8fafc; }\n\n.clickly-fab-badge {\n position: absolute;\n top: -2px;\n right: -2px;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n background: #f59e0b;\n color: #0f172a;\n font: 600 11px -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n border-radius: 9px;\n display: grid;\n place-items: center;\n pointer-events: none;\n}\n\n/* ─── Toolbar (expanded state) ──────────────────────────────────── */\n\n.clickly-toolbar {\n position: fixed;\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px;\n background: rgba(15, 23, 42, 0.94);\n color: #f8fafc;\n border-radius: 12px;\n font: 13px/1 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n box-shadow: 0 8px 24px rgba(0,0,0,0.3), 0 0 0 1px rgba(255,255,255,0.06) inset;\n pointer-events: auto;\n user-select: none;\n z-index: 1;\n animation: clickly-fade-in 120ms ease-out;\n}\n\n@keyframes clickly-fade-in {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n.clickly-toolbar .grip {\n display: grid;\n place-items: center;\n width: 24px;\n height: 28px;\n color: #94a3b8;\n touch-action: none;\n}\n\n.clickly-toolbar .divider {\n width: 1px;\n height: 18px;\n background: rgba(255,255,255,0.12);\n margin: 0 2px;\n}\n\n.clickly-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n height: 28px;\n padding: 0 8px;\n background: transparent;\n border: none;\n border-radius: 8px;\n color: #cbd5e1;\n cursor: pointer;\n font: inherit;\n}\n.clickly-btn:hover { background: rgba(255,255,255,0.08); color: #fff; }\n.clickly-btn:active { background: rgba(255,255,255,0.14); }\n.clickly-btn.is-active { background: #0ea5e9; color: #fff; }\n.clickly-btn[disabled] { opacity: 0.4; cursor: not-allowed; }\n\n.clickly-btn.icon-only {\n width: 28px;\n padding: 0;\n justify-content: center;\n}\n\n.clickly-btn.primary-pinned {\n background: #10b981;\n color: #fff;\n font-weight: 500;\n}\n.clickly-btn.primary-pinned:hover {\n background: #059669;\n color: #fff;\n}\n\n/* ─── Popup & popovers ──────────────────────────────────────────── */\n\n.clickly-popup, .clickly-popover {\n position: fixed;\n background: #fff;\n color: #0f172a;\n border-radius: 10px;\n box-shadow: 0 12px 32px rgba(2,6,23,0.18), 0 0 0 1px rgba(15,23,42,0.06);\n font: 13px/1.5 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n pointer-events: auto;\n z-index: 2;\n animation: clickly-fade-in 120ms ease-out;\n}\n\n.clickly-popup { width: 320px; padding: 12px; }\n\n.clickly-popup .target-info {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n margin-bottom: 8px;\n color: #475569;\n font-size: 11px;\n font-family: ui-monospace, \"SF Mono\", Menlo, monospace;\n}\n\n.clickly-popup textarea {\n width: 100%;\n min-height: 64px;\n max-height: 160px;\n padding: 8px;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n resize: vertical;\n font: inherit;\n color: inherit;\n}\n.clickly-popup textarea:focus {\n outline: none;\n border-color: #0ea5e9;\n box-shadow: 0 0 0 3px rgba(14,165,233,0.18);\n}\n\n.clickly-popup .row {\n display: flex;\n justify-content: flex-end;\n gap: 6px;\n margin-top: 10px;\n}\n\n.clickly-popup .row .ghost {\n background: transparent;\n color: #475569;\n border: 1px solid #e2e8f0;\n}\n.clickly-popup .row .ghost:hover { background: #f8fafc; }\n\n.clickly-popup .row .primary {\n background: #0ea5e9;\n color: #fff;\n border: none;\n}\n.clickly-popup .row .primary:hover { background: #0284c7; }\n.clickly-popup .row button {\n height: 28px;\n padding: 0 12px;\n border-radius: 6px;\n font: inherit;\n cursor: pointer;\n}\n\n.clickly-popover { width: 260px; padding: 12px; }\n.clickly-popover h4 { margin: 0 0 8px; font-size: 12px; color: #475569; text-transform: uppercase; letter-spacing: 0.05em; }\n.clickly-popover .field { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 6px 0; font-size: 13px; }\n.clickly-popover select { font: inherit; padding: 4px 6px; border-radius: 4px; border: 1px solid #e2e8f0; }\n.clickly-popover input[type=\"color\"] { width: 28px; height: 24px; padding: 0; border: 1px solid #e2e8f0; border-radius: 4px; background: none; }\n\n.clickly-counter {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n border-radius: 9px;\n background: #f59e0b;\n color: #1f2937;\n font-size: 11px;\n font-weight: 600;\n margin-left: 4px;\n}\n\n/* ─── Annotation pins (persistent numbered markers) ─────────────── */\n\n.clickly-pin {\n position: fixed;\n width: 22px;\n height: 22px;\n border-radius: 999px;\n background: #f59e0b;\n color: #0f172a;\n font: 600 12px/22px -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n text-align: center;\n cursor: pointer;\n pointer-events: auto;\n user-select: none;\n box-shadow: 0 2px 6px rgba(0,0,0,0.25), 0 0 0 2px #fff;\n z-index: 1;\n transition: transform 100ms ease;\n}\n.clickly-pin:hover { transform: scale(1.12); }\n.clickly-pin-num { display: block; }\n\n.clickly-pin-bubble {\n position: absolute;\n top: 28px;\n left: 0;\n width: 240px;\n padding: 8px 10px;\n background: #fff;\n color: #0f172a;\n border-radius: 8px;\n box-shadow: 0 8px 24px rgba(2,6,23,0.18), 0 0 0 1px rgba(15,23,42,0.06);\n font: 13px/1.4 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n text-align: left;\n cursor: default;\n z-index: 3;\n animation: clickly-fade-in 100ms ease-out;\n}\n.clickly-pin-comment { word-break: break-word; }\n.clickly-pin-meta {\n margin-top: 6px;\n font-family: ui-monospace, \"SF Mono\", Menlo, monospace;\n font-size: 11px;\n color: #475569;\n word-break: break-all;\n}\n.clickly-pin-remove {\n margin-top: 8px;\n padding: 4px 8px;\n border: 1px solid #fecaca;\n background: #fff;\n color: #b91c1c;\n border-radius: 4px;\n font: 11px inherit;\n cursor: pointer;\n}\n.clickly-pin-remove:hover { background: #fef2f2; }\n\n/* ─── Annotation list ───────────────────────────────────────────── */\n\n.clickly-list {\n position: fixed;\n max-height: 50vh;\n width: 320px;\n overflow-y: auto;\n background: #fff;\n border-radius: 10px;\n box-shadow: 0 12px 32px rgba(2,6,23,0.18), 0 0 0 1px rgba(15,23,42,0.06);\n color: #0f172a;\n font: 12px/1.4 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n pointer-events: auto;\n z-index: 2;\n animation: clickly-fade-in 120ms ease-out;\n}\n.clickly-list .row { display: flex; gap: 8px; padding: 8px 10px; border-bottom: 1px solid #f1f5f9; }\n.clickly-list .row:last-child { border-bottom: none; }\n.clickly-list .num { color: #94a3b8; min-width: 18px; }\n.clickly-list .selector { color: #475569; font-family: ui-monospace, \"SF Mono\", Menlo, monospace; font-size: 11px; word-break: break-all; }\n.clickly-list .body { flex: 1; min-width: 0; }\n.clickly-list .body p { margin: 2px 0 0; word-break: break-word; }\n.clickly-list button.remove {\n background: transparent;\n border: none;\n color: #94a3b8;\n cursor: pointer;\n padding: 2px;\n display: grid;\n place-items: center;\n}\n.clickly-list button.remove svg { width: 12px; height: 12px; }\n.clickly-list button.remove:hover { color: #ef4444; }\n.clickly-list .empty { padding: 20px; text-align: center; color: #94a3b8; }\n`;\n","/**\n * CSS injected into `document.head` (NOT the shadow root). Targets the\n * host page body to:\n *\n * - disable text selection while we're inspecting/pressed/dragging\n * (otherwise the browser tries to select text mid-drag and the\n * marquee never starts)\n * - swap the cursor to crosshair in area mode for a clear UX cue\n *\n * Mounted by `Clickly.tsx`, torn down on unmount.\n */\nexport const GLOBAL_PAGE_CSS = `\nbody[data-clickly-active] {\n -webkit-user-select: none !important;\n user-select: none !important;\n}\nbody[data-clickly-active],\nbody[data-clickly-active] *:not(input):not(textarea):not(select) {\n cursor: crosshair !important;\n}\nbody[data-clickly-mode=\"multi\"],\nbody[data-clickly-mode=\"multi\"] *:not(input):not(textarea):not(select) {\n cursor: copy !important;\n}\n/* Restore normal cursor while the annotation popup is open so the user\n can comfortably type in the textarea + click the buttons. */\nbody[data-clickly-annotating] {\n cursor: default !important;\n}\n`;\n","import { useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n Overlay,\n SelectionEngine,\n createShadowHost,\n type ShadowHost,\n} from \"@useclickly/core\";\nimport { ClicklyRoot } from \"./internal/ClicklyRoot\";\nimport { REACT_UI_CSS } from \"./internal/styles\";\nimport { GLOBAL_PAGE_CSS } from \"./internal/globalStyles\";\n\nexport interface ClicklyProps {\n /** Custom class on the host element (for z-index / positioning overrides). */\n className?: string;\n /** Optional MCP server endpoint, e.g. \"http://localhost:4747\". */\n endpoint?: string;\n /** Join an existing MCP session by ID. */\n sessionId?: string;\n\n /* Lifecycle callbacks (Phase 6+ will wire these to annotation events) */\n onAnnotationAdd?: (id: string) => void;\n onAnnotationDelete?: (id: string) => void;\n onAnnotationsClear?: () => void;\n onCopy?: (markdown: string) => void;\n onSessionCreated?: (sessionId: string) => void;\n}\n\ninterface Mount {\n shadow: ShadowHost;\n engine: SelectionEngine;\n overlay: Overlay;\n portal: HTMLDivElement;\n}\n\n/**\n * Mount once near the root of your React app. Dev-only by convention:\n *\n * ```tsx\n * {process.env.NODE_ENV === \"development\" && <Clickly />}\n * ```\n *\n * Renders a small floating button (FAB) in the bottom-right corner.\n * Click it (or press `⌘/Ctrl+Shift+F`) to open the full toolbar.\n */\nexport function Clickly({ className }: ClicklyProps = {}) {\n const [mount, setMount] = useState<Mount | null>(null);\n\n useEffect(() => {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return;\n\n let shadow: ShadowHost | null = null;\n let engine: SelectionEngine | null = null;\n let overlay: Overlay | null = null;\n let portal: HTMLDivElement | null = null;\n\n try {\n shadow = createShadowHost({ document });\n\n portal = document.createElement(\"div\");\n portal.setAttribute(\"data-clickly-react-root\", \"\");\n shadow.root.appendChild(portal);\n\n if (!shadow.root.querySelector(\"style[data-clickly-react]\")) {\n const style = document.createElement(\"style\");\n style.setAttribute(\"data-clickly-react\", \"\");\n style.textContent = REACT_UI_CSS;\n shadow.root.appendChild(style);\n }\n\n // Document-level styles (cursor + text-select inhibitor) — these\n // can't live inside the shadow root because they target body.\n if (!document.head.querySelector(\"style[data-clickly-globals]\")) {\n const gstyle = document.createElement(\"style\");\n gstyle.setAttribute(\"data-clickly-globals\", \"\");\n gstyle.textContent = GLOBAL_PAGE_CSS;\n document.head.appendChild(gstyle);\n }\n\n engine = new SelectionEngine({ document, host: shadow.host });\n overlay = new Overlay({\n engine,\n root: shadow.root,\n document,\n excludeHost: shadow.host,\n });\n\n setMount({ shadow, engine, overlay, portal });\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(\"[clickly] failed to mount\", err);\n overlay?.destroy();\n engine?.destroy();\n portal?.remove();\n shadow?.destroy();\n }\n\n return () => {\n setMount(null);\n overlay?.destroy();\n engine?.destroy();\n portal?.remove();\n shadow?.destroy();\n document.head.querySelector(\"style[data-clickly-globals]\")?.remove();\n document.body.removeAttribute(\"data-clickly-active\");\n document.body.removeAttribute(\"data-clickly-mode\");\n };\n }, []);\n\n useEffect(() => {\n if (!mount || !className) return;\n mount.shadow.host.className = className;\n return () => {\n if (mount.shadow.host.isConnected) mount.shadow.host.className = \"\";\n };\n }, [mount, className]);\n\n if (!mount) return null;\n return createPortal(\n <ClicklyRoot engine={mount.engine} host={mount.shadow.host} />,\n mount.portal,\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/hooks/useDraggable.ts","../src/state/useEngineState.ts","../src/state/annotations.ts","../src/state/settings.ts","../src/output/markdown.ts","../src/internal/icons.tsx","../src/internal/SettingsPopover.tsx","../src/internal/AnnotationList.tsx","../src/internal/Toolbar.tsx","../src/internal/CollapsedFAB.tsx","../src/internal/AnnotationPopup.tsx","../src/internal/AnnotationPins.tsx","../src/internal/ClicklyRoot.tsx","../src/internal/styles.ts","../src/internal/globalStyles.ts","../src/Clickly.tsx"],"names":["useState","useRef","useCallback","useEffect","useSyncExternalStore","create","useShallow","jsx","jsxs","Fragment","collectMetadata","nanoid","useMemo","createShadowHost","SelectionEngine","Overlay","createPortal"],"mappings":";;;;;;;;;;;AA0BO,SAAS,YAAA,CACd,YACA,IAAA,EACc;AACd,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAmB,UAAU,CAAA;AAC7D,EAAA,MAAM,CAAC,UAAA,EAAY,WAAW,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,QAAA,GAAWC,aAAoD,IAAI,CAAA;AAEzE,EAAA,MAAM,aAAA,GAAgBC,iBAAA;AAAA,IACpB,CAAC,CAAA,KAA0B;AACzB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAC,CAAA,CAAE,MAAA,CAAmB,iBAAA,GAAoB,CAAA,CAAE,SAAS,CAAA;AACrD,MAAA,QAAA,CAAS,OAAA,GAAU;AAAA,QACjB,SAAS,EAAE,CAAA,EAAG,EAAE,OAAA,EAAS,CAAA,EAAG,EAAE,OAAA,EAAQ;AAAA,QACtC,GAAA,EAAK;AAAA,OACP;AACA,MAAA,WAAA,CAAY,IAAI,CAAA;AAAA,IAClB,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAoB;AAClC,MAAA,MAAM,IAAI,QAAA,CAAS,OAAA;AACnB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,OAAA,CAAQ,CAAA;AACjC,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,OAAA,CAAQ,CAAA;AACjC,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,GAAa,IAAA,CAAK,KAAA,GAAQ,CAAA;AAC9C,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,WAAA,GAAc,IAAA,CAAK,MAAA,GAAS,CAAA;AAChD,MAAA,WAAA,CAAY;AAAA,QACV,CAAA,EAAG,KAAA,CAAM,CAAA,CAAE,GAAA,CAAI,CAAA,GAAI,EAAA,EAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,QAC3C,CAAA,EAAG,KAAA,CAAM,CAAA,CAAE,GAAA,CAAI,CAAA,GAAI,EAAA,EAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC;AAAA,OAC5C,CAAA;AAAA,IACH,CAAA;AACA,IAAA,MAAM,OAAO,MAAM;AACjB,MAAA,WAAA,CAAY,KAAK,CAAA;AACjB,MAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,IACrB,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,eAAe,MAAM,CAAA;AAC7C,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,IAAI,CAAA;AACzC,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,eAAe,MAAM,CAAA;AAChD,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,IAAI,CAAA;AAAA,IAC9C,CAAA;AAAA,EACF,GAAG,CAAC,UAAA,EAAY,KAAK,MAAA,EAAQ,IAAA,CAAK,KAAK,CAAC,CAAA;AAExC,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA,EAAa;AAAA,MACX,aAAA;AAAA,MACA,OAAO,EAAE,MAAA,EAAQ,aAAa,UAAA,GAAa,MAAA,EAAQ,aAAa,MAAA;AAAO,KACzE;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,KAAA,CAAM,CAAA,EAAW,EAAA,EAAY,EAAA,EAAoB;AACxD,EAAA,OAAO,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,GAAA,CAAI,EAAA,EAAI,CAAC,CAAC,CAAA;AACrC;AC/EO,SAAS,eAAe,MAAA,EAA6C;AAC1E,EAAA,OAAOC,0BAAA;AAAA,IACL,CAAC,EAAA,KAAQ,MAAA,GAAS,OAAO,SAAA,CAAU,EAAE,IAAI,MAAM;AAAA,IAAC,CAAA;AAAA,IAChD,MAAO,MAAA,GAAS,MAAA,CAAO,WAAA,EAAY,GAAI,IAAA;AAAA,IACvC,MAAM;AAAA,GACR;AACF;AAEA,IAAM,IAAA,GAAoB,EAAE,IAAA,EAAM,MAAA,EAAO;ACElC,IAAM,cAAA,GAAiBC,cAAA,CAAyB,CAAC,GAAA,EAAK,GAAA,MAAS;AAAA,EACpE,MAAM,EAAC;AAAA,EACP,OAAO,EAAC;AAAA,EAER,GAAA,EAAK,CAAC,CAAA,KACJ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACV,IAAA,EAAM,EAAE,GAAG,CAAA,CAAE,MAAM,CAAC,CAAA,CAAE,EAAE,GAAG,CAAA,EAAE;AAAA,IAC7B,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,QAAA,CAAS,EAAE,EAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAC,GAAG,CAAA,CAAE,KAAA,EAAO,EAAE,EAAE;AAAA,GAC7D,CAAE,CAAA;AAAA,EAEJ,MAAA,EAAQ,CAAC,EAAA,KACP,GAAA,CAAI,CAAC,CAAA,KAAM;AACT,IAAA,IAAI,EAAE,EAAA,IAAM,CAAA,CAAE,IAAA,CAAA,EAAO,OAAO,CAAA;AAC5B,IAAA,MAAM,IAAA,GAAO,EAAE,GAAG,CAAA,CAAE,IAAA,EAAK;AACzB,IAAA,OAAO,KAAK,EAAE,CAAA;AACd,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,EAAE,CAAA,EAAE;AAAA,EAC9D,CAAC,CAAA;AAAA,EAEH,QAAQ,CAAC,EAAA,EAAI,KAAA,KACX,GAAA,CAAI,CAAC,CAAA,KAAM;AACT,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AACrB,IAAA,IAAI,CAAC,KAAK,OAAO,CAAA;AACjB,IAAA,OAAO,EAAE,IAAA,EAAM,EAAE,GAAG,EAAE,IAAA,EAAM,CAAC,EAAE,GAAG,EAAE,GAAG,GAAA,EAAK,GAAG,KAAA,IAAQ,EAAE;AAAA,EAC3D,CAAC,CAAA;AAAA,EAEH,KAAA,EAAO,MAAM,GAAA,CAAI,EAAE,IAAA,EAAM,EAAC,EAAG,KAAA,EAAO,EAAC,EAAG,CAAA;AAAA,EAExC,MAAM,MAAM;AACV,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,GAAA,EAAI;AAC5B,IAAA,OAAO,KAAA,CAAM,IAAI,CAAC,EAAA,KAAO,KAAK,EAAE,CAAC,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAAA,EACnD;AACF,CAAA,CAAE;AASK,SAAS,kBAAA,GAAmC;AACjD,EAAA,OAAO,cAAA;AAAA,IACLC,kBAAA,CAAW,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,GAAA,CAAI,CAAC,EAAA,KAAO,CAAA,CAAE,KAAK,EAAE,CAAC,CAAA,CAAE,MAAA,CAAO,OAAO,CAAiB;AAAA,GACnF;AACF;AC7CO,IAAM,QAAA,GAAqB;AAAA,EAChC,YAAA,EAAc,UAAA;AAAA,EACd,SAAA,EAAW,IAAA;AAAA,EACX,mBAAA,EAAqB,IAAA;AAAA,EACrB,WAAA,EAAa;AACf;AAEA,IAAM,WAAA,GAAc,kBAAA;AAEpB,SAAS,IAAA,GAAiB;AACxB,EAAA,IAAI,OAAO,YAAA,KAAiB,WAAA,EAAa,OAAO,QAAA;AAChD,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,OAAA,CAAQ,WAAW,CAAA;AAC5C,IAAA,IAAI,CAAC,KAAK,OAAO,QAAA;AACjB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,OAAO,EAAE,GAAG,QAAA,EAAU,GAAG,MAAA,EAAO;AAAA,EAClC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,QAAA;AAAA,EACT;AACF;AAEA,SAAS,QAAQ,CAAA,EAAa;AAC5B,EAAA,IAAI,OAAO,iBAAiB,WAAA,EAAa;AACzC,EAAA,IAAI;AACF,IAAA,YAAA,CAAa,OAAA,CAAQ,WAAA,EAAa,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,EACrD,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEO,IAAM,WAAA,GAAcD,cAAAA,CAAsB,CAAC,GAAA,MAAS;AAAA,EACzD,GAAG,IAAA,EAAK;AAAA,EACR,GAAA,EAAK,CAAC,KAAA,KACJ,GAAA,CAAI,CAAC,GAAA,KAAQ;AACX,IAAA,MAAM,IAAA,GAAO,EAAE,GAAG,GAAA,EAAK,GAAG,KAAA,EAAM;AAChC,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AAAA,EACH,OAAO,MAAM;AACX,IAAA,OAAA,CAAQ,QAAQ,CAAA;AAChB,IAAA,GAAA,CAAI,QAAQ,CAAA;AAAA,EACd;AACF,CAAA,CAAE;;;AClDK,SAAS,qBAAA,CACd,WAAA,EACA,MAAA,GAAuB,UAAA,EACf;AACR,EAAA,IAAI,CAAC,WAAA,CAAY,MAAA,EAAQ,OAAO,kBAAA;AAChC,EAAA,OAAO,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,SAAA,CAAU,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,MAAM,CAAC,CAAA,CAAE,KAAK,MAAM,CAAA;AAC3E;AAEA,SAAS,SAAA,CAAU,CAAA,EAAe,KAAA,EAAe,MAAA,EAA8B;AAC7E,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,KAAK,CAAA,CAAE,CAAA;AACpC,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ,CAAA,eAAA,EAAkB,CAAA,CAAE,OAAO,CAAA,EAAG,EAAE,UAAA,GAAa,GAAA,GAAM,CAAA,CAAE,UAAA,CAAW,MAAM,GAAG,CAAA,CAAE,IAAA,CAAK,GAAG,IAAI,EAAE,CAAA,EAAA;AAAA,GAC3F;AACA,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,CAAA,CAAE,WAAW,CAAA,EAAA,CAAI,CAAA;AAC3C,EAAA,IAAI,MAAA,KAAW,SAAA,IAAa,CAAA,CAAE,WAAA,EAAa;AACzC,IAAA,MAAM,IAAI,CAAA,CAAE,WAAA;AACZ,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,cAAA,EAAiB,KAAK,KAAA,CAAM,CAAA,CAAE,CAAC,CAAC,CAAA,IAAA,EAAO,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAC,CAAC,CAAA,IAAA,EAAO,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,KAAK,CAAC,OAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,MAAM,CAAC,CAAA,GAAA;AAAA,KAC1G;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,KAAW,SAAA,IAAa,CAAA,CAAE,UAAA,EAAY;AACxC,IAAA,KAAA,CAAM,IAAA,CAAK,iBAAiB,CAAA,CAAE,UAAU,IAAI,CAAA,CAAE,UAAA,IAAc,GAAG,CAAA,EAAA,CAAI,CAAA;AAAA,EACrE;AACA,EAAA,IAAI,MAAA,KAAW,UAAA,IAAc,MAAA,KAAW,UAAA,EAAY;AAClD,IAAA,IAAI,EAAE,eAAA,EAAiB,KAAA,CAAM,KAAK,CAAA,WAAA,EAAc,CAAA,CAAE,eAAe,CAAA,CAAE,CAAA;AACnE,IAAA,IAAI,CAAA,CAAE,UAAA,EAAY,KAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAE,UAAA,EAAY,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,EAChF;AACA,EAAA,IAAI,MAAA,KAAW,UAAA,IAAc,CAAA,CAAE,cAAA,EAAgB;AAC7C,IAAA,KAAA,CAAM,IAAA,CAAK,6BAAA,GAAgC,CAAA,CAAE,cAAA,GAAiB,OAAO,CAAA;AAAA,EACvE;AACA,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACvC,EAAA,IAAI,EAAE,QAAA,EAAU,KAAA,CAAM,KAAK,CAAA,cAAA,EAAiB,CAAA,CAAE,QAAQ,CAAA,CAAE,CAAA;AACxD,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,QAAA,CAAS,GAAW,CAAA,EAAmB;AAC9C,EAAA,OAAO,CAAA,CAAE,UAAU,CAAA,GAAI,CAAA,GAAI,EAAE,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA,GAAI,QAAA;AACjD;AC7CA,SAAS,IAAA,CAAK;AAAA,EACZ,QAAA;AAAA,EACA,IAAA,GAAO;AACT,CAAA,EAGG;AACD,EAAA,uBACEE,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,IAAA;AAAA,MACP,MAAA,EAAQ,IAAA;AAAA,MACR,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,GAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,aAAA,EAAY,MAAA;AAAA,MAEX;AAAA;AAAA,GACH;AAEJ;AAEO,IAAM,UAAA,GAAa,sBACxBA,cAAA,CAAC,IAAA,EAAA,EACC,yCAAC,MAAA,EAAA,EAAK,CAAA,EAAE,sBAAqB,CAAA,EAC/B,CAAA;AAGK,IAAM,UAAA,GAAa,sBACxBC,eAAA,CAAC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,kBAAAD,cAAA,CAAC,MAAA,EAAA,EAAK,GAAE,wBAAA,EAAyB,CAAA;AAAA,kBACjCA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,eAAA,EAAgB,CAAA;AAAA,kBACxBA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,eAAA,EAAgB;AAAA,CAAA,EAC1B,CAAA;AAGK,IAAM,aAAa,sBACxBA,cAAA,CAAC,QACC,QAAA,kBAAAA,cAAA,CAAC,MAAA,EAAA,EAAK,GAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,IAAG,GAAA,EAAI,eAAA,EAAgB,OAAM,CAAA,EACxE,CAAA;AAGK,IAAM,QAAA,GAAW,sBACtBC,eAAA,CAAC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,kBAAAD,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,kBAChDA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0BAAA,EAA2B;AAAA,CAAA,EACrC,CAAA;AAGK,IAAM,SAAA,GAAY,sBACvBA,cAAA,CAAC,IAAA,EAAA,EACC,yCAAC,MAAA,EAAA,EAAK,CAAA,EAAE,4FAA2F,CAAA,EACrG,CAAA;AAGK,IAAM,YAAA,GAAe,sBAC1BC,eAAA,CAAC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,kBAAAD,cAAA,CAAC,YAAO,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI,CAAA;AAAA,kBAC9BA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,ilBAAA,EAAklB;AAAA,CAAA,EAC5lB,CAAA;AAGK,IAAM,QAAA,GAAW,sBACtBC,eAAA,CAAC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,kBAAAD,cAAA,CAAC,YAAO,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,GAAE,GAAA,EAAI,CAAA;AAAA,iCAC3B,QAAA,EAAA,EAAO,EAAA,EAAG,KAAI,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI,CAAA;AAAA,iCAC5B,QAAA,EAAA,EAAO,EAAA,EAAG,KAAI,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI,CAAA;AAAA,iCAC5B,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,GAAA,EAAI,GAAE,GAAA,EAAI,CAAA;AAAA,iCAC5B,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI,CAAA;AAAA,iCAC7B,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI;AAAA,CAAA,EAChC,CAAA;AAGK,IAAM,SAAA,GAAY,sBACvBA,cAAA,CAAC,IAAA,EAAA,EACC,yCAAC,MAAA,EAAA,EAAK,CAAA,EAAE,wBAAuB,CAAA,EACjC,CAAA;AAGK,IAAM,SAAA,GAAY,sBACvBA,cAAA,CAAC,IAAA,EAAA,EACC,yCAAC,MAAA,EAAA,EAAK,CAAA,EAAE,kBAAiB,CAAA,EAC3B,CAAA;AAGK,IAAM,QAAA,GAAW,sBACtBA,cAAA,CAAC,IAAA,EAAA,EACC,yCAAC,MAAA,EAAA,EAAK,CAAA,EAAE,qDAAoD,CAAA,EAC9D,CAAA;ACnFK,SAAS,eAAA,CAAgB,EAAE,MAAA,EAAQ,KAAA,EAAO,SAAQ,EAAU;AACjE,EAAA,MAAM,GAAA,GAAMN,aAAuB,IAAI,CAAA;AACvC,EAAA,MAAM,IAAI,WAAA,EAAY;AAEtB,EAAAE,gBAAU,MAAM;AACd,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAoB;AAClC,MAAA,IAAI,GAAA,CAAI,WAAW,CAAC,GAAA,CAAI,QAAQ,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,EAAG,OAAA,EAAQ;AAAA,IACtE,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAA,EAAe,MAAA,EAAQ,IAAI,CAAA;AACnD,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,aAAA,EAAe,QAAQ,IAAI,CAAA;AAAA,EACrE,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,IAAI,GAAG,CAAA;AACtC,EAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,MAAA,CAAO,aAAa,GAAA,EAAK,MAAA,CAAO,CAAA,GAAI,KAAA,GAAQ,GAAG,CAAA;AAErE,EAAA,uBACEK,eAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAU,mBAAkB,KAAA,EAAO,EAAE,IAAA,EAAM,GAAA,EAAI,EAC5D,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,QAAG,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,oBAEZC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,OAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,cAAAA,CAAC,OAAA,EAAA,EAAM,OAAA,EAAQ,gBAAA,EAAiB,QAAA,EAAA,eAAA,EAAa,CAAA;AAAA,sBAC7CC,eAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAG,gBAAA;AAAA,UACH,OAAO,CAAA,CAAE,YAAA;AAAA,UACT,QAAA,EAAU,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,CAAI,EAAE,YAAA,EAAc,CAAA,CAAE,MAAA,CAAO,KAAA,EAAuB,CAAA;AAAA,UAEvE,QAAA,EAAA;AAAA,4BAAAD,cAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,SAAA,EAAU,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,4BAC/BA,cAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,YAAW,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,4BACjCA,cAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,YAAW,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,4BACjCA,cAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,YAAW,QAAA,EAAA,UAAA,EAAQ;AAAA;AAAA;AAAA;AACnC,KAAA,EACF,CAAA;AAAA,oBAEAC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,OAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,cAAAA,CAAC,OAAA,EAAA,EAAM,OAAA,EAAQ,cAAA,EAAe,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,sBACzCA,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAG,cAAA;AAAA,UACH,IAAA,EAAK,UAAA;AAAA,UACL,SAAS,CAAA,CAAE,SAAA;AAAA,UACX,QAAA,EAAU,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,CAAI,EAAE,SAAA,EAAW,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS;AAAA;AAAA;AACxD,KAAA,EACF,CAAA;AAAA,oBAEAC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,OAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,cAAAA,CAAC,OAAA,EAAA,EAAM,OAAA,EAAQ,eAAA,EAAgB,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,sBAC/CA,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAG,eAAA;AAAA,UACH,IAAA,EAAK,UAAA;AAAA,UACL,SAAS,CAAA,CAAE,mBAAA;AAAA,UACX,QAAA,EAAU,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,CAAI,EAAE,mBAAA,EAAqB,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS;AAAA;AAAA;AAClE,KAAA,EACF,CAAA;AAAA,oBAEAC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,OAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,cAAAA,CAAC,OAAA,EAAA,EAAM,OAAA,EAAQ,eAAA,EAAgB,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,sBAC3CA,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAG,eAAA;AAAA,UACH,IAAA,EAAK,OAAA;AAAA,UACL,OAAO,CAAA,CAAE,WAAA;AAAA,UACT,QAAA,EAAU,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,CAAI,EAAE,WAAA,EAAa,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO;AAAA;AAAA;AACxD,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AChEO,SAAS,cAAA,CAAe,EAAE,MAAA,EAAQ,KAAA,EAAO,SAAQ,EAAU;AAChE,EAAA,MAAM,QAAQ,kBAAA,EAAmB;AACjC,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAC7C,EAAA,MAAM,GAAA,GAAMN,aAAuB,IAAI,CAAA;AAEvC,EAAAE,gBAAU,MAAM;AACd,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAoB;AAClC,MAAA,IAAI,GAAA,CAAI,WAAW,CAAC,GAAA,CAAI,QAAQ,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,EAAG,OAAA,EAAQ;AAAA,IACtE,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAA,EAAe,MAAA,EAAQ,IAAI,CAAA;AACnD,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,aAAA,EAAe,QAAQ,IAAI,CAAA;AAAA,EACrE,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,cAAc,GAAA,EAAK,KAAA,CAAM,MAAA,GAAS,EAAA,GAAK,EAAE,CAAC,CAAA;AACjG,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,OAAO,UAAA,GAAa,GAAA,EAAK,OAAO,CAAC,CAAA;AAEvD,EAAA,uBACEI,cAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAU,cAAA,EAAe,KAAA,EAAO,EAAE,IAAA,EAAM,GAAA,EAAI,EACxD,QAAA,EAAA,KAAA,CAAM,WAAW,CAAA,mBAChBA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,OAAA,EAAQ,QAAA,EAAA,qBAAA,EAAmB,CAAA,GAE1C,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACZC,eAAAA,CAAC,KAAA,EAAA,EAAe,WAAU,KAAA,EACxB,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,KAAA,EAAM,QAAA,EAAA;AAAA,MAAA,GAAA;AAAA,MAAE,CAAA,GAAI;AAAA,KAAA,EAAE,CAAA;AAAA,oBAC9BA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EAAY,YAAE,WAAA,EAAY,CAAA;AAAA,sBACzCA,cAAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,CAAA,CAAE,OAAA,EAAQ;AAAA,KAAA,EAChB,CAAA;AAAA,oBACAA,cAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,QAAA,EAAS,SAAS,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,GAAG,KAAA,EAAM,QAAA,EAC5D,QAAA,kBAAAA,cAAAA,CAAC,aAAU,CAAA,EACb;AAAA,GAAA,EAAA,EARQ,CAAA,CAAE,EASZ,CACD,CAAA,EAEL,CAAA;AAEJ;ACxBA,IAAM,YAAA,GAAe,EAAE,KAAA,EAAO,GAAA,EAAK,QAAQ,EAAA,EAAG;AAOvC,SAAS,OAAA,CAAQ,EAAE,MAAA,EAAQ,UAAA,EAAW,EAAU;AACrD,EAAA,MAAM,KAAA,GAAQ,eAAe,MAAM,CAAA;AACnC,EAAA,MAAM,cAAc,kBAAA,EAAmB;AACvC,EAAA,MAAM,gBAAA,GAAmB,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AACtD,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AAEtD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIP,eAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,SAAA,GAAYC,aAAuB,IAAI,CAAA;AAE7C,EAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAY,GAAI,YAAA;AAAA,IAChC;AAAA,MACE,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,UAAA,GAAa,YAAA,CAAa,QAAQ,EAAE,CAAA;AAAA,MAC1D,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,WAAA,GAAc,YAAA,CAAa,SAAS,EAAE;AAAA,KAC9D;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,QAAA,GAAW,MAAM,IAAA,KAAS,MAAA;AAChC,EAAA,MAAM,WAAA,GACJ,KAAA,CAAM,IAAA,KAAS,SAAA,IAAa,KAAA,CAAM,IAAA,KAAS,SAAA,IAAa,KAAA,CAAM,IAAA,KAAS,UAAA,GACnE,KAAA,CAAM,IAAA,GACN,IAAA;AACN,EAAA,MAAM,WAAA,GACJ,KAAA,CAAM,IAAA,KAAS,SAAA,IAAa,KAAA,CAAM,IAAA,KAAS,SAAA,IAAa,KAAA,CAAM,IAAA,KAAS,UAAA,GACnE,KAAA,CAAM,MAAA,CAAO,MAAA,GACb,CAAA;AAEN,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAqB;AACpC,IAAA,IAAI,CAAC,QAAA,EAAU,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA;AAAA,SAC3B,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,EACvB,CAAA;AAEA,EAAA,MAAM,SAAS,YAAY;AACzB,IAAA,MAAM,EAAA,GAAK,qBAAA,CAAsB,WAAA,EAAa,YAAY,CAAA;AAC1D,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,EAAE,CAAA;AAAA,IACxC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC9B,IAAA,IAAI,QAAQ,CAAA,MAAA,EAAS,WAAA,CAAY,MAAM,CAAA,eAAA,CAAiB,GAAG,gBAAA,EAAiB;AAAA,EAC9E,CAAA;AAEA,EAAA,uBACEO,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,SAAA;AAAA,MACL,SAAA,EAAU,iBAAA;AAAA,MACV,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,CAAS,CAAA,EAAG,KAAK,QAAA,CAAS,CAAA,EAAG,KAAA,EAAO,YAAA,CAAa,KAAA,EAAM;AAAA,MACtE,YAAA,EAAW,iBAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAD,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,MAAA;AAAA,YACT,GAAG,WAAA;AAAA,YACJ,KAAA,EAAM,cAAA;AAAA,YACN,IAAA,EAAK,WAAA;AAAA,YACL,kBAAA,EAAiB,UAAA;AAAA,YAEjB,QAAA,kBAAAA,eAAC,QAAA,EAAA,EAAS;AAAA;AAAA,SACZ;AAAA,wBAEAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA,qBAAA,EAAwB,WAAA,KAAgB,QAAA,GAAW,eAAe,EAAE,CAAA,CAAA;AAAA,YAC/E,OAAA,EAAS,MAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,YAC/B,KAAA,EAAM,YAAA;AAAA,YACN,YAAA,EAAW,+BAAA;AAAA,YACX,gBAAc,WAAA,KAAgB,QAAA;AAAA,YAE9B,QAAA,kBAAAA,eAAC,UAAA,EAAA,EAAW;AAAA;AAAA,SACd;AAAA,wBACAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA,qBAAA,EAAwB,WAAA,KAAgB,OAAA,GAAU,eAAe,EAAE,CAAA,CAAA;AAAA,YAC9E,OAAA,EAAS,MAAM,OAAA,CAAQ,OAAO,CAAA;AAAA,YAC9B,KAAA,EAAM,gCAAA;AAAA,YACN,YAAA,EAAW,8BAAA;AAAA,YACX,gBAAc,WAAA,KAAgB,OAAA;AAAA,YAE9B,QAAA,kBAAAA,eAAC,UAAA,EAAA,EAAW;AAAA;AAAA,SACd;AAAA,wBACAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA,qBAAA,EAAwB,WAAA,KAAgB,MAAA,GAAS,eAAe,EAAE,CAAA,CAAA;AAAA,YAC7E,OAAA,EAAS,MAAM,OAAA,CAAQ,MAAM,CAAA;AAAA,YAC7B,KAAA,EAAM,eAAA;AAAA,YACN,YAAA,EAAW,0BAAA;AAAA,YACX,gBAAc,WAAA,KAAgB,MAAA;AAAA,YAE9B,QAAA,kBAAAA,eAAC,UAAA,EAAA,EAAW;AAAA;AAAA,SACd;AAAA,wBAEAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,QAExB,WAAA,GAAc,CAAA,oBACbC,eAAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAD,eAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,4BAAA;AAAA,cACV,OAAA,EAAS,MAAM,MAAA,CAAO,cAAA,EAAe;AAAA,cACrC,KAAA,EAAO,gBAAgB,WAAW,CAAA,0BAAA,CAAA;AAAA,cAElC,QAAA,EAAA;AAAA,gCAAAD,eAAC,SAAA,EAAA,EAAU,CAAA;AAAA,gBAAE,YAAA;AAAA,gBACF,WAAA;AAAA,gBAAY;AAAA;AAAA;AAAA,WACzB;AAAA,0BACAA,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,uBAAA;AAAA,cACV,OAAA,EAAS,MAAM,MAAA,CAAO,WAAA,EAAY;AAAA,cAClC,KAAA,EAAM,oBAAA;AAAA,cAEN,QAAA,kBAAAA,eAAC,SAAA,EAAA,EAAU;AAAA;AAAA,WACb;AAAA,0BACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU;AAAA,SAAA,EAC3B,CAAA;AAAA,wBAGFC,eAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,aAAA;AAAA,YACV,SAAS,MAAM,WAAA,CAAY,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,YACpC,KAAA,EAAM,iBAAA;AAAA,YAEN,QAAA,EAAA;AAAA,8BAAAD,eAAC,QAAA,EAAA,EAAS,CAAA;AAAA,cACT,WAAA,CAAY,SAAS,CAAA,oBACpBA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAmB,QAAA,EAAA,WAAA,CAAY,MAAA,EAAO;AAAA;AAAA;AAAA,SAE1D;AAAA,wBAEAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,uBAAA;AAAA,YACV,OAAA,EAAS,MAAA;AAAA,YACT,KAAA,EAAM,mBAAA;AAAA,YACN,YAAA,EAAW,kCAAA;AAAA,YACX,QAAA,EAAU,YAAY,MAAA,KAAW,CAAA;AAAA,YAEjC,QAAA,kBAAAA,eAAC,QAAA,EAAA,EAAS;AAAA;AAAA,SACZ;AAAA,wBACAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,uBAAA;AAAA,YACV,OAAA,EAAS,OAAA;AAAA,YACT,KAAA,EAAM,WAAA;AAAA,YACN,YAAA,EAAW,uBAAA;AAAA,YACX,QAAA,EAAU,YAAY,MAAA,KAAW,CAAA;AAAA,YAEjC,QAAA,kBAAAA,eAAC,SAAA,EAAA,EAAU;AAAA;AAAA,SACb;AAAA,wBAEAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,wBAEzBA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,uBAAA;AAAA,YACV,SAAS,MAAM,eAAA,CAAgB,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,YACxC,KAAA,EAAM,UAAA;AAAA,YACN,YAAA,EAAW,eAAA;AAAA,YACX,eAAA,EAAe,YAAA;AAAA,YAEf,QAAA,kBAAAA,eAAC,YAAA,EAAA,EAAa;AAAA;AAAA,SAChB;AAAA,wBACAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,uBAAA;AAAA,YACV,OAAA,EAAS,UAAA;AAAA,YACT,KAAA,EAAM,gBAAA;AAAA,YACN,YAAA,EAAW,0BAAA;AAAA,YAEX,QAAA,kBAAAA,eAAC,SAAA,EAAA,EAAU;AAAA;AAAA,SACb;AAAA,QAEC,gCACCA,cAAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACC,QAAQ,EAAE,CAAA,EAAG,SAAS,CAAA,EAAG,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,YACvC,OAAO,YAAA,CAAa,KAAA;AAAA,YACpB,OAAA,EAAS,MAAM,eAAA,CAAgB,KAAK;AAAA;AAAA,SACtC;AAAA,QAGD,4BACCA,cAAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,QAAQ,EAAE,CAAA,EAAG,SAAS,CAAA,EAAG,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,YACvC,OAAO,YAAA,CAAa,KAAA;AAAA,YACpB,OAAA,EAAS,MAAM,WAAA,CAAY,KAAK;AAAA;AAAA;AAClC;AAAA;AAAA,GAEJ;AAEJ;ACxMO,SAAS,YAAA,CAAa,EAAE,QAAA,EAAS,EAAU;AAChD,EAAA,MAAM,cAAc,kBAAA,EAAmB;AACvC,EAAA,uBACEC,eAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,aAAA;AAAA,MACV,OAAA,EAAS,QAAA;AAAA,MACT,KAAA,EAAM,oCAAA;AAAA,MACN,YAAA,EAAW,sBAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAD,eAAC,UAAA,EAAA,EAAW,CAAA;AAAA,QACX,WAAA,CAAY,SAAS,CAAA,oBACpBA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EAAqB,QAAA,EAAA,WAAA,CAAY,MAAA,EAAO;AAAA;AAAA;AAAA,GAE5D;AAEJ;ACdA,IAAM,OAAA,GAAU,GAAA;AAChB,IAAM,WAAA,GAAc,GAAA;AAEb,SAAS,eAAA,CAAgB,EAAE,MAAA,EAAO,EAAgC;AACvE,EAAA,MAAM,KAAA,GAAQ,eAAe,MAAM,CAAA;AACnC,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,GAAG,CAAA;AACjD,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AAChD,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AAEtD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIP,eAAS,EAAE,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQC,aAA4B,IAAI,CAAA;AAE9C,EAAAE,gBAAU,MAAM;AACd,IAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC/B,MAAA,UAAA,CAAW,EAAE,CAAA;AACb,MAAA,qBAAA,CAAsB,MAAM,KAAA,CAAM,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,IACpD;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,CAAM,IAAI,CAAC,CAAA;AAEf,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAgD;AAC7D,IAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,MAAA,EAAO;AAAA,IACT;AACA,IAAA,IAAI,EAAE,GAAA,KAAQ,OAAA,KAAY,CAAA,CAAE,OAAA,IAAW,EAAE,OAAA,CAAA,EAAU;AACjD,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,MAAA,EAAO;AAAA,IACT;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,MAAA,EAAO;AAEnC,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AACjC,IAAA,MAAM,GAAA,GAAM,OAAO,gBAAA,EAAiB;AACpC,IAAA,IAAI,CAAC,GAAA,EAAK;AAEV,IAAA,MAAM,QAAA,GACJ,IAAI,IAAA,KAAS,QAAA,GAAW,CAAC,GAAA,CAAI,OAAO,IAAI,GAAA,CAAI,QAAA;AAC9C,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAI3B,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,IAAA,EAAK,IAAK,cAAA;AACxC,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,KAAS,QAAA;AAC7B,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,QAAA,EAAS,CAAE,mBAAA;AACzC,IAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,MAAA,MAAM,EAAA,GAAKO,qBAAgB,EAAA,EAAI,EAAE,QAAQ,YAAA,EAAc,YAAA,EAAc,WAAW,CAAA;AAChF,MAAA,MAAM,UAAA,GAAyB;AAAA,QAC7B,EAAA,EAAI,MAAA,GAASC,aAAA,CAAO,CAAC,CAAA;AAAA,QACrB,OAAA,EAAS,aAAA;AAAA,QACT,SAAS,EAAA,CAAG,OAAA;AAAA,QACZ,aAAa,EAAA,CAAG,WAAA;AAAA,QAChB,UAAU,EAAA,CAAG,QAAA;AAAA,QACb,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,GAAG,EAAA,CAAG,WAAA,CAAY,CAAA,GAAI,EAAA,CAAG,YAAY,KAAA,GAAQ,CAAA;AAAA,QAC7C,CAAA,EAAG,EAAA,CAAG,WAAA,CAAY,CAAA,GAAI,MAAA,CAAO,OAAA;AAAA,QAC7B,KAAK,QAAA,CAAS,IAAA;AAAA,QACd,aAAa,EAAA,CAAG,WAAA;AAAA,QAChB,UAAA,EAAY,GAAG,UAAA,IAAc,MAAA;AAAA,QAC7B,cAAA,EAAgB,eAAA,CAAgB,EAAA,CAAG,cAAc,CAAA;AAAA,QACjD,aAAA,EAAe,GAAG,aAAA,IAAiB,MAAA;AAAA,QACnC,UAAA,EAAY,GAAG,UAAA,IAAc,MAAA;AAAA,QAC7B,YAAA,EAAc,GAAG,YAAA,IAAgB,MAAA;AAAA,QACjC,OAAA,EAAS,GAAG,OAAA,IAAW,MAAA;AAAA,QACvB,eAAA,EAAiB,GAAG,eAAA,IAAmB,MAAA;AAAA,QACvC,UAAA,EAAY,GAAG,UAAA,IAAc,MAAA;AAAA,QAC7B,UAAA,EAAY,GAAG,UAAA,IAAc,MAAA;AAAA,QAC7B,YAAA,EAAc,GAAG,YAAA,IAAgB,MAAA;AAAA,QACjC,aAAA,EAAe,OAAA;AAAA,QACf,IAAA,EAAM,UAAA;AAAA,QACN,MAAA,EAAQ;AAAA,OACV;AACA,MAAA,aAAA,CAAc,UAAU,CAAA;AAAA,IAC1B;AAEA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,GAAA,GAAM,cAAA,CAAe,QAAA,EAAS,CAAE,IAAA,EAAK;AAC3C,MAAA,SAAA,CAAU,SAAA,EACN,UAAU,qBAAA,CAAsB,GAAA,EAAK,YAAY,CAAC,CAAA,CACnD,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,IAC1B;AAEA,IAAA,MAAA,CAAO,MAAA,EAAO;AAAA,EAChB,CAAA;AAEA,EAAA,MAAM,SAAA,GAAYC,cAAQ,MAAM;AAC9B,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc,OAAO,IAAA;AACxC,IAAA,MAAM,GAAA,GAAM,OAAO,gBAAA,EAAiB;AACpC,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,IAAA,MAAM,IAAA,GAAO,WAAW,GAAG,CAAA;AAC3B,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,IAAA,IAAI,GAAA,GAAM,KAAK,MAAA,GAAS,CAAA;AACxB,IAAA,IAAI,OAAO,IAAA,CAAK,IAAA;AAChB,IAAA,IAAI,GAAA,GAAM,WAAA,GAAc,MAAA,CAAO,WAAA,EAAa;AAC1C,MAAA,GAAA,GAAM,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,GAAM,cAAc,CAAC,CAAA;AAAA,IAC9C;AACA,IAAA,IAAI,IAAA,GAAO,OAAA,GAAU,MAAA,CAAO,UAAA,EAAY;AACtC,MAAA,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,UAAA,GAAa,UAAU,CAAC,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,EAAE,GAAA,EAAK,IAAA,EAAM,KAAA,EAAO,iBAAA,CAAkB,GAAG,CAAA,EAAE;AAAA,EACpD,CAAA,EAAG,CAAC,KAAA,EAAO,MAAM,CAAC,CAAA;AAElB,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,YAAA,IAAgB,CAAC,WAAW,OAAO,IAAA;AAEtD,EAAA,uBACEJ,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAAgB,KAAA,EAAO,EAAE,GAAA,EAAK,SAAA,CAAU,GAAA,EAAK,IAAA,EAAM,SAAA,CAAU,MAAK,EAC/E,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,SAAA,CAAU,KAAA,EAAM,CAAA;AAAA,sBACvBA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,CAAM,UAAU,IAAA,EAAK;AAAA,KAAA,EAC9B,CAAA;AAAA,oBACAA,cAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,KAAA;AAAA,QACL,KAAA,EAAO,OAAA;AAAA,QACP,WAAA,EAAY,qEAAA;AAAA,QACZ,YAAA,EAAW,oBAAA;AAAA,QACX,UAAU,CAAC,CAAA,KAAM,UAAA,CAAW,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QAC1C,SAAA,EAAW;AAAA;AAAA,KACb;AAAA,oBACAC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,KAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,eAAC,QAAA,EAAA,EAAO,SAAA,EAAU,OAAA,EAAQ,OAAA,EAAS,QAAQ,QAAA,EAAA,QAAA,EAE3C,CAAA;AAAA,sBACAA,cAAAA,CAAC,QAAA,EAAA,EAAO,WAAU,SAAA,EAAU,OAAA,EAAS,QAAQ,QAAA,EAAA,KAAA,EAE7C;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAIA,SAAS,gBAAgB,MAAA,EAAoD;AAC3E,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA;AACrC,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AACjC,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AACxD;AAEA,SAAS,WACP,GAAA,EACgB;AAChB,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,IAAI,IAAI,IAAA,KAAS,QAAA,EAAU,OAAO,GAAA,CAAI,QAAQ,qBAAA,EAAsB;AACpE,EAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AACvB,IAAA,OAAO,IAAI,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,EAC5E;AACA,EAAA,IAAI,GAAA,CAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACtC,EAAA,OAAO,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA,CAAG,qBAAA,EAAsB;AAChD;AAEA,SAAS,kBACP,GAAA,EACQ;AACR,EAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AACzB,IAAA,MAAM,IAAIG,oBAAA,CAAgB,GAAA,CAAI,SAAS,EAAE,MAAA,EAAQ,WAAW,CAAA;AAC5D,IAAA,OAAO,CAAA,CAAE,WAAA;AAAA,EACX;AACA,EAAA,IAAI,IAAI,IAAA,KAAS,MAAA,SAAe,CAAA,UAAA,EAAU,GAAA,CAAI,SAAS,MAAM,CAAA,WAAA,CAAA;AAC7D,EAAA,OAAO,CAAA,EAAG,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA,WAAA,CAAA;AAC/B;ACjKO,SAAS,cAAA,GAAiB;AAC/B,EAAA,MAAM,cAAc,kBAAA,EAAmB;AAEvC,EAAA,MAAM,GAAG,UAAU,CAAA,GAAIV,eAAS,CAAC,CAAA;AACjC,EAAAG,gBAAU,MAAM;AACd,IAAA,IAAI,GAAA,GAAqB,IAAA;AACzB,IAAA,MAAM,SAAS,MAAM;AACnB,MAAA,IAAI,QAAQ,IAAA,EAAM;AAClB,MAAA,GAAA,GAAM,sBAAsB,MAAM;AAChC,QAAA,GAAA,GAAM,IAAA;AACN,QAAA,UAAA,CAAW,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,MACzB,CAAC,CAAA;AAAA,IACH,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,MAAA,EAAQ,EAAE,SAAS,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AAC1E,IAAA,MAAA,CAAO,iBAAiB,QAAA,EAAU,MAAA,EAAQ,EAAE,OAAA,EAAS,MAAM,CAAA;AAC3D,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,GAAA,KAAQ,IAAA,EAAM,oBAAA,CAAqB,GAAG,CAAA;AAC1C,MAAA,MAAA,CAAO,oBAAoB,QAAA,EAAU,MAAA,EAAQ,EAAE,OAAA,EAAS,MAA8B,CAAA;AACtF,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,MAAM,CAAA;AAAA,IAC7C,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACEI,eAAAE,mBAAAA,EAAA,EACG,sBAAY,GAAA,CAAI,CAAC,GAAG,CAAA,qBACnBF,eAAC,GAAA,EAAA,EAAe,MAAA,EAAQ,IAAI,CAAA,EAAG,UAAA,EAAY,KAAjC,CAAA,CAAE,EAAkC,CAC/C,CAAA,EACH,CAAA;AAEJ;AAEA,SAAS,GAAA,CAAI,EAAE,MAAA,EAAQ,UAAA,EAAW,EAA+C;AAC/E,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAC7C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIP,eAAS,KAAK,CAAA;AAE5C,EAAA,MAAM,GAAA,GAAM,gBAAgB,UAAU,CAAA;AACtC,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,EAAA,uBACEQ,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,aAAA;AAAA,MACV,OAAO,EAAE,IAAA,EAAM,IAAI,CAAA,EAAG,GAAA,EAAK,IAAI,CAAA,EAAE;AAAA,MACjC,YAAA,EAAc,MAAM,UAAA,CAAW,IAAI,CAAA;AAAA,MACnC,YAAA,EAAc,MAAM,UAAA,CAAW,KAAK,CAAA;AAAA,MACpC,IAAA,EAAK,QAAA;AAAA,MACL,QAAA,EAAU,CAAA;AAAA,MACV,OAAO,UAAA,CAAW,OAAA;AAAA,MAElB,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAmB,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,QACzC,OAAA,oBACCC,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oBAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAuB,qBAAW,OAAA,EAAQ,CAAA;AAAA,0BACzDA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAAoB,qBAAW,WAAA,EAAY,CAAA;AAAA,0BAC1DA,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,oBAAA;AAAA,cACV,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,gBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,gBAAA,MAAA,CAAO,WAAW,EAAE,CAAA;AAAA,cACtB,CAAA;AAAA,cACD,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EACF;AAAA;AAAA;AAAA,GAEJ;AAEJ;AAEA,SAAS,gBAAgB,CAAA,EAAgD;AAEvE,EAAA,IAAI,EAAE,WAAA,EAAa;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,CAAA,CAAE,WAAW,CAAA;AAC/C,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,MAAM,CAAA,GAAI,GAAG,qBAAA,EAAsB;AACnC,QAAA,IAAI,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,MAAA,EAAQ,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,KAAA,GAAQ,EAAA,EAAI,CAAA,EAAG,CAAA,CAAE,MAAM,EAAA,EAAG;AAAA,MACnE;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,IAAI,EAAE,WAAA,EAAa;AACjB,IAAA,OAAO;AAAA,MACL,GAAG,CAAA,CAAE,WAAA,CAAY,CAAA,GAAI,CAAA,CAAE,YAAY,KAAA,GAAQ,EAAA;AAAA,MAC3C,CAAA,EAAG,CAAA,CAAE,WAAA,CAAY,CAAA,GAAI;AAAA,KACvB;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;ACjFO,SAAS,WAAA,CAAY;AAAA,EAC1B,MAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIP,eAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,gBAAA,GAAmB,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AACtD,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AACtD,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AACpD,EAAA,MAAM,WAAA,GAAc,eAAe,MAAM,CAAA;AAGzC,EAAAG,gBAAU,MAAM;AACd,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,iBAAA,EAAmB,WAAW,CAAA;AAAA,EACvD,CAAA,EAAG,CAAC,IAAA,EAAM,WAAW,CAAC,CAAA;AAGtB,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI,OAAO,WAAA,EAAY,CAAE,SAAS,MAAA,EAAQ,MAAA,CAAO,SAAS,QAAQ,CAAA;AAAA,IACpE,CAAA,MAAO;AACL,MAAA,IAAI,OAAO,WAAA,EAAY,CAAE,IAAA,KAAS,MAAA,SAAe,UAAA,EAAW;AAAA,IAC9D;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,MAAM,CAAC,CAAA;AAKrB,EAAAA,gBAAU,MAAM;AACd,IAAA,MAAM,MAAA,GAAS,YAAY,IAAA,KAAS,MAAA;AACpC,IAAA,IAAI,MAAA,EAAQ,QAAA,CAAS,IAAA,CAAK,YAAA,CAAa,uBAAuB,EAAE,CAAA;AAAA,SAC3D,QAAA,CAAS,IAAA,CAAK,eAAA,CAAgB,qBAAqB,CAAA;AAExD,IAAA,MAAM,IAAA,GACJ,WAAA,CAAY,IAAA,KAAS,SAAA,IACrB,WAAA,CAAY,IAAA,KAAS,SAAA,IACrB,WAAA,CAAY,IAAA,KAAS,UAAA,GACjB,WAAA,CAAY,IAAA,GACZ,IAAA;AACN,IAAA,IAAI,IAAA,EAAM,QAAA,CAAS,IAAA,CAAK,YAAA,CAAa,qBAAqB,IAAI,CAAA;AAAA,SACzD,QAAA,CAAS,IAAA,CAAK,eAAA,CAAgB,mBAAmB,CAAA;AAItD,IAAA,IAAI,WAAA,CAAY,SAAS,YAAA,EAAc;AACrC,MAAA,QAAA,CAAS,IAAA,CAAK,YAAA,CAAa,yBAAA,EAA2B,EAAE,CAAA;AAAA,IAC1D,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,IAAA,CAAK,gBAAgB,yBAAyB,CAAA;AAAA,IACzD;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,IAAA,CAAK,gBAAgB,qBAAqB,CAAA;AACnD,MAAA,QAAA,CAAS,IAAA,CAAK,gBAAgB,mBAAmB,CAAA;AACjD,MAAA,QAAA,CAAS,IAAA,CAAK,gBAAgB,yBAAyB,CAAA;AAAA,IACzD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAAA,gBAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,MAAM,GAAA,GAAO,EAAE,MAAA,EAA+B,OAAA;AAC9C,MAAA,IAAI,GAAA,KAAQ,OAAA,IAAW,GAAA,KAAQ,UAAA,EAAY;AAC3C,MAAA,IAAK,CAAA,CAAE,QAA+B,iBAAA,EAAmB;AACzD,MAAA,MAAM,SAAS,QAAA,CAAS,aAAA;AACxB,MAAA,IAAI,WAAW,MAAA,CAAO,OAAA,KAAY,UAAA,IAAc,MAAA,CAAO,YAAY,OAAA,CAAA,EAAU;AAG7E,MAAA,IAAI,CAAA,CAAE,GAAA,CAAI,WAAA,EAAY,KAAM,GAAA,IAAO,EAAE,QAAA,KAAa,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,CAAA,EAAU;AACzE,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,WAAA,CAAY,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AACrB,QAAA;AAAA,MACF;AAKA,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,QAAA,IAAI,MAAA,CAAO,WAAA,EAAY,CAAE,IAAA,KAAS,YAAA,EAAc;AAChD,QAAA,IAAI,QAAA,cAAsB,KAAK,CAAA;AAC/B,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,QAAA,EAAU;AAEf,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,GAAA,EAAK,MAAA,CAAO,QAAQ,QAAQ,CAAA;AAC1C,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,GAAA,EAAK,MAAA,CAAO,QAAQ,OAAO,CAAA;AACzC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,GAAA,EAAK,MAAA,CAAO,QAAQ,MAAM,CAAA;AAGxC,MAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,QAAA,MAAM,CAAA,GAAI,OAAO,WAAA,EAAY;AAC7B,QAAA,IAAI,EAAE,IAAA,KAAS,SAAA,IAAa,CAAA,CAAE,MAAA,CAAO,SAAS,CAAA,EAAG;AAC/C,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,MAAA,CAAO,cAAA,EAAe;AAAA,QACxB;AAAA,MACF;AAEA,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,GAAA,IAAO,CAAA,CAAE,QAAQ,GAAA,EAAK;AAClC,QAAA,MAAM,IAAA,GAAO,cAAA,CAAe,QAAA,EAAS,CAAE,IAAA,EAAK;AAC5C,QAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACvB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,SAAA,CAAU,SAAA,EAAW,SAAA,CAAU,qBAAA,CAAsB,IAAA,EAAM,YAAY,CAAC,CAAA;AAAA,MAC1E;AACA,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,GAAA,IAAO,CAAA,CAAE,QAAQ,GAAA,EAAK;AAClC,QAAA,IAAI,eAAe,QAAA,EAAS,CAAE,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACnD,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,gBAAA,EAAiB;AAAA,MACnB;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,KAAK,CAAA;AACxC,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC1D,GAAG,CAAC,gBAAA,EAAkB,YAAA,EAAc,QAAA,EAAU,MAAM,CAAC,CAAA;AAErD,EAAA,uBACEK,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EAGb,QAAA,EAAA;AAAA,oBAAAD,eAAC,cAAA,EAAA,EAAe,CAAA;AAAA,IACf,QAAA,mBACCC,eAAAA,CAAAC,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAF,eAAC,OAAA,EAAA,EAAQ,MAAA,EAAgB,YAAY,MAAM,WAAA,CAAY,KAAK,CAAA,EAAG,CAAA;AAAA,sBAC/DA,cAAAA,CAAC,eAAA,EAAA,EAAgB,MAAA,EAAgB;AAAA,KAAA,EACnC,CAAA,mBAEAA,cAAAA,CAAC,YAAA,EAAA,EAAa,UAAU,MAAM,WAAA,CAAY,IAAI,CAAA,EAAG;AAAA,GAAA,EAErD,CAAA;AAEJ;;;AChJO,IAAM,YAAA,GAAe;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;;;ACMrB,IAAM,eAAA,GAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","file":"index.cjs","sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface Position {\n x: number;\n y: number;\n}\n\ninterface DraggableApi {\n position: Position;\n setPosition: (p: Position) => void;\n /** Spread onto the drag handle. */\n handleProps: {\n onPointerDown: (e: React.PointerEvent) => void;\n style: React.CSSProperties;\n };\n isDragging: boolean;\n}\n\n/**\n * In-session drag positioning. Position resets to `defaultPos` whenever\n * the consumer remounts (e.g. toolbar collapse → expand cycle).\n *\n * We deliberately do NOT persist across reloads — users expect the\n * toolbar to come back at its default anchor, not where they last left\n * it three sessions ago. Drag is for \"get out of my way right now\".\n */\nexport function useDraggable(\n defaultPos: Position,\n size: { width: number; height: number },\n): DraggableApi {\n const [position, setPosition] = useState<Position>(defaultPos);\n const [isDragging, setDragging] = useState(false);\n const startRef = useRef<{ pointer: Position; pos: Position } | null>(null);\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent) => {\n e.preventDefault();\n (e.target as Element).setPointerCapture?.(e.pointerId);\n startRef.current = {\n pointer: { x: e.clientX, y: e.clientY },\n pos: position,\n };\n setDragging(true);\n },\n [position],\n );\n\n useEffect(() => {\n if (!isDragging) return;\n const onMove = (e: PointerEvent) => {\n const s = startRef.current;\n if (!s) return;\n const dx = e.clientX - s.pointer.x;\n const dy = e.clientY - s.pointer.y;\n const maxX = window.innerWidth - size.width - 8;\n const maxY = window.innerHeight - size.height - 8;\n setPosition({\n x: clamp(s.pos.x + dx, 8, Math.max(8, maxX)),\n y: clamp(s.pos.y + dy, 8, Math.max(8, maxY)),\n });\n };\n const onUp = () => {\n setDragging(false);\n startRef.current = null;\n };\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n return () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n };\n }, [isDragging, size.height, size.width]);\n\n return {\n position,\n setPosition,\n handleProps: {\n onPointerDown,\n style: { cursor: isDragging ? \"grabbing\" : \"grab\", touchAction: \"none\" },\n },\n isDragging,\n };\n}\n\nfunction clamp(n: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(hi, n));\n}\n","import { useSyncExternalStore } from \"react\";\nimport type { EngineState, SelectionEngine } from \"@useclickly/core\";\n\n/**\n * React-friendly accessor for the SelectionEngine's external store.\n * Engine is already a `Subscribable<EngineState>` — zero adapter code.\n */\nexport function useEngineState(engine: SelectionEngine | null): EngineState {\n return useSyncExternalStore(\n (cb) => (engine ? engine.subscribe(cb) : () => {}),\n () => (engine ? engine.getSnapshot() : IDLE),\n () => IDLE,\n );\n}\n\nconst IDLE: EngineState = { kind: \"idle\" };\n","import type { Annotation } from \"@useclickly/core\";\nimport { create } from \"zustand\";\nimport { useShallow } from \"zustand/react/shallow\";\n\nexport interface AnnotationsStore {\n byId: Record<string, Annotation>;\n order: string[];\n\n add: (a: Annotation) => void;\n remove: (id: string) => void;\n update: (id: string, patch: Partial<Annotation>) => void;\n clear: () => void;\n\n /** Imperative read. Hooks should use `useAnnotationsList()` instead. */\n list: () => Annotation[];\n}\n\nexport const useAnnotations = create<AnnotationsStore>((set, get) => ({\n byId: {},\n order: [],\n\n add: (a) =>\n set((s) => ({\n byId: { ...s.byId, [a.id]: a },\n order: s.order.includes(a.id) ? s.order : [...s.order, a.id],\n })),\n\n remove: (id) =>\n set((s) => {\n if (!(id in s.byId)) return s;\n const next = { ...s.byId };\n delete next[id];\n return { byId: next, order: s.order.filter((x) => x !== id) };\n }),\n\n update: (id, patch) =>\n set((s) => {\n const cur = s.byId[id];\n if (!cur) return s;\n return { byId: { ...s.byId, [id]: { ...cur, ...patch } } };\n }),\n\n clear: () => set({ byId: {}, order: [] }),\n\n list: () => {\n const { byId, order } = get();\n return order.map((id) => byId[id]).filter(Boolean) as Annotation[];\n },\n}));\n\n/**\n * Subscribe to the annotation list with shallow equality — re-renders\n * only when items add/remove/reorder/update. Always use this from\n * component code; never call `useAnnotations(s => s.list())`, which\n * returns a new array reference on every store change and infinite-loops\n * `useSyncExternalStore`.\n */\nexport function useAnnotationsList(): Annotation[] {\n return useAnnotations(\n useShallow((s) => s.order.map((id) => s.byId[id]).filter(Boolean) as Annotation[]),\n );\n}\n","import { create } from \"zustand\";\n\nexport type OutputDetail = \"compact\" | \"standard\" | \"detailed\" | \"forensic\";\n\nexport interface Settings {\n outputDetail: OutputDetail;\n copyOnAdd: boolean;\n showReactComponents: boolean;\n markerColor: string;\n}\n\nexport interface SettingsStore extends Settings {\n set: (patch: Partial<Settings>) => void;\n reset: () => void;\n}\n\nexport const DEFAULTS: Settings = {\n outputDetail: \"standard\",\n copyOnAdd: true,\n showReactComponents: true,\n markerColor: \"#06b6d4\",\n};\n\nconst STORAGE_KEY = \"clickly:settings\";\n\nfunction load(): Settings {\n if (typeof localStorage === \"undefined\") return DEFAULTS;\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (!raw) return DEFAULTS;\n const parsed = JSON.parse(raw) as Partial<Settings>;\n return { ...DEFAULTS, ...parsed };\n } catch {\n return DEFAULTS;\n }\n}\n\nfunction persist(s: Settings) {\n if (typeof localStorage === \"undefined\") return;\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(s));\n } catch {\n /* quota / privacy mode */\n }\n}\n\nexport const useSettings = create<SettingsStore>((set) => ({\n ...load(),\n set: (patch) =>\n set((cur) => {\n const next = { ...cur, ...patch };\n persist(next);\n return next;\n }),\n reset: () => {\n persist(DEFAULTS);\n set(DEFAULTS);\n },\n}));\n","import type { Annotation } from \"@useclickly/core\";\nimport type { OutputDetail } from \"../state/settings\";\n\n/**\n * Phase 5 placeholder formatter — Phase 9 adds the React + Source lines\n * when those fields are populated. Phase 8 replaces the whole thing with\n * a full AFS-compliant implementation.\n */\nexport function annotationsToMarkdown(\n annotations: Annotation[],\n detail: OutputDetail = \"standard\",\n): string {\n if (!annotations.length) return \"(no annotations)\";\n return annotations.map((a, i) => formatOne(a, i + 1, detail)).join(\"\\n\\n\");\n}\n\nfunction formatOne(a: Annotation, index: number, detail: OutputDetail): string {\n const lines: string[] = [];\n lines.push(`## Annotation #${index}`);\n lines.push(\n `**Element:** \\`${a.element}${a.cssClasses ? \".\" + a.cssClasses.split(\" \").join(\".\") : \"\"}\\``,\n );\n lines.push(`**Path:** \\`${a.elementPath}\\``);\n if (detail !== \"compact\" && a.boundingBox) {\n const b = a.boundingBox;\n lines.push(\n `**Position:** ${Math.round(b.x)}px, ${Math.round(b.y)}px (${Math.round(b.width)}×${Math.round(b.height)}px)`,\n );\n }\n // Phase 9: React component tree + source file/line\n if (detail !== \"compact\" && a.sourceFile) {\n lines.push(`**Source:** \\`${a.sourceFile}:${a.sourceLine ?? \"?\"}\\``);\n }\n if (detail === \"detailed\" || detail === \"forensic\") {\n if (a.reactComponents) lines.push(`**React:** ${a.reactComponents}`);\n if (a.nearbyText) lines.push(`**Nearby text:** ${truncate(a.nearbyText, 120)}`);\n }\n if (detail === \"forensic\" && a.computedStyles) {\n lines.push(\"**Computed styles:**\\n```\\n\" + a.computedStyles + \"\\n```\");\n }\n lines.push(`**Feedback:** ${a.comment}`);\n if (a.severity) lines.push(`**Severity:** ${a.severity}`);\n return lines.join(\"\\n\");\n}\n\nfunction truncate(s: string, n: number): string {\n return s.length <= n ? s : s.slice(0, n - 1) + \"…\";\n}\n","// Inline SVG icons — no icon-library dep. 16x16 stroked, currentColor.\n\nfunction Icon({\n children,\n size = 16,\n}: {\n children: React.ReactNode;\n size?: number;\n}) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n {children}\n </svg>\n );\n}\n\nexport const IconCursor = () => (\n <Icon>\n <path d=\"M4 4l6 16 2-7 7-2z\" />\n </Icon>\n);\n\nexport const IconLayers = () => (\n <Icon>\n <path d=\"M12 2l9 5-9 5-9-5 9-5z\" />\n <path d=\"M3 12l9 5 9-5\" />\n <path d=\"M3 17l9 5 9-5\" />\n </Icon>\n);\n\nexport const IconSquare = () => (\n <Icon>\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" strokeDasharray=\"3 3\" />\n </Icon>\n);\n\nexport const IconCopy = () => (\n <Icon>\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" />\n <path d=\"M5 15V5a2 2 0 0 1 2-2h10\" />\n </Icon>\n);\n\nexport const IconTrash = () => (\n <Icon>\n <path d=\"M3 6h18M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2m3 0v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6h14z\" />\n </Icon>\n);\n\nexport const IconSettings = () => (\n <Icon>\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n <path d=\"M19.4 15a1.7 1.7 0 0 0 .34 1.87l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.7 1.7 0 0 0-1.87-.34 1.7 1.7 0 0 0-1.03 1.55V21a2 2 0 1 1-4 0v-.09a1.7 1.7 0 0 0-1.11-1.55 1.7 1.7 0 0 0-1.87.34l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06A1.7 1.7 0 0 0 4.6 15 1.7 1.7 0 0 0 3.04 14H3a2 2 0 1 1 0-4h.09A1.7 1.7 0 0 0 4.64 8.9a1.7 1.7 0 0 0-.34-1.87l-.06-.06A2 2 0 1 1 7.07 4.14l.06.06A1.7 1.7 0 0 0 9 4.54 1.7 1.7 0 0 0 10 3.03V3a2 2 0 1 1 4 0v.09a1.7 1.7 0 0 0 1 1.51 1.7 1.7 0 0 0 1.87-.34l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06A1.7 1.7 0 0 0 19.4 9a1.7 1.7 0 0 0 1.55 1H21a2 2 0 1 1 0 4h-.09a1.7 1.7 0 0 0-1.5 1z\" />\n </Icon>\n);\n\nexport const IconGrip = () => (\n <Icon>\n <circle cx=\"9\" cy=\"6\" r=\"1\" />\n <circle cx=\"9\" cy=\"12\" r=\"1\" />\n <circle cx=\"9\" cy=\"18\" r=\"1\" />\n <circle cx=\"15\" cy=\"6\" r=\"1\" />\n <circle cx=\"15\" cy=\"12\" r=\"1\" />\n <circle cx=\"15\" cy=\"18\" r=\"1\" />\n </Icon>\n);\n\nexport const IconClose = () => (\n <Icon>\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </Icon>\n);\n\nexport const IconCheck = () => (\n <Icon>\n <path d=\"M5 12l5 5L20 7\" />\n </Icon>\n);\n\nexport const IconList = () => (\n <Icon>\n <path d=\"M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01\" />\n </Icon>\n);\n\nexport const IconPower = () => (\n <Icon>\n <path d=\"M12 2v10M18.36 5.64a9 9 0 1 1-12.73 0\" />\n </Icon>\n);\n","import { useEffect, useRef } from \"react\";\nimport { useSettings, type OutputDetail } from \"../state/settings\";\n\ninterface Props {\n anchor: { x: number; y: number };\n width: number;\n onClose: () => void;\n}\n\nexport function SettingsPopover({ anchor, width, onClose }: Props) {\n const ref = useRef<HTMLDivElement>(null);\n const s = useSettings();\n\n useEffect(() => {\n const onDown = (e: PointerEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) onClose();\n };\n window.addEventListener(\"pointerdown\", onDown, true);\n return () => window.removeEventListener(\"pointerdown\", onDown, true);\n }, [onClose]);\n\n // Position above the toolbar.\n const top = Math.max(8, anchor.y - 200);\n const left = Math.min(window.innerWidth - 268, anchor.x + width - 260);\n\n return (\n <div ref={ref} className=\"clickly-popover\" style={{ left, top }}>\n <h4>Settings</h4>\n\n <div className=\"field\">\n <label htmlFor=\"clickly-detail\">Output detail</label>\n <select\n id=\"clickly-detail\"\n value={s.outputDetail}\n onChange={(e) => s.set({ outputDetail: e.target.value as OutputDetail })}\n >\n <option value=\"compact\">Compact</option>\n <option value=\"standard\">Standard</option>\n <option value=\"detailed\">Detailed</option>\n <option value=\"forensic\">Forensic</option>\n </select>\n </div>\n\n <div className=\"field\">\n <label htmlFor=\"clickly-copy\">Copy on add</label>\n <input\n id=\"clickly-copy\"\n type=\"checkbox\"\n checked={s.copyOnAdd}\n onChange={(e) => s.set({ copyOnAdd: e.target.checked })}\n />\n </div>\n\n <div className=\"field\">\n <label htmlFor=\"clickly-react\">React components</label>\n <input\n id=\"clickly-react\"\n type=\"checkbox\"\n checked={s.showReactComponents}\n onChange={(e) => s.set({ showReactComponents: e.target.checked })}\n />\n </div>\n\n <div className=\"field\">\n <label htmlFor=\"clickly-color\">Marker color</label>\n <input\n id=\"clickly-color\"\n type=\"color\"\n value={s.markerColor}\n onChange={(e) => s.set({ markerColor: e.target.value })}\n />\n </div>\n </div>\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport { useAnnotations, useAnnotationsList } from \"../state/annotations\";\nimport { IconClose } from \"./icons\";\n\ninterface Props {\n anchor: { x: number; y: number };\n width: number;\n onClose: () => void;\n}\n\nexport function AnnotationList({ anchor, width, onClose }: Props) {\n const items = useAnnotationsList();\n const remove = useAnnotations((s) => s.remove);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const onDown = (e: PointerEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) onClose();\n };\n window.addEventListener(\"pointerdown\", onDown, true);\n return () => window.removeEventListener(\"pointerdown\", onDown, true);\n }, [onClose]);\n\n const top = Math.max(8, anchor.y - 8 - Math.min(window.innerHeight * 0.5, items.length * 60 + 40));\n const left = Math.min(window.innerWidth - 328, anchor.x);\n\n return (\n <div ref={ref} className=\"clickly-list\" style={{ left, top }}>\n {items.length === 0 ? (\n <div className=\"empty\">No annotations yet.</div>\n ) : (\n items.map((a, i) => (\n <div key={a.id} className=\"row\">\n <span className=\"num\">#{i + 1}</span>\n <div className=\"body\">\n <div className=\"selector\">{a.elementPath}</div>\n <p>{a.comment}</p>\n </div>\n <button className=\"remove\" onClick={() => remove(a.id)} title=\"Remove\">\n <IconClose />\n </button>\n </div>\n ))\n )}\n </div>\n );\n}\n","import { useRef, useState } from \"react\";\nimport type { SelectionEngine, SelectionMode } from \"@useclickly/core\";\nimport { useDraggable } from \"../hooks/useDraggable\";\nimport { useEngineState } from \"../state/useEngineState\";\nimport { useAnnotations, useAnnotationsList } from \"../state/annotations\";\nimport { useSettings } from \"../state/settings\";\nimport { annotationsToMarkdown } from \"../output/markdown\";\nimport {\n IconCheck,\n IconClose,\n IconCopy,\n IconCursor,\n IconGrip,\n IconLayers,\n IconList,\n IconSettings,\n IconSquare,\n IconTrash,\n} from \"./icons\";\nimport { SettingsPopover } from \"./SettingsPopover\";\nimport { AnnotationList } from \"./AnnotationList\";\n\nconst TOOLBAR_SIZE = { width: 360, height: 40 };\n\ninterface Props {\n engine: SelectionEngine;\n onCollapse: () => void;\n}\n\nexport function Toolbar({ engine, onCollapse }: Props) {\n const state = useEngineState(engine);\n const annotations = useAnnotationsList();\n const clearAnnotations = useAnnotations((s) => s.clear);\n const outputDetail = useSettings((s) => s.outputDetail);\n\n const [showSettings, setShowSettings] = useState(false);\n const [showList, setShowList] = useState(false);\n const anchorRef = useRef<HTMLDivElement>(null);\n\n const { position, handleProps } = useDraggable(\n {\n x: Math.max(8, window.innerWidth - TOOLBAR_SIZE.width - 16),\n y: Math.max(8, window.innerHeight - TOOLBAR_SIZE.height - 16),\n },\n TOOLBAR_SIZE,\n );\n\n const isActive = state.kind !== \"idle\";\n const currentMode: SelectionMode | null =\n state.kind === \"inspect\" || state.kind === \"pressed\" || state.kind === \"dragging\"\n ? state.mode\n : null;\n const pinnedCount =\n state.kind === \"inspect\" || state.kind === \"pressed\" || state.kind === \"dragging\"\n ? state.pinned.length\n : 0;\n\n const setMode = (m: SelectionMode) => {\n if (!isActive) engine.activate(m);\n else engine.setMode(m);\n };\n\n const onCopy = async () => {\n const md = annotationsToMarkdown(annotations, outputDetail);\n try {\n await navigator.clipboard.writeText(md);\n } catch {\n /* ignore */\n }\n };\n\n const onClear = () => {\n if (annotations.length === 0) return;\n if (confirm(`Clear ${annotations.length} annotation(s)?`)) clearAnnotations();\n };\n\n return (\n <div\n ref={anchorRef}\n className=\"clickly-toolbar\"\n style={{ left: position.x, top: position.y, width: TOOLBAR_SIZE.width }}\n aria-label=\"Clickly toolbar\"\n >\n <div\n className=\"grip\"\n {...handleProps}\n title=\"Drag to move\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n >\n <IconGrip />\n </div>\n\n <button\n className={`clickly-btn icon-only${currentMode === \"single\" ? \" is-active\" : \"\"}`}\n onClick={() => setMode(\"single\")}\n title=\"Single (1)\"\n aria-label=\"Single-element selection mode\"\n aria-pressed={currentMode === \"single\"}\n >\n <IconCursor />\n </button>\n <button\n className={`clickly-btn icon-only${currentMode === \"multi\" ? \" is-active\" : \"\"}`}\n onClick={() => setMode(\"multi\")}\n title=\"Multi-select (2 / shift-click)\"\n aria-label=\"Multi-element selection mode\"\n aria-pressed={currentMode === \"multi\"}\n >\n <IconLayers />\n </button>\n <button\n className={`clickly-btn icon-only${currentMode === \"area\" ? \" is-active\" : \"\"}`}\n onClick={() => setMode(\"area\")}\n title=\"Area drag (3)\"\n aria-label=\"Area drag-selection mode\"\n aria-pressed={currentMode === \"area\"}\n >\n <IconSquare />\n </button>\n\n <div className=\"divider\" />\n\n {pinnedCount > 0 && (\n <>\n <button\n className=\"clickly-btn primary-pinned\"\n onClick={() => engine.annotatePinned()}\n title={`Annotate the ${pinnedCount} pinned element(s) (Enter)`}\n >\n <IconCheck />\n Annotate ({pinnedCount})\n </button>\n <button\n className=\"clickly-btn icon-only\"\n onClick={() => engine.clearPinned()}\n title=\"Clear pinned (Esc)\"\n >\n <IconClose />\n </button>\n <div className=\"divider\" />\n </>\n )}\n\n <button\n className=\"clickly-btn\"\n onClick={() => setShowList((v) => !v)}\n title=\"Annotations (L)\"\n >\n <IconList />\n {annotations.length > 0 && (\n <span className=\"clickly-counter\">{annotations.length}</span>\n )}\n </button>\n\n <button\n className=\"clickly-btn icon-only\"\n onClick={onCopy}\n title=\"Copy markdown (C)\"\n aria-label=\"Copy all annotations as markdown\"\n disabled={annotations.length === 0}\n >\n <IconCopy />\n </button>\n <button\n className=\"clickly-btn icon-only\"\n onClick={onClear}\n title=\"Clear (X)\"\n aria-label=\"Clear all annotations\"\n disabled={annotations.length === 0}\n >\n <IconTrash />\n </button>\n\n <div className=\"divider\" />\n\n <button\n className=\"clickly-btn icon-only\"\n onClick={() => setShowSettings((v) => !v)}\n title=\"Settings\"\n aria-label=\"Open settings\"\n aria-expanded={showSettings}\n >\n <IconSettings />\n </button>\n <button\n className=\"clickly-btn icon-only\"\n onClick={onCollapse}\n title=\"Collapse (Esc)\"\n aria-label=\"Collapse Clickly toolbar\"\n >\n <IconClose />\n </button>\n\n {showSettings && (\n <SettingsPopover\n anchor={{ x: position.x, y: position.y }}\n width={TOOLBAR_SIZE.width}\n onClose={() => setShowSettings(false)}\n />\n )}\n\n {showList && (\n <AnnotationList\n anchor={{ x: position.x, y: position.y }}\n width={TOOLBAR_SIZE.width}\n onClose={() => setShowList(false)}\n />\n )}\n </div>\n );\n}\n","import { useAnnotationsList } from \"../state/annotations\";\nimport { IconCursor } from \"./icons\";\n\ninterface Props {\n onExpand: () => void;\n}\n\n/**\n * Default state — a small round button anchored bottom-right.\n * Click to expand the full toolbar.\n */\nexport function CollapsedFAB({ onExpand }: Props) {\n const annotations = useAnnotationsList();\n return (\n <button\n className=\"clickly-fab\"\n onClick={onExpand}\n title=\"Open Clickly (⌘/Ctrl+Shift+F)\"\n aria-label=\"Open Clickly toolbar\"\n >\n <IconCursor />\n {annotations.length > 0 && (\n <span className=\"clickly-fab-badge\">{annotations.length}</span>\n )}\n </button>\n );\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { nanoid } from \"nanoid\";\nimport {\n collectMetadata,\n type Annotation,\n type SelectionEngine,\n} from \"@useclickly/core\";\nimport { useEngineState } from \"../state/useEngineState\";\nimport { useAnnotations } from \"../state/annotations\";\nimport { useSettings } from \"../state/settings\";\nimport { annotationsToMarkdown } from \"../output/markdown\";\n\nconst POPUP_W = 320;\nconst POPUP_H_EST = 200;\n\nexport function AnnotationPopup({ engine }: { engine: SelectionEngine }) {\n const state = useEngineState(engine);\n const addAnnotation = useAnnotations((s) => s.add);\n const copyOnAdd = useSettings((s) => s.copyOnAdd);\n const outputDetail = useSettings((s) => s.outputDetail);\n\n const [comment, setComment] = useState(\"\");\n const taRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n if (state.kind === \"annotating\") {\n setComment(\"\");\n requestAnimationFrame(() => taRef.current?.focus());\n }\n }, [state.kind]);\n\n const onKey = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n cancel();\n }\n if (e.key === \"Enter\" && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n submit();\n }\n };\n\n const cancel = () => engine.commit();\n\n const submit = () => {\n if (state.kind !== \"annotating\") return;\n const sel = engine.resolveSelection();\n if (!sel) return;\n\n const elements: Element[] =\n sel.kind === \"single\" ? [sel.element] : sel.elements;\n if (elements.length === 0) return;\n\n // For multi / area selections, create one annotation per element — they\n // all share the same comment but each pins its own element on the page.\n const sharedComment = comment.trim() || \"(no comment)\";\n const isMulti = sel.kind !== \"single\";\n const showReact = useSettings.getState().showReactComponents;\n for (const el of elements) {\n const md = collectMetadata(el, { detail: outputDetail, includeReact: showReact });\n const annotation: Annotation = {\n id: \"ann_\" + nanoid(8),\n comment: sharedComment,\n element: md.element,\n elementPath: md.elementPath,\n fullPath: md.fullPath,\n timestamp: Date.now(),\n x: md.boundingBox.x + md.boundingBox.width / 2,\n y: md.boundingBox.y + window.scrollY,\n url: location.href,\n boundingBox: md.boundingBox,\n cssClasses: md.cssClasses || undefined,\n computedStyles: stringifyStyles(md.computedStyles),\n accessibility: md.accessibility || undefined,\n nearbyText: md.nearbyText || undefined,\n selectedText: md.selectedText || undefined,\n isFixed: md.isFixed || undefined,\n reactComponents: md.reactComponents || undefined,\n sourceFile: md.sourceFile || undefined,\n sourceLine: md.sourceLine || undefined,\n sourceColumn: md.sourceColumn || undefined,\n isMultiSelect: isMulti,\n kind: \"feedback\",\n status: \"pending\",\n };\n addAnnotation(annotation);\n }\n\n if (copyOnAdd) {\n const all = useAnnotations.getState().list();\n navigator.clipboard\n ?.writeText(annotationsToMarkdown(all, outputDetail))\n .catch(() => undefined);\n }\n\n engine.commit();\n };\n\n const placement = useMemo(() => {\n if (state.kind !== \"annotating\") return null;\n const sel = engine.resolveSelection();\n if (!sel) return null;\n const rect = anchorRect(sel);\n if (!rect) return null;\n let top = rect.bottom + 8;\n let left = rect.left;\n if (top + POPUP_H_EST > window.innerHeight) {\n top = Math.max(8, rect.top - POPUP_H_EST - 8);\n }\n if (left + POPUP_W > window.innerWidth) {\n left = Math.max(8, window.innerWidth - POPUP_W - 8);\n }\n return { top, left, label: describeSelection(sel) };\n }, [state, engine]);\n\n if (state.kind !== \"annotating\" || !placement) return null;\n\n return (\n <div className=\"clickly-popup\" style={{ top: placement.top, left: placement.left }}>\n <div className=\"target-info\">\n <span>{placement.label}</span>\n <span>{state.selection.kind}</span>\n </div>\n <textarea\n ref={taRef}\n value={comment}\n placeholder=\"Describe the issue or change… (⌘/Ctrl + Enter to submit)\"\n aria-label=\"Annotation comment\"\n onChange={(e) => setComment(e.target.value)}\n onKeyDown={onKey}\n />\n <div className=\"row\">\n <button className=\"ghost\" onClick={cancel}>\n Cancel\n </button>\n <button className=\"primary\" onClick={submit}>\n Add\n </button>\n </div>\n </div>\n );\n}\n\n/* ─── small helpers ────────────────────────────────────────────── */\n\nfunction stringifyStyles(styles: Record<string, string>): string | undefined {\n const entries = Object.entries(styles);\n if (entries.length === 0) return undefined;\n return entries.map(([k, v]) => `${k}: ${v}`).join(\"; \");\n}\n\nfunction anchorRect(\n sel: ReturnType<SelectionEngine[\"resolveSelection\"]>,\n): DOMRect | null {\n if (!sel) return null;\n if (sel.kind === \"single\") return sel.element.getBoundingClientRect();\n if (sel.kind === \"area\") {\n return new DOMRect(sel.rect.x, sel.rect.y, sel.rect.width, sel.rect.height);\n }\n if (sel.elements.length === 0) return null;\n return sel.elements[0]!.getBoundingClientRect();\n}\n\nfunction describeSelection(\n sel: NonNullable<ReturnType<SelectionEngine[\"resolveSelection\"]>>,\n): string {\n if (sel.kind === \"single\") {\n const m = collectMetadata(sel.element, { detail: \"compact\" });\n return m.elementPath;\n }\n if (sel.kind === \"area\") return `area · ${sel.elements.length} element(s)`;\n return `${sel.elements.length} element(s)`;\n}\n","import { useEffect, useState } from \"react\";\nimport type { Annotation } from \"@useclickly/core\";\nimport { useAnnotations, useAnnotationsList } from \"../state/annotations\";\n\n/**\n * Persistent numbered markers anchored to annotated elements. Updates\n * on scroll/resize (RAF-coalesced) and re-resolves the live element by\n * its stored `elementPath` selector on each render — so pins follow\n * the actual element when layout changes, falling back to the stored\n * bounding box if the selector no longer matches.\n */\nexport function AnnotationPins() {\n const annotations = useAnnotationsList();\n // Bump on scroll/resize to recompute positions. RAF-coalesced.\n const [, setVersion] = useState(0);\n useEffect(() => {\n let raf: number | null = null;\n const update = () => {\n if (raf !== null) return;\n raf = requestAnimationFrame(() => {\n raf = null;\n setVersion((v) => v + 1);\n });\n };\n window.addEventListener(\"scroll\", update, { capture: true, passive: true });\n window.addEventListener(\"resize\", update, { passive: true });\n return () => {\n if (raf !== null) cancelAnimationFrame(raf);\n window.removeEventListener(\"scroll\", update, { capture: true } as EventListenerOptions);\n window.removeEventListener(\"resize\", update);\n };\n }, []);\n\n return (\n <>\n {annotations.map((a, i) => (\n <Pin key={a.id} number={i + 1} annotation={a} />\n ))}\n </>\n );\n}\n\nfunction Pin({ number, annotation }: { number: number; annotation: Annotation }) {\n const remove = useAnnotations((s) => s.remove);\n const [hovered, setHovered] = useState(false);\n\n const pos = resolvePosition(annotation);\n if (!pos) return null;\n\n return (\n <div\n className=\"clickly-pin\"\n style={{ left: pos.x, top: pos.y }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n role=\"button\"\n tabIndex={0}\n title={annotation.comment}\n >\n <span className=\"clickly-pin-num\">{number}</span>\n {hovered && (\n <div className=\"clickly-pin-bubble\">\n <div className=\"clickly-pin-comment\">{annotation.comment}</div>\n <div className=\"clickly-pin-meta\">{annotation.elementPath}</div>\n <button\n className=\"clickly-pin-remove\"\n onClick={(e) => {\n e.stopPropagation();\n remove(annotation.id);\n }}\n >\n Remove\n </button>\n </div>\n )}\n </div>\n );\n}\n\nfunction resolvePosition(a: Annotation): { x: number; y: number } | null {\n // Prefer the live element via its short selector.\n if (a.elementPath) {\n try {\n const el = document.querySelector(a.elementPath);\n if (el) {\n const r = el.getBoundingClientRect();\n if (r.width || r.height) return { x: r.right - 11, y: r.top - 11 };\n }\n } catch {\n /* invalid selector — fall through to bbox */\n }\n }\n // Fallback: stored bounding box (won't follow layout changes, but lets\n // the pin still appear if the element was removed from the DOM).\n if (a.boundingBox) {\n return {\n x: a.boundingBox.x + a.boundingBox.width - 11,\n y: a.boundingBox.y - 11,\n };\n }\n return null;\n}\n","import { useEffect, useState } from \"react\";\nimport type { SelectionEngine } from \"@useclickly/core\";\nimport { Toolbar } from \"./Toolbar\";\nimport { CollapsedFAB } from \"./CollapsedFAB\";\nimport { AnnotationPopup } from \"./AnnotationPopup\";\nimport { AnnotationPins } from \"./AnnotationPins\";\nimport { useAnnotations } from \"../state/annotations\";\nimport { annotationsToMarkdown } from \"../output/markdown\";\nimport { useSettings } from \"../state/settings\";\nimport { useEngineState } from \"../state/useEngineState\";\n\n/**\n * Top-level React subtree rendered (via createPortal) inside the\n * shadow root. Owns:\n *\n * - the expanded ↔ collapsed UI state\n * - all keyboard shortcuts (delegating engine actions to the engine)\n * - the body `data-clickly-active` attribute used to flip the page\n * cursor to crosshair while inspecting\n */\nexport function ClicklyRoot({\n engine,\n host,\n}: {\n engine: SelectionEngine;\n host: HTMLElement;\n}) {\n const [expanded, setExpanded] = useState(false);\n const clearAnnotations = useAnnotations((s) => s.clear);\n const outputDetail = useSettings((s) => s.outputDetail);\n const markerColor = useSettings((s) => s.markerColor);\n const engineState = useEngineState(engine);\n\n // Apply user-chosen marker color → updates the shadow root's CSS vars.\n useEffect(() => {\n host.style.setProperty(\"--clickly-hover\", markerColor);\n }, [host, markerColor]);\n\n // Activate engine while expanded; deactivate when collapsed.\n useEffect(() => {\n if (expanded) {\n if (engine.getSnapshot().kind === \"idle\") engine.activate(\"single\");\n } else {\n if (engine.getSnapshot().kind !== \"idle\") engine.deactivate();\n }\n }, [expanded, engine]);\n\n // Body attributes — host page can target our active state + mode in\n // CSS. We use these to disable text selection + swap the cursor while\n // inspecting (see internal/globalStyles.ts).\n useEffect(() => {\n const active = engineState.kind !== \"idle\";\n if (active) document.body.setAttribute(\"data-clickly-active\", \"\");\n else document.body.removeAttribute(\"data-clickly-active\");\n\n const mode =\n engineState.kind === \"inspect\" ||\n engineState.kind === \"pressed\" ||\n engineState.kind === \"dragging\"\n ? engineState.mode\n : null;\n if (mode) document.body.setAttribute(\"data-clickly-mode\", mode);\n else document.body.removeAttribute(\"data-clickly-mode\");\n\n // Suppress the crosshair while the popup is open — typing in the\n // comment textarea should not feel like an inspection.\n if (engineState.kind === \"annotating\") {\n document.body.setAttribute(\"data-clickly-annotating\", \"\");\n } else {\n document.body.removeAttribute(\"data-clickly-annotating\");\n }\n\n return () => {\n document.body.removeAttribute(\"data-clickly-active\");\n document.body.removeAttribute(\"data-clickly-mode\");\n document.body.removeAttribute(\"data-clickly-annotating\");\n };\n }, [engineState]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const tag = (e.target as HTMLElement | null)?.tagName;\n if (tag === \"INPUT\" || tag === \"TEXTAREA\") return;\n if ((e.target as HTMLElement | null)?.isContentEditable) return;\n const active = document.activeElement;\n if (active && (active.tagName === \"TEXTAREA\" || active.tagName === \"INPUT\")) return;\n\n // Toggle FAB ↔ toolbar\n if (e.key.toLowerCase() === \"f\" && e.shiftKey && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n setExpanded((v) => !v);\n return;\n }\n\n // Escape:\n // - if popup open (annotating) → engine handles cancel\n // - else collapse the toolbar\n if (e.key === \"Escape\") {\n if (engine.getSnapshot().kind === \"annotating\") return;\n if (expanded) setExpanded(false);\n return;\n }\n\n if (!expanded) return;\n\n if (e.key === \"1\") engine.setMode(\"single\");\n if (e.key === \"2\") engine.setMode(\"multi\");\n if (e.key === \"3\") engine.setMode(\"area\");\n\n // Enter: commit pinned selection → open popup\n if (e.key === \"Enter\") {\n const s = engine.getSnapshot();\n if (s.kind === \"inspect\" && s.pinned.length > 0) {\n e.preventDefault();\n engine.annotatePinned();\n }\n }\n\n if (e.key === \"c\" || e.key === \"C\") {\n const list = useAnnotations.getState().list();\n if (list.length === 0) return;\n e.preventDefault();\n navigator.clipboard?.writeText(annotationsToMarkdown(list, outputDetail));\n }\n if (e.key === \"x\" || e.key === \"X\") {\n if (useAnnotations.getState().list().length === 0) return;\n e.preventDefault();\n clearAnnotations();\n }\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [clearAnnotations, outputDetail, expanded, engine]);\n\n return (\n <div className=\"clickly-ui\">\n {/* Pins persist regardless of expanded state, so users always see\n which elements they've annotated. */}\n <AnnotationPins />\n {expanded ? (\n <>\n <Toolbar engine={engine} onCollapse={() => setExpanded(false)} />\n <AnnotationPopup engine={engine} />\n </>\n ) : (\n <CollapsedFAB onExpand={() => setExpanded(true)} />\n )}\n </div>\n );\n}\n","/**\n * CSS injected into the shadow root by the React layer. Separate from\n * the overlay-marker CSS in `@useclickly/core/styles` so each package owns\n * its surface.\n */\nexport const REACT_UI_CSS = `\n.clickly-ui, .clickly-ui * { box-sizing: border-box; }\n\n/* ─── Floating action button (collapsed state) ──────────────────── */\n\n.clickly-fab {\n position: fixed;\n right: 16px;\n bottom: 16px;\n width: 48px;\n height: 48px;\n border: none;\n border-radius: 999px;\n background: #0f172a;\n color: #f8fafc;\n display: grid;\n place-items: center;\n cursor: pointer;\n pointer-events: auto;\n user-select: none;\n box-shadow:\n 0 8px 24px rgba(0,0,0,0.30),\n 0 0 0 1px rgba(255,255,255,0.06) inset;\n transition: transform 140ms ease, box-shadow 140ms ease;\n z-index: 1;\n}\n.clickly-fab:hover {\n transform: scale(1.06);\n box-shadow:\n 0 10px 28px rgba(0,0,0,0.36),\n 0 0 0 1px rgba(255,255,255,0.10) inset;\n}\n.clickly-fab:active { transform: scale(0.96); }\n.clickly-fab svg { width: 18px; height: 18px; color: #f8fafc; }\n\n.clickly-fab-badge {\n position: absolute;\n top: -2px;\n right: -2px;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n background: #f59e0b;\n color: #0f172a;\n font: 600 11px -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n border-radius: 9px;\n display: grid;\n place-items: center;\n pointer-events: none;\n}\n\n/* ─── Toolbar (expanded state) ──────────────────────────────────── */\n\n.clickly-toolbar {\n position: fixed;\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px;\n background: rgba(15, 23, 42, 0.94);\n color: #f8fafc;\n border-radius: 12px;\n font: 13px/1 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n box-shadow: 0 8px 24px rgba(0,0,0,0.3), 0 0 0 1px rgba(255,255,255,0.06) inset;\n pointer-events: auto;\n user-select: none;\n z-index: 1;\n animation: clickly-fade-in 120ms ease-out;\n}\n\n@keyframes clickly-fade-in {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n.clickly-toolbar .grip {\n display: grid;\n place-items: center;\n width: 24px;\n height: 28px;\n color: #94a3b8;\n touch-action: none;\n}\n\n.clickly-toolbar .divider {\n width: 1px;\n height: 18px;\n background: rgba(255,255,255,0.12);\n margin: 0 2px;\n}\n\n.clickly-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n height: 28px;\n padding: 0 8px;\n background: transparent;\n border: none;\n border-radius: 8px;\n color: #cbd5e1;\n cursor: pointer;\n font: inherit;\n}\n.clickly-btn:hover { background: rgba(255,255,255,0.08); color: #fff; }\n.clickly-btn:active { background: rgba(255,255,255,0.14); }\n.clickly-btn.is-active { background: #0ea5e9; color: #fff; }\n.clickly-btn[disabled] { opacity: 0.4; cursor: not-allowed; }\n\n.clickly-btn.icon-only {\n width: 28px;\n padding: 0;\n justify-content: center;\n}\n\n.clickly-btn.primary-pinned {\n background: #10b981;\n color: #fff;\n font-weight: 500;\n}\n.clickly-btn.primary-pinned:hover {\n background: #059669;\n color: #fff;\n}\n\n/* ─── Popup & popovers ──────────────────────────────────────────── */\n\n.clickly-popup, .clickly-popover {\n position: fixed;\n background: #fff;\n color: #0f172a;\n border-radius: 10px;\n box-shadow: 0 12px 32px rgba(2,6,23,0.18), 0 0 0 1px rgba(15,23,42,0.06);\n font: 13px/1.5 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n pointer-events: auto;\n z-index: 2;\n animation: clickly-fade-in 120ms ease-out;\n}\n\n.clickly-popup { width: 320px; padding: 12px; }\n\n.clickly-popup .target-info {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n margin-bottom: 8px;\n color: #475569;\n font-size: 11px;\n font-family: ui-monospace, \"SF Mono\", Menlo, monospace;\n}\n\n.clickly-popup textarea {\n width: 100%;\n min-height: 64px;\n max-height: 160px;\n padding: 8px;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n resize: vertical;\n font: inherit;\n color: inherit;\n}\n.clickly-popup textarea:focus {\n outline: none;\n border-color: #0ea5e9;\n box-shadow: 0 0 0 3px rgba(14,165,233,0.18);\n}\n\n.clickly-popup .row {\n display: flex;\n justify-content: flex-end;\n gap: 6px;\n margin-top: 10px;\n}\n\n.clickly-popup .row .ghost {\n background: transparent;\n color: #475569;\n border: 1px solid #e2e8f0;\n}\n.clickly-popup .row .ghost:hover { background: #f8fafc; }\n\n.clickly-popup .row .primary {\n background: #0ea5e9;\n color: #fff;\n border: none;\n}\n.clickly-popup .row .primary:hover { background: #0284c7; }\n.clickly-popup .row button {\n height: 28px;\n padding: 0 12px;\n border-radius: 6px;\n font: inherit;\n cursor: pointer;\n}\n\n.clickly-popover { width: 260px; padding: 12px; }\n.clickly-popover h4 { margin: 0 0 8px; font-size: 12px; color: #475569; text-transform: uppercase; letter-spacing: 0.05em; }\n.clickly-popover .field { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 6px 0; font-size: 13px; }\n.clickly-popover select { font: inherit; padding: 4px 6px; border-radius: 4px; border: 1px solid #e2e8f0; }\n.clickly-popover input[type=\"color\"] { width: 28px; height: 24px; padding: 0; border: 1px solid #e2e8f0; border-radius: 4px; background: none; }\n\n.clickly-counter {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n border-radius: 9px;\n background: #f59e0b;\n color: #1f2937;\n font-size: 11px;\n font-weight: 600;\n margin-left: 4px;\n}\n\n/* ─── Annotation pins (persistent numbered markers) ─────────────── */\n\n.clickly-pin {\n position: fixed;\n width: 22px;\n height: 22px;\n border-radius: 999px;\n background: #f59e0b;\n color: #0f172a;\n font: 600 12px/22px -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n text-align: center;\n cursor: pointer;\n pointer-events: auto;\n user-select: none;\n box-shadow: 0 2px 6px rgba(0,0,0,0.25), 0 0 0 2px #fff;\n z-index: 1;\n transition: transform 100ms ease;\n}\n.clickly-pin:hover { transform: scale(1.12); }\n.clickly-pin-num { display: block; }\n\n.clickly-pin-bubble {\n position: absolute;\n top: 28px;\n left: 0;\n width: 240px;\n padding: 8px 10px;\n background: #fff;\n color: #0f172a;\n border-radius: 8px;\n box-shadow: 0 8px 24px rgba(2,6,23,0.18), 0 0 0 1px rgba(15,23,42,0.06);\n font: 13px/1.4 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n text-align: left;\n cursor: default;\n z-index: 3;\n animation: clickly-fade-in 100ms ease-out;\n}\n.clickly-pin-comment { word-break: break-word; }\n.clickly-pin-meta {\n margin-top: 6px;\n font-family: ui-monospace, \"SF Mono\", Menlo, monospace;\n font-size: 11px;\n color: #475569;\n word-break: break-all;\n}\n.clickly-pin-remove {\n margin-top: 8px;\n padding: 4px 8px;\n border: 1px solid #fecaca;\n background: #fff;\n color: #b91c1c;\n border-radius: 4px;\n font: 11px inherit;\n cursor: pointer;\n}\n.clickly-pin-remove:hover { background: #fef2f2; }\n\n/* ─── Annotation list ───────────────────────────────────────────── */\n\n.clickly-list {\n position: fixed;\n max-height: 50vh;\n width: 320px;\n overflow-y: auto;\n background: #fff;\n border-radius: 10px;\n box-shadow: 0 12px 32px rgba(2,6,23,0.18), 0 0 0 1px rgba(15,23,42,0.06);\n color: #0f172a;\n font: 12px/1.4 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n pointer-events: auto;\n z-index: 2;\n animation: clickly-fade-in 120ms ease-out;\n}\n.clickly-list .row { display: flex; gap: 8px; padding: 8px 10px; border-bottom: 1px solid #f1f5f9; }\n.clickly-list .row:last-child { border-bottom: none; }\n.clickly-list .num { color: #94a3b8; min-width: 18px; }\n.clickly-list .selector { color: #475569; font-family: ui-monospace, \"SF Mono\", Menlo, monospace; font-size: 11px; word-break: break-all; }\n.clickly-list .body { flex: 1; min-width: 0; }\n.clickly-list .body p { margin: 2px 0 0; word-break: break-word; }\n.clickly-list button.remove {\n background: transparent;\n border: none;\n color: #94a3b8;\n cursor: pointer;\n padding: 2px;\n display: grid;\n place-items: center;\n}\n.clickly-list button.remove svg { width: 12px; height: 12px; }\n.clickly-list button.remove:hover { color: #ef4444; }\n.clickly-list .empty { padding: 20px; text-align: center; color: #94a3b8; }\n`;\n","/**\n * CSS injected into `document.head` (NOT the shadow root). Targets the\n * host page body to:\n *\n * - disable text selection while we're inspecting/pressed/dragging\n * (otherwise the browser tries to select text mid-drag and the\n * marquee never starts)\n * - swap the cursor to crosshair in area mode for a clear UX cue\n *\n * Mounted by `Clickly.tsx`, torn down on unmount.\n */\nexport const GLOBAL_PAGE_CSS = `\nbody[data-clickly-active] {\n -webkit-user-select: none !important;\n user-select: none !important;\n}\nbody[data-clickly-active],\nbody[data-clickly-active] *:not(input):not(textarea):not(select) {\n cursor: crosshair !important;\n}\nbody[data-clickly-mode=\"multi\"],\nbody[data-clickly-mode=\"multi\"] *:not(input):not(textarea):not(select) {\n cursor: copy !important;\n}\n/* Restore normal cursor while the annotation popup is open so the user\n can comfortably type in the textarea + click the buttons. */\nbody[data-clickly-annotating] {\n cursor: default !important;\n}\n`;\n","import { useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n Overlay,\n SelectionEngine,\n createShadowHost,\n type ShadowHost,\n} from \"@useclickly/core\";\nimport { ClicklyRoot } from \"./internal/ClicklyRoot\";\nimport { REACT_UI_CSS } from \"./internal/styles\";\nimport { GLOBAL_PAGE_CSS } from \"./internal/globalStyles\";\n\nexport interface ClicklyProps {\n /** Custom class on the host element (for z-index / positioning overrides). */\n className?: string;\n /** Optional MCP server endpoint, e.g. \"http://localhost:4747\". */\n endpoint?: string;\n /** Join an existing MCP session by ID. */\n sessionId?: string;\n\n /* Lifecycle callbacks (Phase 6+ will wire these to annotation events) */\n onAnnotationAdd?: (id: string) => void;\n onAnnotationDelete?: (id: string) => void;\n onAnnotationsClear?: () => void;\n onCopy?: (markdown: string) => void;\n onSessionCreated?: (sessionId: string) => void;\n}\n\ninterface Mount {\n shadow: ShadowHost;\n engine: SelectionEngine;\n overlay: Overlay;\n portal: HTMLDivElement;\n}\n\n/**\n * Mount once near the root of your React app. Dev-only by convention:\n *\n * ```tsx\n * {process.env.NODE_ENV === \"development\" && <Clickly />}\n * ```\n *\n * Renders a small floating button (FAB) in the bottom-right corner.\n * Click it (or press `⌘/Ctrl+Shift+F`) to open the full toolbar.\n */\nexport function Clickly({ className }: ClicklyProps = {}) {\n const [mount, setMount] = useState<Mount | null>(null);\n\n useEffect(() => {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return;\n\n let shadow: ShadowHost | null = null;\n let engine: SelectionEngine | null = null;\n let overlay: Overlay | null = null;\n let portal: HTMLDivElement | null = null;\n\n try {\n shadow = createShadowHost({ document });\n\n portal = document.createElement(\"div\");\n portal.setAttribute(\"data-clickly-react-root\", \"\");\n shadow.root.appendChild(portal);\n\n if (!shadow.root.querySelector(\"style[data-clickly-react]\")) {\n const style = document.createElement(\"style\");\n style.setAttribute(\"data-clickly-react\", \"\");\n style.textContent = REACT_UI_CSS;\n shadow.root.appendChild(style);\n }\n\n // Document-level styles (cursor + text-select inhibitor) — these\n // can't live inside the shadow root because they target body.\n if (!document.head.querySelector(\"style[data-clickly-globals]\")) {\n const gstyle = document.createElement(\"style\");\n gstyle.setAttribute(\"data-clickly-globals\", \"\");\n gstyle.textContent = GLOBAL_PAGE_CSS;\n document.head.appendChild(gstyle);\n }\n\n engine = new SelectionEngine({ document, host: shadow.host });\n overlay = new Overlay({\n engine,\n root: shadow.root,\n document,\n excludeHost: shadow.host,\n });\n\n setMount({ shadow, engine, overlay, portal });\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(\"[clickly] failed to mount\", err);\n overlay?.destroy();\n engine?.destroy();\n portal?.remove();\n shadow?.destroy();\n }\n\n return () => {\n setMount(null);\n overlay?.destroy();\n engine?.destroy();\n portal?.remove();\n shadow?.destroy();\n document.head.querySelector(\"style[data-clickly-globals]\")?.remove();\n document.body.removeAttribute(\"data-clickly-active\");\n document.body.removeAttribute(\"data-clickly-mode\");\n };\n }, []);\n\n useEffect(() => {\n if (!mount || !className) return;\n mount.shadow.host.className = className;\n return () => {\n if (mount.shadow.host.isConnected) mount.shadow.host.className = \"\";\n };\n }, [mount, className]);\n\n if (!mount) return null;\n return createPortal(\n <ClicklyRoot engine={mount.engine} host={mount.shadow.host} />,\n mount.portal,\n );\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -63,9 +63,9 @@ declare const DEFAULTS: Settings;
63
63
  declare const useSettings: zustand.UseBoundStore<zustand.StoreApi<SettingsStore>>;
64
64
 
65
65
  /**
66
- * Phase 5 placeholder formatter. Phase 8 ships the full AFS-compliant
67
- * implementation with four detail tiers and JSON export. Kept here so
68
- * the Copy button does something useful during development.
66
+ * Phase 5 placeholder formatter Phase 9 adds the React + Source lines
67
+ * when those fields are populated. Phase 8 replaces the whole thing with
68
+ * a full AFS-compliant implementation.
69
69
  */
70
70
  declare function annotationsToMarkdown(annotations: Annotation[], detail?: OutputDetail): string;
71
71
 
package/dist/index.d.ts CHANGED
@@ -1,72 +1,15 @@
1
- import * as react from 'react';
2
- import * as zustand from 'zustand';
3
- import { Annotation } from '@useclickly/core';
4
- export { Annotation, AnnotationKind, AnnotationStatus, ScreenshotData } from '@useclickly/core';
5
-
6
- interface ClicklyProps {
7
- /** Custom class on the host element (for z-index / positioning overrides). */
8
- className?: string;
9
- /** Optional MCP server endpoint, e.g. "http://localhost:4747". */
10
- endpoint?: string;
11
- /** Join an existing MCP session by ID. */
12
- sessionId?: string;
13
- onAnnotationAdd?: (id: string) => void;
14
- onAnnotationDelete?: (id: string) => void;
15
- onAnnotationsClear?: () => void;
16
- onCopy?: (markdown: string) => void;
17
- onSessionCreated?: (sessionId: string) => void;
18
- }
19
1
  /**
20
- * Mount once near the root of your React app. Dev-only by convention:
2
+ * @useclickly/react public surface
21
3
  *
22
- * ```tsx
23
- * {process.env.NODE_ENV === "development" && <Clickly />}
24
- * ```
25
- *
26
- * Renders a small floating button (FAB) in the bottom-right corner.
27
- * Click it (or press `⌘/Ctrl+Shift+F`) to open the full toolbar.
28
- */
29
- declare function Clickly({ className }?: ClicklyProps): react.ReactPortal | null;
30
-
31
- interface AnnotationsStore {
32
- byId: Record<string, Annotation>;
33
- order: string[];
34
- add: (a: Annotation) => void;
35
- remove: (id: string) => void;
36
- update: (id: string, patch: Partial<Annotation>) => void;
37
- clear: () => void;
38
- /** Imperative read. Hooks should use `useAnnotationsList()` instead. */
39
- list: () => Annotation[];
40
- }
41
- declare const useAnnotations: zustand.UseBoundStore<zustand.StoreApi<AnnotationsStore>>;
42
- /**
43
- * Subscribe to the annotation list with shallow equality — re-renders
44
- * only when items add/remove/reorder/update. Always use this from
45
- * component code; never call `useAnnotations(s => s.list())`, which
46
- * returns a new array reference on every store change and infinite-loops
47
- * `useSyncExternalStore`.
48
- */
49
- declare function useAnnotationsList(): Annotation[];
50
-
51
- type OutputDetail = "compact" | "standard" | "detailed" | "forensic";
52
- interface Settings {
53
- outputDetail: OutputDetail;
54
- copyOnAdd: boolean;
55
- showReactComponents: boolean;
56
- markerColor: string;
57
- }
58
- interface SettingsStore extends Settings {
59
- set: (patch: Partial<Settings>) => void;
60
- reset: () => void;
61
- }
62
- declare const DEFAULTS: Settings;
63
- declare const useSettings: zustand.UseBoundStore<zustand.StoreApi<SettingsStore>>;
64
-
65
- /**
66
- * Phase 5 placeholder formatter. Phase 8 ships the full AFS-compliant
67
- * implementation with four detail tiers and JSON export. Kept here so
68
- * the Copy button does something useful during development.
4
+ * The single export is `<Clickly />`. Stores and types are also
5
+ * re-exported for advanced integrations.
69
6
  */
70
- declare function annotationsToMarkdown(annotations: Annotation[], detail?: OutputDetail): string;
71
-
72
- export { type AnnotationsStore, Clickly, type ClicklyProps, DEFAULTS as DEFAULT_SETTINGS, type OutputDetail, type Settings, type SettingsStore, annotationsToMarkdown, useAnnotations, useAnnotationsList, useSettings };
7
+ export { Clickly } from "./Clickly";
8
+ export type { ClicklyProps } from "./Clickly";
9
+ export { useAnnotations, useAnnotationsList } from "./state/annotations";
10
+ export { useSettings, DEFAULTS as DEFAULT_SETTINGS } from "./state/settings";
11
+ export type { AnnotationsStore } from "./state/annotations";
12
+ export type { Settings, SettingsStore, OutputDetail } from "./state/settings";
13
+ export { annotationsToMarkdown } from "./output/markdown";
14
+ export type { Annotation, AnnotationStatus, AnnotationKind, ScreenshotData, } from "@useclickly/core";
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAG9C,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC7E,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAG9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,YAAY,EACV,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,cAAc,GACf,MAAM,kBAAkB,CAAC"}