@useclickly/react 0.2.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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
@@ -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.js CHANGED
@@ -146,11 +146,18 @@ function annotationsToMarkdown(annotations, detail = "standard") {
146
146
  function formatOne(a, index, detail) {
147
147
  const lines = [];
148
148
  lines.push(`## Annotation #${index}`);
149
- lines.push(`**Element:** \`${a.element}${a.cssClasses ? "." + a.cssClasses.split(" ").join(".") : ""}\``);
149
+ lines.push(
150
+ `**Element:** \`${a.element}${a.cssClasses ? "." + a.cssClasses.split(" ").join(".") : ""}\``
151
+ );
150
152
  lines.push(`**Path:** \`${a.elementPath}\``);
151
153
  if (detail !== "compact" && a.boundingBox) {
152
154
  const b = a.boundingBox;
153
- lines.push(`**Position:** ${Math.round(b.x)}px, ${Math.round(b.y)}px (${Math.round(b.width)}\xD7${Math.round(b.height)}px)`);
155
+ lines.push(
156
+ `**Position:** ${Math.round(b.x)}px, ${Math.round(b.y)}px (${Math.round(b.width)}\xD7${Math.round(b.height)}px)`
157
+ );
158
+ }
159
+ if (detail !== "compact" && a.sourceFile) {
160
+ lines.push(`**Source:** \`${a.sourceFile}:${a.sourceLine ?? "?"}\``);
154
161
  }
155
162
  if (detail === "detailed" || detail === "forensic") {
156
163
  if (a.reactComponents) lines.push(`**React:** ${a.reactComponents}`);
@@ -349,13 +356,25 @@ function Toolbar({ engine, onCollapse }) {
349
356
  style: { left: position.x, top: position.y, width: TOOLBAR_SIZE.width },
350
357
  "aria-label": "Clickly toolbar",
351
358
  children: [
352
- /* @__PURE__ */ jsx("div", { className: "grip", ...handleProps, title: "Drag to move", children: /* @__PURE__ */ jsx(IconGrip, {}) }),
359
+ /* @__PURE__ */ jsx(
360
+ "div",
361
+ {
362
+ className: "grip",
363
+ ...handleProps,
364
+ title: "Drag to move",
365
+ role: "separator",
366
+ "aria-orientation": "vertical",
367
+ children: /* @__PURE__ */ jsx(IconGrip, {})
368
+ }
369
+ ),
353
370
  /* @__PURE__ */ jsx(
354
371
  "button",
355
372
  {
356
373
  className: `clickly-btn icon-only${currentMode === "single" ? " is-active" : ""}`,
357
374
  onClick: () => setMode("single"),
358
375
  title: "Single (1)",
376
+ "aria-label": "Single-element selection mode",
377
+ "aria-pressed": currentMode === "single",
359
378
  children: /* @__PURE__ */ jsx(IconCursor, {})
360
379
  }
361
380
  ),
@@ -365,6 +384,8 @@ function Toolbar({ engine, onCollapse }) {
365
384
  className: `clickly-btn icon-only${currentMode === "multi" ? " is-active" : ""}`,
366
385
  onClick: () => setMode("multi"),
367
386
  title: "Multi-select (2 / shift-click)",
387
+ "aria-label": "Multi-element selection mode",
388
+ "aria-pressed": currentMode === "multi",
368
389
  children: /* @__PURE__ */ jsx(IconLayers, {})
369
390
  }
370
391
  ),
@@ -374,6 +395,8 @@ function Toolbar({ engine, onCollapse }) {
374
395
  className: `clickly-btn icon-only${currentMode === "area" ? " is-active" : ""}`,
375
396
  onClick: () => setMode("area"),
376
397
  title: "Area drag (3)",
398
+ "aria-label": "Area drag-selection mode",
399
+ "aria-pressed": currentMode === "area",
377
400
  children: /* @__PURE__ */ jsx(IconSquare, {})
378
401
  }
379
402
  ),
@@ -422,6 +445,7 @@ function Toolbar({ engine, onCollapse }) {
422
445
  className: "clickly-btn icon-only",
423
446
  onClick: onCopy,
424
447
  title: "Copy markdown (C)",
448
+ "aria-label": "Copy all annotations as markdown",
425
449
  disabled: annotations.length === 0,
426
450
  children: /* @__PURE__ */ jsx(IconCopy, {})
427
451
  }
@@ -432,6 +456,7 @@ function Toolbar({ engine, onCollapse }) {
432
456
  className: "clickly-btn icon-only",
433
457
  onClick: onClear,
434
458
  title: "Clear (X)",
459
+ "aria-label": "Clear all annotations",
435
460
  disabled: annotations.length === 0,
436
461
  children: /* @__PURE__ */ jsx(IconTrash, {})
437
462
  }
@@ -443,6 +468,8 @@ function Toolbar({ engine, onCollapse }) {
443
468
  className: "clickly-btn icon-only",
444
469
  onClick: () => setShowSettings((v) => !v),
445
470
  title: "Settings",
471
+ "aria-label": "Open settings",
472
+ "aria-expanded": showSettings,
446
473
  children: /* @__PURE__ */ jsx(IconSettings, {})
447
474
  }
448
475
  ),
@@ -452,6 +479,7 @@ function Toolbar({ engine, onCollapse }) {
452
479
  className: "clickly-btn icon-only",
453
480
  onClick: onCollapse,
454
481
  title: "Collapse (Esc)",
482
+ "aria-label": "Collapse Clickly toolbar",
455
483
  children: /* @__PURE__ */ jsx(IconClose, {})
456
484
  }
457
485
  ),
@@ -525,8 +553,9 @@ function AnnotationPopup({ engine }) {
525
553
  if (elements.length === 0) return;
526
554
  const sharedComment = comment.trim() || "(no comment)";
527
555
  const isMulti = sel.kind !== "single";
556
+ const showReact = useSettings.getState().showReactComponents;
528
557
  for (const el of elements) {
529
- const md = collectMetadata(el, { detail: outputDetail });
558
+ const md = collectMetadata(el, { detail: outputDetail, includeReact: showReact });
530
559
  const annotation = {
531
560
  id: "ann_" + nanoid(8),
532
561
  comment: sharedComment,
@@ -544,6 +573,10 @@ function AnnotationPopup({ engine }) {
544
573
  nearbyText: md.nearbyText || void 0,
545
574
  selectedText: md.selectedText || void 0,
546
575
  isFixed: md.isFixed || void 0,
576
+ reactComponents: md.reactComponents || void 0,
577
+ sourceFile: md.sourceFile || void 0,
578
+ sourceLine: md.sourceLine || void 0,
579
+ sourceColumn: md.sourceColumn || void 0,
547
580
  isMultiSelect: isMulti,
548
581
  kind: "feedback",
549
582
  status: "pending"
@@ -584,6 +617,7 @@ function AnnotationPopup({ engine }) {
584
617
  ref: taRef,
585
618
  value: comment,
586
619
  placeholder: "Describe the issue or change\u2026 (\u2318/Ctrl + Enter to submit)",
620
+ "aria-label": "Annotation comment",
587
621
  onChange: (e) => setComment(e.target.value),
588
622
  onKeyDown: onKey
589
623
  }