@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.
- package/README.md +67 -19
- package/dist/index.cjs +38 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +38 -4
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs.map
CHANGED
|
@@ -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":"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;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,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
|
|
67
|
-
*
|
|
68
|
-
*
|
|
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
|
|
67
|
-
*
|
|
68
|
-
*
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
}
|