@critique.work/agentation 2.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +27 -0
- package/README.md +135 -0
- package/dist/index.d.mts +289 -0
- package/dist/index.d.ts +289 -0
- package/dist/index.js +6483 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +6408 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/page-toolbar-css/index.tsx","../src/components/annotation-popup-css/index.tsx","../src/components/annotation-popup-css/styles.module.scss","../src/components/icons.tsx","../src/utils/freeze-animations.ts","../src/utils/element-identification.ts","../src/utils/storage.ts","../src/utils/sync.ts","../src/utils/react-detection.ts","../src/components/page-toolbar-css/styles.module.scss"],"sourcesContent":["// =============================================================================\n// Agentation\n// =============================================================================\n//\n// A floating toolbar for annotating web pages and collecting structured feedback\n// for AI coding agents.\n//\n// Usage:\n// import { Agentation } from 'agentation';\n// <Agentation />\n//\n// =============================================================================\n\n// Main components\n// CSS-only version (default - zero runtime deps)\nexport { PageFeedbackToolbarCSS as Agentation } from \"./components/page-toolbar-css\";\nexport { PageFeedbackToolbarCSS } from \"./components/page-toolbar-css\";\nexport type { DemoAnnotation, AgentationProps } from \"./components/page-toolbar-css\";\n\n// Shared components (for building custom UIs)\nexport { AnnotationPopupCSS } from \"./components/annotation-popup-css\";\nexport type {\n AnnotationPopupCSSProps,\n AnnotationPopupCSSHandle,\n} from \"./components/annotation-popup-css\";\n\n// Icons (same for both versions - they're pure SVG)\nexport * from \"./components/icons\";\n\n// Utilities (for building custom UIs)\nexport {\n identifyElement,\n identifyAnimationElement,\n getElementPath,\n getNearbyText,\n getElementClasses,\n // Shadow DOM support\n isInShadowDOM,\n getShadowHost,\n closestCrossingShadow,\n} from \"./utils/element-identification\";\n\nexport {\n loadAnnotations,\n saveAnnotations,\n getStorageKey,\n} from \"./utils/storage\";\n\n// Types\nexport type { Annotation } from \"./types\";\n","\"use client\";\n\nimport { useState, useCallback, useEffect, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport {\n AnnotationPopupCSS,\n AnnotationPopupCSSHandle,\n} from \"../annotation-popup-css\";\nimport {\n IconListSparkle,\n IconPlayAlt,\n IconPauseAlt,\n IconClose,\n IconPlus,\n IconGear,\n IconCheck,\n IconCheckSmall,\n IconCheckSmallAnimated,\n IconHelp,\n AnimatedBunny,\n IconEye,\n IconEyeMinus,\n IconCopyAlt,\n IconCopyAnimated,\n IconSendArrow,\n IconTrashAlt,\n IconXmark,\n IconCheckmark,\n IconCheckmarkLarge,\n IconCheckmarkCircle,\n IconPause,\n IconEyeAnimated,\n IconPausePlayAnimated,\n IconSun,\n IconMoon,\n IconXmarkLarge,\n IconEdit,\n IconChevronLeft,\n IconChevronRight,\n IconPencil,\n} from \"../icons\";\nimport {\n identifyElement,\n getNearbyText,\n getElementClasses,\n getDetailedComputedStyles,\n getForensicComputedStyles,\n parseComputedStylesString,\n getFullElementPath,\n getAccessibilityInfo,\n getNearbyElements,\n closestCrossingShadow,\n} from \"../../utils/element-identification\";\nimport {\n loadAnnotations,\n loadAllAnnotations,\n saveAnnotations,\n getStorageKey,\n loadSessionId,\n saveSessionId,\n clearSessionId,\n saveAnnotationsWithSyncMarker,\n} from \"../../utils/storage\";\nimport {\n createSession,\n getSession,\n syncAnnotation,\n updateAnnotation as updateAnnotationOnServer,\n deleteAnnotation as deleteAnnotationFromServer,\n requestAction,\n} from \"../../utils/sync\";\nimport { getReactComponentName } from \"../../utils/react-detection\";\nimport {\n freeze as freezeAll,\n unfreeze as unfreezeAll,\n originalSetTimeout,\n originalSetInterval,\n} from \"../../utils/freeze-animations\";\n\nimport type { Annotation } from \"../../types\";\nimport styles from \"./styles.module.scss\";\n\n/**\n * Composes element identification with React component detection.\n * This is the boundary where we combine framework-agnostic element ID\n * with React-specific component name detection.\n */\nfunction identifyElementWithReact(\n element: HTMLElement,\n reactMode: ReactComponentMode = \"filtered\",\n): {\n /** Combined name for display (React path + element) */\n name: string;\n /** Raw element name without React path */\n elementName: string;\n /** DOM path */\n path: string;\n /** React component path (e.g., '<SideNav> <LinkComponent>') */\n reactComponents: string | null;\n} {\n const { name: elementName, path } = identifyElement(element);\n\n // If React detection is off, just return element info\n if (reactMode === \"off\") {\n return { name: elementName, elementName, path, reactComponents: null };\n }\n\n const reactInfo = getReactComponentName(element, { mode: reactMode });\n\n return {\n name: reactInfo.path ? `${reactInfo.path} ${elementName}` : elementName,\n elementName,\n path,\n reactComponents: reactInfo.path,\n };\n}\n\n// Module-level flag to prevent re-animating on SPA page navigation\nlet hasPlayedEntranceAnimation = false;\n\n// =============================================================================\n// Types\n// =============================================================================\n\ntype HoverInfo = {\n element: string;\n elementName: string;\n elementPath: string;\n rect: DOMRect | null;\n reactComponents?: string | null;\n};\n\ntype OutputDetailLevel = \"compact\" | \"standard\" | \"detailed\" | \"forensic\";\n// ReactComponentMode is now derived from outputDetail when reactEnabled is true\ntype ReactComponentMode = \"smart\" | \"filtered\" | \"all\" | \"off\";\ntype MarkerClickBehavior = \"edit\" | \"delete\";\n\ntype ToolbarSettings = {\n outputDetail: OutputDetailLevel;\n autoClearAfterCopy: boolean;\n annotationColor: string;\n blockInteractions: boolean;\n reactEnabled: boolean; // Simple toggle - mode derived from outputDetail\n markerClickBehavior: MarkerClickBehavior;\n webhookUrl: string; // Overrides prop if set\n webhooksEnabled: boolean;\n};\n\nconst DEFAULT_SETTINGS: ToolbarSettings = {\n outputDetail: \"standard\",\n autoClearAfterCopy: false,\n annotationColor: \"#3c82f7\",\n blockInteractions: true,\n reactEnabled: true,\n markerClickBehavior: \"edit\",\n webhookUrl: \"\",\n webhooksEnabled: true,\n};\n\n// Simple URL validation - checks for valid http(s) URL format\nconst isValidUrl = (url: string): boolean => {\n if (!url || !url.trim()) return false;\n try {\n const parsed = new URL(url.trim());\n return parsed.protocol === \"http:\" || parsed.protocol === \"https:\";\n } catch {\n return false;\n }\n};\n\n// Maps output detail level to React detection mode\nconst OUTPUT_TO_REACT_MODE: Record<OutputDetailLevel, ReactComponentMode> = {\n compact: \"off\",\n standard: \"filtered\",\n detailed: \"smart\",\n forensic: \"all\",\n};\n\nconst MARKER_CLICK_OPTIONS: {\n value: MarkerClickBehavior;\n label: string;\n}[] = [\n { value: \"edit\", label: \"Edit\" },\n { value: \"delete\", label: \"Delete\" },\n];\n\nconst OUTPUT_DETAIL_OPTIONS: { value: OutputDetailLevel; label: string }[] = [\n { value: \"compact\", label: \"Compact\" },\n { value: \"standard\", label: \"Standard\" },\n { value: \"detailed\", label: \"Detailed\" },\n { value: \"forensic\", label: \"Forensic\" },\n];\n\nconst COLOR_OPTIONS = [\n { value: \"#AF52DE\", label: \"Purple\" },\n { value: \"#3c82f7\", label: \"Blue\" },\n { value: \"#5AC8FA\", label: \"Cyan\" },\n { value: \"#34C759\", label: \"Green\" },\n { value: \"#FFD60A\", label: \"Yellow\" },\n { value: \"#FF9500\", label: \"Orange\" },\n { value: \"#FF3B30\", label: \"Red\" },\n];\n\n// =============================================================================\n// Utils\n// =============================================================================\n\n/**\n * Recursively pierces shadow DOMs to find the deepest element at a point.\n * document.elementFromPoint() stops at shadow hosts, so we need to\n * recursively check inside open shadow roots to find the actual target.\n */\nfunction deepElementFromPoint(x: number, y: number): HTMLElement | null {\n let element = document.elementFromPoint(x, y) as HTMLElement | null;\n if (!element) return null;\n\n // Keep drilling down through shadow roots\n while (element?.shadowRoot) {\n const deeper = element.shadowRoot.elementFromPoint(x, y) as HTMLElement | null;\n if (!deeper || deeper === element) break;\n element = deeper;\n }\n\n return element;\n}\n\nfunction isElementFixed(element: HTMLElement): boolean {\n let current: HTMLElement | null = element;\n while (current && current !== document.body) {\n const style = window.getComputedStyle(current);\n const position = style.position;\n if (position === \"fixed\" || position === \"sticky\") {\n return true;\n }\n current = current.parentElement;\n }\n return false;\n}\n\nfunction findStrokeAtPoint(\n x: number,\n y: number,\n strokes: Array<{ points: Array<{ x: number; y: number }>; fixed: boolean }>,\n threshold = 12,\n): number | null {\n const scrollY = window.scrollY;\n // Reverse order — last drawn is on top\n for (let i = strokes.length - 1; i >= 0; i--) {\n const stroke = strokes[i];\n if (stroke.points.length < 2) continue;\n for (let j = 0; j < stroke.points.length - 1; j++) {\n const a = stroke.points[j];\n const b = stroke.points[j + 1];\n // Convert to viewport coords\n const ay = stroke.fixed ? a.y : a.y - scrollY;\n const by = stroke.fixed ? b.y : b.y - scrollY;\n const ax = a.x;\n const bx = b.x;\n // Point-to-segment distance\n const dx = bx - ax;\n const dy = by - ay;\n const lenSq = dx * dx + dy * dy;\n let t = lenSq === 0 ? 0 : ((x - ax) * dx + (y - ay) * dy) / lenSq;\n t = Math.max(0, Math.min(1, t));\n const projX = ax + t * dx;\n const projY = ay + t * dy;\n const dist = Math.hypot(x - projX, y - projY);\n if (dist < threshold) return i;\n }\n }\n return null;\n}\n\nfunction classifyStrokeGesture(\n points: Array<{ x: number; y: number }>,\n fixed: boolean,\n): string {\n if (points.length < 2) return \"Mark\";\n const scrollY = window.scrollY;\n const viewportPoints = fixed\n ? points\n : points.map((p) => ({ x: p.x, y: p.y - scrollY }));\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const p of viewportPoints) {\n minX = Math.min(minX, p.x);\n minY = Math.min(minY, p.y);\n maxX = Math.max(maxX, p.x);\n maxY = Math.max(maxY, p.y);\n }\n const bboxW = maxX - minX;\n const bboxH = maxY - minY;\n const bboxDiag = Math.hypot(bboxW, bboxH);\n\n const start = viewportPoints[0];\n const end = viewportPoints[viewportPoints.length - 1];\n const startEndDist = Math.hypot(end.x - start.x, end.y - start.y);\n const closedLoop = startEndDist < bboxDiag * 0.35;\n const aspectRatio = bboxW / Math.max(bboxH, 1);\n\n if (closedLoop && bboxDiag > 20) {\n const edgeThreshold = Math.max(bboxW, bboxH) * 0.15;\n let edgePoints = 0;\n for (const p of viewportPoints) {\n const nearLeft = p.x - minX < edgeThreshold;\n const nearRight = maxX - p.x < edgeThreshold;\n const nearTop = p.y - minY < edgeThreshold;\n const nearBottom = maxY - p.y < edgeThreshold;\n if ((nearLeft || nearRight) && (nearTop || nearBottom)) edgePoints++;\n }\n return edgePoints > viewportPoints.length * 0.15 ? \"Box\" : \"Circle\";\n } else if (aspectRatio > 3 && bboxH < 40) {\n return \"Underline\";\n } else if (startEndDist > bboxDiag * 0.5) {\n return \"Arrow\";\n }\n return \"Drawing\";\n}\n\nfunction hexToRgba(hex: string, alpha: number): string {\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\nfunction formatRelativeTime(dateString: string): string {\n const date = new Date(dateString);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSec = Math.floor(diffMs / 1000);\n const diffMin = Math.floor(diffSec / 60);\n const diffHr = Math.floor(diffMin / 60);\n const diffDay = Math.floor(diffHr / 24);\n\n if (diffSec < 60) return \"just now\";\n if (diffMin < 60) return `${diffMin}m ago`;\n if (diffHr < 24) return `${diffHr}h ago`;\n if (diffDay < 7) return `${diffDay}d ago`;\n return date.toLocaleDateString();\n}\n\nfunction truncateUrl(url: string): string {\n try {\n const parsed = new URL(url);\n const path = parsed.pathname;\n // Show path, truncate if too long\n if (path.length > 25) {\n return \"...\" + path.slice(-22);\n }\n return path || \"/\";\n } catch {\n // If URL parsing fails, just truncate the string\n if (url.length > 25) {\n return \"...\" + url.slice(-22);\n }\n return url;\n }\n}\n\nfunction getActiveButtonStyle(\n isActive: boolean,\n color: string,\n): React.CSSProperties | undefined {\n if (!isActive) return undefined;\n return {\n color: color,\n backgroundColor: hexToRgba(color, 0.25),\n };\n}\n\nfunction generateOutput(\n annotations: Annotation[],\n pathname: string,\n detailLevel: OutputDetailLevel = \"standard\",\n reactMode: ReactComponentMode = \"filtered\",\n): string {\n if (annotations.length === 0) return \"\";\n\n const viewport =\n typeof window !== \"undefined\"\n ? `${window.innerWidth}×${window.innerHeight}`\n : \"unknown\";\n\n let output = `## Page Feedback: ${pathname}\\n`;\n\n if (detailLevel === \"forensic\") {\n // Full environment info for forensic mode\n output += `\\n**Environment:**\\n`;\n output += `- Viewport: ${viewport}\\n`;\n if (typeof window !== \"undefined\") {\n output += `- URL: ${window.location.href}\\n`;\n output += `- User Agent: ${navigator.userAgent}\\n`;\n output += `- Timestamp: ${new Date().toISOString()}\\n`;\n output += `- Device Pixel Ratio: ${window.devicePixelRatio}\\n`;\n }\n output += `\\n---\\n`;\n } else if (detailLevel !== \"compact\") {\n output += `**Viewport:** ${viewport}\\n`;\n }\n output += \"\\n\";\n\n annotations.forEach((a, i) => {\n if (detailLevel === \"compact\") {\n output += `${i + 1}. **${a.element}**: ${a.comment}`;\n if (a.selectedText) {\n output += ` (re: \"${a.selectedText.slice(0, 30)}${a.selectedText.length > 30 ? \"...\" : \"\"}\")`;\n }\n output += \"\\n\";\n } else if (detailLevel === \"forensic\") {\n // Forensic mode - order matches output page example\n output += `### ${i + 1}. ${a.element}\\n`;\n if (a.isMultiSelect && a.fullPath) {\n output += `*Forensic data shown for first element of selection*\\n`;\n }\n if (a.fullPath) {\n output += `**Full DOM Path:** ${a.fullPath}\\n`;\n }\n if (a.cssClasses) {\n output += `**CSS Classes:** ${a.cssClasses}\\n`;\n }\n if (a.boundingBox) {\n output += `**Position:** x:${Math.round(a.boundingBox.x)}, y:${Math.round(a.boundingBox.y)} (${Math.round(a.boundingBox.width)}×${Math.round(a.boundingBox.height)}px)\\n`;\n }\n output += `**Annotation at:** ${a.x.toFixed(1)}% from left, ${Math.round(a.y)}px from top\\n`;\n if (a.selectedText) {\n output += `**Selected text:** \"${a.selectedText}\"\\n`;\n }\n if (a.nearbyText && !a.selectedText) {\n output += `**Context:** ${a.nearbyText.slice(0, 100)}\\n`;\n }\n if (a.computedStyles) {\n output += `**Computed Styles:** ${a.computedStyles}\\n`;\n }\n if (a.accessibility) {\n output += `**Accessibility:** ${a.accessibility}\\n`;\n }\n if (a.nearbyElements) {\n output += `**Nearby Elements:** ${a.nearbyElements}\\n`;\n }\n if (a.reactComponents) {\n output += `**React:** ${a.reactComponents}\\n`;\n }\n output += `**Feedback:** ${a.comment}\\n\\n`;\n } else {\n // Standard and detailed modes\n output += `### ${i + 1}. ${a.element}\\n`;\n output += `**Location:** ${a.elementPath}\\n`;\n\n // React components in both standard and detailed\n if (a.reactComponents) {\n output += `**React:** ${a.reactComponents}\\n`;\n }\n\n if (detailLevel === \"detailed\") {\n if (a.cssClasses) {\n output += `**Classes:** ${a.cssClasses}\\n`;\n }\n\n if (a.boundingBox) {\n output += `**Position:** ${Math.round(a.boundingBox.x)}px, ${Math.round(a.boundingBox.y)}px (${Math.round(a.boundingBox.width)}×${Math.round(a.boundingBox.height)}px)\\n`;\n }\n }\n\n if (a.selectedText) {\n output += `**Selected text:** \"${a.selectedText}\"\\n`;\n }\n\n if (detailLevel === \"detailed\" && a.nearbyText && !a.selectedText) {\n output += `**Context:** ${a.nearbyText.slice(0, 100)}\\n`;\n }\n\n output += `**Feedback:** ${a.comment}\\n\\n`;\n }\n });\n\n return output.trim();\n}\n\n// =============================================================================\n// Types for Props\n// =============================================================================\n\nexport type DemoAnnotation = {\n selector: string;\n comment: string;\n selectedText?: string;\n};\n\nexport type PageFeedbackToolbarCSSProps = {\n demoAnnotations?: DemoAnnotation[];\n demoDelay?: number;\n enableDemoMode?: boolean;\n /** Callback fired when an annotation is added. */\n onAnnotationAdd?: (annotation: Annotation) => void;\n /** Callback fired when an annotation is deleted. */\n onAnnotationDelete?: (annotation: Annotation) => void;\n /** Callback fired when an annotation comment is edited. */\n onAnnotationUpdate?: (annotation: Annotation) => void;\n /** Callback fired when all annotations are cleared. Receives the annotations that were cleared. */\n onAnnotationsClear?: (annotations: Annotation[]) => void;\n /** Callback fired when the copy button is clicked. Receives the markdown output. */\n onCopy?: (markdown: string) => void;\n /** Callback fired when \"Send to Agent\" is clicked. Receives the markdown output and annotations. */\n onSubmit?: (output: string, annotations: Annotation[]) => void;\n /** Whether to copy to clipboard when the copy button is clicked. Defaults to true. */\n copyToClipboard?: boolean;\n /** Server URL for sync (e.g., \"http://localhost:4747\"). If not provided, uses localStorage only. */\n endpoint?: string;\n /** Pre-existing session ID to join. If not provided with endpoint, creates a new session. */\n sessionId?: string;\n /** Called when a new session is created (only when endpoint is provided without sessionId). */\n onSessionCreated?: (sessionId: string) => void;\n /** Webhook URL to receive annotation events. */\n webhookUrl?: string;\n};\n\n/** Alias for PageFeedbackToolbarCSSProps */\nexport type AgentationProps = PageFeedbackToolbarCSSProps;\n\n// =============================================================================\n// Component\n// =============================================================================\n\nexport function PageFeedbackToolbarCSS({\n demoAnnotations,\n demoDelay = 1000,\n enableDemoMode = false,\n onAnnotationAdd,\n onAnnotationDelete,\n onAnnotationUpdate,\n onAnnotationsClear,\n onCopy,\n onSubmit,\n copyToClipboard = true,\n endpoint,\n sessionId: initialSessionId,\n onSessionCreated,\n webhookUrl,\n}: PageFeedbackToolbarCSSProps = {}) {\n const [isActive, setIsActive] = useState(false);\n const [annotations, setAnnotations] = useState<Annotation[]>([]);\n const annotationsRef = useRef<Annotation[]>([]);\n annotationsRef.current = annotations;\n const [showMarkers, setShowMarkers] = useState(true);\n\n // Unified marker visibility state - controls both toolbar and eye toggle\n const [markersVisible, setMarkersVisible] = useState(false);\n const [markersExiting, setMarkersExiting] = useState(false);\n const [hoverInfo, setHoverInfo] = useState<HoverInfo | null>(null);\n const [hoverPosition, setHoverPosition] = useState({ x: 0, y: 0 });\n const [pendingAnnotation, setPendingAnnotation] = useState<{\n x: number;\n y: number;\n clientY: number;\n element: string;\n elementPath: string;\n selectedText?: string;\n boundingBox?: { x: number; y: number; width: number; height: number };\n nearbyText?: string;\n cssClasses?: string;\n isMultiSelect?: boolean;\n isFixed?: boolean;\n fullPath?: string;\n accessibility?: string;\n computedStyles?: string;\n computedStylesObj?: Record<string, string>;\n nearbyElements?: string;\n reactComponents?: string;\n elementBoundingBoxes?: Array<{\n x: number;\n y: number;\n width: number;\n height: number;\n }>;\n // Element references for cmd+shift+click multi-select (for live position queries)\n multiSelectElements?: HTMLElement[];\n // Element reference for single-select (for live position queries)\n targetElement?: HTMLElement;\n drawingIndex?: number;\n strokeId?: string;\n } | null>(null);\n const [copied, setCopied] = useState(false);\n const [sendState, setSendState] = useState<\n \"idle\" | \"sending\" | \"sent\" | \"failed\"\n >(\"idle\");\n const [cleared, setCleared] = useState(false);\n const [isClearing, setIsClearing] = useState(false);\n const [hoveredMarkerId, setHoveredMarkerId] = useState<string | null>(null);\n const [tooltipExitingId, setTooltipExitingId] = useState<string | null>(null);\n const [hoveredTargetElement, setHoveredTargetElement] =\n useState<HTMLElement | null>(null);\n const [hoveredTargetElements, setHoveredTargetElements] = useState<\n HTMLElement[]\n >([]); // For cmd+shift+click multi-select hover\n const [deletingMarkerId, setDeletingMarkerId] = useState<string | null>(null);\n const [renumberFrom, setRenumberFrom] = useState<number | null>(null);\n const [editingAnnotation, setEditingAnnotation] = useState<Annotation | null>(\n null,\n );\n const [editingTargetElement, setEditingTargetElement] =\n useState<HTMLElement | null>(null);\n const [editingTargetElements, setEditingTargetElements] = useState<\n HTMLElement[]\n >([]); // For cmd+shift+click multi-select\n const [scrollY, setScrollY] = useState(0);\n const [isScrolling, setIsScrolling] = useState(false);\n const [mounted, setMounted] = useState(false);\n const [isFrozen, setIsFrozen] = useState(false);\n const [showSettings, setShowSettings] = useState(false);\n const [showSettingsVisible, setShowSettingsVisible] = useState(false);\n const [settingsPage, setSettingsPage] = useState<\"main\" | \"automations\">(\n \"main\",\n );\n const [isTransitioning, setIsTransitioning] = useState(false);\n const [tooltipsHidden, setTooltipsHidden] = useState(false);\n\n // Draw mode state\n const [isDrawMode, setIsDrawMode] = useState(false);\n const [drawStrokes, setDrawStrokes] = useState<Array<{ id: string; points: Array<{x: number, y: number}>; color: string; fixed: boolean }>>([]);\n const drawStrokesRef = useRef(drawStrokes);\n drawStrokesRef.current = drawStrokes;\n const [hoveredDrawingIdx, setHoveredDrawingIdx] = useState<number | null>(null);\n const drawCanvasRef = useRef<HTMLCanvasElement>(null);\n const isDrawingRef = useRef(false);\n const currentStrokeRef = useRef<Array<{x: number, y: number}>>([]);\n const dimAmountRef = useRef(0);\n const visualHighlightRef = useRef<number | null>(null);\n const exitingStrokeIdRef = useRef<string | null>(null);\n const exitingAlphaRef = useRef(1);\n\n\n // Cmd+shift+click multi-select state\n const [pendingMultiSelectElements, setPendingMultiSelectElements] = useState<\n Array<{\n element: HTMLElement;\n rect: DOMRect;\n name: string;\n path: string;\n reactComponents?: string;\n }>\n >([]);\n const modifiersHeldRef = useRef({ cmd: false, shift: false });\n\n // Hide tooltips after button click until mouse leaves\n const hideTooltipsUntilMouseLeave = () => {\n setTooltipsHidden(true);\n };\n\n const showTooltipsAgain = () => {\n setTooltipsHidden(false);\n };\n\n // Tooltip component that renders via portal to escape overflow clipping\n const Tooltip = ({\n content,\n children,\n }: {\n content: string;\n children: React.ReactNode;\n }) => {\n const [isHovering, setIsHovering] = useState(false);\n const [visible, setVisible] = useState(false);\n const [shouldRender, setShouldRender] = useState(false);\n const [position, setPosition] = useState({ top: 0, right: 0 });\n const triggerRef = useRef<HTMLSpanElement>(null);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const exitTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const updatePosition = () => {\n if (triggerRef.current) {\n const rect = triggerRef.current.getBoundingClientRect();\n setPosition({\n top: rect.top + rect.height / 2,\n right: window.innerWidth - rect.left + 8,\n });\n }\n };\n\n const handleMouseEnter = () => {\n setIsHovering(true);\n setShouldRender(true);\n if (exitTimeoutRef.current) {\n clearTimeout(exitTimeoutRef.current);\n exitTimeoutRef.current = null;\n }\n updatePosition();\n timeoutRef.current = originalSetTimeout(() => {\n setVisible(true);\n }, 500); // 0.5s delay before showing\n };\n\n const handleMouseLeave = () => {\n setIsHovering(false);\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n setVisible(false);\n // Keep rendered during exit animation\n exitTimeoutRef.current = originalSetTimeout(() => {\n setShouldRender(false);\n }, 150);\n };\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n if (exitTimeoutRef.current) clearTimeout(exitTimeoutRef.current);\n };\n }, []);\n\n return (\n <>\n <span\n ref={triggerRef}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {children}\n </span>\n {shouldRender &&\n createPortal(\n <div\n data-feedback-toolbar\n style={{\n position: \"fixed\",\n top: position.top,\n right: position.right,\n transform: \"translateY(-50%)\",\n padding: \"6px 10px\",\n background: \"#383838\",\n color: \"rgba(255, 255, 255, 0.7)\",\n fontSize: \"11px\",\n fontWeight: 400,\n lineHeight: \"14px\",\n borderRadius: \"10px\",\n width: \"180px\",\n textAlign: \"left\" as const,\n zIndex: 100020,\n pointerEvents: \"none\" as const,\n boxShadow: \"0px 1px 8px rgba(0, 0, 0, 0.28)\",\n opacity: visible && !isTransitioning ? 1 : 0,\n transition: \"opacity 0.15s ease\",\n }}\n >\n {content}\n </div>,\n document.body,\n )}\n </>\n );\n };\n\n const [settings, setSettings] = useState<ToolbarSettings>(DEFAULT_SETTINGS);\n const [isDarkMode, setIsDarkMode] = useState(true);\n const [showEntranceAnimation, setShowEntranceAnimation] = useState(false);\n\n // Check if running on localhost - React detection only works locally\n const isLocalhost =\n typeof window !== \"undefined\" &&\n (window.location.hostname === \"localhost\" ||\n window.location.hostname === \"127.0.0.1\" ||\n window.location.hostname === \"0.0.0.0\" ||\n window.location.hostname.endsWith(\".local\"));\n\n // Effective React mode - derived from outputDetail when enabled\n const effectiveReactMode: ReactComponentMode =\n isLocalhost && settings.reactEnabled\n ? OUTPUT_TO_REACT_MODE[settings.outputDetail]\n : \"off\";\n\n // Server sync state\n const [currentSessionId, setCurrentSessionId] = useState<string | null>(\n initialSessionId ?? null,\n );\n const sessionInitializedRef = useRef(false);\n const [connectionStatus, setConnectionStatus] = useState<\n \"disconnected\" | \"connecting\" | \"connected\"\n >(endpoint ? \"connecting\" : \"disconnected\");\n\n // Draggable toolbar state\n const [toolbarPosition, setToolbarPosition] = useState<{\n x: number;\n y: number;\n } | null>(null);\n const [isDraggingToolbar, setIsDraggingToolbar] = useState(false);\n const [dragStartPos, setDragStartPos] = useState<{\n x: number;\n y: number;\n toolbarX: number;\n toolbarY: number;\n } | null>(null);\n const [dragRotation, setDragRotation] = useState(0);\n const justFinishedToolbarDragRef = useRef(false);\n\n // For animations - track which markers have animated in and which are exiting\n const [animatedMarkers, setAnimatedMarkers] = useState<Set<string>>(\n new Set(),\n );\n const [exitingMarkers, setExitingMarkers] = useState<Set<string>>(new Set());\n const [pendingExiting, setPendingExiting] = useState(false);\n const [editExiting, setEditExiting] = useState(false);\n\n // Multi-select drag state - use refs for all drag visuals to avoid re-renders\n const [isDragging, setIsDragging] = useState(false);\n const mouseDownPosRef = useRef<{ x: number; y: number } | null>(null);\n const dragStartRef = useRef<{ x: number; y: number } | null>(null);\n const dragRectRef = useRef<HTMLDivElement | null>(null);\n const highlightsContainerRef = useRef<HTMLDivElement | null>(null);\n const justFinishedDragRef = useRef(false);\n const lastElementUpdateRef = useRef(0);\n const recentlyAddedIdRef = useRef<string | null>(null);\n const prevConnectionStatusRef = useRef<typeof connectionStatus | null>(null);\n const DRAG_THRESHOLD = 8;\n const ELEMENT_UPDATE_THROTTLE = 50; // Faster updates since no React re-renders\n\n const popupRef = useRef<AnnotationPopupCSSHandle>(null);\n const editPopupRef = useRef<AnnotationPopupCSSHandle>(null);\n const scrollTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const pathname =\n typeof window !== \"undefined\" ? window.location.pathname : \"/\";\n\n // Handle showSettings changes with exit animation\n useEffect(() => {\n if (showSettings) {\n setShowSettingsVisible(true);\n } else {\n // Reset tooltips when settings close (fixes tooltips not showing after closing settings)\n setTooltipsHidden(false);\n // Reset to main page when settings close\n setSettingsPage(\"main\");\n const timer = originalSetTimeout(() => setShowSettingsVisible(false), 0);\n return () => clearTimeout(timer);\n }\n }, [showSettings]);\n\n useEffect(() => {\n setIsTransitioning(true);\n const timer = originalSetTimeout(() => setIsTransitioning(false), 350);\n return () => clearTimeout(timer);\n }, [settingsPage]);\n\n // Unified marker visibility - depends on BOTH toolbar active AND showMarkers toggle\n // This single effect handles all marker show/hide animations\n const shouldShowMarkers = isActive && showMarkers;\n useEffect(() => {\n if (shouldShowMarkers) {\n // Show markers - reset animations and make visible\n setMarkersExiting(false);\n setMarkersVisible(true);\n setAnimatedMarkers(new Set());\n // After enter animations complete, mark all as animated\n // Must wait for max stagger delay (count * 20ms) + animation duration (250ms)\n const enterMaxDelay = Math.max(0, annotations.length - 1) * 20;\n const timer = originalSetTimeout(() => {\n setAnimatedMarkers((prev) => {\n const newSet = new Set(prev);\n annotations.forEach((a) => newSet.add(a.id));\n return newSet;\n });\n }, enterMaxDelay + 250 + 50);\n return () => clearTimeout(timer);\n } else if (markersVisible) {\n // Hide markers - start exit animation, then unmount\n // Timeout must cover max stagger delay + animation duration (200ms)\n setMarkersExiting(true);\n const maxDelay = Math.max(0, annotations.length - 1) * 20;\n const timer = originalSetTimeout(() => {\n setMarkersVisible(false);\n setMarkersExiting(false);\n }, maxDelay + 200 + 50); // +50ms buffer\n return () => clearTimeout(timer);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [shouldShowMarkers]);\n\n // Mount and load\n useEffect(() => {\n setMounted(true);\n setScrollY(window.scrollY);\n const stored = loadAnnotations<Annotation>(pathname);\n setAnnotations(stored);\n\n // Trigger entrance animation only on first load (not on SPA navigation)\n if (!hasPlayedEntranceAnimation) {\n setShowEntranceAnimation(true);\n hasPlayedEntranceAnimation = true;\n // Remove animation class after it completes (toolbar: 500ms, badge: 400ms delay + 300ms)\n originalSetTimeout(() => setShowEntranceAnimation(false), 750);\n }\n\n try {\n const storedSettings = localStorage.getItem(\"feedback-toolbar-settings\");\n if (storedSettings) {\n setSettings({ ...DEFAULT_SETTINGS, ...JSON.parse(storedSettings) });\n }\n } catch (e) {\n // Ignore parsing errors\n }\n\n // Load saved theme preference, default to dark mode\n try {\n const savedTheme = localStorage.getItem(\"feedback-toolbar-theme\");\n if (savedTheme !== null) {\n setIsDarkMode(savedTheme === \"dark\");\n }\n // If no saved preference, keep default (dark mode)\n } catch (e) {\n // Ignore localStorage errors\n }\n\n // Load saved toolbar position\n try {\n const savedPosition = localStorage.getItem(\"feedback-toolbar-position\");\n if (savedPosition) {\n const pos = JSON.parse(savedPosition);\n if (typeof pos.x === \"number\" && typeof pos.y === \"number\") {\n setToolbarPosition(pos);\n }\n }\n } catch (e) {\n // Ignore localStorage errors\n }\n }, [pathname]);\n\n // Save settings\n useEffect(() => {\n if (mounted) {\n localStorage.setItem(\n \"feedback-toolbar-settings\",\n JSON.stringify(settings),\n );\n }\n }, [settings, mounted]);\n\n // Save theme preference\n useEffect(() => {\n if (mounted) {\n localStorage.setItem(\n \"feedback-toolbar-theme\",\n isDarkMode ? \"dark\" : \"light\",\n );\n }\n }, [isDarkMode, mounted]);\n\n // Save toolbar position when drag ends\n const prevDraggingRef = useRef(false);\n useEffect(() => {\n const wasDragging = prevDraggingRef.current;\n prevDraggingRef.current = isDraggingToolbar;\n\n // Save position when dragging ends (transition from true to false)\n if (wasDragging && !isDraggingToolbar && toolbarPosition && mounted) {\n localStorage.setItem(\n \"feedback-toolbar-position\",\n JSON.stringify(toolbarPosition),\n );\n }\n }, [isDraggingToolbar, toolbarPosition, mounted]);\n\n // Initialize server session (when endpoint is provided)\n useEffect(() => {\n if (!endpoint || !mounted || sessionInitializedRef.current) return;\n sessionInitializedRef.current = true;\n setConnectionStatus(\"connecting\");\n\n const initSession = async () => {\n try {\n // Check for stored session ID to rejoin on refresh\n const storedSessionId = loadSessionId(pathname);\n const sessionIdToJoin = initialSessionId || storedSessionId;\n let sessionEstablished = false;\n\n if (sessionIdToJoin) {\n // Join existing session - server annotations are authoritative\n try {\n const session = await getSession(endpoint, sessionIdToJoin);\n setCurrentSessionId(session.id);\n setConnectionStatus(\"connected\");\n saveSessionId(pathname, session.id);\n sessionEstablished = true;\n\n // Find local annotations that need to be synced:\n // 1. Annotations never synced to any session\n // 2. Annotations synced to a different session\n // 3. Annotations marked as synced to THIS session but missing from server\n // (handles server-side deletion)\n const allLocalAnnotations = loadAnnotations<Annotation>(pathname);\n const serverIds = new Set(session.annotations.map((a) => a.id));\n const localToMerge = allLocalAnnotations.filter((a) => {\n // If it exists on server, don't re-upload\n if (serverIds.has(a.id)) return false;\n // Otherwise, needs to be synced (whether never synced, synced elsewhere, or missing from server)\n return true;\n });\n\n // Sync unsynced local annotations to this session\n if (localToMerge.length > 0) {\n const baseUrl =\n typeof window !== \"undefined\" ? window.location.origin : \"\";\n const pageUrl = `${baseUrl}${pathname}`;\n\n const results = await Promise.allSettled(\n localToMerge.map((annotation) =>\n syncAnnotation(endpoint, session.id, {\n ...annotation,\n sessionId: session.id,\n url: pageUrl,\n }),\n ),\n );\n\n const syncedAnnotations = results.map((result, i) => {\n if (result.status === \"fulfilled\") {\n return result.value;\n }\n console.warn(\n \"[Agentation] Failed to sync annotation:\",\n result.reason,\n );\n return localToMerge[i];\n });\n\n // Mark merged annotations as synced\n const allAnnotations = [\n ...session.annotations,\n ...syncedAnnotations,\n ];\n setAnnotations(allAnnotations);\n saveAnnotationsWithSyncMarker(\n pathname,\n allAnnotations,\n session.id,\n );\n } else {\n setAnnotations(session.annotations);\n saveAnnotationsWithSyncMarker(\n pathname,\n session.annotations,\n session.id,\n );\n }\n } catch (joinError) {\n // Session doesn't exist or expired - will create new below\n console.warn(\n \"[Agentation] Could not join session, creating new:\",\n joinError,\n );\n // Clear the stored session ID since it's invalid\n clearSessionId(pathname);\n // sessionEstablished remains false, will create new session\n }\n }\n\n // Create new session if we don't have one yet (either no stored ID, or rejoin failed)\n if (!sessionEstablished) {\n // Create new session for current page\n const currentUrl =\n typeof window !== \"undefined\" ? window.location.href : \"/\";\n const session = await createSession(endpoint, currentUrl);\n setCurrentSessionId(session.id);\n setConnectionStatus(\"connected\");\n saveSessionId(pathname, session.id);\n onSessionCreated?.(session.id);\n\n // Only sync annotations that have never been synced (no _syncedTo marker)\n const allAnnotations = loadAllAnnotations<Annotation>();\n const baseUrl =\n typeof window !== \"undefined\" ? window.location.origin : \"\";\n\n // Sync annotations from all pages in parallel\n const syncPromises: Promise<void>[] = [];\n for (const [pagePath, annotations] of allAnnotations) {\n // Filter to only unsynced annotations\n const unsyncedAnnotations = annotations.filter(\n (a) => !(a as Annotation & { _syncedTo?: string })._syncedTo,\n );\n if (unsyncedAnnotations.length === 0) continue;\n\n const pageUrl = `${baseUrl}${pagePath}`;\n const isCurrentPage = pagePath === pathname;\n\n syncPromises.push(\n (async () => {\n try {\n // Use current session for current page, create new sessions for other pages\n const targetSession = isCurrentPage\n ? session\n : await createSession(endpoint, pageUrl);\n\n const results = await Promise.allSettled(\n unsyncedAnnotations.map((annotation) =>\n syncAnnotation(endpoint, targetSession.id, {\n ...annotation,\n sessionId: targetSession.id,\n url: pageUrl,\n }),\n ),\n );\n\n // Mark synced annotations and update local state for current page\n const syncedAnnotations = results.map((result, i) => {\n if (result.status === \"fulfilled\") {\n return result.value;\n }\n console.warn(\n \"[Agentation] Failed to sync annotation:\",\n result.reason,\n );\n return unsyncedAnnotations[i];\n });\n\n // Save with sync marker\n saveAnnotationsWithSyncMarker(\n pagePath,\n syncedAnnotations,\n targetSession.id,\n );\n\n if (isCurrentPage) {\n const originalIds = new Set(\n unsyncedAnnotations.map((a) => a.id),\n );\n setAnnotations((prev) => {\n const newDuringSync = prev.filter(\n (a) => !originalIds.has(a.id),\n );\n return [...syncedAnnotations, ...newDuringSync];\n });\n }\n } catch (err) {\n console.warn(\n `[Agentation] Failed to sync annotations for ${pagePath}:`,\n err,\n );\n }\n })(),\n );\n }\n\n await Promise.allSettled(syncPromises);\n }\n } catch (error) {\n // Network error - continue in local-only mode\n setConnectionStatus(\"disconnected\");\n console.warn(\n \"[Agentation] Failed to initialize session, using local storage:\",\n error,\n );\n }\n };\n\n initSession();\n }, [endpoint, initialSessionId, mounted, onSessionCreated, pathname]);\n\n // Periodic health check for server connection\n useEffect(() => {\n if (!endpoint || !mounted) return;\n\n const checkHealth = async () => {\n try {\n const response = await fetch(`${endpoint}/health`);\n if (response.ok) {\n setConnectionStatus(\"connected\");\n } else {\n setConnectionStatus(\"disconnected\");\n }\n } catch {\n setConnectionStatus(\"disconnected\");\n }\n };\n\n // Check immediately, then every 10 seconds\n checkHealth();\n const interval = originalSetInterval(checkHealth, 10000);\n return () => clearInterval(interval);\n }, [endpoint, mounted]);\n\n // Listen for server-side annotation events (real-time sync with other users)\n useEffect(() => {\n if (!endpoint || !mounted || !currentSessionId) return;\n\n const eventSource = new EventSource(\n `${endpoint}/sessions/${currentSessionId}/events`\n );\n\n const removedStatuses = [\"resolved\", \"dismissed\"];\n\n const handleCreated = (e: MessageEvent) => {\n try {\n const event = JSON.parse(e.data);\n const annotation = event.payload as Annotation;\n if (!annotation?.id) return;\n // Skip if we already have this annotation locally (our own create).\n // Ref check guards the callback; setter check guards state against races.\n if (annotationsRef.current.some((a) => a.id === annotation.id)) return;\n setAnnotations((prev) =>\n prev.some((a) => a.id === annotation.id) ? prev : [...prev, annotation]\n );\n onAnnotationAdd?.(annotation);\n } catch {\n // Ignore parse errors\n }\n };\n\n const handleUpdated = (e: MessageEvent) => {\n try {\n const event = JSON.parse(e.data);\n const annotation = event.payload as Annotation;\n if (!annotation?.id) return;\n if (removedStatuses.includes(annotation.status!)) {\n const id = annotation.id;\n // Trigger exit animation then remove\n setExitingMarkers((prev) => new Set(prev).add(id));\n originalSetTimeout(() => {\n setAnnotations((prev) => prev.filter((a) => a.id !== id));\n setExitingMarkers((prev) => {\n const next = new Set(prev);\n next.delete(id);\n return next;\n });\n }, 150);\n } else {\n setAnnotations((prev) =>\n prev.map((a) => (a.id === annotation.id ? { ...a, ...annotation } : a))\n );\n }\n onAnnotationUpdate?.(annotation);\n } catch {\n // Ignore parse errors\n }\n };\n\n const handleDeleted = (e: MessageEvent) => {\n try {\n const event = JSON.parse(e.data);\n const id = (event.payload?.id ?? event.payload) as string;\n if (!id) return;\n const existing = annotationsRef.current.find((a) => a.id === id);\n // Always attempt removal (ref may be stale), callback only if found\n setExitingMarkers((prev) => new Set(prev).add(id));\n originalSetTimeout(() => {\n setAnnotations((prev) => prev.filter((a) => a.id !== id));\n setExitingMarkers((prev) => {\n const next = new Set(prev);\n next.delete(id);\n return next;\n });\n }, 150);\n if (existing) onAnnotationDelete?.(existing);\n } catch {\n // Ignore parse errors\n }\n };\n\n eventSource.addEventListener(\"annotation.created\", handleCreated);\n eventSource.addEventListener(\"annotation.updated\", handleUpdated);\n eventSource.addEventListener(\"annotation.deleted\", handleDeleted);\n\n return () => {\n eventSource.removeEventListener(\"annotation.created\", handleCreated);\n eventSource.removeEventListener(\"annotation.updated\", handleUpdated);\n eventSource.removeEventListener(\"annotation.deleted\", handleDeleted);\n eventSource.close();\n };\n }, [endpoint, mounted, currentSessionId]);\n\n // Sync local annotations when connection is restored\n useEffect(() => {\n if (!endpoint || !mounted) return;\n\n // Check if we just reconnected (was disconnected, now connected)\n const wasDisconnected = prevConnectionStatusRef.current === \"disconnected\";\n const isNowConnected = connectionStatus === \"connected\";\n prevConnectionStatusRef.current = connectionStatus;\n\n if (wasDisconnected && isNowConnected) {\n // Sync any local annotations that aren't on the server\n const syncLocalAnnotations = async () => {\n try {\n const localAnnotations = loadAnnotations<Annotation>(pathname);\n if (localAnnotations.length === 0) return;\n\n const baseUrl = typeof window !== \"undefined\" ? window.location.origin : \"\";\n const pageUrl = `${baseUrl}${pathname}`;\n\n // Get or create session\n let sessionId = currentSessionId;\n let serverAnnotations: Annotation[] = [];\n\n if (sessionId) {\n // Try to get existing session\n try {\n const session = await getSession(endpoint, sessionId);\n serverAnnotations = session.annotations;\n } catch {\n // Session doesn't exist anymore, create new one\n sessionId = null;\n }\n }\n\n if (!sessionId) {\n // Create new session\n const newSession = await createSession(endpoint, pageUrl);\n sessionId = newSession.id;\n setCurrentSessionId(sessionId);\n saveSessionId(pathname, sessionId);\n }\n\n // Find annotations that need syncing\n const serverIds = new Set(serverAnnotations.map((a) => a.id));\n const unsyncedLocal = localAnnotations.filter((a) => !serverIds.has(a.id));\n\n if (unsyncedLocal.length > 0) {\n const results = await Promise.allSettled(\n unsyncedLocal.map((annotation) =>\n syncAnnotation(endpoint, sessionId!, {\n ...annotation,\n sessionId: sessionId!,\n url: pageUrl,\n })\n )\n );\n\n const syncedAnnotations = results.map((result, i) => {\n if (result.status === \"fulfilled\") {\n return result.value;\n }\n console.warn(\"[Agentation] Failed to sync annotation on reconnect:\", result.reason);\n return unsyncedLocal[i];\n });\n\n // Update local state with server + synced annotations\n const allAnnotations = [...serverAnnotations, ...syncedAnnotations];\n setAnnotations(allAnnotations);\n saveAnnotationsWithSyncMarker(pathname, allAnnotations, sessionId!);\n }\n } catch (err) {\n console.warn(\"[Agentation] Failed to sync on reconnect:\", err);\n }\n };\n\n syncLocalAnnotations();\n }\n }, [connectionStatus, endpoint, mounted, currentSessionId, pathname]);\n\n // Demo annotations\n useEffect(() => {\n if (!enableDemoMode) return;\n if (!mounted || !demoAnnotations || demoAnnotations.length === 0) return;\n if (annotations.length > 0) return;\n\n const timeoutIds: ReturnType<typeof setTimeout>[] = [];\n\n timeoutIds.push(\n originalSetTimeout(() => {\n setIsActive(true);\n }, demoDelay - 200),\n );\n\n demoAnnotations.forEach((demo, index) => {\n const annotationDelay = demoDelay + index * 300;\n\n timeoutIds.push(\n originalSetTimeout(() => {\n const element = document.querySelector(demo.selector) as HTMLElement;\n if (!element) return;\n\n const rect = element.getBoundingClientRect();\n const { name, path } = identifyElement(element);\n\n const newAnnotation: Annotation = {\n id: `demo-${Date.now()}-${index}`,\n x: ((rect.left + rect.width / 2) / window.innerWidth) * 100,\n y: rect.top + rect.height / 2 + window.scrollY,\n comment: demo.comment,\n element: name,\n elementPath: path,\n timestamp: Date.now(),\n selectedText: demo.selectedText,\n boundingBox: {\n x: rect.left,\n y: rect.top + window.scrollY,\n width: rect.width,\n height: rect.height,\n },\n nearbyText: getNearbyText(element),\n cssClasses: getElementClasses(element),\n };\n\n setAnnotations((prev) => [...prev, newAnnotation]);\n }, annotationDelay),\n );\n });\n\n return () => {\n timeoutIds.forEach(clearTimeout);\n };\n }, [enableDemoMode, mounted, demoAnnotations, demoDelay]);\n\n // Track scroll\n useEffect(() => {\n const handleScroll = () => {\n setScrollY(window.scrollY);\n setIsScrolling(true);\n\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n\n scrollTimeoutRef.current = originalSetTimeout(() => {\n setIsScrolling(false);\n }, 150);\n };\n\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n return () => {\n window.removeEventListener(\"scroll\", handleScroll);\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n };\n }, []);\n\n // Save annotations (preserving sync markers if connected to a session)\n useEffect(() => {\n if (mounted && annotations.length > 0) {\n if (currentSessionId) {\n // Connected to session - save with sync marker to prevent re-upload on refresh\n saveAnnotationsWithSyncMarker(pathname, annotations, currentSessionId);\n } else {\n // Not connected - save without markers (will sync when connected)\n saveAnnotations(pathname, annotations);\n }\n } else if (mounted && annotations.length === 0) {\n localStorage.removeItem(getStorageKey(pathname));\n }\n }, [annotations, pathname, mounted, currentSessionId]);\n\n // Freeze animations (delegates to freeze-animations utility)\n const freezeAnimations = useCallback(() => {\n if (isFrozen) return;\n freezeAll();\n setIsFrozen(true);\n }, [isFrozen]);\n\n const unfreezeAnimations = useCallback(() => {\n if (!isFrozen) return;\n unfreezeAll();\n setIsFrozen(false);\n }, [isFrozen]);\n\n const toggleFreeze = useCallback(() => {\n if (isFrozen) {\n unfreezeAnimations();\n } else {\n freezeAnimations();\n }\n }, [isFrozen, freezeAnimations, unfreezeAnimations]);\n\n // Create pending annotation from cmd+shift+click multi-select\n const createMultiSelectPendingAnnotation = useCallback(() => {\n if (pendingMultiSelectElements.length === 0) return;\n\n const firstItem = pendingMultiSelectElements[0];\n const firstEl = firstItem.element;\n const isMulti = pendingMultiSelectElements.length > 1;\n\n // Get fresh rects for all elements\n const freshRects = pendingMultiSelectElements.map((item) =>\n item.element.getBoundingClientRect(),\n );\n\n if (!isMulti) {\n // Single element - treat as regular annotation (not multi-select)\n const rect = freshRects[0];\n const isFixed = isElementFixed(firstEl);\n\n setPendingAnnotation({\n x: (rect.left / window.innerWidth) * 100,\n y: isFixed ? rect.top : rect.top + window.scrollY,\n clientY: rect.top,\n element: firstItem.name,\n elementPath: firstItem.path,\n boundingBox: {\n x: rect.left,\n y: isFixed ? rect.top : rect.top + window.scrollY,\n width: rect.width,\n height: rect.height,\n },\n isFixed,\n fullPath: getFullElementPath(firstEl),\n accessibility: getAccessibilityInfo(firstEl),\n computedStyles: getForensicComputedStyles(firstEl),\n computedStylesObj: getDetailedComputedStyles(firstEl),\n nearbyElements: getNearbyElements(firstEl),\n cssClasses: getElementClasses(firstEl),\n nearbyText: getNearbyText(firstEl),\n reactComponents: firstItem.reactComponents,\n });\n } else {\n // Multiple elements - multi-select annotation\n const bounds = {\n left: Math.min(...freshRects.map((r) => r.left)),\n top: Math.min(...freshRects.map((r) => r.top)),\n right: Math.max(...freshRects.map((r) => r.right)),\n bottom: Math.max(...freshRects.map((r) => r.bottom)),\n };\n\n const names = pendingMultiSelectElements\n .slice(0, 5)\n .map((item) => item.name)\n .join(\", \");\n const suffix =\n pendingMultiSelectElements.length > 5\n ? ` +${pendingMultiSelectElements.length - 5} more`\n : \"\";\n\n const elementBoundingBoxes = freshRects.map((rect) => ({\n x: rect.left,\n y: rect.top + window.scrollY,\n width: rect.width,\n height: rect.height,\n }));\n\n // Position marker near the last selected element (most recent click)\n const lastItem = pendingMultiSelectElements[pendingMultiSelectElements.length - 1];\n const lastEl = lastItem.element;\n const lastRect = freshRects[freshRects.length - 1];\n const lastCenterX = lastRect.left + lastRect.width / 2;\n const lastCenterY = lastRect.top + lastRect.height / 2;\n const lastIsFixed = isElementFixed(lastEl);\n\n setPendingAnnotation({\n x: (lastCenterX / window.innerWidth) * 100,\n y: lastIsFixed ? lastCenterY : lastCenterY + window.scrollY,\n clientY: lastCenterY,\n element: `${pendingMultiSelectElements.length} elements: ${names}${suffix}`,\n elementPath: \"multi-select\",\n boundingBox: {\n x: bounds.left,\n y: bounds.top + window.scrollY,\n width: bounds.right - bounds.left,\n height: bounds.bottom - bounds.top,\n },\n isMultiSelect: true,\n isFixed: lastIsFixed,\n elementBoundingBoxes,\n multiSelectElements: pendingMultiSelectElements.map((item) => item.element),\n targetElement: lastEl, // Anchor marker/popup to last clicked element\n fullPath: getFullElementPath(firstEl),\n accessibility: getAccessibilityInfo(firstEl),\n computedStyles: getForensicComputedStyles(firstEl),\n computedStylesObj: getDetailedComputedStyles(firstEl),\n nearbyElements: getNearbyElements(firstEl),\n cssClasses: getElementClasses(firstEl),\n nearbyText: getNearbyText(firstEl),\n });\n }\n\n setPendingMultiSelectElements([]);\n setHoverInfo(null);\n }, [pendingMultiSelectElements]);\n\n // Reset state when deactivating\n useEffect(() => {\n if (!isActive) {\n setPendingAnnotation(null);\n setEditingAnnotation(null);\n setEditingTargetElement(null);\n setEditingTargetElements([]);\n setHoverInfo(null);\n setShowSettings(false); // Close settings when toolbar closes\n setPendingMultiSelectElements([]); // Clear multi-select\n modifiersHeldRef.current = { cmd: false, shift: false }; // Reset modifier tracking\n setIsDrawMode(false); // Exit draw mode\n if (isFrozen) {\n unfreezeAnimations();\n }\n }\n }, [isActive, isFrozen, unfreezeAnimations]);\n\n // Unmount safety — if component is removed while frozen, unfreeze the page\n useEffect(() => {\n return () => {\n unfreezeAll();\n };\n }, []);\n\n // Custom cursor\n useEffect(() => {\n if (!isActive) return;\n\n const style = document.createElement(\"style\");\n style.id = \"feedback-cursor-styles\";\n // Text elements get text cursor (higher specificity with body prefix)\n // Everything else gets crosshair\n style.textContent = `\n body * {\n cursor: crosshair !important;\n }\n body p, body span, body h1, body h2, body h3, body h4, body h5, body h6,\n body li, body td, body th, body label, body blockquote, body figcaption,\n body caption, body legend, body dt, body dd, body pre, body code,\n body em, body strong, body b, body i, body u, body s, body a,\n body time, body address, body cite, body q, body abbr, body dfn,\n body mark, body small, body sub, body sup, body [contenteditable],\n body p *, body span *, body h1 *, body h2 *, body h3 *, body h4 *,\n body h5 *, body h6 *, body li *, body a *, body label *, body pre *,\n body code *, body blockquote *, body [contenteditable] * {\n cursor: text !important;\n }\n [data-feedback-toolbar], [data-feedback-toolbar] * {\n cursor: default !important;\n }\n [data-feedback-toolbar] textarea,\n [data-feedback-toolbar] input[type=\"text\"],\n [data-feedback-toolbar] input[type=\"url\"] {\n cursor: text !important;\n }\n [data-feedback-toolbar] button,\n [data-feedback-toolbar] button *,\n [data-feedback-toolbar] label,\n [data-feedback-toolbar] label *,\n [data-feedback-toolbar] a,\n [data-feedback-toolbar] a *,\n [data-feedback-toolbar] [role=\"button\"],\n [data-feedback-toolbar] [role=\"button\"] * {\n cursor: pointer !important;\n }\n [data-annotation-marker], [data-annotation-marker] * {\n cursor: pointer !important;\n }\n html[data-drawing-hover], html[data-drawing-hover] * {\n cursor: pointer !important;\n }\n `;\n document.head.appendChild(style);\n\n return () => {\n const existingStyle = document.getElementById(\"feedback-cursor-styles\");\n if (existingStyle) existingStyle.remove();\n };\n }, [isActive]);\n\n // Cursor change when hovering a drawing stroke (both draw mode and normal mode)\n useEffect(() => {\n if (hoveredDrawingIdx !== null && isActive) {\n document.documentElement.setAttribute(\"data-drawing-hover\", \"\");\n return () => document.documentElement.removeAttribute(\"data-drawing-hover\");\n }\n }, [hoveredDrawingIdx, isActive]);\n\n // Handle mouse move\n useEffect(() => {\n if (!isActive || pendingAnnotation || isDrawMode) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n // Use composedPath to get actual target inside shadow DOM\n const target = (e.composedPath()[0] || e.target) as HTMLElement;\n if (closestCrossingShadow(target, \"[data-feedback-toolbar]\")) {\n setHoverInfo(null);\n // Only clear drawing hover when NOT over a marker — markers manage their own via handleMarkerHover\n if (!target.closest(\"[data-annotation-marker]\")) {\n setHoveredDrawingIdx(null);\n }\n return;\n }\n\n // Check if hovering over a completed drawing stroke\n if (drawStrokes.length > 0) {\n const strokeIdx = findStrokeAtPoint(e.clientX, e.clientY, drawStrokes);\n if (strokeIdx !== null) {\n setHoveredDrawingIdx(strokeIdx);\n setHoverInfo(null);\n return;\n }\n }\n setHoveredDrawingIdx(null);\n\n const elementUnder = deepElementFromPoint(e.clientX, e.clientY);\n if (\n !elementUnder ||\n closestCrossingShadow(elementUnder, \"[data-feedback-toolbar]\")\n ) {\n setHoverInfo(null);\n return;\n }\n\n const { name, elementName, path, reactComponents } =\n identifyElementWithReact(elementUnder, effectiveReactMode);\n const rect = elementUnder.getBoundingClientRect();\n\n setHoverInfo({\n element: name,\n elementName,\n elementPath: path,\n rect,\n reactComponents,\n });\n setHoverPosition({ x: e.clientX, y: e.clientY });\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove);\n return () => document.removeEventListener(\"mousemove\", handleMouseMove);\n }, [isActive, pendingAnnotation, isDrawMode, effectiveReactMode, drawStrokes]);\n\n // Start editing an annotation (right-click or click on drawing stroke)\n const startEditAnnotation = useCallback((annotation: Annotation) => {\n setEditingAnnotation(annotation);\n setHoveredMarkerId(null);\n setHoveredTargetElement(null);\n setHoveredTargetElements([]);\n\n // Try to find elements at the annotation's position(s) for live tracking\n if (annotation.elementBoundingBoxes?.length) {\n // Cmd+shift+click: find element at each bounding box center\n const elements: HTMLElement[] = [];\n for (const bb of annotation.elementBoundingBoxes) {\n const centerX = bb.x + bb.width / 2;\n const centerY = bb.y + bb.height / 2 - window.scrollY;\n const el = deepElementFromPoint(centerX, centerY);\n if (el) elements.push(el);\n }\n setEditingTargetElements(elements);\n setEditingTargetElement(null);\n } else if (annotation.boundingBox) {\n // Single element\n const bb = annotation.boundingBox;\n const centerX = bb.x + bb.width / 2;\n // Convert document coords to viewport coords (unless fixed)\n const centerY = annotation.isFixed\n ? bb.y + bb.height / 2\n : bb.y + bb.height / 2 - window.scrollY;\n const el = deepElementFromPoint(centerX, centerY);\n\n // Validate found element's size roughly matches stored bounding box\n if (el) {\n const elRect = el.getBoundingClientRect();\n const widthRatio = elRect.width / bb.width;\n const heightRatio = elRect.height / bb.height;\n if (widthRatio < 0.5 || heightRatio < 0.5) {\n setEditingTargetElement(null);\n } else {\n setEditingTargetElement(el);\n }\n } else {\n setEditingTargetElement(null);\n }\n setEditingTargetElements([]);\n } else {\n setEditingTargetElement(null);\n setEditingTargetElements([]);\n }\n }, []);\n\n // Handle click\n useEffect(() => {\n if (!isActive || isDrawMode) return;\n\n const handleClick = (e: MouseEvent) => {\n if (justFinishedDragRef.current) {\n justFinishedDragRef.current = false;\n return;\n }\n\n // Use composedPath to get actual target inside shadow DOM, falling back to e.target\n const target = (e.composedPath()[0] || e.target) as HTMLElement;\n\n if (closestCrossingShadow(target, \"[data-feedback-toolbar]\")) return;\n if (closestCrossingShadow(target, \"[data-annotation-popup]\")) return;\n if (closestCrossingShadow(target, \"[data-annotation-marker]\")) return;\n\n // Check if clicking on a completed drawing stroke\n if (drawStrokes.length > 0 && !pendingAnnotation && !editingAnnotation) {\n const strokeIdx = findStrokeAtPoint(e.clientX, e.clientY, drawStrokes);\n if (strokeIdx !== null) {\n e.preventDefault();\n e.stopPropagation();\n\n // If annotation already exists for this drawing, open it in edit mode\n const existingAnnotation = annotations.find(a => a.strokeId === drawStrokes[strokeIdx]?.id || a.drawingIndex === strokeIdx);\n if (existingAnnotation) {\n startEditAnnotation(existingAnnotation);\n return;\n }\n\n const stroke = drawStrokes[strokeIdx];\n const scrollYNow = window.scrollY;\n\n // Temporarily hide canvas to find element underneath at click point\n const canvas = drawCanvasRef.current;\n if (canvas) canvas.style.visibility = \"hidden\";\n const elementUnder = deepElementFromPoint(e.clientX, e.clientY);\n if (canvas) canvas.style.visibility = \"\";\n\n const gestureShape = classifyStrokeGesture(stroke.points, stroke.fixed);\n let name = `Drawing: ${gestureShape}`;\n let path = \"\";\n let reactComponents: string | null = null;\n let nearbyText: string | undefined;\n let cssClasses: string | undefined;\n let fullPath: string | undefined;\n let accessibility: string | undefined;\n let computedStylesStr: string | undefined;\n let computedStylesObj: Record<string, string> | undefined;\n let nearbyElements: string | undefined;\n let isFixed = stroke.fixed;\n let boundingBox: { x: number; y: number; width: number; height: number } | undefined;\n\n if (elementUnder) {\n const info = identifyElementWithReact(elementUnder, effectiveReactMode);\n name = `Drawing: ${gestureShape} → ${info.name}`;\n path = info.path;\n reactComponents = info.reactComponents;\n nearbyText = getNearbyText(elementUnder);\n cssClasses = getElementClasses(elementUnder);\n fullPath = getFullElementPath(elementUnder);\n accessibility = getAccessibilityInfo(elementUnder);\n computedStylesStr = getForensicComputedStyles(elementUnder);\n computedStylesObj = getDetailedComputedStyles(elementUnder);\n nearbyElements = getNearbyElements(elementUnder);\n const rect = elementUnder.getBoundingClientRect();\n boundingBox = {\n x: rect.left,\n y: isFixed ? rect.top : rect.top + scrollYNow,\n width: rect.width,\n height: rect.height,\n };\n }\n\n // Position marker at click point (on the stroke)\n const annX = (e.clientX / window.innerWidth) * 100;\n const annY = isFixed ? e.clientY : e.clientY + scrollYNow;\n\n setPendingAnnotation({\n x: annX,\n y: annY,\n clientY: e.clientY,\n element: name,\n elementPath: path,\n boundingBox,\n nearbyText,\n cssClasses,\n isFixed,\n fullPath,\n accessibility,\n computedStyles: computedStylesStr,\n computedStylesObj,\n nearbyElements,\n reactComponents: reactComponents ?? undefined,\n targetElement: elementUnder ?? undefined,\n drawingIndex: strokeIdx,\n strokeId: stroke.id,\n });\n setHoverInfo(null);\n setHoveredDrawingIdx(null);\n return;\n }\n }\n\n // Handle cmd+shift+click for multi-element selection\n if (e.metaKey && e.shiftKey && !pendingAnnotation && !editingAnnotation) {\n e.preventDefault();\n e.stopPropagation();\n\n const elementUnder = deepElementFromPoint(e.clientX, e.clientY);\n if (!elementUnder) return;\n\n const rect = elementUnder.getBoundingClientRect();\n const { name, path, reactComponents } = identifyElementWithReact(\n elementUnder,\n effectiveReactMode,\n );\n\n // Toggle: check if already selected\n const existingIndex = pendingMultiSelectElements.findIndex(\n (item) => item.element === elementUnder,\n );\n\n if (existingIndex >= 0) {\n // Deselect\n setPendingMultiSelectElements((prev) =>\n prev.filter((_, i) => i !== existingIndex),\n );\n } else {\n // Select\n setPendingMultiSelectElements((prev) => [\n ...prev,\n {\n element: elementUnder,\n rect,\n name,\n path,\n reactComponents: reactComponents ?? undefined,\n },\n ]);\n }\n return;\n }\n\n const isInteractive = closestCrossingShadow(\n target,\n \"button, a, input, select, textarea, [role='button'], [onclick]\",\n );\n\n // Block interactions on interactive elements when enabled\n if (settings.blockInteractions && isInteractive) {\n e.preventDefault();\n e.stopPropagation();\n // Still create annotation on the interactive element\n }\n\n if (pendingAnnotation) {\n if (isInteractive && !settings.blockInteractions) {\n return;\n }\n e.preventDefault();\n popupRef.current?.shake();\n return;\n }\n\n if (editingAnnotation) {\n if (isInteractive && !settings.blockInteractions) {\n return;\n }\n e.preventDefault();\n editPopupRef.current?.shake();\n return;\n }\n\n e.preventDefault();\n\n const elementUnder = deepElementFromPoint(e.clientX, e.clientY);\n if (!elementUnder) return;\n\n const { name, path, reactComponents } = identifyElementWithReact(\n elementUnder,\n effectiveReactMode,\n );\n const rect = elementUnder.getBoundingClientRect();\n const x = (e.clientX / window.innerWidth) * 100;\n\n const isFixed = isElementFixed(elementUnder);\n const y = isFixed ? e.clientY : e.clientY + window.scrollY;\n\n const selection = window.getSelection();\n let selectedText: string | undefined;\n if (selection && selection.toString().trim().length > 0) {\n selectedText = selection.toString().trim().slice(0, 500);\n }\n\n // Capture computed styles - filtered for popup, full for forensic output\n const computedStylesObj = getDetailedComputedStyles(elementUnder);\n const computedStylesStr = getForensicComputedStyles(elementUnder);\n\n setPendingAnnotation({\n x,\n y,\n clientY: e.clientY,\n element: name,\n elementPath: path,\n selectedText,\n boundingBox: {\n x: rect.left,\n y: isFixed ? rect.top : rect.top + window.scrollY,\n width: rect.width,\n height: rect.height,\n },\n nearbyText: getNearbyText(elementUnder),\n cssClasses: getElementClasses(elementUnder),\n isFixed,\n fullPath: getFullElementPath(elementUnder),\n accessibility: getAccessibilityInfo(elementUnder),\n computedStyles: computedStylesStr,\n computedStylesObj,\n nearbyElements: getNearbyElements(elementUnder),\n reactComponents: reactComponents ?? undefined,\n targetElement: elementUnder, // Store for live position queries\n });\n setHoverInfo(null);\n };\n\n // Use capture phase to intercept before element handlers\n document.addEventListener(\"click\", handleClick, true);\n return () => document.removeEventListener(\"click\", handleClick, true);\n }, [\n isActive,\n isDrawMode,\n pendingAnnotation,\n editingAnnotation,\n settings.blockInteractions,\n effectiveReactMode,\n pendingMultiSelectElements,\n drawStrokes,\n annotations,\n startEditAnnotation,\n ]);\n\n // Cmd+shift+click multi-select: keyup listener for modifier release\n useEffect(() => {\n if (!isActive) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Meta\") modifiersHeldRef.current.cmd = true;\n if (e.key === \"Shift\") modifiersHeldRef.current.shift = true;\n };\n\n const handleKeyUp = (e: KeyboardEvent) => {\n const wasHoldingBoth =\n modifiersHeldRef.current.cmd && modifiersHeldRef.current.shift;\n\n if (e.key === \"Meta\") modifiersHeldRef.current.cmd = false;\n if (e.key === \"Shift\") modifiersHeldRef.current.shift = false;\n\n const nowHoldingBoth =\n modifiersHeldRef.current.cmd && modifiersHeldRef.current.shift;\n\n // Released modifier while holding elements → trigger popup\n if (\n wasHoldingBoth &&\n !nowHoldingBoth &&\n pendingMultiSelectElements.length > 0\n ) {\n createMultiSelectPendingAnnotation();\n }\n };\n\n // Reset modifier state AND clear selection when window loses focus (e.g., cmd+tab away)\n const handleBlur = () => {\n modifiersHeldRef.current = { cmd: false, shift: false };\n setPendingMultiSelectElements([]);\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n document.addEventListener(\"keyup\", handleKeyUp);\n window.addEventListener(\"blur\", handleBlur);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n document.removeEventListener(\"keyup\", handleKeyUp);\n window.removeEventListener(\"blur\", handleBlur);\n };\n }, [isActive, pendingMultiSelectElements, createMultiSelectPendingAnnotation]);\n\n // Multi-select drag - mousedown\n useEffect(() => {\n if (!isActive || pendingAnnotation || isDrawMode) return;\n\n const handleMouseDown = (e: MouseEvent) => {\n // Use composedPath to get actual target inside shadow DOM\n const target = (e.composedPath()[0] || e.target) as HTMLElement;\n\n if (closestCrossingShadow(target, \"[data-feedback-toolbar]\")) return;\n if (closestCrossingShadow(target, \"[data-annotation-marker]\")) return;\n if (closestCrossingShadow(target, \"[data-annotation-popup]\")) return;\n\n // Don't start drag on text elements - allow native text selection\n const textTags = new Set([\n \"P\",\n \"SPAN\",\n \"H1\",\n \"H2\",\n \"H3\",\n \"H4\",\n \"H5\",\n \"H6\",\n \"LI\",\n \"TD\",\n \"TH\",\n \"LABEL\",\n \"BLOCKQUOTE\",\n \"FIGCAPTION\",\n \"CAPTION\",\n \"LEGEND\",\n \"DT\",\n \"DD\",\n \"PRE\",\n \"CODE\",\n \"EM\",\n \"STRONG\",\n \"B\",\n \"I\",\n \"U\",\n \"S\",\n \"A\",\n \"TIME\",\n \"ADDRESS\",\n \"CITE\",\n \"Q\",\n \"ABBR\",\n \"DFN\",\n \"MARK\",\n \"SMALL\",\n \"SUB\",\n \"SUP\",\n ]);\n\n if (textTags.has(target.tagName) || target.isContentEditable) {\n return;\n }\n\n mouseDownPosRef.current = { x: e.clientX, y: e.clientY };\n };\n\n document.addEventListener(\"mousedown\", handleMouseDown);\n return () => document.removeEventListener(\"mousedown\", handleMouseDown);\n }, [isActive, pendingAnnotation, isDrawMode]);\n\n // Multi-select drag - mousemove (fully optimized with direct DOM updates)\n useEffect(() => {\n if (!isActive || pendingAnnotation) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!mouseDownPosRef.current) return;\n\n const dx = e.clientX - mouseDownPosRef.current.x;\n const dy = e.clientY - mouseDownPosRef.current.y;\n const distance = dx * dx + dy * dy;\n const thresholdSq = DRAG_THRESHOLD * DRAG_THRESHOLD;\n\n if (!isDragging && distance >= thresholdSq) {\n dragStartRef.current = mouseDownPosRef.current;\n setIsDragging(true);\n }\n\n if ((isDragging || distance >= thresholdSq) && dragStartRef.current) {\n // Direct DOM update for drag rectangle - no React state\n if (dragRectRef.current) {\n const left = Math.min(dragStartRef.current.x, e.clientX);\n const top = Math.min(dragStartRef.current.y, e.clientY);\n const width = Math.abs(e.clientX - dragStartRef.current.x);\n const height = Math.abs(e.clientY - dragStartRef.current.y);\n dragRectRef.current.style.transform = `translate(${left}px, ${top}px)`;\n dragRectRef.current.style.width = `${width}px`;\n dragRectRef.current.style.height = `${height}px`;\n }\n\n // Throttle element detection (still no React re-renders)\n const now = Date.now();\n if (now - lastElementUpdateRef.current < ELEMENT_UPDATE_THROTTLE) {\n return;\n }\n lastElementUpdateRef.current = now;\n\n const startX = dragStartRef.current.x;\n const startY = dragStartRef.current.y;\n const left = Math.min(startX, e.clientX);\n const top = Math.min(startY, e.clientY);\n const right = Math.max(startX, e.clientX);\n const bottom = Math.max(startY, e.clientY);\n const midX = (left + right) / 2;\n const midY = (top + bottom) / 2;\n\n // Sample corners, edges, and center for element detection\n const candidateElements = new Set<HTMLElement>();\n const points = [\n [left, top],\n [right, top],\n [left, bottom],\n [right, bottom],\n [midX, midY],\n [midX, top],\n [midX, bottom],\n [left, midY],\n [right, midY],\n ];\n\n for (const [x, y] of points) {\n const elements = document.elementsFromPoint(x, y);\n for (const el of elements) {\n if (el instanceof HTMLElement) candidateElements.add(el);\n }\n }\n\n // Also check nearby elements\n const nearbyElements = document.querySelectorAll(\n \"button, a, input, img, p, h1, h2, h3, h4, h5, h6, li, label, td, th, div, span, section, article, aside, nav\",\n );\n for (const el of nearbyElements) {\n if (el instanceof HTMLElement) {\n const rect = el.getBoundingClientRect();\n // Check if element's center point is inside or if it overlaps significantly\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n const centerInside =\n centerX >= left &&\n centerX <= right &&\n centerY >= top &&\n centerY <= bottom;\n\n const overlapX =\n Math.min(rect.right, right) - Math.max(rect.left, left);\n const overlapY =\n Math.min(rect.bottom, bottom) - Math.max(rect.top, top);\n const overlapArea =\n overlapX > 0 && overlapY > 0 ? overlapX * overlapY : 0;\n const elementArea = rect.width * rect.height;\n const overlapRatio =\n elementArea > 0 ? overlapArea / elementArea : 0;\n\n if (centerInside || overlapRatio > 0.5) {\n candidateElements.add(el);\n }\n }\n }\n\n const allMatching: DOMRect[] = [];\n const meaningfulTags = new Set([\n \"BUTTON\",\n \"A\",\n \"INPUT\",\n \"IMG\",\n \"P\",\n \"H1\",\n \"H2\",\n \"H3\",\n \"H4\",\n \"H5\",\n \"H6\",\n \"LI\",\n \"LABEL\",\n \"TD\",\n \"TH\",\n \"SECTION\",\n \"ARTICLE\",\n \"ASIDE\",\n \"NAV\",\n ]);\n\n for (const el of candidateElements) {\n if (\n closestCrossingShadow(el, \"[data-feedback-toolbar]\") ||\n closestCrossingShadow(el, \"[data-annotation-marker]\")\n )\n continue;\n\n const rect = el.getBoundingClientRect();\n if (\n rect.width > window.innerWidth * 0.8 &&\n rect.height > window.innerHeight * 0.5\n )\n continue;\n if (rect.width < 10 || rect.height < 10) continue;\n\n if (\n rect.left < right &&\n rect.right > left &&\n rect.top < bottom &&\n rect.bottom > top\n ) {\n const tagName = el.tagName;\n let shouldInclude = meaningfulTags.has(tagName);\n\n // For divs and spans, only include if they have meaningful content\n if (!shouldInclude && (tagName === \"DIV\" || tagName === \"SPAN\")) {\n const hasText =\n el.textContent && el.textContent.trim().length > 0;\n const isInteractive =\n el.onclick !== null ||\n el.getAttribute(\"role\") === \"button\" ||\n el.getAttribute(\"role\") === \"link\" ||\n el.classList.contains(\"clickable\") ||\n el.hasAttribute(\"data-clickable\");\n\n if (\n (hasText || isInteractive) &&\n !el.querySelector(\"p, h1, h2, h3, h4, h5, h6, button, a\")\n ) {\n shouldInclude = true;\n }\n }\n\n if (shouldInclude) {\n // Check if any existing match contains this element (filter children)\n let dominated = false;\n for (const existingRect of allMatching) {\n if (\n existingRect.left <= rect.left &&\n existingRect.right >= rect.right &&\n existingRect.top <= rect.top &&\n existingRect.bottom >= rect.bottom\n ) {\n // Existing rect contains this one - keep the smaller one\n dominated = true;\n break;\n }\n }\n if (!dominated) allMatching.push(rect);\n }\n }\n }\n\n // Direct DOM update for highlights - no React state\n if (highlightsContainerRef.current) {\n const container = highlightsContainerRef.current;\n // Reuse existing divs or create new ones\n while (container.children.length > allMatching.length) {\n container.removeChild(container.lastChild!);\n }\n allMatching.forEach((rect, i) => {\n let div = container.children[i] as HTMLDivElement;\n if (!div) {\n div = document.createElement(\"div\");\n div.className = styles.selectedElementHighlight;\n container.appendChild(div);\n }\n div.style.transform = `translate(${rect.left}px, ${rect.top}px)`;\n div.style.width = `${rect.width}px`;\n div.style.height = `${rect.height}px`;\n });\n }\n }\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove, { passive: true });\n return () => document.removeEventListener(\"mousemove\", handleMouseMove);\n }, [isActive, pendingAnnotation, isDragging, DRAG_THRESHOLD]);\n\n // Multi-select drag - mouseup\n useEffect(() => {\n if (!isActive) return;\n\n const handleMouseUp = (e: MouseEvent) => {\n const wasDragging = isDragging;\n const dragStart = dragStartRef.current;\n\n if (isDragging && dragStart) {\n justFinishedDragRef.current = true;\n\n // Do final element detection for accurate count\n const left = Math.min(dragStart.x, e.clientX);\n const top = Math.min(dragStart.y, e.clientY);\n const right = Math.max(dragStart.x, e.clientX);\n const bottom = Math.max(dragStart.y, e.clientY);\n\n // Query all meaningful elements and check bounding box intersection\n const allMatching: { element: HTMLElement; rect: DOMRect }[] = [];\n const selector =\n \"button, a, input, img, p, h1, h2, h3, h4, h5, h6, li, label, td, th\";\n\n document.querySelectorAll(selector).forEach((el) => {\n if (!(el instanceof HTMLElement)) return;\n if (\n closestCrossingShadow(el, \"[data-feedback-toolbar]\") ||\n closestCrossingShadow(el, \"[data-annotation-marker]\")\n )\n return;\n\n const rect = el.getBoundingClientRect();\n if (\n rect.width > window.innerWidth * 0.8 &&\n rect.height > window.innerHeight * 0.5\n )\n return;\n if (rect.width < 10 || rect.height < 10) return;\n\n // Check if element intersects with selection\n if (\n rect.left < right &&\n rect.right > left &&\n rect.top < bottom &&\n rect.bottom > top\n ) {\n allMatching.push({ element: el, rect });\n }\n });\n\n // Filter out parent elements that contain other matched elements\n const finalElements = allMatching.filter(\n ({ element: el }) =>\n !allMatching.some(\n ({ element: other }) => other !== el && el.contains(other),\n ),\n );\n\n const x = (e.clientX / window.innerWidth) * 100;\n const y = e.clientY + window.scrollY;\n\n if (finalElements.length > 0) {\n const bounds = finalElements.reduce(\n (acc, { rect }) => ({\n left: Math.min(acc.left, rect.left),\n top: Math.min(acc.top, rect.top),\n right: Math.max(acc.right, rect.right),\n bottom: Math.max(acc.bottom, rect.bottom),\n }),\n {\n left: Infinity,\n top: Infinity,\n right: -Infinity,\n bottom: -Infinity,\n },\n );\n\n const elementNames = finalElements\n .slice(0, 5)\n .map(({ element }) => identifyElement(element).name)\n .join(\", \");\n const suffix =\n finalElements.length > 5\n ? ` +${finalElements.length - 5} more`\n : \"\";\n\n // Capture computed styles from first element - filtered for popup, full for forensic output\n const firstElement = finalElements[0].element;\n const firstElementComputedStyles =\n getDetailedComputedStyles(firstElement);\n const firstElementComputedStylesStr =\n getForensicComputedStyles(firstElement);\n\n setPendingAnnotation({\n x,\n y,\n clientY: e.clientY,\n element: `${finalElements.length} elements: ${elementNames}${suffix}`,\n elementPath: \"multi-select\",\n boundingBox: {\n x: bounds.left,\n y: bounds.top + window.scrollY,\n width: bounds.right - bounds.left,\n height: bounds.bottom - bounds.top,\n },\n isMultiSelect: true,\n // Forensic data from first element\n fullPath: getFullElementPath(firstElement),\n accessibility: getAccessibilityInfo(firstElement),\n computedStyles: firstElementComputedStylesStr,\n computedStylesObj: firstElementComputedStyles,\n nearbyElements: getNearbyElements(firstElement),\n cssClasses: getElementClasses(firstElement),\n nearbyText: getNearbyText(firstElement),\n });\n } else {\n // No elements selected, but allow annotation on empty area\n const width = Math.abs(right - left);\n const height = Math.abs(bottom - top);\n\n // Only create if drag area is meaningful size (not just a click)\n if (width > 20 && height > 20) {\n setPendingAnnotation({\n x,\n y,\n clientY: e.clientY,\n element: \"Area selection\",\n elementPath: `region at (${Math.round(left)}, ${Math.round(top)})`,\n boundingBox: {\n x: left,\n y: top + window.scrollY,\n width,\n height,\n },\n isMultiSelect: true,\n });\n }\n }\n setHoverInfo(null);\n } else if (wasDragging) {\n justFinishedDragRef.current = true;\n }\n\n mouseDownPosRef.current = null;\n dragStartRef.current = null;\n setIsDragging(false);\n // Clear highlights container\n if (highlightsContainerRef.current) {\n highlightsContainerRef.current.innerHTML = \"\";\n }\n };\n\n document.addEventListener(\"mouseup\", handleMouseUp);\n return () => document.removeEventListener(\"mouseup\", handleMouseUp);\n }, [isActive, isDragging]);\n\n // Draw mode: redraw helper — dimAmount 0–1 controls non-hovered stroke opacity\n const redrawCanvas = useCallback((ctx: CanvasRenderingContext2D, strokes: typeof drawStrokes, hoveredIdx?: number | null, dimAmount = 0) => {\n const scrollY = window.scrollY;\n const dpr = window.devicePixelRatio || 1;\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n ctx.save();\n ctx.scale(dpr, dpr);\n\n const tracePath = (stroke: typeof strokes[0], offsetY: number) => {\n const p0 = stroke.points[0];\n ctx.moveTo(p0.x, p0.y - offsetY);\n for (let i = 1; i < stroke.points.length - 1; i++) {\n const curr = stroke.points[i];\n const next = stroke.points[i + 1];\n const midX = (curr.x + next.x) / 2;\n const midY = (curr.y + next.y - 2 * offsetY) / 2;\n ctx.quadraticCurveTo(curr.x, curr.y - offsetY, midX, midY);\n }\n const last = stroke.points[stroke.points.length - 1];\n ctx.lineTo(last.x, last.y - offsetY);\n };\n\n for (let si = 0; si < strokes.length; si++) {\n const stroke = strokes[si];\n if (stroke.points.length < 2) continue;\n const offsetY = stroke.fixed ? 0 : scrollY;\n // Per-stroke alpha: dim non-hovered strokes, fade exiting stroke\n let alpha = (hoveredIdx != null && si !== hoveredIdx) ? 1 - 0.7 * dimAmount : 1;\n if (exitingStrokeIdRef.current && stroke.id === exitingStrokeIdRef.current) {\n alpha *= exitingAlphaRef.current;\n }\n ctx.globalAlpha = alpha;\n ctx.beginPath();\n ctx.strokeStyle = stroke.color;\n ctx.lineWidth = 3;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n tracePath(stroke, offsetY);\n ctx.stroke();\n }\n ctx.globalAlpha = 1;\n ctx.restore();\n }, []);\n\n // Draw mode: drawing logic (also handles hover/click-to-annotate on completed strokes)\n const drawClickStartRef = useRef<{ x: number; y: number; strokeIdx: number | null } | null>(null);\n useEffect(() => {\n if (!isDrawMode || !isActive) return;\n\n const canvas = drawCanvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n const dpr = window.devicePixelRatio || 1;\n\n const handleMouseDown = (e: MouseEvent) => {\n // If an annotation popup is open, shake it instead of drawing\n if (pendingAnnotation) {\n popupRef.current?.shake();\n return;\n }\n if (editingAnnotation) {\n editPopupRef.current?.shake();\n return;\n }\n\n // Check if clicking on an existing stroke\n const strokeIdx = findStrokeAtPoint(e.clientX, e.clientY, drawStrokes);\n drawClickStartRef.current = { x: e.clientX, y: e.clientY, strokeIdx };\n\n isDrawingRef.current = true;\n currentStrokeRef.current = [{ x: e.clientX, y: e.clientY }];\n ctx.save();\n ctx.scale(dpr, dpr);\n ctx.beginPath();\n ctx.strokeStyle = settings.annotationColor;\n ctx.lineWidth = 3;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n ctx.moveTo(e.clientX, e.clientY);\n };\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!isDrawingRef.current) {\n // Hover detection on completed strokes (not actively drawing)\n const strokeIdx = findStrokeAtPoint(e.clientX, e.clientY, drawStrokes);\n setHoveredDrawingIdx(strokeIdx);\n if (strokeIdx !== null) canvas.setAttribute(\"data-stroke-hover\", \"\");\n else canvas.removeAttribute(\"data-stroke-hover\");\n return;\n }\n const point = { x: e.clientX, y: e.clientY };\n const prev = currentStrokeRef.current[currentStrokeRef.current.length - 1];\n // Skip points that are very close together (reduces jitter)\n const dist = Math.hypot(point.x - prev.x, point.y - prev.y);\n if (dist < 2) return;\n currentStrokeRef.current.push(point);\n // Quadratic curve to midpoint for smooth live drawing\n const midX = (prev.x + point.x) / 2;\n const midY = (prev.y + point.y) / 2;\n ctx.quadraticCurveTo(prev.x, prev.y, midX, midY);\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(midX, midY);\n };\n\n const handleMouseUp = (e: MouseEvent) => {\n if (!isDrawingRef.current) return;\n isDrawingRef.current = false;\n ctx.restore();\n const pts = currentStrokeRef.current;\n\n // Detect click (not drag) on existing stroke — open annotation popup\n const clickStart = drawClickStartRef.current;\n if (clickStart && clickStart.strokeIdx !== null && pts.length <= 3) {\n const movedDist = Math.hypot(e.clientX - clickStart.x, e.clientY - clickStart.y);\n if (movedDist < 5) {\n // It's a click on an existing stroke\n currentStrokeRef.current = [];\n drawClickStartRef.current = null;\n // Redraw to clear any partial stroke artifact\n redrawCanvas(ctx, drawStrokes, clickStart.strokeIdx, dimAmountRef.current);\n\n const strokeIdx = clickStart.strokeIdx;\n\n // If annotation already exists for this drawing, open it in edit mode\n const existingAnnotation = annotations.find(a => a.drawingIndex === strokeIdx);\n if (existingAnnotation) {\n startEditAnnotation(existingAnnotation);\n setHoveredDrawingIdx(null);\n return;\n }\n\n const stroke = drawStrokes[strokeIdx];\n const scrollYNow = window.scrollY;\n\n // Use click position for element detection\n const centerX = e.clientX;\n const centerY = e.clientY;\n\n // Temporarily hide canvas to find element underneath\n canvas.style.visibility = \"hidden\";\n const elementUnder = deepElementFromPoint(centerX, centerY);\n canvas.style.visibility = \"\";\n\n const gestureShape = classifyStrokeGesture(stroke.points, stroke.fixed);\n let name = `Drawing: ${gestureShape}`;\n let path = \"\";\n let reactComponents: string | null = null;\n let nearbyText: string | undefined;\n let cssClasses: string | undefined;\n let fullPath: string | undefined;\n let accessibility: string | undefined;\n let computedStylesStr: string | undefined;\n let computedStylesObj: Record<string, string> | undefined;\n let nearbyElements: string | undefined;\n const isFixed = stroke.fixed;\n let boundingBox: { x: number; y: number; width: number; height: number } | undefined;\n\n if (elementUnder) {\n const info = identifyElementWithReact(elementUnder, effectiveReactMode);\n name = `Drawing: ${gestureShape} → ${info.name}`;\n path = info.path;\n reactComponents = info.reactComponents;\n nearbyText = getNearbyText(elementUnder);\n cssClasses = getElementClasses(elementUnder);\n fullPath = getFullElementPath(elementUnder);\n accessibility = getAccessibilityInfo(elementUnder);\n computedStylesStr = getForensicComputedStyles(elementUnder);\n computedStylesObj = getDetailedComputedStyles(elementUnder);\n nearbyElements = getNearbyElements(elementUnder);\n const rect = elementUnder.getBoundingClientRect();\n boundingBox = {\n x: rect.left,\n y: isFixed ? rect.top : rect.top + scrollYNow,\n width: rect.width,\n height: rect.height,\n };\n }\n\n // Position marker at click point (on the stroke)\n const annX = (e.clientX / window.innerWidth) * 100;\n const annY = isFixed ? e.clientY : e.clientY + scrollYNow;\n\n setPendingAnnotation({\n x: annX,\n y: annY,\n clientY: e.clientY,\n element: name,\n elementPath: path,\n boundingBox,\n nearbyText,\n cssClasses,\n isFixed,\n fullPath,\n accessibility,\n computedStyles: computedStylesStr,\n computedStylesObj,\n nearbyElements,\n reactComponents: reactComponents ?? undefined,\n targetElement: elementUnder ?? undefined,\n drawingIndex: strokeIdx,\n strokeId: stroke.id,\n });\n setHoverInfo(null);\n setHoveredDrawingIdx(null);\n return;\n }\n }\n drawClickStartRef.current = null;\n\n if (pts.length > 1) {\n // Determine if stroke is over fixed/sticky elements\n // Check the bounding-box center — most reliable signal for what the stroke targets\n canvas.style.visibility = \"hidden\";\n\n const isElFixed = (el: HTMLElement): boolean => {\n let node: HTMLElement | null = el;\n while (node && node !== document.documentElement) {\n const pos = getComputedStyle(node).position;\n if (pos === \"fixed\" || pos === \"sticky\") return true;\n node = node.parentElement;\n }\n return false;\n };\n\n // Bounding box center\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const p of pts) {\n minX = Math.min(minX, p.x);\n minY = Math.min(minY, p.y);\n maxX = Math.max(maxX, p.x);\n maxY = Math.max(maxY, p.y);\n }\n const centerX = (minX + maxX) / 2;\n const centerY = (minY + maxY) / 2;\n const centerEl = deepElementFromPoint(centerX, centerY);\n let isFixed = centerEl ? isElFixed(centerEl) : false;\n\n // If center is ambiguous (e.g. arrow spanning fixed→scrollable), sample edges too\n if (!isFixed) {\n let fixedCount = 0;\n let totalSampled = 0;\n const sampleCount = Math.min(6, pts.length);\n const step = Math.max(1, Math.floor(pts.length / sampleCount));\n for (let i = 0; i < pts.length; i += step) {\n const el = deepElementFromPoint(pts[i].x, pts[i].y);\n if (!el) continue;\n totalSampled++;\n if (isElFixed(el)) fixedCount++;\n }\n // If majority of edge samples are fixed, override\n if (totalSampled > 0 && fixedCount > totalSampled * 0.6) isFixed = true;\n }\n\n // Fixed strokes stay in viewport coords; scrollable strokes convert to page coords\n const finalPoints = isFixed\n ? [...pts]\n : pts.map(p => ({ x: p.x, y: p.y + window.scrollY }));\n\n const newStrokeIdx = drawStrokes.length;\n const newStrokeId = crypto.randomUUID();\n const newStroke = { id: newStrokeId, points: finalPoints, color: settings.annotationColor, fixed: isFixed };\n\n // Identify element underneath for annotation\n const gestureShape = classifyStrokeGesture(finalPoints, isFixed);\n let name = `Drawing: ${gestureShape}`;\n let elPath = \"\";\n let reactComponents: string | null = null;\n let nearbyText: string | undefined;\n let cssClasses: string | undefined;\n let fullPath: string | undefined;\n let accessibility: string | undefined;\n let computedStylesStr: string | undefined;\n let computedStylesObj: Record<string, string> | undefined;\n let nearbyElements: string | undefined;\n let boundingBox: { x: number; y: number; width: number; height: number } | undefined;\n\n if (centerEl) {\n const info = identifyElementWithReact(centerEl, effectiveReactMode);\n name = `Drawing: ${gestureShape} → ${info.name}`;\n elPath = info.path;\n reactComponents = info.reactComponents;\n nearbyText = getNearbyText(centerEl);\n cssClasses = getElementClasses(centerEl);\n fullPath = getFullElementPath(centerEl);\n accessibility = getAccessibilityInfo(centerEl);\n computedStylesStr = getForensicComputedStyles(centerEl);\n computedStylesObj = getDetailedComputedStyles(centerEl);\n nearbyElements = getNearbyElements(centerEl);\n const rect = centerEl.getBoundingClientRect();\n boundingBox = {\n x: rect.left,\n y: isFixed ? rect.top : rect.top + window.scrollY,\n width: rect.width,\n height: rect.height,\n };\n }\n\n canvas.style.visibility = \"\";\n\n setDrawStrokes(prev => [...prev, newStroke]);\n\n // Position marker at the end of the stroke (where the pen was released)\n const lastPt = finalPoints[finalPoints.length - 1];\n const lastPtViewY = isFixed ? lastPt.y : lastPt.y - window.scrollY;\n const annX = (lastPt.x / window.innerWidth) * 100;\n const annY = lastPt.y; // Already in page coords (finalPoints are converted)\n\n setPendingAnnotation({\n x: annX,\n y: annY,\n clientY: lastPtViewY,\n element: name,\n elementPath: elPath,\n boundingBox,\n nearbyText,\n cssClasses,\n isFixed,\n fullPath,\n accessibility,\n computedStyles: computedStylesStr,\n computedStylesObj,\n nearbyElements,\n reactComponents: reactComponents ?? undefined,\n targetElement: centerEl ?? undefined,\n drawingIndex: newStrokeIdx,\n strokeId: newStrokeId,\n });\n setHoverInfo(null);\n }\n currentStrokeRef.current = [];\n };\n\n const handleMouseLeave = () => {\n setHoveredDrawingIdx(null);\n canvas.removeAttribute(\"data-stroke-hover\");\n };\n\n canvas.addEventListener(\"mousedown\", handleMouseDown);\n canvas.addEventListener(\"mousemove\", handleMouseMove);\n canvas.addEventListener(\"mouseup\", handleMouseUp);\n canvas.addEventListener(\"mouseleave\", handleMouseLeave);\n\n return () => {\n canvas.removeEventListener(\"mousedown\", handleMouseDown);\n canvas.removeEventListener(\"mousemove\", handleMouseMove);\n canvas.removeEventListener(\"mouseup\", handleMouseUp);\n canvas.removeEventListener(\"mouseleave\", handleMouseLeave);\n };\n }, [isDrawMode, isActive, settings.annotationColor, drawStrokes, annotations, effectiveReactMode, redrawCanvas, startEditAnnotation, pendingAnnotation, editingAnnotation]);\n\n // Draw mode: resize canvas, redraw on scroll\n useEffect(() => {\n if (!isActive) return;\n const canvas = drawCanvasRef.current;\n if (!canvas) return;\n\n const resize = () => {\n const dpr = window.devicePixelRatio || 1;\n canvas.style.width = window.innerWidth + \"px\";\n canvas.style.height = window.innerHeight + \"px\";\n canvas.width = window.innerWidth * dpr;\n canvas.height = window.innerHeight * dpr;\n const ctx = canvas.getContext(\"2d\");\n if (ctx) redrawCanvas(ctx, drawStrokes, visualHighlightRef.current, dimAmountRef.current);\n };\n\n const onScroll = () => {\n const ctx = canvas.getContext(\"2d\");\n if (ctx) redrawCanvas(ctx, drawStrokes, visualHighlightRef.current, dimAmountRef.current);\n };\n\n resize();\n window.addEventListener(\"resize\", resize);\n window.addEventListener(\"scroll\", onScroll, { passive: true });\n return () => {\n window.removeEventListener(\"resize\", resize);\n window.removeEventListener(\"scroll\", onScroll);\n };\n }, [isActive, drawStrokes, redrawCanvas]);\n\n // Animate dim in/out when hovering drawings\n useEffect(() => {\n const canvas = drawCanvasRef.current;\n if (!canvas || !isActive || drawStrokes.length === 0) return;\n\n const effectiveHighlight = hoveredDrawingIdx ?? pendingAnnotation?.drawingIndex ?? editingAnnotation?.drawingIndex ?? null;\n const targetDim = effectiveHighlight != null ? 1 : 0;\n\n // Update visual highlight ref — keep old value during fade-out\n if (effectiveHighlight != null) {\n visualHighlightRef.current = effectiveHighlight;\n }\n\n // Already at target — just redraw with current value\n if (Math.abs(dimAmountRef.current - targetDim) < 0.01) {\n dimAmountRef.current = targetDim;\n if (targetDim === 0) visualHighlightRef.current = null;\n const ctx = canvas.getContext(\"2d\");\n if (ctx) redrawCanvas(ctx, drawStrokes, visualHighlightRef.current, targetDim);\n return;\n }\n\n let raf: number;\n const animate = () => {\n const diff = targetDim - dimAmountRef.current;\n if (Math.abs(diff) < 0.01) {\n dimAmountRef.current = targetDim;\n if (targetDim === 0) visualHighlightRef.current = null;\n } else {\n dimAmountRef.current += diff * 0.25;\n }\n const ctx = canvas.getContext(\"2d\");\n if (ctx) redrawCanvas(ctx, drawStrokes, visualHighlightRef.current, dimAmountRef.current);\n if (Math.abs(dimAmountRef.current - targetDim) > 0.01) {\n raf = requestAnimationFrame(animate);\n }\n };\n raf = requestAnimationFrame(animate);\n return () => cancelAnimationFrame(raf);\n }, [isActive, hoveredDrawingIdx, pendingAnnotation?.drawingIndex, editingAnnotation?.drawingIndex, drawStrokes, redrawCanvas]);\n\n // Fire webhook for annotation events - returns true on success, false on failure\n const fireWebhook = useCallback(\n async (\n event: string,\n payload: Record<string, unknown>,\n force?: boolean,\n ): Promise<boolean> => {\n // Settings webhookUrl overrides prop\n const targetUrl = settings.webhookUrl || webhookUrl;\n // Skip if no URL, or if webhooks disabled (unless force is true for manual sends)\n if (!targetUrl || (!settings.webhooksEnabled && !force)) return false;\n\n try {\n const response = await fetch(targetUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n event,\n timestamp: Date.now(),\n url:\n typeof window !== \"undefined\" ? window.location.href : undefined,\n ...payload,\n }),\n });\n return response.ok;\n } catch (error) {\n console.warn(\"[Agentation] Webhook failed:\", error);\n return false;\n }\n },\n [webhookUrl, settings.webhookUrl, settings.webhooksEnabled],\n );\n\n // Add annotation\n const addAnnotation = useCallback(\n (comment: string) => {\n if (!pendingAnnotation) return;\n\n const newAnnotation: Annotation = {\n id: Date.now().toString(),\n x: pendingAnnotation.x,\n y: pendingAnnotation.y,\n comment,\n element: pendingAnnotation.element,\n elementPath: pendingAnnotation.elementPath,\n timestamp: Date.now(),\n selectedText: pendingAnnotation.selectedText,\n boundingBox: pendingAnnotation.boundingBox,\n nearbyText: pendingAnnotation.nearbyText,\n cssClasses: pendingAnnotation.cssClasses,\n isMultiSelect: pendingAnnotation.isMultiSelect,\n isFixed: pendingAnnotation.isFixed,\n fullPath: pendingAnnotation.fullPath,\n accessibility: pendingAnnotation.accessibility,\n computedStyles: pendingAnnotation.computedStyles,\n nearbyElements: pendingAnnotation.nearbyElements,\n reactComponents: pendingAnnotation.reactComponents,\n elementBoundingBoxes: pendingAnnotation.elementBoundingBoxes,\n drawingIndex: pendingAnnotation.drawingIndex,\n strokeId: pendingAnnotation.strokeId,\n // Protocol fields for server sync\n ...(endpoint && currentSessionId\n ? {\n sessionId: currentSessionId,\n url:\n typeof window !== \"undefined\"\n ? window.location.href\n : undefined,\n status: \"pending\" as const,\n }\n : {}),\n };\n\n setAnnotations((prev) => [...prev, newAnnotation]);\n // Prevent immediate hover on newly added marker\n recentlyAddedIdRef.current = newAnnotation.id;\n originalSetTimeout(() => {\n recentlyAddedIdRef.current = null;\n }, 300);\n // Mark as needing animation (will be set to animated after animation completes)\n originalSetTimeout(() => {\n setAnimatedMarkers((prev) => new Set(prev).add(newAnnotation.id));\n }, 250);\n\n // Fire callback\n onAnnotationAdd?.(newAnnotation);\n fireWebhook(\"annotation.add\", { annotation: newAnnotation });\n\n // Animate out the pending annotation UI\n setPendingExiting(true);\n originalSetTimeout(() => {\n setPendingAnnotation(null);\n setPendingExiting(false);\n }, 150);\n\n window.getSelection()?.removeAllRanges();\n\n // Sync to server (non-blocking, but update local ID with server's ID)\n if (endpoint && currentSessionId) {\n syncAnnotation(endpoint, currentSessionId, newAnnotation)\n .then((serverAnnotation) => {\n // Update local annotation with server-assigned ID\n if (serverAnnotation.id !== newAnnotation.id) {\n setAnnotations((prev) =>\n prev.map((a) =>\n a.id === newAnnotation.id\n ? { ...a, id: serverAnnotation.id }\n : a,\n ),\n );\n // Also update the animated markers set\n setAnimatedMarkers((prev) => {\n const next = new Set(prev);\n next.delete(newAnnotation.id);\n next.add(serverAnnotation.id);\n return next;\n });\n }\n })\n .catch((error) => {\n console.warn(\"[Agentation] Failed to sync annotation:\", error);\n });\n }\n },\n [\n pendingAnnotation,\n onAnnotationAdd,\n fireWebhook,\n endpoint,\n currentSessionId,\n ],\n );\n\n // Cancel annotation with exit animation\n const cancelAnnotation = useCallback(() => {\n const strokeId = pendingAnnotation?.strokeId;\n setPendingExiting(true);\n\n // Fade the linked stroke on canvas in parallel with popup exit\n if (strokeId) {\n exitingStrokeIdRef.current = strokeId;\n exitingAlphaRef.current = 1;\n const canvas = drawCanvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (ctx) {\n const start = performance.now();\n const fade = (now: number) => {\n const t = Math.min((now - start) / 150, 1);\n exitingAlphaRef.current = 1 - t;\n redrawCanvas(ctx, drawStrokesRef.current, visualHighlightRef.current, dimAmountRef.current);\n if (t < 1) requestAnimationFrame(fade);\n };\n requestAnimationFrame(fade);\n }\n }\n\n originalSetTimeout(() => {\n exitingStrokeIdRef.current = null;\n if (strokeId) {\n const currentStrokes = drawStrokesRef.current;\n const drawingIdx = currentStrokes.findIndex(s => s.id === strokeId);\n if (drawingIdx >= 0) {\n setDrawStrokes(prev => prev.filter(s => s.id !== strokeId));\n setAnnotations(prev => prev.map(a =>\n a.drawingIndex != null && a.drawingIndex > drawingIdx\n ? { ...a, drawingIndex: a.drawingIndex - 1 }\n : a\n ));\n }\n }\n setPendingAnnotation(null);\n setPendingExiting(false);\n }, 150);\n }, [pendingAnnotation]);\n\n // Delete annotation with exit animation\n const deleteAnnotation = useCallback(\n (id: string) => {\n const currentAnnotations = annotationsRef.current;\n const deletedIndex = currentAnnotations.findIndex((a) => a.id === id);\n const deletedAnnotation = currentAnnotations[deletedIndex];\n\n // Close edit panel with exit animation if deleting the annotation being edited\n if (editingAnnotation?.id === id) {\n setEditExiting(true);\n originalSetTimeout(() => {\n setEditingAnnotation(null);\n setEditingTargetElement(null);\n setEditingTargetElements([]);\n setEditExiting(false);\n }, 150);\n }\n\n setDeletingMarkerId(id);\n setExitingMarkers((prev) => new Set(prev).add(id));\n\n // Fire callback\n if (deletedAnnotation) {\n onAnnotationDelete?.(deletedAnnotation);\n fireWebhook(\"annotation.delete\", { annotation: deletedAnnotation });\n }\n\n // Sync delete to server (non-blocking)\n if (endpoint) {\n deleteAnnotationFromServer(endpoint, id).catch((error) => {\n console.warn(\n \"[Agentation] Failed to delete annotation from server:\",\n error,\n );\n });\n }\n\n // Fade the linked stroke on canvas in parallel with marker exit\n if (deletedAnnotation?.strokeId) {\n exitingStrokeIdRef.current = deletedAnnotation.strokeId;\n exitingAlphaRef.current = 1;\n const canvas = drawCanvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (ctx) {\n const start = performance.now();\n const fade = (now: number) => {\n const t = Math.min((now - start) / 150, 1);\n exitingAlphaRef.current = 1 - t;\n redrawCanvas(ctx, drawStrokesRef.current, visualHighlightRef.current, dimAmountRef.current);\n if (t < 1) requestAnimationFrame(fade);\n };\n requestAnimationFrame(fade);\n }\n }\n\n // Wait for marker exit animation then remove annotation + linked stroke\n originalSetTimeout(() => {\n exitingStrokeIdRef.current = null;\n // Use strokeId (stable) to find the correct stroke — drawingIndex can be\n // stale if other strokes were added/removed during the 150ms wait\n const latestAnn = annotationsRef.current.find(a => a.id === id);\n const strokeId = latestAnn?.strokeId;\n const currentStrokes = drawStrokesRef.current;\n const drawingIdx = strokeId ? currentStrokes.findIndex(s => s.id === strokeId) : -1;\n\n if (drawingIdx >= 0) {\n setDrawStrokes(prev => prev.filter(s => s.id !== strokeId));\n setAnnotations(prev => prev\n .filter(a => a.id !== id)\n .map(a =>\n a.drawingIndex != null && a.drawingIndex > drawingIdx\n ? { ...a, drawingIndex: a.drawingIndex - 1 }\n : a\n ));\n } else {\n setAnnotations((prev) => prev.filter((a) => a.id !== id));\n }\n setExitingMarkers((prev) => {\n const next = new Set(prev);\n next.delete(id);\n return next;\n });\n setDeletingMarkerId(null);\n\n // Trigger renumber animation for markers after deleted one\n const latestAnnotations = annotationsRef.current;\n const currentIndex = latestAnnotations.findIndex(a => a.id === id);\n if (currentIndex >= 0 && currentIndex < latestAnnotations.length - 1) {\n setRenumberFrom(currentIndex);\n originalSetTimeout(() => setRenumberFrom(null), 200);\n }\n }, 150);\n },\n [editingAnnotation, onAnnotationDelete, fireWebhook, endpoint],\n );\n\n // Handle marker hover - finds element(s) for live position tracking\n const handleMarkerHover = useCallback(\n (annotation: Annotation | null) => {\n if (!annotation) {\n // Start tooltip exit animation synchronously (before clearing hoveredMarkerId)\n if (hoveredMarkerId) {\n setTooltipExitingId(hoveredMarkerId);\n originalSetTimeout(() => setTooltipExitingId(null), 100);\n }\n setHoveredMarkerId(null);\n setHoveredTargetElement(null);\n setHoveredTargetElements([]);\n setHoveredDrawingIdx(null);\n return;\n }\n\n setTooltipExitingId(null);\n setHoveredMarkerId(annotation.id);\n\n // Highlight linked drawing stroke when marker is hovered\n if (annotation.drawingIndex != null && annotation.drawingIndex < drawStrokes.length) {\n setHoveredDrawingIdx(annotation.drawingIndex);\n } else {\n setHoveredDrawingIdx(null);\n }\n\n // Find elements at the annotation's position(s) for live tracking\n if (annotation.elementBoundingBoxes?.length) {\n // Cmd+shift+click: find element at each bounding box center\n const elements: HTMLElement[] = [];\n for (const bb of annotation.elementBoundingBoxes) {\n const centerX = bb.x + bb.width / 2;\n const centerY = bb.y + bb.height / 2 - window.scrollY;\n // Use elementsFromPoint to look through the marker if it's covering\n const allEls = document.elementsFromPoint(centerX, centerY);\n const el = allEls.find(\n (e) => !e.closest('[data-annotation-marker]') && !e.closest('[data-agentation-root]'),\n ) as HTMLElement | undefined;\n if (el) elements.push(el);\n }\n setHoveredTargetElements(elements);\n setHoveredTargetElement(null);\n } else if (annotation.boundingBox) {\n // Single element\n const bb = annotation.boundingBox;\n const centerX = bb.x + bb.width / 2;\n const centerY = annotation.isFixed\n ? bb.y + bb.height / 2\n : bb.y + bb.height / 2 - window.scrollY;\n const el = deepElementFromPoint(centerX, centerY);\n\n // Validate found element's size roughly matches stored bounding box\n // (prevents using wrong child element when clicking center of a container)\n if (el) {\n const elRect = el.getBoundingClientRect();\n const widthRatio = elRect.width / bb.width;\n const heightRatio = elRect.height / bb.height;\n // If found element is much smaller than stored, it's probably a child - don't use it\n if (widthRatio < 0.5 || heightRatio < 0.5) {\n setHoveredTargetElement(null);\n } else {\n setHoveredTargetElement(el);\n }\n } else {\n setHoveredTargetElement(null);\n }\n setHoveredTargetElements([]);\n } else {\n setHoveredTargetElement(null);\n setHoveredTargetElements([]);\n }\n },\n [drawStrokes, hoveredMarkerId],\n );\n\n // Update annotation (edit mode submit)\n const updateAnnotation = useCallback(\n (newComment: string) => {\n if (!editingAnnotation) return;\n\n const updatedAnnotation = { ...editingAnnotation, comment: newComment };\n\n setAnnotations((prev) =>\n prev.map((a) =>\n a.id === editingAnnotation.id ? updatedAnnotation : a,\n ),\n );\n\n // Fire callback\n onAnnotationUpdate?.(updatedAnnotation);\n fireWebhook(\"annotation.update\", { annotation: updatedAnnotation });\n\n // Sync update to server (non-blocking)\n if (endpoint) {\n updateAnnotationOnServer(endpoint, editingAnnotation.id, {\n comment: newComment,\n }).catch((error) => {\n console.warn(\n \"[Agentation] Failed to update annotation on server:\",\n error,\n );\n });\n }\n\n // Animate out the edit popup\n setEditExiting(true);\n originalSetTimeout(() => {\n setEditingAnnotation(null);\n setEditingTargetElement(null);\n setEditingTargetElements([]);\n setEditExiting(false);\n }, 150);\n },\n [editingAnnotation, onAnnotationUpdate, fireWebhook, endpoint],\n );\n\n // Cancel editing with exit animation\n const cancelEditAnnotation = useCallback(() => {\n setEditExiting(true);\n originalSetTimeout(() => {\n setEditingAnnotation(null);\n setEditingTargetElement(null);\n setEditingTargetElements([]);\n setEditExiting(false);\n }, 150);\n }, []);\n\n // Clear all with staggered animation\n const clearAll = useCallback(() => {\n const count = annotations.length;\n if (count === 0 && drawStrokes.length === 0) return;\n\n // Fire callback with all annotations before clearing\n onAnnotationsClear?.(annotations);\n fireWebhook(\"annotations.clear\", { annotations });\n\n // Sync deletions to server (non-blocking)\n if (endpoint) {\n Promise.all(\n annotations.map((a) =>\n deleteAnnotationFromServer(endpoint, a.id).catch((error) => {\n console.warn(\n \"[Agentation] Failed to delete annotation from server:\",\n error,\n );\n }),\n ),\n );\n }\n\n setIsClearing(true);\n setCleared(true);\n\n // Clear draw strokes\n setDrawStrokes([]);\n const canvas = drawCanvasRef.current;\n if (canvas) {\n const ctx = canvas.getContext(\"2d\");\n if (ctx) ctx.clearRect(0, 0, canvas.width, canvas.height);\n }\n\n const totalAnimationTime = count * 30 + 200;\n originalSetTimeout(() => {\n setAnnotations([]);\n setAnimatedMarkers(new Set()); // Reset animated markers\n localStorage.removeItem(getStorageKey(pathname));\n setIsClearing(false);\n }, totalAnimationTime);\n\n originalSetTimeout(() => setCleared(false), 1500);\n }, [pathname, annotations, drawStrokes, onAnnotationsClear, fireWebhook, endpoint]);\n\n // Copy output\n const copyOutput = useCallback(async () => {\n const displayUrl =\n typeof window !== \"undefined\"\n ? window.location.pathname +\n window.location.search +\n window.location.hash\n : pathname;\n let output = generateOutput(\n annotations,\n displayUrl,\n settings.outputDetail,\n effectiveReactMode,\n );\n if (!output && drawStrokes.length === 0) return;\n if (!output) output = `## Page Feedback: ${displayUrl}\\n`;\n\n // Describe draw strokes as text by detecting elements underneath\n if (drawStrokes.length > 0) {\n // Collect drawing indices that have linked annotations (skip those in standalone section)\n const linkedDrawingIndices = new Set<number>();\n for (const a of annotations) {\n if (a.drawingIndex != null) linkedDrawingIndices.add(a.drawingIndex);\n }\n\n // Temporarily hide the draw canvas so elementFromPoint hits real page elements\n const canvas = drawCanvasRef.current;\n if (canvas) canvas.style.visibility = \"hidden\";\n\n const strokeDescriptions: string[] = [];\n const scrollY = window.scrollY;\n for (let strokeIdx = 0; strokeIdx < drawStrokes.length; strokeIdx++) {\n // Skip strokes that have a linked annotation — their info is in the annotation output\n if (linkedDrawingIndices.has(strokeIdx)) continue;\n const stroke = drawStrokes[strokeIdx];\n if (stroke.points.length < 2) continue;\n\n // Get viewport coords for analysis (fixed strokes are already in viewport coords)\n const viewportPoints = stroke.fixed\n ? stroke.points\n : stroke.points.map(p => ({ x: p.x, y: p.y - scrollY }));\n\n // Bounding box (viewport coords)\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const p of viewportPoints) {\n minX = Math.min(minX, p.x);\n minY = Math.min(minY, p.y);\n maxX = Math.max(maxX, p.x);\n maxY = Math.max(maxY, p.y);\n }\n const bboxW = maxX - minX;\n const bboxH = maxY - minY;\n const bboxDiag = Math.hypot(bboxW, bboxH);\n\n // Start/end analysis\n const start = viewportPoints[0];\n const end = viewportPoints[viewportPoints.length - 1];\n const startEndDist = Math.hypot(end.x - start.x, end.y - start.y);\n\n // Gesture classification\n let gesture: \"circle\" | \"box\" | \"underline\" | \"arrow\" | \"drawing\";\n const closedLoop = startEndDist < bboxDiag * 0.35;\n const aspectRatio = bboxW / Math.max(bboxH, 1);\n\n if (closedLoop && bboxDiag > 20) {\n // Closed loop — circle vs box: measure how many points hug the bbox edges\n // Box strokes spend time near edges; circles stay more centered\n const edgeThreshold = Math.max(bboxW, bboxH) * 0.15;\n let edgePoints = 0;\n for (const p of viewportPoints) {\n const nearLeft = p.x - minX < edgeThreshold;\n const nearRight = maxX - p.x < edgeThreshold;\n const nearTop = p.y - minY < edgeThreshold;\n const nearBottom = maxY - p.y < edgeThreshold;\n if ((nearLeft || nearRight) && (nearTop || nearBottom)) edgePoints++;\n }\n // If many points are near corners, it's a box\n gesture = edgePoints > viewportPoints.length * 0.15 ? \"box\" : \"circle\";\n } else if (aspectRatio > 3 && bboxH < 40) {\n gesture = \"underline\";\n } else if (startEndDist > bboxDiag * 0.5) {\n gesture = \"arrow\";\n } else {\n gesture = \"drawing\";\n }\n\n // Sample elements along the stroke\n const sampleCount = Math.min(10, viewportPoints.length);\n const step = Math.max(1, Math.floor(viewportPoints.length / sampleCount));\n const seenElements = new Set<HTMLElement>();\n const elementNames: string[] = [];\n\n const samplePoints = [start];\n for (let i = step; i < viewportPoints.length - 1; i += step) {\n samplePoints.push(viewportPoints[i]);\n }\n samplePoints.push(end);\n\n for (const p of samplePoints) {\n const el = deepElementFromPoint(p.x, p.y);\n if (!el || seenElements.has(el)) continue;\n if (closestCrossingShadow(el, \"[data-feedback-toolbar]\")) continue;\n seenElements.add(el);\n const { name } = identifyElement(el);\n if (!elementNames.includes(name)) {\n elementNames.push(name);\n }\n }\n\n // Format description\n const region = `${Math.round(minX)},${Math.round(minY)} → ${Math.round(maxX)},${Math.round(maxY)}`;\n let desc: string;\n\n if ((gesture === \"circle\" || gesture === \"box\") && elementNames.length > 0) {\n const verb = gesture === \"box\" ? \"Boxed\" : \"Circled\";\n desc = `${verb} **${elementNames[0]}**${elementNames.length > 1 ? ` (and ${elementNames.slice(1).join(\", \")})` : \"\"} (region: ${region})`;\n } else if (gesture === \"underline\" && elementNames.length > 0) {\n desc = `Underlined **${elementNames[0]}** (${region})`;\n } else if (gesture === \"arrow\" && elementNames.length >= 2) {\n desc = `Arrow from **${elementNames[0]}** to **${elementNames[elementNames.length - 1]}** (${Math.round(start.x)},${Math.round(start.y)} → ${Math.round(end.x)},${Math.round(end.y)})`;\n } else if (elementNames.length > 0) {\n desc = `${gesture === \"arrow\" ? \"Arrow\" : \"Drawing\"} near **${elementNames.join(\"**, **\")}** (region: ${region})`;\n } else {\n desc = `Drawing at ${region}`;\n }\n strokeDescriptions.push(desc);\n }\n\n // Restore canvas\n if (canvas) canvas.style.visibility = \"\";\n\n if (strokeDescriptions.length > 0) {\n output += `\\n**Drawings:**\\n`;\n strokeDescriptions.forEach((d, i) => {\n output += `${i + 1}. ${d}\\n`;\n });\n }\n }\n\n if (copyToClipboard) {\n try {\n await navigator.clipboard.writeText(output);\n } catch {\n // Clipboard may fail (permissions, not HTTPS, etc.) - continue anyway\n }\n }\n\n // Fire callback with markdown output (always, regardless of clipboard success)\n onCopy?.(output);\n\n setCopied(true);\n originalSetTimeout(() => setCopied(false), 2000);\n\n if (settings.autoClearAfterCopy) {\n originalSetTimeout(() => clearAll(), 500);\n }\n }, [\n annotations,\n drawStrokes,\n pathname,\n settings.outputDetail,\n effectiveReactMode,\n settings.autoClearAfterCopy,\n clearAll,\n copyToClipboard,\n onCopy,\n ]);\n\n // Send to webhook\n const sendToWebhook = useCallback(async () => {\n const displayUrl =\n typeof window !== \"undefined\"\n ? window.location.pathname +\n window.location.search +\n window.location.hash\n : pathname;\n const output = generateOutput(\n annotations,\n displayUrl,\n settings.outputDetail,\n effectiveReactMode,\n );\n if (!output) return;\n\n // Fire onSubmit callback\n if (onSubmit) {\n onSubmit(output, annotations);\n }\n\n // Start sending (arrow fades)\n setSendState(\"sending\");\n\n // Brief delay for the fade effect\n await new Promise((resolve) => originalSetTimeout(resolve, 150));\n\n // Fire webhook and check result (force=true to bypass webhooksEnabled check for manual sends)\n const success = await fireWebhook(\"submit\", { output, annotations }, true);\n\n // Show result\n setSendState(success ? \"sent\" : \"failed\");\n originalSetTimeout(() => setSendState(\"idle\"), 2500);\n\n // Clear annotations if send succeeded and autoClearAfterCopy is enabled\n if (success && settings.autoClearAfterCopy) {\n originalSetTimeout(() => clearAll(), 500);\n }\n }, [\n onSubmit,\n fireWebhook,\n annotations,\n pathname,\n settings.outputDetail,\n effectiveReactMode,\n settings.autoClearAfterCopy,\n clearAll,\n ]);\n\n // Toolbar dragging - mousemove and mouseup\n useEffect(() => {\n if (!dragStartPos) return;\n\n const DRAG_THRESHOLD = 10; // pixels\n\n const handleMouseMove = (e: MouseEvent) => {\n const deltaX = e.clientX - dragStartPos.x;\n const deltaY = e.clientY - dragStartPos.y;\n const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n\n // Start dragging once threshold is exceeded\n if (!isDraggingToolbar && distance > DRAG_THRESHOLD) {\n setIsDraggingToolbar(true);\n }\n\n if (isDraggingToolbar || distance > DRAG_THRESHOLD) {\n // Calculate new position\n let newX = dragStartPos.toolbarX + deltaX;\n let newY = dragStartPos.toolbarY + deltaY;\n\n // Constrain to viewport\n const padding = 20;\n const wrapperWidth = 337; // .toolbar wrapper width\n const toolbarHeight = 44;\n\n // Content is right-aligned within wrapper via margin-left: auto\n // Calculate content width based on state\n const contentWidth = isActive\n ? connectionStatus === \"connected\"\n ? 337\n : 297\n : 44; // collapsed circle\n\n // Content offset from wrapper left edge\n const contentOffset = wrapperWidth - contentWidth;\n\n // Min X: content left edge >= padding\n const minX = padding - contentOffset;\n // Max X: wrapper right edge <= viewport - padding\n const maxX = window.innerWidth - padding - wrapperWidth;\n\n newX = Math.max(minX, Math.min(maxX, newX));\n newY = Math.max(\n padding,\n Math.min(window.innerHeight - toolbarHeight - padding, newY),\n );\n\n setToolbarPosition({ x: newX, y: newY });\n }\n };\n\n const handleMouseUp = () => {\n // If we were actually dragging, set flag to prevent click event\n if (isDraggingToolbar) {\n justFinishedToolbarDragRef.current = true;\n }\n setIsDraggingToolbar(false);\n setDragStartPos(null);\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n\n return () => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [dragStartPos, isDraggingToolbar, isActive, connectionStatus]);\n\n // Handle toolbar drag start\n const handleToolbarMouseDown = useCallback(\n (e: React.MouseEvent) => {\n // Only drag when clicking the toolbar background (not buttons or settings)\n if (\n (e.target as HTMLElement).closest(\"button\") ||\n (e.target as HTMLElement).closest(`.${styles.settingsPanel}`)\n ) {\n return;\n }\n\n // Don't prevent default yet - let onClick work for collapsed state\n\n // Get toolbar parent's actual current position (toolbarPosition is applied to parent)\n const toolbarParent = (e.currentTarget as HTMLElement).parentElement;\n if (!toolbarParent) return;\n\n const rect = toolbarParent.getBoundingClientRect();\n const currentX = toolbarPosition?.x ?? rect.left;\n const currentY = toolbarPosition?.y ?? rect.top;\n\n // Generate random rotation between -5 and 5 degrees\n const randomRotation = (Math.random() - 0.5) * 10; // -5 to +5\n setDragRotation(randomRotation);\n\n setDragStartPos({\n x: e.clientX,\n y: e.clientY,\n toolbarX: currentX,\n toolbarY: currentY,\n });\n // Don't set isDraggingToolbar yet - wait for actual movement\n },\n [toolbarPosition],\n );\n\n // Keep toolbar in view on window resize and when toolbar expands/collapses\n useEffect(() => {\n if (!toolbarPosition) return;\n\n const constrainPosition = () => {\n const padding = 20;\n const wrapperWidth = 337; // .toolbar wrapper width\n const toolbarHeight = 44;\n\n let newX = toolbarPosition.x;\n let newY = toolbarPosition.y;\n\n // Content is right-aligned within wrapper via margin-left: auto\n // Calculate content width based on state\n const contentWidth = isActive\n ? connectionStatus === \"connected\"\n ? 297\n : 257\n : 44; // collapsed circle\n\n // Content offset from wrapper left edge\n const contentOffset = wrapperWidth - contentWidth;\n\n // Min X: content left edge >= padding\n const minX = padding - contentOffset;\n // Max X: wrapper right edge <= viewport - padding\n const maxX = window.innerWidth - padding - wrapperWidth;\n\n newX = Math.max(minX, Math.min(maxX, newX));\n newY = Math.max(\n padding,\n Math.min(window.innerHeight - toolbarHeight - padding, newY),\n );\n\n // Only update if position changed\n if (newX !== toolbarPosition.x || newY !== toolbarPosition.y) {\n setToolbarPosition({ x: newX, y: newY });\n }\n };\n\n // Constrain immediately when isActive changes or on mount\n constrainPosition();\n\n window.addEventListener(\"resize\", constrainPosition);\n return () => window.removeEventListener(\"resize\", constrainPosition);\n }, [toolbarPosition, isActive, connectionStatus]);\n\n // Keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Don't trigger shortcuts when typing in inputs\n const target = e.target as HTMLElement;\n const isTyping =\n target.tagName === \"INPUT\" ||\n target.tagName === \"TEXTAREA\" ||\n target.isContentEditable;\n\n if (e.key === \"Escape\") {\n // Exit draw mode first if active\n if (isDrawMode) {\n setIsDrawMode(false);\n return;\n }\n // Clear multi-select if active\n if (pendingMultiSelectElements.length > 0) {\n setPendingMultiSelectElements([]);\n return;\n }\n if (pendingAnnotation) {\n // Let popup handle\n } else if (isActive) {\n hideTooltipsUntilMouseLeave();\n setIsActive(false);\n }\n }\n\n // Cmd+Shift+F / Ctrl+Shift+F to toggle feedback mode\n if ((e.metaKey || e.ctrlKey) && e.shiftKey && (e.key === \"f\" || e.key === \"F\")) {\n e.preventDefault();\n hideTooltipsUntilMouseLeave();\n setIsActive((prev) => !prev);\n return;\n }\n\n // Cmd+Z in draw mode: undo last stroke\n if ((e.metaKey || e.ctrlKey) && (e.key === \"z\" || e.key === \"Z\") && isDrawMode && !e.shiftKey) {\n e.preventDefault();\n setDrawStrokes(prev => {\n const next = prev.slice(0, -1);\n const canvas = drawCanvasRef.current;\n if (canvas) {\n const ctx = canvas.getContext(\"2d\");\n if (ctx) redrawCanvas(ctx, next);\n }\n return next;\n });\n return;\n }\n\n // Skip other shortcuts if typing or modifier keys are held\n if (isTyping || e.metaKey || e.ctrlKey) return;\n\n // \"P\" to toggle pause/freeze\n if (e.key === \"p\" || e.key === \"P\") {\n e.preventDefault();\n hideTooltipsUntilMouseLeave();\n toggleFreeze();\n }\n\n // \"D\" to toggle draw mode\n if (e.key === \"d\" || e.key === \"D\") {\n e.preventDefault();\n hideTooltipsUntilMouseLeave();\n setIsDrawMode(prev => !prev);\n }\n\n // \"H\" to toggle marker visibility\n if (e.key === \"h\" || e.key === \"H\") {\n if (annotations.length > 0) {\n e.preventDefault();\n hideTooltipsUntilMouseLeave();\n setShowMarkers((prev) => !prev);\n if (isDrawMode) setIsDrawMode(false);\n }\n }\n\n // \"C\" to copy output\n if (e.key === \"c\" || e.key === \"C\") {\n if (annotations.length > 0) {\n e.preventDefault();\n hideTooltipsUntilMouseLeave();\n copyOutput();\n }\n }\n\n // \"X\" to clear all\n if (e.key === \"x\" || e.key === \"X\") {\n if (annotations.length > 0) {\n e.preventDefault();\n hideTooltipsUntilMouseLeave();\n clearAll();\n }\n }\n\n // \"S\" to send annotations\n if (e.key === \"s\" || e.key === \"S\") {\n const hasValidWebhook =\n isValidUrl(settings.webhookUrl) || isValidUrl(webhookUrl || \"\");\n if (\n annotations.length > 0 &&\n hasValidWebhook &&\n sendState === \"idle\"\n ) {\n e.preventDefault();\n hideTooltipsUntilMouseLeave();\n sendToWebhook();\n }\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [\n isActive,\n isDrawMode,\n pendingAnnotation,\n annotations.length,\n settings.webhookUrl,\n webhookUrl,\n sendState,\n sendToWebhook,\n toggleFreeze,\n copyOutput,\n clearAll,\n redrawCanvas,\n pendingMultiSelectElements,\n ]);\n\n if (!mounted) return null;\n\n const hasAnnotations = annotations.length > 0;\n\n // Filter annotations for rendering (exclude exiting ones from normal flow)\n const visibleAnnotations = annotations.filter(\n (a) => !exitingMarkers.has(a.id),\n );\n const exitingAnnotationsList = annotations.filter((a) =>\n exitingMarkers.has(a.id),\n );\n\n // Helper function to calculate viewport-aware tooltip positioning\n // Helper function to calculate viewport-aware tooltip positioning\n const getTooltipPosition = (annotation: Annotation): React.CSSProperties => {\n // Tooltip dimensions (from CSS)\n const tooltipMaxWidth = 200;\n const tooltipEstimatedHeight = 80; // Estimated max height\n const markerSize = 22;\n const gap = 10;\n\n // Convert percentage-based x to pixels\n const markerX = (annotation.x / 100) * window.innerWidth;\n const markerY =\n typeof annotation.y === \"string\"\n ? parseFloat(annotation.y)\n : annotation.y;\n\n const styles: React.CSSProperties = {};\n\n // Vertical positioning: flip if near bottom\n const spaceBelow = window.innerHeight - markerY - markerSize - gap;\n if (spaceBelow < tooltipEstimatedHeight) {\n // Show above marker\n styles.top = \"auto\";\n styles.bottom = `calc(100% + ${gap}px)`;\n }\n // If enough space below, use default CSS (top: calc(100% + 10px))\n\n // Horizontal positioning: adjust if near edges\n const centerX = markerX - tooltipMaxWidth / 2;\n const edgePadding = 10;\n\n if (centerX < edgePadding) {\n // Too close to left edge\n const offset = edgePadding - centerX;\n styles.left = `calc(50% + ${offset}px)`;\n } else if (centerX + tooltipMaxWidth > window.innerWidth - edgePadding) {\n // Too close to right edge\n const overflow =\n centerX + tooltipMaxWidth - (window.innerWidth - edgePadding);\n styles.left = `calc(50% - ${overflow}px)`;\n }\n // If centered position is fine, use default CSS (left: 50%)\n\n return styles;\n };\n\n return createPortal(\n <>\n {/* Toolbar */}\n <div\n className={styles.toolbar}\n data-feedback-toolbar\n style={\n toolbarPosition\n ? {\n left: toolbarPosition.x,\n top: toolbarPosition.y,\n right: \"auto\",\n bottom: \"auto\",\n }\n : undefined\n }\n >\n {/* Morphing container */}\n <div\n className={`${styles.toolbarContainer} ${!isDarkMode ? styles.light : \"\"} ${isActive ? styles.expanded : styles.collapsed} ${showEntranceAnimation ? styles.entrance : \"\"} ${isDraggingToolbar ? styles.dragging : \"\"} ${!settings.webhooksEnabled && (isValidUrl(settings.webhookUrl) || isValidUrl(webhookUrl || \"\")) ? styles.serverConnected : \"\"}`}\n onClick={\n !isActive\n ? (e) => {\n // Don't activate if we just finished dragging\n if (justFinishedToolbarDragRef.current) {\n justFinishedToolbarDragRef.current = false;\n e.preventDefault();\n return;\n }\n setIsActive(true);\n }\n : undefined\n }\n onMouseDown={handleToolbarMouseDown}\n role={!isActive ? \"button\" : undefined}\n tabIndex={!isActive ? 0 : -1}\n title={!isActive ? \"Start feedback mode\" : undefined}\n style={{\n ...(isDraggingToolbar && {\n transform: `scale(1.05) rotate(${dragRotation}deg)`,\n cursor: \"grabbing\",\n }),\n }}\n >\n {/* Toggle content - visible when collapsed */}\n <div\n className={`${styles.toggleContent} ${!isActive ? styles.visible : styles.hidden}`}\n >\n <IconListSparkle size={24} />\n {hasAnnotations && (\n <span\n className={`${styles.badge} ${isActive ? styles.fadeOut : \"\"} ${showEntranceAnimation ? styles.entrance : \"\"}`}\n style={{ backgroundColor: settings.annotationColor }}\n >\n {annotations.length}\n </span>\n )}\n </div>\n\n {/* Controls content - visible when expanded */}\n <div\n className={`${styles.controlsContent} ${isActive ? styles.visible : styles.hidden} ${\n toolbarPosition && toolbarPosition.y < 100\n ? styles.tooltipBelow\n : \"\"\n } ${tooltipsHidden || showSettings ? styles.tooltipsHidden : \"\"}`}\n onMouseLeave={showTooltipsAgain}\n >\n <div\n className={`${styles.buttonWrapper} ${\n toolbarPosition && toolbarPosition.x < 120\n ? styles.buttonWrapperAlignLeft\n : \"\"\n }`}\n >\n <button\n className={`${styles.controlButton} ${!isDarkMode ? styles.light : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n hideTooltipsUntilMouseLeave();\n toggleFreeze();\n }}\n data-active={isFrozen}\n >\n <IconPausePlayAnimated size={24} isPaused={isFrozen} />\n </button>\n <span className={styles.buttonTooltip}>\n {isFrozen ? \"Resume animations\" : \"Pause animations\"}\n <span className={styles.shortcut}>P</span>\n </span>\n </div>\n\n <div className={styles.buttonWrapper}>\n <button\n className={`${styles.controlButton} ${!isDarkMode ? styles.light : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n hideTooltipsUntilMouseLeave();\n setIsDrawMode(prev => !prev);\n }}\n data-active={isDrawMode}\n >\n <IconPencil size={24} />\n </button>\n <span className={styles.buttonTooltip}>\n {isDrawMode ? \"Exit draw mode\" : \"Draw mode\"}\n <span className={styles.shortcut}>D</span>\n </span>\n </div>\n\n <div className={styles.buttonWrapper}>\n <button\n className={`${styles.controlButton} ${!isDarkMode ? styles.light : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n hideTooltipsUntilMouseLeave();\n setShowMarkers(!showMarkers);\n if (isDrawMode) setIsDrawMode(false);\n }}\n disabled={!hasAnnotations}\n >\n <IconEyeAnimated size={24} isOpen={showMarkers} />\n </button>\n <span className={styles.buttonTooltip}>\n {showMarkers ? \"Hide markers\" : \"Show markers\"}\n <span className={styles.shortcut}>H</span>\n </span>\n </div>\n\n <div className={styles.buttonWrapper}>\n <button\n className={`${styles.controlButton} ${!isDarkMode ? styles.light : \"\"} ${copied ? styles.statusShowing : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n hideTooltipsUntilMouseLeave();\n copyOutput();\n }}\n disabled={!hasAnnotations && drawStrokes.length === 0}\n data-active={copied}\n >\n <IconCopyAnimated size={24} copied={copied} />\n </button>\n <span className={styles.buttonTooltip}>\n Copy feedback\n <span className={styles.shortcut}>C</span>\n </span>\n </div>\n\n {/* Send button - only visible when webhook URL is available AND auto-send is off */}\n <div\n className={`${styles.buttonWrapper} ${styles.sendButtonWrapper} ${!settings.webhooksEnabled && (isValidUrl(settings.webhookUrl) || isValidUrl(webhookUrl || \"\")) ? styles.sendButtonVisible : \"\"}`}\n >\n <button\n className={`${styles.controlButton} ${!isDarkMode ? styles.light : \"\"} ${sendState === \"sent\" || sendState === \"failed\" ? styles.statusShowing : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n hideTooltipsUntilMouseLeave();\n sendToWebhook();\n }}\n disabled={\n !hasAnnotations ||\n (!isValidUrl(settings.webhookUrl) &&\n !isValidUrl(webhookUrl || \"\")) ||\n sendState === \"sending\"\n }\n data-no-hover={sendState === \"sent\" || sendState === \"failed\"}\n tabIndex={\n isValidUrl(settings.webhookUrl) ||\n isValidUrl(webhookUrl || \"\")\n ? 0\n : -1\n }\n >\n <IconSendArrow size={24} state={sendState} />\n {hasAnnotations && sendState === \"idle\" && (\n <span\n className={`${styles.buttonBadge} ${!isDarkMode ? styles.light : \"\"}`}\n style={{ backgroundColor: settings.annotationColor }}\n >\n {annotations.length}\n </span>\n )}\n </button>\n <span className={styles.buttonTooltip}>\n Send Annotations\n <span className={styles.shortcut}>S</span>\n </span>\n </div>\n\n <div className={styles.buttonWrapper}>\n <button\n className={`${styles.controlButton} ${!isDarkMode ? styles.light : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n hideTooltipsUntilMouseLeave();\n clearAll();\n }}\n disabled={!hasAnnotations && drawStrokes.length === 0}\n data-danger\n >\n <IconTrashAlt size={24} />\n </button>\n <span className={styles.buttonTooltip}>\n Clear all\n <span className={styles.shortcut}>X</span>\n </span>\n </div>\n\n <div className={styles.buttonWrapper}>\n <button\n className={`${styles.controlButton} ${!isDarkMode ? styles.light : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n hideTooltipsUntilMouseLeave();\n setShowSettings(!showSettings);\n }}\n >\n <IconGear size={24} />\n </button>\n {endpoint && connectionStatus !== \"disconnected\" && (\n <span\n className={`${styles.mcpIndicator} ${!isDarkMode ? styles.light : \"\"} ${styles[connectionStatus]} ${showSettings ? styles.hidden : \"\"}`}\n title={\n connectionStatus === \"connected\"\n ? \"MCP Connected\"\n : \"MCP Connecting...\"\n }\n />\n )}\n <span className={styles.buttonTooltip}>Settings</span>\n </div>\n\n <div\n className={`${styles.divider} ${!isDarkMode ? styles.light : \"\"}`}\n />\n\n <div\n className={`${styles.buttonWrapper} ${\n toolbarPosition &&\n typeof window !== \"undefined\" &&\n toolbarPosition.x > window.innerWidth - 120\n ? styles.buttonWrapperAlignRight\n : \"\"\n }`}\n >\n <button\n className={`${styles.controlButton} ${!isDarkMode ? styles.light : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n hideTooltipsUntilMouseLeave();\n setIsActive(false);\n }}\n >\n <IconXmarkLarge size={24} />\n </button>\n <span className={styles.buttonTooltip}>\n Exit\n <span className={styles.shortcut}>Esc</span>\n </span>\n </div>\n </div>\n\n {/* Settings Panel */}\n <div\n className={`${styles.settingsPanel} ${isDarkMode ? styles.dark : styles.light} ${showSettingsVisible ? styles.enter : styles.exit}`}\n onClick={(e) => e.stopPropagation()}\n style={\n toolbarPosition && toolbarPosition.y < 230\n ? {\n bottom: \"auto\",\n top: \"calc(100% + 0.5rem)\",\n }\n : undefined\n }\n >\n <div\n className={`${styles.settingsPanelContainer} ${isTransitioning ? styles.transitioning : \"\"}`}\n >\n <div\n className={`${styles.settingsPage} ${settingsPage === \"automations\" ? styles.slideLeft : \"\"}`}\n >\n <div className={styles.settingsHeader}>\n <span className={styles.settingsBrand}>\n <span\n className={styles.settingsBrandSlash}\n style={{\n color: settings.annotationColor,\n transition: \"color 0.2s ease\",\n }}\n >\n /\n </span>\n agentation\n </span>\n <span className={styles.settingsVersion}>v{__VERSION__}</span>\n <button\n className={styles.themeToggle}\n onClick={() => setIsDarkMode(!isDarkMode)}\n title={\n isDarkMode\n ? \"Switch to light mode\"\n : \"Switch to dark mode\"\n }\n >\n <span className={styles.themeIconWrapper}>\n <span\n key={isDarkMode ? \"sun\" : \"moon\"}\n className={styles.themeIcon}\n >\n {isDarkMode ? (\n <IconSun size={20} />\n ) : (\n <IconMoon size={20} />\n )}\n </span>\n </span>\n </button>\n </div>\n\n <div className={styles.settingsSection}>\n <div className={styles.settingsRow}>\n <div\n className={`${styles.settingsLabel} ${!isDarkMode ? styles.light : \"\"}`}\n >\n Output Detail\n <Tooltip content=\"Controls how much detail is included in the copied output\">\n <span className={styles.helpIcon}>\n <IconHelp size={20} />\n </span>\n </Tooltip>\n </div>\n <button\n className={`${styles.cycleButton} ${!isDarkMode ? styles.light : \"\"}`}\n onClick={() => {\n const currentIndex = OUTPUT_DETAIL_OPTIONS.findIndex(\n (opt) => opt.value === settings.outputDetail,\n );\n const nextIndex =\n (currentIndex + 1) % OUTPUT_DETAIL_OPTIONS.length;\n setSettings((s) => ({\n ...s,\n outputDetail: OUTPUT_DETAIL_OPTIONS[nextIndex].value,\n }));\n }}\n >\n <span\n key={settings.outputDetail}\n className={styles.cycleButtonText}\n >\n {\n OUTPUT_DETAIL_OPTIONS.find(\n (opt) => opt.value === settings.outputDetail,\n )?.label\n }\n </span>\n <span className={styles.cycleDots}>\n {OUTPUT_DETAIL_OPTIONS.map((option, i) => (\n <span\n key={option.value}\n className={`${styles.cycleDot} ${!isDarkMode ? styles.light : \"\"} ${settings.outputDetail === option.value ? styles.active : \"\"}`}\n />\n ))}\n </span>\n </button>\n </div>\n\n <div\n className={`${styles.settingsRow} ${styles.settingsRowMarginTop} ${!isLocalhost ? styles.settingsRowDisabled : \"\"}`}\n >\n <div\n className={`${styles.settingsLabel} ${!isDarkMode ? styles.light : \"\"}`}\n >\n React Components\n <Tooltip\n content={\n !isLocalhost\n ? \"Disabled — production builds minify component names, making detection unreliable. Use on localhost in development mode.\"\n : \"Include React component names in annotations\"\n }\n >\n <span className={styles.helpIcon}>\n <IconHelp size={20} />\n </span>\n </Tooltip>\n </div>\n <label\n className={`${styles.toggleSwitch} ${!isLocalhost ? styles.disabled : \"\"}`}\n >\n <input\n type=\"checkbox\"\n checked={isLocalhost && settings.reactEnabled}\n disabled={!isLocalhost}\n onChange={() =>\n setSettings((s) => ({\n ...s,\n reactEnabled: !s.reactEnabled,\n }))\n }\n />\n <span className={styles.toggleSlider} />\n </label>\n </div>\n </div>\n\n <div className={styles.settingsSection}>\n <div\n className={`${styles.settingsLabel} ${styles.settingsLabelMarker} ${!isDarkMode ? styles.light : \"\"}`}\n >\n Marker Colour\n </div>\n <div className={styles.colorOptions}>\n {COLOR_OPTIONS.map((color) => (\n <div\n key={color.value}\n role=\"button\"\n onClick={() =>\n setSettings((s) => ({\n ...s,\n annotationColor: color.value,\n }))\n }\n style={{\n borderColor:\n settings.annotationColor === color.value\n ? color.value\n : \"transparent\",\n }}\n className={`${styles.colorOptionRing} ${settings.annotationColor === color.value ? styles.selected : \"\"}`}\n >\n <div\n className={`${styles.colorOption} ${settings.annotationColor === color.value ? styles.selected : \"\"}`}\n style={{ backgroundColor: color.value }}\n title={color.label}\n />\n </div>\n ))}\n </div>\n </div>\n\n <div className={styles.settingsSection}>\n <label className={styles.settingsToggle}>\n <input\n type=\"checkbox\"\n id=\"autoClearAfterCopy\"\n checked={settings.autoClearAfterCopy}\n onChange={(e) =>\n setSettings((s) => ({\n ...s,\n autoClearAfterCopy: e.target.checked,\n }))\n }\n />\n <label\n className={`${styles.customCheckbox} ${settings.autoClearAfterCopy ? styles.checked : \"\"}`}\n htmlFor=\"autoClearAfterCopy\"\n >\n {settings.autoClearAfterCopy && (\n <IconCheckSmallAnimated size={14} />\n )}\n </label>\n <span\n className={`${styles.toggleLabel} ${!isDarkMode ? styles.light : \"\"}`}\n >\n Clear on copy/send\n <Tooltip content=\"Automatically clear annotations after copying\">\n <span\n className={`${styles.helpIcon} ${styles.helpIconNudge2}`}\n >\n <IconHelp size={20} />\n </span>\n </Tooltip>\n </span>\n </label>\n <label\n className={`${styles.settingsToggle} ${styles.settingsToggleMarginBottom}`}\n >\n <input\n type=\"checkbox\"\n id=\"blockInteractions\"\n checked={settings.blockInteractions}\n onChange={(e) =>\n setSettings((s) => ({\n ...s,\n blockInteractions: e.target.checked,\n }))\n }\n />\n <label\n className={`${styles.customCheckbox} ${settings.blockInteractions ? styles.checked : \"\"}`}\n htmlFor=\"blockInteractions\"\n >\n {settings.blockInteractions && (\n <IconCheckSmallAnimated size={14} />\n )}\n </label>\n <span\n className={`${styles.toggleLabel} ${!isDarkMode ? styles.light : \"\"}`}\n >\n Block page interactions\n </span>\n </label>\n </div>\n\n <div\n className={`${styles.settingsSection} ${styles.settingsSectionExtraPadding}`}\n >\n <button\n className={`${styles.settingsNavLink} ${!isDarkMode ? styles.light : \"\"}`}\n onClick={() => setSettingsPage(\"automations\")}\n >\n <span>Manage MCP & Webhooks</span>\n <span className={styles.settingsNavLinkRight}>\n {endpoint && connectionStatus !== \"disconnected\" && (\n <span\n className={`${styles.mcpNavIndicator} ${styles[connectionStatus]}`}\n />\n )}\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7.5 12.5L12 8L7.5 3.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </span>\n </button>\n </div>\n </div>\n\n {/* Automations Page */}\n <div\n className={`${styles.settingsPage} ${styles.automationsPage} ${settingsPage === \"automations\" ? styles.slideIn : \"\"}`}\n >\n <button\n className={`${styles.settingsBackButton} ${!isDarkMode ? styles.light : \"\"}`}\n onClick={() => setSettingsPage(\"main\")}\n >\n <IconChevronLeft size={16} />\n <span>Manage MCP & Webhooks</span>\n </button>\n\n {/* MCP Connection section */}\n <div className={styles.settingsSection}>\n <div className={styles.settingsRow}>\n <span\n className={`${styles.automationHeader} ${!isDarkMode ? styles.light : \"\"}`}\n >\n MCP Connection\n <Tooltip content=\"Connect via Model Context Protocol to let AI agents like Claude Code receive annotations in real-time.\">\n <span\n className={`${styles.helpIcon} ${styles.helpIconNudgeDown}`}\n >\n <IconHelp size={20} />\n </span>\n </Tooltip>\n </span>\n {endpoint && (\n <div\n className={`${styles.mcpStatusDot} ${styles[connectionStatus]}`}\n title={\n connectionStatus === \"connected\"\n ? \"Connected\"\n : connectionStatus === \"connecting\"\n ? \"Connecting...\"\n : \"Disconnected\"\n }\n />\n )}\n </div>\n <p\n className={`${styles.automationDescription} ${!isDarkMode ? styles.light : \"\"}`}\n style={{ paddingBottom: 6 }}\n >\n MCP connection allows agents to receive and act on\n annotations.{\" \"}\n <a\n href=\"https://agentation.dev/mcp\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={`${styles.learnMoreLink} ${!isDarkMode ? styles.light : \"\"}`}\n >\n Learn more\n </a>\n </p>\n </div>\n\n {/* Webhooks section */}\n <div\n className={`${styles.settingsSection} ${styles.settingsSectionGrow}`}\n >\n <div className={styles.settingsRow}>\n <span\n className={`${styles.automationHeader} ${!isDarkMode ? styles.light : \"\"}`}\n >\n Webhooks\n <Tooltip content=\"Send annotation data to any URL endpoint when annotations change. Useful for custom integrations.\">\n <span\n className={`${styles.helpIcon} ${styles.helpIconNoNudge}`}\n >\n <IconHelp size={20} />\n </span>\n </Tooltip>\n </span>\n <div className={styles.autoSendRow}>\n <span\n className={`${styles.autoSendLabel} ${!isDarkMode ? styles.light : \"\"} ${settings.webhooksEnabled ? styles.active : \"\"}`}\n >\n Auto-Send\n </span>\n <label\n className={`${styles.toggleSwitch} ${!settings.webhookUrl ? styles.disabled : \"\"}`}\n >\n <input\n type=\"checkbox\"\n checked={settings.webhooksEnabled}\n disabled={!settings.webhookUrl}\n onChange={() =>\n setSettings((s) => ({\n ...s,\n webhooksEnabled: !s.webhooksEnabled,\n }))\n }\n />\n <span className={styles.toggleSlider} />\n </label>\n </div>\n </div>\n <p\n className={`${styles.automationDescription} ${!isDarkMode ? styles.light : \"\"}`}\n >\n The webhook URL will receive live annotation changes and\n annotation data.\n </p>\n <textarea\n className={`${styles.webhookUrlInput} ${!isDarkMode ? styles.light : \"\"}`}\n placeholder=\"Webhook URL\"\n value={settings.webhookUrl}\n style={\n {\n \"--marker-color\": settings.annotationColor,\n } as React.CSSProperties\n }\n onChange={(e) =>\n setSettings((s) => ({\n ...s,\n webhookUrl: e.target.value,\n }))\n }\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Draw canvas — outside overlay so it can fade on toolbar close */}\n <canvas\n ref={drawCanvasRef}\n className={`${styles.drawCanvas} ${isDrawMode ? styles.active : \"\"}`}\n style={{ opacity: shouldShowMarkers ? 1 : 0, transition: \"opacity 0.15s ease\" }}\n data-feedback-toolbar\n />\n\n {/* Markers layer - normal scrolling markers */}\n <div className={styles.markersLayer} data-feedback-toolbar>\n {markersVisible &&\n visibleAnnotations\n .filter((a) => !a.isFixed)\n .map((annotation, index) => {\n const isHovered =\n !markersExiting && hoveredMarkerId === annotation.id;\n const isDeleting = deletingMarkerId === annotation.id;\n const showDeleteState =\n (isHovered || isDeleting) && !editingAnnotation;\n const isMulti = annotation.isMultiSelect;\n const markerColor = isMulti\n ? \"#34C759\"\n : settings.annotationColor;\n const globalIndex = annotations.findIndex(\n (a) => a.id === annotation.id,\n );\n const needsEnterAnimation = !animatedMarkers.has(annotation.id);\n const animClass = markersExiting\n ? styles.exit\n : isClearing\n ? styles.clearing\n : needsEnterAnimation\n ? styles.enter\n : \"\";\n\n const showDeleteHover =\n showDeleteState && settings.markerClickBehavior === \"delete\";\n\n return (\n <div\n key={annotation.id}\n className={`${styles.marker} ${isMulti ? styles.multiSelect : \"\"} ${animClass} ${showDeleteHover ? styles.hovered : \"\"}`}\n data-annotation-marker\n style={{\n left: `${annotation.x}%`,\n top: annotation.y,\n backgroundColor: showDeleteHover ? undefined : markerColor,\n animationDelay: markersExiting\n ? `${(visibleAnnotations.length - 1 - index) * 20}ms`\n : needsEnterAnimation && animatedMarkers.size === 0\n ? `${index * 20}ms`\n : undefined,\n }}\n onMouseEnter={() =>\n !markersExiting &&\n annotation.id !== recentlyAddedIdRef.current &&\n handleMarkerHover(annotation)\n }\n onMouseLeave={() => handleMarkerHover(null)}\n onClick={(e) => {\n e.stopPropagation();\n if (!markersExiting) {\n if (settings.markerClickBehavior === \"delete\") {\n deleteAnnotation(annotation.id);\n } else {\n startEditAnnotation(annotation);\n }\n }\n }}\n onContextMenu={(e) => {\n if (settings.markerClickBehavior === \"delete\") {\n e.preventDefault();\n e.stopPropagation();\n if (!markersExiting) startEditAnnotation(annotation);\n }\n }}\n >\n {showDeleteState ? (\n showDeleteHover ? (\n <IconXmark size={isMulti ? 18 : 16} />\n ) : (\n <IconEdit size={16} />\n )\n ) : (\n <span\n className={\n renumberFrom !== null && globalIndex >= renumberFrom\n ? styles.renumber\n : undefined\n }\n >\n {globalIndex + 1}\n </span>\n )}\n {(isHovered || tooltipExitingId === annotation.id) && !editingAnnotation && (\n <div\n className={`${styles.markerTooltip} ${!isDarkMode ? styles.light : \"\"} ${tooltipExitingId === annotation.id && !isHovered ? styles.exit : styles.enter}`}\n style={getTooltipPosition(annotation)}\n >\n <span className={styles.markerQuote}>\n {annotation.element}\n {annotation.selectedText &&\n ` \"${annotation.selectedText.slice(0, 30)}${annotation.selectedText.length > 30 ? \"...\" : \"\"}\"`}\n </span>\n <span className={styles.markerNote}>\n {annotation.comment}\n </span>\n </div>\n )}\n </div>\n );\n })}\n\n {/* Exiting markers (normal) - individual deletion animations */}\n {markersVisible &&\n !markersExiting &&\n exitingAnnotationsList\n .filter((a) => !a.isFixed)\n .map((annotation) => {\n const isMulti = annotation.isMultiSelect;\n return (\n <div\n key={annotation.id}\n className={`${styles.marker} ${styles.hovered} ${isMulti ? styles.multiSelect : \"\"} ${styles.exit}`}\n data-annotation-marker\n style={{\n left: `${annotation.x}%`,\n top: annotation.y,\n }}\n >\n <IconXmark size={isMulti ? 12 : 10} />\n </div>\n );\n })}\n </div>\n\n {/* Fixed markers layer */}\n <div className={styles.fixedMarkersLayer} data-feedback-toolbar>\n {markersVisible &&\n visibleAnnotations\n .filter((a) => a.isFixed)\n .map((annotation, index) => {\n const fixedAnnotations = visibleAnnotations.filter(\n (a) => a.isFixed,\n );\n const isHovered =\n !markersExiting && hoveredMarkerId === annotation.id;\n const isDeleting = deletingMarkerId === annotation.id;\n const showDeleteState =\n (isHovered || isDeleting) && !editingAnnotation;\n const isMulti = annotation.isMultiSelect;\n const markerColor = isMulti\n ? \"#34C759\"\n : settings.annotationColor;\n const globalIndex = annotations.findIndex(\n (a) => a.id === annotation.id,\n );\n const needsEnterAnimation = !animatedMarkers.has(annotation.id);\n const animClass = markersExiting\n ? styles.exit\n : isClearing\n ? styles.clearing\n : needsEnterAnimation\n ? styles.enter\n : \"\";\n\n const showDeleteHover =\n showDeleteState && settings.markerClickBehavior === \"delete\";\n\n return (\n <div\n key={annotation.id}\n className={`${styles.marker} ${styles.fixed} ${isMulti ? styles.multiSelect : \"\"} ${animClass} ${showDeleteHover ? styles.hovered : \"\"}`}\n data-annotation-marker\n style={{\n left: `${annotation.x}%`,\n top: annotation.y,\n backgroundColor: showDeleteHover ? undefined : markerColor,\n animationDelay: markersExiting\n ? `${(fixedAnnotations.length - 1 - index) * 20}ms`\n : needsEnterAnimation && animatedMarkers.size === 0\n ? `${index * 20}ms`\n : undefined,\n\n }}\n onMouseEnter={() =>\n !markersExiting &&\n annotation.id !== recentlyAddedIdRef.current &&\n handleMarkerHover(annotation)\n }\n onMouseLeave={() => handleMarkerHover(null)}\n onClick={(e) => {\n e.stopPropagation();\n if (!markersExiting) {\n if (settings.markerClickBehavior === \"delete\") {\n deleteAnnotation(annotation.id);\n } else {\n startEditAnnotation(annotation);\n }\n }\n }}\n onContextMenu={(e) => {\n if (settings.markerClickBehavior === \"delete\") {\n e.preventDefault();\n e.stopPropagation();\n if (!markersExiting) startEditAnnotation(annotation);\n }\n }}\n >\n {showDeleteState ? (\n showDeleteHover ? (\n <IconXmark size={isMulti ? 18 : 16} />\n ) : (\n <IconEdit size={16} />\n )\n ) : (\n <span\n className={\n renumberFrom !== null && globalIndex >= renumberFrom\n ? styles.renumber\n : undefined\n }\n >\n {globalIndex + 1}\n </span>\n )}\n {(isHovered || tooltipExitingId === annotation.id) && !editingAnnotation && (\n <div\n className={`${styles.markerTooltip} ${!isDarkMode ? styles.light : \"\"} ${tooltipExitingId === annotation.id && !isHovered ? styles.exit : styles.enter}`}\n style={getTooltipPosition(annotation)}\n >\n <span className={styles.markerQuote}>\n {annotation.element}\n {annotation.selectedText &&\n ` \"${annotation.selectedText.slice(0, 30)}${annotation.selectedText.length > 30 ? \"...\" : \"\"}\"`}\n </span>\n <span className={styles.markerNote}>\n {annotation.comment}\n </span>\n </div>\n )}\n </div>\n );\n })}\n\n {/* Exiting markers (fixed) - individual deletion animations */}\n {markersVisible &&\n !markersExiting &&\n exitingAnnotationsList\n .filter((a) => a.isFixed)\n .map((annotation) => {\n const isMulti = annotation.isMultiSelect;\n return (\n <div\n key={annotation.id}\n className={`${styles.marker} ${styles.fixed} ${styles.hovered} ${isMulti ? styles.multiSelect : \"\"} ${styles.exit}`}\n data-annotation-marker\n style={{\n left: `${annotation.x}%`,\n top: annotation.y,\n }}\n >\n <IconClose size={isMulti ? 12 : 10} />\n </div>\n );\n })}\n </div>\n\n {/* Interactive overlay */}\n {isActive && (\n <div\n className={styles.overlay}\n data-feedback-toolbar\n style={\n pendingAnnotation || editingAnnotation\n ? { zIndex: 99999 }\n : undefined\n }\n >\n {/* Hover highlight */}\n {hoverInfo?.rect &&\n !pendingAnnotation &&\n !isScrolling &&\n !isDragging &&\n !isDrawMode && (\n <div\n className={`${styles.hoverHighlight} ${styles.enter}`}\n style={{\n left: hoverInfo.rect.left,\n top: hoverInfo.rect.top,\n width: hoverInfo.rect.width,\n height: hoverInfo.rect.height,\n borderColor: `${settings.annotationColor}80`,\n backgroundColor: `${settings.annotationColor}0A`,\n }}\n />\n )}\n\n {/* Cmd+shift+click multi-select highlights (during selection, before releasing modifiers) */}\n {pendingMultiSelectElements\n .filter((item) => document.contains(item.element))\n .map((item, index) => {\n const rect = item.element.getBoundingClientRect();\n // Only show green if 2+ elements selected, otherwise use default blue\n const isMulti = pendingMultiSelectElements.length > 1;\n return (\n <div\n key={index}\n className={\n isMulti\n ? styles.multiSelectOutline\n : styles.singleSelectOutline\n }\n style={{\n position: \"fixed\",\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n ...(isMulti\n ? {}\n : {\n borderColor: `${settings.annotationColor}99`,\n backgroundColor: `${settings.annotationColor}0D`,\n }),\n }}\n />\n );\n })}\n\n {/* Marker hover outline (shows bounding box of hovered annotation) */}\n {hoveredMarkerId &&\n !pendingAnnotation &&\n (() => {\n const hoveredAnnotation = annotations.find(\n (a) => a.id === hoveredMarkerId,\n );\n if (!hoveredAnnotation?.boundingBox) return null;\n // Drawing-linked annotations highlight the stroke via canvas, not an element box\n if (hoveredAnnotation.drawingIndex != null) return null;\n\n // Render individual element boxes if available (cmd+shift+click multi-select)\n if (hoveredAnnotation.elementBoundingBoxes?.length) {\n // Use live positions from hoveredTargetElements when available\n if (hoveredTargetElements.length > 0) {\n return hoveredTargetElements\n .filter((el) => document.contains(el))\n .map((el, index) => {\n const rect = el.getBoundingClientRect();\n return (\n <div\n key={`hover-outline-live-${index}`}\n className={`${styles.multiSelectOutline} ${styles.enter}`}\n style={{\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n }}\n />\n );\n });\n }\n // Fallback to stored bounding boxes\n return hoveredAnnotation.elementBoundingBoxes.map(\n (bb, index) => (\n <div\n key={`hover-outline-${index}`}\n className={`${styles.multiSelectOutline} ${styles.enter}`}\n style={{\n left: bb.x,\n top: bb.y - scrollY,\n width: bb.width,\n height: bb.height,\n }}\n />\n ),\n );\n }\n\n // Single element: use live position from hoveredTargetElement when available\n const rect =\n hoveredTargetElement && document.contains(hoveredTargetElement)\n ? hoveredTargetElement.getBoundingClientRect()\n : null;\n\n const bb = rect\n ? { x: rect.left, y: rect.top, width: rect.width, height: rect.height }\n : {\n x: hoveredAnnotation.boundingBox.x,\n y: hoveredAnnotation.isFixed\n ? hoveredAnnotation.boundingBox.y\n : hoveredAnnotation.boundingBox.y - scrollY,\n width: hoveredAnnotation.boundingBox.width,\n height: hoveredAnnotation.boundingBox.height,\n };\n\n const isMulti = hoveredAnnotation.isMultiSelect;\n return (\n <div\n className={`${isMulti ? styles.multiSelectOutline : styles.singleSelectOutline} ${styles.enter}`}\n style={{\n left: bb.x,\n top: bb.y,\n width: bb.width,\n height: bb.height,\n ...(isMulti\n ? {}\n : {\n borderColor: `${settings.annotationColor}99`,\n backgroundColor: `${settings.annotationColor}0D`,\n }),\n }}\n />\n );\n })()}\n\n {/* Hover tooltip */}\n {hoverInfo && !pendingAnnotation && !isScrolling && !isDragging && !isDrawMode && (\n <div\n className={`${styles.hoverTooltip} ${styles.enter}`}\n style={{\n left: Math.max(\n 8,\n Math.min(hoverPosition.x, window.innerWidth - 100),\n ),\n top: Math.max(\n hoverPosition.y - (hoverInfo.reactComponents ? 48 : 32),\n 8,\n ),\n }}\n >\n {hoverInfo.reactComponents && (\n <div className={styles.hoverReactPath}>\n {hoverInfo.reactComponents}\n </div>\n )}\n <div className={styles.hoverElementName}>\n {hoverInfo.elementName}\n </div>\n </div>\n )}\n\n {/* Pending annotation marker + popup */}\n {pendingAnnotation && (\n <>\n {/* Show element/area outline while adding annotation (skip for drawing-linked annotations — drawing is the highlight) */}\n {pendingAnnotation.drawingIndex != null\n ? null\n : pendingAnnotation.multiSelectElements?.length\n ? // Cmd+shift+click multi-select: show individual boxes with live positions\n pendingAnnotation.multiSelectElements\n .filter((el) => document.contains(el))\n .map((el, index) => {\n const rect = el.getBoundingClientRect();\n return (\n <div\n key={`pending-multi-${index}`}\n className={`${styles.multiSelectOutline} ${pendingExiting ? styles.exit : styles.enter}`}\n style={{\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n }}\n />\n );\n })\n : // Single element or drag multi-select: show single box\n pendingAnnotation.targetElement &&\n document.contains(pendingAnnotation.targetElement)\n ? // Single-click: use live getBoundingClientRect for consistent positioning\n (() => {\n const rect =\n pendingAnnotation.targetElement!.getBoundingClientRect();\n return (\n <div\n className={`${styles.singleSelectOutline} ${pendingExiting ? styles.exit : styles.enter}`}\n style={{\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n borderColor: `${settings.annotationColor}99`,\n backgroundColor: `${settings.annotationColor}0D`,\n }}\n />\n );\n })()\n : // Drag selection or fallback: use stored boundingBox\n pendingAnnotation.boundingBox && (\n <div\n className={`${pendingAnnotation.isMultiSelect ? styles.multiSelectOutline : styles.singleSelectOutline} ${pendingExiting ? styles.exit : styles.enter}`}\n style={{\n left: pendingAnnotation.boundingBox.x,\n top: pendingAnnotation.boundingBox.y - scrollY,\n width: pendingAnnotation.boundingBox.width,\n height: pendingAnnotation.boundingBox.height,\n ...(pendingAnnotation.isMultiSelect\n ? {}\n : {\n borderColor: `${settings.annotationColor}99`,\n backgroundColor: `${settings.annotationColor}0D`,\n }),\n }}\n />\n )}\n\n {(() => {\n // Use stored coordinates - they match what will be saved\n const markerX = pendingAnnotation.x;\n const markerY = pendingAnnotation.isFixed\n ? pendingAnnotation.y\n : pendingAnnotation.y - scrollY;\n\n return (\n <>\n <div\n className={`${styles.marker} ${styles.pending} ${pendingAnnotation.isMultiSelect ? styles.multiSelect : \"\"} ${pendingExiting ? styles.exit : styles.enter}`}\n style={{\n left: `${markerX}%`,\n top: markerY,\n backgroundColor: pendingAnnotation.isMultiSelect\n ? \"#34C759\"\n : settings.annotationColor,\n }}\n >\n <IconPlus size={12} />\n </div>\n\n <AnnotationPopupCSS\n ref={popupRef}\n element={pendingAnnotation.element}\n selectedText={pendingAnnotation.selectedText}\n computedStyles={pendingAnnotation.computedStylesObj}\n placeholder={\n pendingAnnotation.element === \"Area selection\"\n ? \"What should change in this area?\"\n : pendingAnnotation.isMultiSelect\n ? \"Feedback for this group of elements...\"\n : \"What should change?\"\n }\n onSubmit={addAnnotation}\n onCancel={cancelAnnotation}\n isExiting={pendingExiting}\n lightMode={!isDarkMode}\n accentColor={\n pendingAnnotation.isMultiSelect\n ? \"#34C759\"\n : settings.annotationColor\n }\n style={{\n // Popup is 280px wide, centered with translateX(-50%), so 140px each side\n // Clamp so popup stays 20px from viewport edges\n left: Math.max(\n 160,\n Math.min(\n window.innerWidth - 160,\n (markerX / 100) * window.innerWidth,\n ),\n ),\n // Position popup above or below marker to keep marker visible\n ...(markerY > window.innerHeight - 290\n ? { bottom: window.innerHeight - markerY + 20 }\n : { top: markerY + 20 }),\n }}\n />\n </>\n );\n })()}\n </>\n )}\n\n {/* Edit annotation popup */}\n {editingAnnotation && (\n <>\n {/* Show element/area outline while editing (skip for drawing-linked — drawing is the highlight) */}\n {editingAnnotation.drawingIndex != null\n ? null\n : editingAnnotation.elementBoundingBoxes?.length\n ? // Cmd+shift+click: show individual element boxes (use live rects when available)\n (() => {\n // Use live positions from editingTargetElements when available\n if (editingTargetElements.length > 0) {\n return editingTargetElements\n .filter((el) => document.contains(el))\n .map((el, index) => {\n const rect = el.getBoundingClientRect();\n return (\n <div\n key={`edit-multi-live-${index}`}\n className={`${styles.multiSelectOutline} ${styles.enter}`}\n style={{\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n }}\n />\n );\n });\n }\n // Fallback to stored bounding boxes\n return editingAnnotation.elementBoundingBoxes!.map(\n (bb, index) => (\n <div\n key={`edit-multi-${index}`}\n className={`${styles.multiSelectOutline} ${styles.enter}`}\n style={{\n left: bb.x,\n top: bb.y - scrollY,\n width: bb.width,\n height: bb.height,\n }}\n />\n ),\n );\n })()\n : // Single element or drag multi-select: show single box\n (() => {\n // Use live position from editingTargetElement when available\n const rect =\n editingTargetElement &&\n document.contains(editingTargetElement)\n ? editingTargetElement.getBoundingClientRect()\n : null;\n\n const bb = rect\n ? { x: rect.left, y: rect.top, width: rect.width, height: rect.height }\n : editingAnnotation.boundingBox\n ? {\n x: editingAnnotation.boundingBox.x,\n y: editingAnnotation.isFixed\n ? editingAnnotation.boundingBox.y\n : editingAnnotation.boundingBox.y - scrollY,\n width: editingAnnotation.boundingBox.width,\n height: editingAnnotation.boundingBox.height,\n }\n : null;\n\n if (!bb) return null;\n\n return (\n <div\n className={`${editingAnnotation.isMultiSelect ? styles.multiSelectOutline : styles.singleSelectOutline} ${styles.enter}`}\n style={{\n left: bb.x,\n top: bb.y,\n width: bb.width,\n height: bb.height,\n ...(editingAnnotation.isMultiSelect\n ? {}\n : {\n borderColor: `${settings.annotationColor}99`,\n backgroundColor: `${settings.annotationColor}0D`,\n }),\n }}\n />\n );\n })()}\n\n <AnnotationPopupCSS\n ref={editPopupRef}\n element={editingAnnotation.element}\n selectedText={editingAnnotation.selectedText}\n computedStyles={parseComputedStylesString(\n editingAnnotation.computedStyles,\n )}\n placeholder=\"Edit your feedback...\"\n initialValue={editingAnnotation.comment}\n submitLabel=\"Save\"\n onSubmit={updateAnnotation}\n onCancel={cancelEditAnnotation}\n onDelete={() => deleteAnnotation(editingAnnotation.id)}\n isExiting={editExiting}\n lightMode={!isDarkMode}\n accentColor={\n editingAnnotation.isMultiSelect\n ? \"#34C759\"\n : settings.annotationColor\n }\n style={(() => {\n const markerY = editingAnnotation.isFixed\n ? editingAnnotation.y\n : editingAnnotation.y - scrollY;\n return {\n // Popup is 280px wide, centered with translateX(-50%), so 140px each side\n // Clamp so popup stays 20px from viewport edges\n left: Math.max(\n 160,\n Math.min(\n window.innerWidth - 160,\n (editingAnnotation.x / 100) * window.innerWidth,\n ),\n ),\n // Position popup above or below marker to keep marker visible\n ...(markerY > window.innerHeight - 290\n ? { bottom: window.innerHeight - markerY + 20 }\n : { top: markerY + 20 }),\n };\n })()}\n />\n </>\n )}\n\n {/* Drag selection - all visuals use refs for smooth 60fps */}\n {isDragging && (\n <>\n <div ref={dragRectRef} className={styles.dragSelection} />\n <div\n ref={highlightsContainerRef}\n className={styles.highlightsContainer}\n />\n </>\n )}\n </div>\n )}\n </>,\n document.body,\n );\n}\n\nexport default PageFeedbackToolbarCSS;\n","\"use client\";\n\nimport { useState, useRef, useEffect, useCallback, forwardRef, useImperativeHandle } from \"react\";\nimport styles from \"./styles.module.scss\";\nimport { IconTrash } from \"../icons\";\nimport { originalSetTimeout } from \"../../utils/freeze-animations\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface AnnotationPopupCSSProps {\n /** Element name to display in header */\n element: string;\n /** Optional timestamp display (e.g., \"@ 1.23s\" for animation feedback) */\n timestamp?: string;\n /** Optional selected/highlighted text */\n selectedText?: string;\n /** Placeholder text for the textarea */\n placeholder?: string;\n /** Initial value for textarea (for edit mode) */\n initialValue?: string;\n /** Label for submit button (default: \"Add\") */\n submitLabel?: string;\n /** Called when annotation is submitted with text */\n onSubmit: (text: string) => void;\n /** Called when popup is cancelled/dismissed */\n onCancel: () => void;\n /** Called when delete button is clicked (only shown if provided) */\n onDelete?: () => void;\n /** Position styles (left, top) */\n style?: React.CSSProperties;\n /** Custom color for submit button and textarea focus (hex) */\n accentColor?: string;\n /** External exit state (parent controls exit animation) */\n isExiting?: boolean;\n /** Light mode styling */\n lightMode?: boolean;\n /** Computed styles for the selected element */\n computedStyles?: Record<string, string>;\n}\n\nexport interface AnnotationPopupCSSHandle {\n /** Shake the popup (e.g., when user clicks outside) */\n shake: () => void;\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\nexport const AnnotationPopupCSS = forwardRef<AnnotationPopupCSSHandle, AnnotationPopupCSSProps>(\n function AnnotationPopupCSS(\n {\n element,\n timestamp,\n selectedText,\n placeholder = \"What should change?\",\n initialValue = \"\",\n submitLabel = \"Add\",\n onSubmit,\n onCancel,\n onDelete,\n style,\n accentColor = \"#3c82f7\",\n isExiting = false,\n lightMode = false,\n computedStyles,\n },\n ref\n ) {\n const [text, setText] = useState(initialValue);\n const [isShaking, setIsShaking] = useState(false);\n const [animState, setAnimState] = useState<\"initial\" | \"enter\" | \"entered\" | \"exit\">(\"initial\");\n const [isFocused, setIsFocused] = useState(false);\n const [isStylesExpanded, setIsStylesExpanded] = useState(false); // Computed styles accordion state\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const popupRef = useRef<HTMLDivElement>(null);\n const cancelTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const shakeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Sync with parent exit state\n useEffect(() => {\n if (isExiting && animState !== \"exit\") {\n setAnimState(\"exit\");\n }\n }, [isExiting, animState]);\n\n // Animate in on mount and focus textarea\n useEffect(() => {\n // Start enter animation (use originalSetTimeout to bypass freeze patch)\n originalSetTimeout(() => {\n setAnimState(\"enter\");\n }, 0);\n // Transition to entered state after animation completes\n const enterTimer = originalSetTimeout(() => {\n setAnimState(\"entered\");\n }, 200); // Match animation duration\n const focusTimer = originalSetTimeout(() => {\n const textarea = textareaRef.current;\n if (textarea) {\n textarea.focus();\n textarea.selectionStart = textarea.selectionEnd = textarea.value.length;\n textarea.scrollTop = textarea.scrollHeight;\n }\n }, 50);\n return () => {\n clearTimeout(enterTimer);\n clearTimeout(focusTimer);\n if (cancelTimerRef.current) clearTimeout(cancelTimerRef.current);\n if (shakeTimerRef.current) clearTimeout(shakeTimerRef.current);\n };\n }, []);\n\n // Shake animation\n const shake = useCallback(() => {\n if (shakeTimerRef.current) clearTimeout(shakeTimerRef.current);\n setIsShaking(true);\n shakeTimerRef.current = originalSetTimeout(() => {\n setIsShaking(false);\n textareaRef.current?.focus();\n }, 250);\n }, []);\n\n // Expose shake to parent via ref\n useImperativeHandle(ref, () => ({\n shake,\n }), [shake]);\n\n // Handle cancel with exit animation\n const handleCancel = useCallback(() => {\n setAnimState(\"exit\");\n cancelTimerRef.current = originalSetTimeout(() => {\n onCancel();\n }, 150); // Match exit animation duration\n }, [onCancel]);\n\n // Handle submit\n const handleSubmit = useCallback(() => {\n if (!text.trim()) return;\n onSubmit(text.trim());\n }, [text, onSubmit]);\n\n // Handle keyboard\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.nativeEvent.isComposing) return;\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n if (e.key === \"Escape\") {\n handleCancel();\n }\n },\n [handleSubmit, handleCancel]\n );\n\n const popupClassName = [\n styles.popup,\n lightMode ? styles.light : \"\",\n animState === \"enter\" ? styles.enter : \"\",\n animState === \"entered\" ? styles.entered : \"\",\n animState === \"exit\" ? styles.exit : \"\",\n isShaking ? styles.shake : \"\",\n ].filter(Boolean).join(\" \");\n\n return (\n <div\n ref={popupRef}\n className={popupClassName}\n data-annotation-popup\n style={style}\n onClick={(e) => e.stopPropagation()}\n >\n <div className={styles.header}>\n {computedStyles && Object.keys(computedStyles).length > 0 ? (\n <button\n className={styles.headerToggle}\n onClick={() => {\n const wasExpanded = isStylesExpanded;\n setIsStylesExpanded(!isStylesExpanded);\n if (wasExpanded) {\n // Refocus textarea when closing\n originalSetTimeout(() => textareaRef.current?.focus(), 0);\n }\n }}\n type=\"button\"\n >\n <svg\n className={`${styles.chevron} ${isStylesExpanded ? styles.expanded : \"\"}`}\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5.5 10.25L9 7.25L5.75 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span className={styles.element}>{element}</span>\n </button>\n ) : (\n <span className={styles.element}>{element}</span>\n )}\n {timestamp && <span className={styles.timestamp}>{timestamp}</span>}\n </div>\n\n {/* Collapsible computed styles section - uses grid-template-rows for smooth animation */}\n {computedStyles && Object.keys(computedStyles).length > 0 && (\n <div className={`${styles.stylesWrapper} ${isStylesExpanded ? styles.expanded : \"\"}`}>\n <div className={styles.stylesInner}>\n <div className={styles.stylesBlock}>\n {Object.entries(computedStyles).map(([key, value]) => (\n <div key={key} className={styles.styleLine}>\n <span className={styles.styleProperty}>\n {key.replace(/([A-Z])/g, \"-$1\").toLowerCase()}\n </span>\n : <span className={styles.styleValue}>{value}</span>;\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {selectedText && (\n <div className={styles.quote}>\n “{selectedText.slice(0, 80)}\n {selectedText.length > 80 ? \"...\" : \"\"}”\n </div>\n )}\n\n <textarea\n ref={textareaRef}\n className={styles.textarea}\n style={{ borderColor: isFocused ? accentColor : undefined }}\n placeholder={placeholder}\n value={text}\n onChange={(e) => setText(e.target.value)}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n rows={2}\n onKeyDown={handleKeyDown}\n />\n\n <div className={styles.actions}>\n {onDelete && (\n <div className={styles.deleteWrapper}>\n <button className={styles.deleteButton} onClick={onDelete} type=\"button\">\n <IconTrash size={22} />\n </button>\n </div>\n )}\n <button className={styles.cancel} onClick={handleCancel}>\n Cancel\n </button>\n <button\n className={styles.submit}\n style={{\n backgroundColor: accentColor,\n opacity: text.trim() ? 1 : 0.4,\n }}\n onClick={handleSubmit}\n disabled={!text.trim()}\n >\n {submitLabel}\n </button>\n </div>\n </div>\n );\n }\n);\n\nexport default AnnotationPopupCSS;\n","\nconst css = \"svg[fill=none] {\\n fill: none !important;\\n}\\n\\n@keyframes styles-module__popupEnter___AuQDN {\\n from {\\n opacity: 0;\\n transform: translateX(-50%) scale(0.95) translateY(4px);\\n }\\n to {\\n opacity: 1;\\n transform: translateX(-50%) scale(1) translateY(0);\\n }\\n}\\n@keyframes styles-module__popupExit___JJKQX {\\n from {\\n opacity: 1;\\n transform: translateX(-50%) scale(1) translateY(0);\\n }\\n to {\\n opacity: 0;\\n transform: translateX(-50%) scale(0.95) translateY(4px);\\n }\\n}\\n@keyframes styles-module__shake___jdbWe {\\n 0%, 100% {\\n transform: translateX(-50%) scale(1) translateY(0) translateX(0);\\n }\\n 20% {\\n transform: translateX(-50%) scale(1) translateY(0) translateX(-3px);\\n }\\n 40% {\\n transform: translateX(-50%) scale(1) translateY(0) translateX(3px);\\n }\\n 60% {\\n transform: translateX(-50%) scale(1) translateY(0) translateX(-2px);\\n }\\n 80% {\\n transform: translateX(-50%) scale(1) translateY(0) translateX(2px);\\n }\\n}\\n.styles-module__popup___IhzrD {\\n position: fixed;\\n transform: translateX(-50%);\\n width: 280px;\\n padding: 0.75rem 1rem 14px;\\n background: #1a1a1a;\\n border-radius: 16px;\\n box-shadow: 0 4px 24px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(255, 255, 255, 0.08);\\n cursor: default;\\n z-index: 100001;\\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, sans-serif;\\n will-change: transform, opacity;\\n opacity: 0;\\n}\\n.styles-module__popup___IhzrD.styles-module__enter___L7U7N {\\n animation: styles-module__popupEnter___AuQDN 0.2s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;\\n}\\n.styles-module__popup___IhzrD.styles-module__entered___COX-w {\\n opacity: 1;\\n transform: translateX(-50%) scale(1) translateY(0);\\n}\\n.styles-module__popup___IhzrD.styles-module__exit___5eGjE {\\n animation: styles-module__popupExit___JJKQX 0.15s ease-in forwards;\\n}\\n.styles-module__popup___IhzrD.styles-module__entered___COX-w.styles-module__shake___jdbWe {\\n animation: styles-module__shake___jdbWe 0.25s ease-out;\\n}\\n\\n.styles-module__header___wWsSi {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n margin-bottom: 0.5625rem;\\n}\\n\\n.styles-module__element___fTV2z {\\n font-size: 0.75rem;\\n font-weight: 400;\\n color: rgba(255, 255, 255, 0.5);\\n max-width: 100%;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n flex: 1;\\n}\\n\\n.styles-module__headerToggle___WpW0b {\\n display: flex;\\n align-items: center;\\n gap: 0.25rem;\\n background: none;\\n border: none;\\n padding: 0;\\n cursor: pointer;\\n flex: 1;\\n min-width: 0;\\n text-align: left;\\n}\\n.styles-module__headerToggle___WpW0b .styles-module__element___fTV2z {\\n flex: 1;\\n}\\n\\n.styles-module__chevron___ZZJlR {\\n color: rgba(255, 255, 255, 0.5);\\n transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1);\\n flex-shrink: 0;\\n}\\n.styles-module__chevron___ZZJlR.styles-module__expanded___2Hxgv {\\n transform: rotate(90deg);\\n}\\n\\n.styles-module__stylesWrapper___pnHgy {\\n display: grid;\\n grid-template-rows: 0fr;\\n transition: grid-template-rows 0.3s cubic-bezier(0.16, 1, 0.3, 1);\\n}\\n.styles-module__stylesWrapper___pnHgy.styles-module__expanded___2Hxgv {\\n grid-template-rows: 1fr;\\n}\\n\\n.styles-module__stylesInner___YYZe2 {\\n overflow: hidden;\\n}\\n\\n.styles-module__stylesBlock___VfQKn {\\n background: rgba(255, 255, 255, 0.05);\\n border-radius: 0.375rem;\\n padding: 0.5rem 0.625rem;\\n margin-bottom: 0.5rem;\\n font-family: ui-monospace, SFMono-Regular, \\\"SF Mono\\\", Menlo, Consolas, monospace;\\n font-size: 0.6875rem;\\n line-height: 1.5;\\n}\\n\\n.styles-module__styleLine___1YQiD {\\n color: rgba(255, 255, 255, 0.85);\\n word-break: break-word;\\n}\\n\\n.styles-module__styleProperty___84L1i {\\n color: #c792ea;\\n}\\n\\n.styles-module__styleValue___q51-h {\\n color: rgba(255, 255, 255, 0.85);\\n}\\n\\n.styles-module__timestamp___Dtpsv {\\n font-size: 0.625rem;\\n font-weight: 500;\\n color: rgba(255, 255, 255, 0.35);\\n font-variant-numeric: tabular-nums;\\n margin-left: 0.5rem;\\n flex-shrink: 0;\\n}\\n\\n.styles-module__quote___mcMmQ {\\n font-size: 12px;\\n font-style: italic;\\n color: rgba(255, 255, 255, 0.6);\\n margin-bottom: 0.5rem;\\n padding: 0.4rem 0.5rem;\\n background: rgba(255, 255, 255, 0.05);\\n border-radius: 0.25rem;\\n line-height: 1.45;\\n}\\n\\n.styles-module__textarea___jrSae {\\n width: 100%;\\n padding: 0.5rem 0.625rem;\\n font-size: 0.8125rem;\\n font-family: inherit;\\n background: rgba(255, 255, 255, 0.05);\\n color: #fff;\\n border: 1px solid rgba(255, 255, 255, 0.15);\\n border-radius: 8px;\\n resize: none;\\n outline: none;\\n transition: border-color 0.15s ease;\\n}\\n.styles-module__textarea___jrSae:focus {\\n border-color: #3c82f7;\\n}\\n.styles-module__textarea___jrSae.styles-module__green___99l3h:focus {\\n border-color: #34c759;\\n}\\n.styles-module__textarea___jrSae::placeholder {\\n color: rgba(255, 255, 255, 0.35);\\n}\\n.styles-module__textarea___jrSae::-webkit-scrollbar {\\n width: 6px;\\n}\\n.styles-module__textarea___jrSae::-webkit-scrollbar-track {\\n background: transparent;\\n}\\n.styles-module__textarea___jrSae::-webkit-scrollbar-thumb {\\n background: rgba(255, 255, 255, 0.2);\\n border-radius: 3px;\\n}\\n\\n.styles-module__actions___D6x3f {\\n display: flex;\\n justify-content: flex-end;\\n gap: 0.375rem;\\n margin-top: 0.5rem;\\n}\\n\\n.styles-module__cancel___hRjnL,\\n.styles-module__submit___K-mIR {\\n padding: 0.4rem 0.875rem;\\n font-size: 0.75rem;\\n font-weight: 500;\\n border-radius: 1rem;\\n border: none;\\n cursor: pointer;\\n transition: background-color 0.15s ease, color 0.15s ease, opacity 0.15s ease;\\n}\\n\\n.styles-module__cancel___hRjnL {\\n background: transparent;\\n color: rgba(255, 255, 255, 0.5);\\n}\\n.styles-module__cancel___hRjnL:hover {\\n background: rgba(255, 255, 255, 0.1);\\n color: rgba(255, 255, 255, 0.8);\\n}\\n\\n.styles-module__submit___K-mIR {\\n color: white;\\n}\\n.styles-module__submit___K-mIR:hover:not(:disabled) {\\n filter: brightness(0.9);\\n}\\n.styles-module__submit___K-mIR:disabled {\\n cursor: not-allowed;\\n}\\n\\n.styles-module__deleteWrapper___oSjdo {\\n margin-right: auto;\\n}\\n\\n.styles-module__deleteButton___4VuAE {\\n cursor: pointer;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 28px;\\n height: 28px;\\n border-radius: 50%;\\n border: none;\\n background: transparent;\\n color: rgba(255, 255, 255, 0.4);\\n transition: background-color 0.15s ease, color 0.15s ease, transform 0.1s ease;\\n}\\n.styles-module__deleteButton___4VuAE:hover {\\n background: rgba(255, 59, 48, 0.25);\\n color: #ff3b30;\\n}\\n.styles-module__deleteButton___4VuAE:active {\\n transform: scale(0.92);\\n}\\n\\n.styles-module__light___6AaSQ.styles-module__popup___IhzrD {\\n background: #fff;\\n box-shadow: 0 4px 24px rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(0, 0, 0, 0.06);\\n}\\n.styles-module__light___6AaSQ .styles-module__element___fTV2z {\\n color: rgba(0, 0, 0, 0.6);\\n}\\n.styles-module__light___6AaSQ .styles-module__timestamp___Dtpsv {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n.styles-module__light___6AaSQ .styles-module__chevron___ZZJlR {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n.styles-module__light___6AaSQ .styles-module__stylesBlock___VfQKn {\\n background: rgba(0, 0, 0, 0.03);\\n}\\n.styles-module__light___6AaSQ .styles-module__styleLine___1YQiD {\\n color: rgba(0, 0, 0, 0.75);\\n}\\n.styles-module__light___6AaSQ .styles-module__styleProperty___84L1i {\\n color: #7c3aed;\\n}\\n.styles-module__light___6AaSQ .styles-module__styleValue___q51-h {\\n color: rgba(0, 0, 0, 0.75);\\n}\\n.styles-module__light___6AaSQ .styles-module__quote___mcMmQ {\\n color: rgba(0, 0, 0, 0.55);\\n background: rgba(0, 0, 0, 0.04);\\n}\\n.styles-module__light___6AaSQ .styles-module__textarea___jrSae {\\n background: rgba(0, 0, 0, 0.03);\\n color: #1a1a1a;\\n border-color: rgba(0, 0, 0, 0.12);\\n}\\n.styles-module__light___6AaSQ .styles-module__textarea___jrSae::placeholder {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n.styles-module__light___6AaSQ .styles-module__textarea___jrSae::-webkit-scrollbar-thumb {\\n background: rgba(0, 0, 0, 0.15);\\n}\\n.styles-module__light___6AaSQ .styles-module__cancel___hRjnL {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n.styles-module__light___6AaSQ .styles-module__cancel___hRjnL:hover {\\n background: rgba(0, 0, 0, 0.06);\\n color: rgba(0, 0, 0, 0.75);\\n}\\n.styles-module__light___6AaSQ .styles-module__deleteButton___4VuAE {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n.styles-module__light___6AaSQ .styles-module__deleteButton___4VuAE:hover {\\n background: rgba(255, 59, 48, 0.15);\\n color: #ff3b30;\\n}\";\nconst classNames = {\"popup\":\"styles-module__popup___IhzrD\",\"enter\":\"styles-module__enter___L7U7N\",\"popupEnter\":\"styles-module__popupEnter___AuQDN\",\"entered\":\"styles-module__entered___COX-w\",\"exit\":\"styles-module__exit___5eGjE\",\"popupExit\":\"styles-module__popupExit___JJKQX\",\"shake\":\"styles-module__shake___jdbWe\",\"header\":\"styles-module__header___wWsSi\",\"element\":\"styles-module__element___fTV2z\",\"headerToggle\":\"styles-module__headerToggle___WpW0b\",\"chevron\":\"styles-module__chevron___ZZJlR\",\"expanded\":\"styles-module__expanded___2Hxgv\",\"stylesWrapper\":\"styles-module__stylesWrapper___pnHgy\",\"stylesInner\":\"styles-module__stylesInner___YYZe2\",\"stylesBlock\":\"styles-module__stylesBlock___VfQKn\",\"styleLine\":\"styles-module__styleLine___1YQiD\",\"styleProperty\":\"styles-module__styleProperty___84L1i\",\"styleValue\":\"styles-module__styleValue___q51-h\",\"timestamp\":\"styles-module__timestamp___Dtpsv\",\"quote\":\"styles-module__quote___mcMmQ\",\"textarea\":\"styles-module__textarea___jrSae\",\"green\":\"styles-module__green___99l3h\",\"actions\":\"styles-module__actions___D6x3f\",\"cancel\":\"styles-module__cancel___hRjnL\",\"submit\":\"styles-module__submit___K-mIR\",\"deleteWrapper\":\"styles-module__deleteWrapper___oSjdo\",\"deleteButton\":\"styles-module__deleteButton___4VuAE\",\"light\":\"styles-module__light___6AaSQ\"};\n\n// SSR-safe style injection\nif (typeof document !== 'undefined') {\n let style = document.getElementById('feedback-tool-styles-annotation-popup-css-styles');\n if (!style) {\n style = document.createElement('style');\n style.id = 'feedback-tool-styles-annotation-popup-css-styles';\n style.textContent = css;\n document.head.appendChild(style);\n }\n}\n\nexport default classNames;\n","\"use client\";\n\n// =============================================================================\n// Icons\n// =============================================================================\n\n// Small X for marker delete\nexport const IconClose = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n// Plus icon\nexport const IconPlus = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M8 3v10M3 8h10\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n// Checkmark icon\nexport const IconCheck = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M3 8l3.5 3.5L13 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Checkbox checkmark (smaller, optimized for checkboxes)\nexport const IconCheckSmall = ({ size = 14 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 14 14\" fill=\"none\">\n <path\n d=\"M3.9375 7L6.125 9.1875L10.5 4.8125\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// List with sparkle icon\nexport const IconListSparkle = ({\n size = 24,\n style = {},\n}: {\n size?: number;\n style?: React.CSSProperties;\n}) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" style={style}>\n <g clipPath=\"url(#clip0_list_sparkle)\">\n <path\n d=\"M11.5 12L5.5 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M18.5 6.75L5.5 6.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M9.25 17.25L5.5 17.25\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M16 12.75L16.5179 13.9677C16.8078 14.6494 17.3506 15.1922 18.0323 15.4821L19.25 16L18.0323 16.5179C17.3506 16.8078 16.8078 17.3506 16.5179 18.0323L16 19.25L15.4821 18.0323C15.1922 17.3506 14.6494 16.8078 13.9677 16.5179L12.75 16L13.9677 15.4821C14.6494 15.1922 15.1922 14.6494 15.4821 13.9677L16 12.75Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_list_sparkle\">\n <rect width=\"24\" height=\"24\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n);\n\n// Help/Question mark icon for tooltips\nexport const IconHelp = ({ size = 20 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\">\n <circle\n cx=\"10\"\n cy=\"10.5\"\n r=\"5.25\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n />\n <path\n d=\"M8.5 8.75C8.5 7.92 9.17 7.25 10 7.25C10.83 7.25 11.5 7.92 11.5 8.75C11.5 9.58 10.83 10.25 10 10.25V11\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"10\" cy=\"13\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n);\n\n// Animated checkmark with draw + bounce effect\nexport const IconCheckSmallAnimated = ({ size = 14 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 14 14\" fill=\"none\">\n <style>{`\n @keyframes checkDraw {\n 0% {\n stroke-dashoffset: 12;\n }\n 100% {\n stroke-dashoffset: 0;\n }\n }\n @keyframes checkBounce {\n 0% {\n transform: scale(0.5);\n opacity: 0;\n }\n 50% {\n transform: scale(1.12);\n opacity: 1;\n }\n 75% {\n transform: scale(0.95);\n }\n 100% {\n transform: scale(1);\n }\n }\n .check-path-animated {\n stroke-dasharray: 12;\n stroke-dashoffset: 0;\n transform-origin: center;\n animation: checkDraw 0.18s ease-out, checkBounce 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);\n }\n `}</style>\n <path\n className=\"check-path-animated\"\n d=\"M3.9375 7L6.125 9.1875L10.5 4.8125\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// =============================================================================\n// New Icons from SVG files\n// =============================================================================\n\n// Copy icon (two overlapping rectangles)\nexport const IconCopyAlt = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M4.75 11.25C4.75 10.4216 5.42157 9.75 6.25 9.75H12.75C13.5784 9.75 14.25 10.4216 14.25 11.25V17.75C14.25 18.5784 13.5784 19.25 12.75 19.25H6.25C5.42157 19.25 4.75 18.5784 4.75 17.75V11.25Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M17.25 14.25H17.75C18.5784 14.25 19.25 13.5784 19.25 12.75V6.25C19.25 5.42157 18.5784 4.75 17.75 4.75H11.25C10.4216 4.75 9.75 5.42157 9.75 6.25V6.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n// Animated copy/checkmark icon\nexport const IconCopyAnimated = ({ size = 24, copied = false }: { size?: number; copied?: boolean }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <style>{`\n .copy-icon, .check-icon {\n transition: opacity 0.2s ease, transform 0.2s ease;\n }\n `}</style>\n {/* Copy icon */}\n <g className=\"copy-icon\" style={{ opacity: copied ? 0 : 1, transform: copied ? 'scale(0.8)' : 'scale(1)', transformOrigin: 'center' }}>\n <path\n d=\"M4.75 11.25C4.75 10.4216 5.42157 9.75 6.25 9.75H12.75C13.5784 9.75 14.25 10.4216 14.25 11.25V17.75C14.25 18.5784 13.5784 19.25 12.75 19.25H6.25C5.42157 19.25 4.75 18.5784 4.75 17.75V11.25Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M17.25 14.25H17.75C18.5784 14.25 19.25 13.5784 19.25 12.75V6.25C19.25 5.42157 18.5784 4.75 17.75 4.75H11.25C10.4216 4.75 9.75 5.42157 9.75 6.25V6.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </g>\n {/* Checkmark circle */}\n <g className=\"check-icon\" style={{ opacity: copied ? 1 : 0, transform: copied ? 'scale(1)' : 'scale(0.8)', transformOrigin: 'center' }}>\n <path\n d=\"M12 20C7.58172 20 4 16.4182 4 12C4 7.58172 7.58172 4 12 4C16.4182 4 20 7.58172 20 12C20 16.4182 16.4182 20 12 20Z\"\n stroke=\"#22c55e\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M15 10L11 14.25L9.25 12.25\"\n stroke=\"#22c55e\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n </svg>\n);\n\n// Animated send arrow icon (paper plane style with checkmark/error transition)\nexport const IconSendArrow = ({\n size = 24,\n state = \"idle\"\n}: {\n size?: number;\n state?: \"idle\" | \"sending\" | \"sent\" | \"failed\";\n}) => {\n const showArrow = state === \"idle\";\n const showCheck = state === \"sent\";\n const showError = state === \"failed\";\n const isSending = state === \"sending\";\n\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <style>{`\n .send-arrow-icon, .send-check-icon, .send-error-icon {\n transition: opacity 0.15s ease, transform 0.15s ease;\n }\n `}</style>\n {/* Send arrow */}\n <g className=\"send-arrow-icon\" style={{\n opacity: showArrow ? 1 : isSending ? 0.5 : 0,\n transform: showArrow ? 'scale(1)' : 'scale(0.8)',\n transformOrigin: 'center'\n }}>\n <path\n d=\"M9.875 14.125L12.3506 19.6951C12.7184 20.5227 13.9091 20.4741 14.2083 19.6193L18.8139 6.46032C19.0907 5.6695 18.3305 4.90933 17.5397 5.18611L4.38072 9.79174C3.52589 10.0909 3.47731 11.2816 4.30494 11.6494L9.875 14.125ZM9.875 14.125L13.375 10.625\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n {/* Green checkmark circle */}\n <g className=\"send-check-icon\" style={{\n opacity: showCheck ? 1 : 0,\n transform: showCheck ? 'scale(1)' : 'scale(0.8)',\n transformOrigin: 'center'\n }}>\n <path\n d=\"M12 20C7.58172 20 4 16.4182 4 12C4 7.58172 7.58172 4 12 4C16.4182 4 20 7.58172 20 12C20 16.4182 16.4182 20 12 20Z\"\n stroke=\"#22c55e\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M15 10L11 14.25L9.25 12.25\"\n stroke=\"#22c55e\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n {/* Red error circle with exclamation */}\n <g className=\"send-error-icon\" style={{\n opacity: showError ? 1 : 0,\n transform: showError ? 'scale(1)' : 'scale(0.8)',\n transformOrigin: 'center'\n }}>\n <path\n d=\"M12 20C7.58172 20 4 16.4182 4 12C4 7.58172 7.58172 4 12 4C16.4182 4 20 7.58172 20 12C20 16.4182 16.4182 20 12 20Z\"\n stroke=\"#ef4444\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 8V12\"\n stroke=\"#ef4444\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"12\" cy=\"15\" r=\"0.5\" fill=\"#ef4444\" stroke=\"#ef4444\" strokeWidth=\"1\" />\n </g>\n </svg>\n );\n};\n\n// Animated send/checkmark icon (for \"Send to Agent\" button)\nexport const IconSendAnimated = ({ size = 24, sent = false }: { size?: number; sent?: boolean }) => (\n <svg width={size} height={size} viewBox=\"0 0 22 21\" fill=\"none\">\n <style>{`\n .send-icon, .sent-icon {\n transition: opacity 0.2s ease, transform 0.2s ease;\n }\n `}</style>\n {/* Send icon (document with arrow) */}\n <g className=\"send-icon\" style={{ opacity: sent ? 0 : 1, transform: sent ? 'scale(0.8)' : 'scale(1)', transformOrigin: 'center' }}>\n <path\n d=\"M9.5 5H6.5C4.84315 5 3.5 6.34315 3.5 8V15C3.5 16.6569 4.84315 18 6.5 18H13.5C15.1569 18 16.5 16.6569 16.5 15V12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M13.5 8.5L18.5 3.5M18.5 3.5L14.4524 3.5M18.5 3.5L18.5 7.54762\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M7.5 13.75H12.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M7.5 10.75H10.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </g>\n {/* Checkmark circle (success state) */}\n <g className=\"sent-icon\" style={{ opacity: sent ? 1 : 0, transform: sent ? 'scale(1)' : 'scale(0.8)', transformOrigin: 'center' }}>\n <path\n d=\"M11 19C6.58172 19 3 15.4182 3 11C3 6.58172 6.58172 3 11 3C15.4182 3 19 6.58172 19 11C19 15.4182 15.4182 19 11 19Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M14 9L10 13.25L8.25 11.25\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n </svg>\n);\n\n// Eye icon (original)\nexport const IconEye = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M4.91516 12.7108C4.63794 12.2883 4.63705 11.7565 4.91242 11.3328C5.84146 9.9033 8.30909 6.74994 12 6.74994C15.6909 6.74994 18.1585 9.9033 19.0876 11.3328C19.3629 11.7565 19.3621 12.2883 19.0848 12.7108C18.1537 14.13 15.6873 17.2499 12 17.2499C8.31272 17.2499 5.8463 14.13 4.91516 12.7108Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 14.25C13.2426 14.25 14.25 13.2426 14.25 12C14.25 10.7574 13.2426 9.75 12 9.75C10.7574 9.75 9.75 10.7574 9.75 12C9.75 13.2426 10.7574 14.25 12 14.25Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Eye icon (alt version - larger pupil)\nexport const IconEyeAlt = ({ size = 24 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M3.91752 12.7539C3.65127 12.2996 3.65037 11.7515 3.9149 11.2962C4.9042 9.59346 7.72688 5.49994 12 5.49994C16.2731 5.49994 19.0958 9.59346 20.0851 11.2962C20.3496 11.7515 20.3487 12.2996 20.0825 12.7539C19.0908 14.4459 16.2694 18.4999 12 18.4999C7.73064 18.4999 4.90918 14.4459 3.91752 12.7539Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 14.8261C13.5608 14.8261 14.8261 13.5608 14.8261 12C14.8261 10.4392 13.5608 9.17392 12 9.17392C10.4392 9.17392 9.17391 10.4392 9.17391 12C9.17391 13.5608 10.4392 14.8261 12 14.8261Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Eye closed (with slash)\nexport const IconEyeClosed = ({ size = 24 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M18.6025 9.28503C18.9174 8.9701 19.4364 8.99481 19.7015 9.35271C20.1484 9.95606 20.4943 10.507 20.7342 10.9199C21.134 11.6086 21.1329 12.4454 20.7303 13.1328C20.2144 14.013 19.2151 15.5225 17.7723 16.8193C16.3293 18.1162 14.3852 19.2497 12.0008 19.25C11.4192 19.25 10.8638 19.1823 10.3355 19.0613C9.77966 18.934 9.63498 18.2525 10.0382 17.8493C10.2412 17.6463 10.5374 17.573 10.8188 17.6302C11.1993 17.7076 11.5935 17.75 12.0008 17.75C13.8848 17.7497 15.4867 16.8568 16.7693 15.7041C18.0522 14.5511 18.9606 13.1867 19.4363 12.375C19.5656 12.1543 19.5659 11.8943 19.4373 11.6729C19.2235 11.3049 18.921 10.8242 18.5364 10.3003C18.3085 9.98991 18.3302 9.5573 18.6025 9.28503ZM12.0008 4.75C12.5814 4.75006 13.1358 4.81803 13.6632 4.93953C14.2182 5.06741 14.362 5.74812 13.9593 6.15091C13.7558 6.35435 13.4589 6.42748 13.1771 6.36984C12.7983 6.29239 12.4061 6.25006 12.0008 6.25C10.1167 6.25 8.51415 7.15145 7.23028 8.31543C5.94678 9.47919 5.03918 10.8555 4.56426 11.6729C4.43551 11.8945 4.43582 12.1542 4.56524 12.375C4.77587 12.7343 5.07189 13.2012 5.44718 13.7105C5.67623 14.0213 5.65493 14.4552 5.38193 14.7282C5.0671 15.0431 4.54833 15.0189 4.28292 14.6614C3.84652 14.0736 3.50813 13.5369 3.27129 13.1328C2.86831 12.4451 2.86717 11.6088 3.26739 10.9199C3.78185 10.0345 4.77959 8.51239 6.22247 7.2041C7.66547 5.89584 9.61202 4.75 12.0008 4.75Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M5 19L19 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n// Animated eye icon that transitions between open/closed states\nexport const IconEyeAnimated = ({ size = 24, isOpen = true }: { size?: number; isOpen?: boolean }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <style>{`\n .eye-open, .eye-closed {\n transition: opacity 0.2s ease;\n }\n `}</style>\n {/* Open state - full outline + pupil */}\n <g className=\"eye-open\" style={{ opacity: isOpen ? 1 : 0 }}>\n <path\n d=\"M3.91752 12.7539C3.65127 12.2996 3.65037 11.7515 3.9149 11.2962C4.9042 9.59346 7.72688 5.49994 12 5.49994C16.2731 5.49994 19.0958 9.59346 20.0851 11.2962C20.3496 11.7515 20.3487 12.2996 20.0825 12.7539C19.0908 14.4459 16.2694 18.4999 12 18.4999C7.73064 18.4999 4.90918 14.4459 3.91752 12.7539Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 14.8261C13.5608 14.8261 14.8261 13.5608 14.8261 12C14.8261 10.4392 13.5608 9.17392 12 9.17392C10.4392 9.17392 9.17391 10.4392 9.17391 12C9.17391 13.5608 10.4392 14.8261 12 14.8261Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n {/* Closed state - split outline + slash */}\n <g className=\"eye-closed\" style={{ opacity: isOpen ? 0 : 1 }}>\n <path\n d=\"M18.6025 9.28503C18.9174 8.9701 19.4364 8.99481 19.7015 9.35271C20.1484 9.95606 20.4943 10.507 20.7342 10.9199C21.134 11.6086 21.1329 12.4454 20.7303 13.1328C20.2144 14.013 19.2151 15.5225 17.7723 16.8193C16.3293 18.1162 14.3852 19.2497 12.0008 19.25C11.4192 19.25 10.8638 19.1823 10.3355 19.0613C9.77966 18.934 9.63498 18.2525 10.0382 17.8493C10.2412 17.6463 10.5374 17.573 10.8188 17.6302C11.1993 17.7076 11.5935 17.75 12.0008 17.75C13.8848 17.7497 15.4867 16.8568 16.7693 15.7041C18.0522 14.5511 18.9606 13.1867 19.4363 12.375C19.5656 12.1543 19.5659 11.8943 19.4373 11.6729C19.2235 11.3049 18.921 10.8242 18.5364 10.3003C18.3085 9.98991 18.3302 9.5573 18.6025 9.28503ZM12.0008 4.75C12.5814 4.75006 13.1358 4.81803 13.6632 4.93953C14.2182 5.06741 14.362 5.74812 13.9593 6.15091C13.7558 6.35435 13.4589 6.42748 13.1771 6.36984C12.7983 6.29239 12.4061 6.25006 12.0008 6.25C10.1167 6.25 8.51415 7.15145 7.23028 8.31543C5.94678 9.47919 5.03918 10.8555 4.56426 11.6729C4.43551 11.8945 4.43582 12.1542 4.56524 12.375C4.77587 12.7343 5.07189 13.2012 5.44718 13.7105C5.67623 14.0213 5.65493 14.4552 5.38193 14.7282C5.0671 15.0431 4.54833 15.0189 4.28292 14.6614C3.84652 14.0736 3.50813 13.5369 3.27129 13.1328C2.86831 12.4451 2.86717 11.6088 3.26739 10.9199C3.78185 10.0345 4.77959 8.51239 6.22247 7.2041C7.66547 5.89584 9.61202 4.75 12.0008 4.75Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M5 19L19 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </g>\n </svg>\n);\n\n// Animated pause/play icon that transitions between states\nexport const IconPausePlayAnimated = ({ size = 24, isPaused = false }: { size?: number; isPaused?: boolean }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <style>{`\n .pause-bar, .play-triangle {\n transition: opacity 0.15s ease;\n }\n `}</style>\n {/* Pause bars - visible when not paused */}\n <path\n className=\"pause-bar\"\n d=\"M8 6L8 18\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n style={{ opacity: isPaused ? 0 : 1 }}\n />\n <path\n className=\"pause-bar\"\n d=\"M16 18L16 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n style={{ opacity: isPaused ? 0 : 1 }}\n />\n {/* Play triangle - visible when paused */}\n <path\n className=\"play-triangle\"\n d=\"M17.75 10.701C18.75 11.2783 18.75 12.7217 17.75 13.299L8.75 18.4952C7.75 19.0725 6.5 18.3509 6.5 17.1962L6.5 6.80384C6.5 5.64914 7.75 4.92746 8.75 5.50481L17.75 10.701Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n style={{ opacity: isPaused ? 1 : 0 }}\n />\n </svg>\n);\n\n// Eye with minus (hidden/collapsed state)\nexport const IconEyeMinus = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M4.91516 12.7108C4.63794 12.2883 4.63705 11.7565 4.91242 11.3328C5.84146 9.9033 8.30909 6.74994 12 6.74994C15.6909 6.74994 18.1585 9.9033 19.0876 11.3328C19.3629 11.7565 19.3621 12.2883 19.0848 12.7108C18.1537 14.13 15.6873 17.2499 12 17.2499C8.31272 17.2499 5.8463 14.13 4.91516 12.7108Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M9 12H15\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n// Gear icon\nexport const IconGear = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M10.6504 5.81117C10.9939 4.39628 13.0061 4.39628 13.3496 5.81117C13.5715 6.72517 14.6187 7.15891 15.4219 6.66952C16.6652 5.91193 18.0881 7.33479 17.3305 8.57815C16.8411 9.38134 17.2748 10.4285 18.1888 10.6504C19.6037 10.9939 19.6037 13.0061 18.1888 13.3496C17.2748 13.5715 16.8411 14.6187 17.3305 15.4219C18.0881 16.6652 16.6652 18.0881 15.4219 17.3305C14.6187 16.8411 13.5715 17.2748 13.3496 18.1888C13.0061 19.6037 10.9939 19.6037 10.6504 18.1888C10.4285 17.2748 9.38135 16.8411 8.57815 17.3305C7.33479 18.0881 5.91193 16.6652 6.66952 15.4219C7.15891 14.6187 6.72517 13.5715 5.81117 13.3496C4.39628 13.0061 4.39628 10.9939 5.81117 10.6504C6.72517 10.4285 7.15891 9.38134 6.66952 8.57815C5.91193 7.33479 7.33479 5.91192 8.57815 6.66952C9.38135 7.15891 10.4285 6.72517 10.6504 5.81117Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"12\" cy=\"12\" r=\"2.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n);\n\n// Pause icon (two vertical bars - original)\nexport const IconPauseAlt = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M9.25 5.75C9.80228 5.75 10.25 6.19772 10.25 6.75L10.25 17.25C10.25 17.8023 9.80228 18.25 9.25 18.25L6.75 18.25C6.19772 18.25 5.75 17.8023 5.75 17.25L5.75 6.75C5.75 6.19772 6.19772 5.75 6.75 5.75L9.25 5.75Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M17.25 5.75C17.8023 5.75 18.25 6.19772 18.25 6.75L18.25 17.25C18.25 17.8023 17.8023 18.25 17.25 18.25L14.75 18.25C14.1977 18.25 13.75 17.8023 13.75 17.25L13.75 6.75C13.75 6.19772 14.1977 5.75 14.75 5.75L17.25 5.75Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n </svg>\n);\n\n// Pause icon (simple lines)\nexport const IconPause = ({ size = 24 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M8 6L8 18\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M16 18L16 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n// Play icon (triangle pointing right)\nexport const IconPlayAlt = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M17.75 10.701C18.75 11.2783 18.75 12.7217 17.75 13.299L8.75 18.4952C7.75 19.0725 6.5 18.3509 6.5 17.1962L6.5 6.80384C6.5 5.64914 7.75 4.92746 8.75 5.50481L17.75 10.701Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n </svg>\n);\n\n// Trash can icon (filled)\nexport const IconTrashAlt = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M13.5 4C14.7426 4 15.75 5.00736 15.75 6.25V7H18.5C18.9142 7 19.25 7.33579 19.25 7.75C19.25 8.16421 18.9142 8.5 18.5 8.5H17.9678L17.6328 16.2217C17.61 16.7475 17.5912 17.1861 17.5469 17.543C17.5015 17.9087 17.4225 18.2506 17.2461 18.5723C16.9747 19.0671 16.5579 19.4671 16.0518 19.7168C15.7227 19.8791 15.3772 19.9422 15.0098 19.9717C14.6514 20.0004 14.2126 20 13.6865 20H10.3135C9.78735 20 9.34856 20.0004 8.99023 19.9717C8.62278 19.9422 8.27729 19.8791 7.94824 19.7168C7.44205 19.4671 7.02532 19.0671 6.75391 18.5723C6.57751 18.2506 6.49853 17.9087 6.45312 17.543C6.40883 17.1861 6.39005 16.7475 6.36719 16.2217L6.03223 8.5H5.5C5.08579 8.5 4.75 8.16421 4.75 7.75C4.75 7.33579 5.08579 7 5.5 7H8.25V6.25C8.25 5.00736 9.25736 4 10.5 4H13.5ZM7.86621 16.1562C7.89013 16.7063 7.90624 17.0751 7.94141 17.3584C7.97545 17.6326 8.02151 17.7644 8.06934 17.8516C8.19271 18.0763 8.38239 18.2577 8.6123 18.3711C8.70153 18.4151 8.83504 18.4545 9.11035 18.4766C9.39482 18.4994 9.76335 18.5 10.3135 18.5H13.6865C14.2367 18.5 14.6052 18.4994 14.8896 18.4766C15.165 18.4545 15.2985 18.4151 15.3877 18.3711C15.6176 18.2577 15.8073 18.0763 15.9307 17.8516C15.9785 17.7644 16.0245 17.6326 16.0586 17.3584C16.0938 17.0751 16.1099 16.7063 16.1338 16.1562L16.4668 8.5H7.5332L7.86621 16.1562ZM9.97656 10.75C10.3906 10.7371 10.7371 11.0626 10.75 11.4766L10.875 15.4766C10.8879 15.8906 10.5624 16.2371 10.1484 16.25C9.73443 16.2629 9.38794 15.9374 9.375 15.5234L9.25 11.5234C9.23706 11.1094 9.56255 10.7629 9.97656 10.75ZM14.0244 10.75C14.4384 10.7635 14.7635 11.1105 14.75 11.5244L14.6201 15.5244C14.6066 15.9384 14.2596 16.2634 13.8457 16.25C13.4317 16.2365 13.1067 15.8896 13.1201 15.4756L13.251 11.4756C13.2645 11.0617 13.6105 10.7366 14.0244 10.75ZM10.5 5.5C10.0858 5.5 9.75 5.83579 9.75 6.25V7H14.25V6.25C14.25 5.83579 13.9142 5.5 13.5 5.5H10.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\n// Chat bubble with ellipsis\nexport const IconChatEllipsis = ({\n size = 16,\n style = {},\n}: {\n size?: number;\n style?: React.CSSProperties;\n}) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" style={style}>\n <path\n d=\"M18.8875 19.25L19.6112 19.0533C19.6823 19.3148 19.6068 19.5943 19.4137 19.7844C19.2206 19.9746 18.9399 20.0457 18.6795 19.9706L18.8875 19.25ZM14.9631 18.244L15.263 18.9314L14.9631 18.244ZM18.0914 15.6309L17.4669 15.2156L18.0914 15.6309ZM4.75 11.8041H5.5C5.5 15.2664 8.39065 18.1081 12 18.1081V18.8581V19.6081C7.60123 19.6081 4 16.1334 4 11.8041H4.75ZM19.25 11.8041H18.5C18.5 8.34166 15.6094 5.5 12 5.5V4.75V4C16.3988 4 20 7.47476 20 11.8041H19.25ZM12 4.75V5.5C8.39065 5.5 5.5 8.34166 5.5 11.8041H4.75H4C4 7.47476 7.60123 4 12 4V4.75ZM18.0914 15.6309L17.4669 15.2156C18.1213 14.2315 18.5 13.0612 18.5 11.8041H19.25H20C20 13.3681 19.5276 14.8257 18.716 16.0462L18.0914 15.6309ZM18.8875 19.25L18.1638 19.4467L17.2953 16.2517L18.019 16.055L18.7428 15.8583L19.6112 19.0533L18.8875 19.25ZM12 18.8581V18.1081C12.9509 18.1081 13.8518 17.9105 14.6632 17.5565L14.9631 18.244L15.263 18.9314C14.2652 19.3667 13.1603 19.6081 12 19.6081V18.8581ZM15.3144 18.2188L15.5224 17.4982L19.0955 18.5294L18.8875 19.25L18.6795 19.9706L15.1064 18.9394L15.3144 18.2188ZM14.9631 18.244L14.6632 17.5565C14.925 17.4423 15.2286 17.4134 15.5224 17.4982L15.3144 18.2188L15.1064 18.9394C15.1677 18.957 15.223 18.9489 15.263 18.9314L14.9631 18.244ZM18.0914 15.6309L18.716 16.0462C18.7451 16.0024 18.7636 15.9351 18.7428 15.8583L18.019 16.055L17.2953 16.2517C17.1957 15.8853 17.2716 15.5093 17.4669 15.2156L18.0914 15.6309Z\"\n fill=\"currentColor\"\n />\n <circle cx=\"15\" cy=\"11.75\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"11.75\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"9\" cy=\"11.75\" r=\"1\" fill=\"currentColor\" />\n </svg>\n);\n\n// Checkmark icon\nexport const IconCheckmark = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <g clipPath=\"url(#clip0_2_45)\">\n <path\n d=\"M16.25 8.75L10 15.25L7.25 12.25\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_2_45\">\n <rect width=\"24\" height=\"24\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n);\n\n// Large checkmark icon\nexport const IconCheckmarkLarge = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <g clipPath=\"url(#clip0_2_37)\">\n <path\n d=\"M17.5962 7.75L9.42308 16.25L6.15385 12.6538\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_2_37\">\n <rect width=\"24\" height=\"24\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n);\n\n// Checkmark in circle icon\nexport const IconCheckmarkCircle = ({ size = 24 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <g clipPath=\"url(#clip0_checkmark_circle)\">\n <path\n d=\"M12 20C7.58172 20 4 16.4182 4 12C4 7.58172 7.58172 4 12 4C16.4182 4 20 7.58172 20 12C20 16.4182 16.4182 20 12 20Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M15 10L11 14.25L9.25 12.25\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_checkmark_circle\">\n <rect width=\"24\" height=\"24\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n);\n\n// X mark / close icon\nexport const IconXmark = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <g clipPath=\"url(#clip0_2_53)\">\n <path\n d=\"M16.25 16.25L7.75 7.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M7.75 16.25L16.25 7.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_2_53\">\n <rect width=\"24\" height=\"24\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n);\n\n// X mark large / close icon (larger variant)\nexport const IconXmarkLarge = ({ size = 24 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M16.7198 6.21973C17.0127 5.92683 17.4874 5.92683 17.7803 6.21973C18.0732 6.51262 18.0732 6.9874 17.7803 7.28027L13.0606 12L17.7803 16.7197C18.0732 17.0126 18.0732 17.4874 17.7803 17.7803C17.4875 18.0731 17.0127 18.0731 16.7198 17.7803L12.0001 13.0605L7.28033 17.7803C6.98746 18.0731 6.51268 18.0731 6.21979 17.7803C5.92689 17.4874 5.92689 17.0126 6.21979 16.7197L10.9395 12L6.21979 7.28027C5.92689 6.98738 5.92689 6.51262 6.21979 6.21973C6.51268 5.92683 6.98744 5.92683 7.28033 6.21973L12.0001 10.9395L16.7198 6.21973Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\n// Sun icon (light mode)\nexport const IconSun = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M9.99999 12.7082C11.4958 12.7082 12.7083 11.4956 12.7083 9.99984C12.7083 8.50407 11.4958 7.2915 9.99999 7.2915C8.50422 7.2915 7.29166 8.50407 7.29166 9.99984C7.29166 11.4956 8.50422 12.7082 9.99999 12.7082Z\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M10 3.9585V5.05698\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M10 14.9429V16.0414\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M5.7269 5.72656L6.50682 6.50649\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M13.4932 13.4932L14.2731 14.2731\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M3.95834 10H5.05683\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M14.9432 10H16.0417\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M5.7269 14.2731L6.50682 13.4932\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M13.4932 6.50649L14.2731 5.72656\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\n// Moon icon (dark mode)\nexport const IconMoon = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M15.5 10.4955C15.4037 11.5379 15.0124 12.5314 14.3721 13.3596C13.7317 14.1878 12.8688 14.8165 11.8841 15.1722C10.8995 15.5278 9.83397 15.5957 8.81217 15.3679C7.79038 15.1401 6.8546 14.6259 6.11434 13.8857C5.37408 13.1454 4.85995 12.2096 4.63211 11.1878C4.40427 10.166 4.47215 9.10048 4.82781 8.11585C5.18346 7.13123 5.81218 6.26825 6.64039 5.62791C7.4686 4.98756 8.46206 4.59634 9.5045 4.5C8.89418 5.32569 8.60049 6.34302 8.67685 7.36695C8.75321 8.39087 9.19454 9.35339 9.92058 10.0794C10.6466 10.8055 11.6091 11.2468 12.6331 11.3231C13.657 11.3995 14.6743 11.1058 15.5 10.4955Z\" stroke=\"currentColor\" strokeWidth=\"1.13793\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\n// Edit/pencil icon for marker hover\nexport const IconEdit = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.3799 6.9572L9.05645 4.63375M11.3799 6.9572L6.74949 11.5699C6.61925 11.6996 6.45577 11.791 6.277 11.8339L4.29549 12.3092C3.93194 12.3964 3.60478 12.0683 3.69297 11.705L4.16585 9.75693C4.20893 9.57947 4.29978 9.4172 4.42854 9.28771L9.05645 4.63375M11.3799 6.9572L12.3455 5.98759C12.9839 5.34655 12.9839 4.31002 12.3455 3.66897C11.7033 3.02415 10.6594 3.02415 10.0172 3.66897L9.06126 4.62892L9.05645 4.63375\"\n stroke=\"currentColor\"\n strokeWidth=\"0.9\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Trash icon for delete button in edit panel\nexport const IconTrash = ({ size = 24 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M13.5 4C14.7426 4 15.75 5.00736 15.75 6.25V7H18.5C18.9142 7 19.25 7.33579 19.25 7.75C19.25 8.16421 18.9142 8.5 18.5 8.5H17.9678L17.6328 16.2217C17.61 16.7475 17.5912 17.1861 17.5469 17.543C17.5015 17.9087 17.4225 18.2506 17.2461 18.5723C16.9747 19.0671 16.5579 19.4671 16.0518 19.7168C15.7227 19.8791 15.3772 19.9422 15.0098 19.9717C14.6514 20.0004 14.2126 20 13.6865 20H10.3135C9.78735 20 9.34856 20.0004 8.99023 19.9717C8.62278 19.9422 8.27729 19.8791 7.94824 19.7168C7.44205 19.4671 7.02532 19.0671 6.75391 18.5723C6.57751 18.2506 6.49853 17.9087 6.45312 17.543C6.40883 17.1861 6.39005 16.7475 6.36719 16.2217L6.03223 8.5H5.5C5.08579 8.5 4.75 8.16421 4.75 7.75C4.75 7.33579 5.08579 7 5.5 7H8.25V6.25C8.25 5.00736 9.25736 4 10.5 4H13.5ZM7.86621 16.1562C7.89013 16.7063 7.90624 17.0751 7.94141 17.3584C7.97545 17.6326 8.02151 17.7644 8.06934 17.8516C8.19271 18.0763 8.38239 18.2577 8.6123 18.3711C8.70153 18.4151 8.83504 18.4545 9.11035 18.4766C9.39482 18.4994 9.76335 18.5 10.3135 18.5H13.6865C14.2367 18.5 14.6052 18.4994 14.8896 18.4766C15.165 18.4545 15.2985 18.4151 15.3877 18.3711C15.6176 18.2577 15.8073 18.0763 15.9307 17.8516C15.9785 17.7644 16.0245 17.6326 16.0586 17.3584C16.0938 17.0751 16.1099 16.7063 16.1338 16.1562L16.4668 8.5H7.5332L7.86621 16.1562ZM9.97656 10.75C10.3906 10.7371 10.7371 11.0626 10.75 11.4766L10.875 15.4766C10.8879 15.8906 10.5624 16.2371 10.1484 16.25C9.73443 16.2629 9.38794 15.9374 9.375 15.5234L9.25 11.5234C9.23706 11.1094 9.56255 10.7629 9.97656 10.75ZM14.0244 10.75C14.4383 10.7635 14.7635 11.1105 14.75 11.5244L14.6201 15.5244C14.6066 15.9384 14.2596 16.2634 13.8457 16.25C13.4317 16.2365 13.1067 15.8896 13.1201 15.4756L13.251 11.4756C13.2645 11.0617 13.6105 10.7366 14.0244 10.75ZM10.5 5.5C10.0858 5.5 9.75 5.83579 9.75 6.25V7H14.25V6.25C14.25 5.83579 13.9142 5.5 13.5 5.5H10.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\n// Chevron icons for navigation\nexport const IconChevronLeft = ({ size = 16 }: { size?: number }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8.5 3.5L4 8L8.5 12.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nexport const IconChevronRight = ({ size = 16 }: { size?: number }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8.5 11.5L12 8L8.5 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Pencil icon for draw mode\nexport const IconPencil = ({ size = 24 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M15.8787 4.87868C16.6597 4.09763 17.9261 4.09763 18.7071 4.87868L19.1213 5.29289C19.9024 6.07394 19.9024 7.34027 19.1213 8.12132L9.58579 17.6569C9.21071 18.0319 8.70201 18.2426 8.17157 18.2426H5.75V15.8284C5.75 15.298 5.96071 14.7893 6.33579 14.4142L15.8787 4.87868Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M14.5 6.5L17.5 9.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n// Animated Bunny mascot\nexport const AnimatedBunny = ({\n size = 20,\n color = \"#4C74FF\",\n}: {\n size?: number;\n color?: string;\n}) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 28 28\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <style>{`\n @keyframes bunnyEnterEar {\n 0% { opacity: 0; transform: scale(0.8); }\n 100% { opacity: 1; transform: scale(1); }\n }\n @keyframes bunnyEnterFace {\n 0% { opacity: 0; transform: scale(0.9); }\n 100% { opacity: 1; transform: scale(1); }\n }\n @keyframes bunnyEnterEye {\n 0% { opacity: 0; transform: scale(0.5); }\n 100% { opacity: 1; transform: scale(1); }\n }\n @keyframes leftEyeLook {\n 0%, 8% { transform: translate(0, 0); }\n 10%, 18% { transform: translate(1.5px, 0); }\n 20%, 22% { transform: translate(1.5px, 0) scaleY(0.1); }\n 24%, 32% { transform: translate(1.5px, 0); }\n 35%, 48% { transform: translate(-0.8px, -0.6px); }\n 52%, 54% { transform: translate(0, 0) scaleY(0.1); }\n 56%, 68% { transform: translate(0, 0); }\n 72%, 82% { transform: translate(-0.5px, 0.5px); }\n 85%, 100% { transform: translate(0, 0); }\n }\n @keyframes rightEyeLook {\n 0%, 8% { transform: translate(0, 0); }\n 10%, 18% { transform: translate(0.8px, 0); }\n 20%, 22% { transform: translate(0.8px, 0) scaleY(0.1); }\n 24%, 32% { transform: translate(0.8px, 0); }\n 35%, 48% { transform: translate(-1.5px, -0.6px); }\n 52%, 54% { transform: translate(0, 0) scaleY(0.1); }\n 56%, 68% { transform: translate(0, 0); }\n 72%, 82% { transform: translate(-1.2px, 0.5px); }\n 85%, 100% { transform: translate(0, 0); }\n }\n @keyframes leftEarTwitch {\n 0%, 9% { transform: rotate(0deg); }\n 12% { transform: rotate(-8deg); }\n 16%, 34% { transform: rotate(0deg); }\n 38% { transform: rotate(-12deg); }\n 42% { transform: rotate(-6deg); }\n 48%, 100% { transform: rotate(0deg); }\n }\n @keyframes rightEarTwitch {\n 0%, 9% { transform: rotate(0deg); }\n 12% { transform: rotate(6deg); }\n 16%, 34% { transform: rotate(0deg); }\n 38% { transform: rotate(10deg); }\n 42% { transform: rotate(4deg); }\n 48%, 71% { transform: rotate(0deg); }\n 74% { transform: rotate(8deg); }\n 78%, 100% { transform: rotate(0deg); }\n }\n .bunny-eye-left {\n opacity: 0;\n animation: bunnyEnterEye 0.3s ease-out 0.35s forwards, leftEyeLook 5s ease-in-out 0.65s infinite;\n transform-origin: center;\n transform-box: fill-box;\n }\n .bunny-eye-right {\n opacity: 0;\n animation: bunnyEnterEye 0.3s ease-out 0.4s forwards, rightEyeLook 5s ease-in-out 0.7s infinite;\n transform-origin: center;\n transform-box: fill-box;\n }\n .bunny-ear-left {\n opacity: 0;\n animation: bunnyEnterEar 0.3s ease-out 0.1s forwards, leftEarTwitch 5s ease-in-out 0.4s infinite;\n transform-origin: bottom center;\n transform-box: fill-box;\n }\n .bunny-ear-right {\n opacity: 0;\n animation: bunnyEnterEar 0.3s ease-out 0.15s forwards, rightEarTwitch 5s ease-in-out 0.45s infinite;\n transform-origin: bottom center;\n transform-box: fill-box;\n }\n .bunny-face {\n opacity: 0;\n animation: bunnyEnterFace 0.3s ease-out 0.25s forwards;\n transform-origin: center;\n transform-box: fill-box;\n }\n svg:hover .bunny-eye-left,\n svg:hover .bunny-eye-right {\n opacity: 0;\n transition: opacity 0.2s ease;\n }\n .bunny-happy-face {\n opacity: 0;\n transition: opacity 0.2s ease;\n }\n svg:hover .bunny-happy-face {\n opacity: 1;\n }\n `}</style>\n {/* Invisible hover area to catch all hover events */}\n <rect width=\"28\" height=\"28\" fill=\"transparent\" />\n {/* Left ear */}\n <path\n className=\"bunny-ear-left\"\n d=\"M3.738 10.2164L7.224 2.007H9.167L5.676 10.2164H3.738ZM10.791 6.42705C10.791 5.90346 10.726 5.42764 10.596 4.99959C10.47 4.57155 10.292 4.16643 10.063 3.78425C9.833 3.39825 9.56 3.01797 9.243 2.64343C8.926 2.26507 8.767 2.07589 8.767 2.07589L10.24 0.957996C10.24 0.957996 10.433 1.17203 10.819 1.60007C11.209 2.0243 11.559 2.49056 11.869 2.99886C12.178 3.50717 12.413 4.04222 12.574 4.60403C12.734 5.16584 12.814 5.77352 12.814 6.42705C12.814 7.10734 12.73 7.7303 12.562 8.29593C12.394 8.85774 12.153 9.3966 11.84 9.9126C11.526 10.4247 11.181 10.8833 10.802 11.2884C10.428 11.6974 10.24 11.9018 10.24 11.9018L8.767 10.7839C8.767 10.7839 8.924 10.5948 9.237 10.2164C9.554 9.8419 9.83 9.4597 10.063 9.06985C10.3 8.6762 10.479 8.26726 10.602 7.84304C10.728 7.41499 10.791 6.943 10.791 6.42705Z\"\n fill={color}\n />\n {/* Right ear */}\n <path\n className=\"bunny-ear-right\"\n d=\"M15.003 10.2164L18.489 2.007H20.432L16.941 10.2164H15.003ZM22.056 6.42705C22.056 5.90346 21.991 5.42764 21.861 4.99959C21.735 4.57155 21.557 4.16643 21.328 3.78425C21.098 3.39825 20.825 3.01797 20.508 2.64343C20.191 2.26507 20.032 2.07589 20.032 2.07589L21.505 0.957996C21.505 0.957996 21.698 1.17203 22.084 1.60007C22.474 2.0243 22.824 2.49056 23.133 2.99886C23.443 3.50717 23.678 4.04222 23.839 4.60403C23.999 5.16584 24.079 5.77352 24.079 6.42705C24.079 7.10734 23.995 7.7303 23.827 8.29593C23.659 8.85774 23.418 9.3966 23.105 9.9126C22.791 10.4247 22.445 10.8833 22.067 11.2884C21.693 11.6974 21.505 11.9018 21.505 11.9018L20.032 10.7839C20.032 10.7839 20.189 10.5948 20.502 10.2164C20.819 9.8419 21.094 9.4597 21.328 9.06985C21.565 8.6762 21.744 8.26726 21.866 7.84304C21.993 7.41499 22.056 6.943 22.056 6.42705Z\"\n fill={color}\n />\n {/* Face outline */}\n <path\n className=\"bunny-face\"\n d=\"M2.03 20.4328C2.03 20.9564 2.093 21.4322 2.219 21.8602C2.345 22.2883 2.523 22.6953 2.752 23.0813C2.981 23.4635 3.254 23.8419 3.572 24.2164C3.889 24.5948 4.047 24.7839 4.047 24.7839L2.574 25.9018C2.574 25.9018 2.379 25.6878 1.989 25.2598C1.603 24.8355 1.256 24.3693 0.946 23.861C0.636 23.3527 0.401 22.8176 0.241 22.2558C0.08 21.694 0 21.0863 0 20.4328C0 19.7525 0.084 19.1314 0.252 18.5696C0.421 18.004 0.661 17.4651 0.975 16.953C1.288 16.4371 1.632 15.9765 2.007 15.5714C2.385 15.1625 2.574 14.958 2.574 14.958L4.047 16.0759C4.047 16.0759 3.889 16.2651 3.572 16.6434C3.258 17.018 2.983 17.4021 2.746 17.7957C2.513 18.1855 2.335 18.5945 2.213 19.0225C2.091 19.4467 2.03 19.9168 2.03 20.4328ZM23.687 20.4271C23.687 19.9035 23.622 19.4276 23.492 18.9996C23.366 18.5715 23.188 18.1664 22.959 17.7843C22.729 17.3982 22.456 17.018 22.139 16.6434C21.822 16.2651 21.663 16.0759 21.663 16.0759L23.136 14.958C23.136 14.958 23.329 15.172 23.715 15.6001C24.105 16.0243 24.455 16.4906 24.765 16.9989C25.074 17.5072 25.309 18.0422 25.47 18.604C25.63 19.1658 25.71 19.7735 25.71 20.4271C25.71 21.1073 25.626 21.7303 25.458 22.2959C25.29 22.8577 25.049 23.3966 24.736 23.9126C24.422 24.4247 24.077 24.8833 23.698 25.2884C23.324 25.6974 23.136 25.9018 23.136 25.9018L21.663 24.7839C21.663 24.7839 21.82 24.5948 22.133 24.2164C22.45 23.8419 22.726 23.4597 22.959 23.0698C23.196 22.6762 23.375 22.2673 23.498 21.843C23.624 21.415 23.687 20.943 23.687 20.4271Z\"\n fill={color}\n />\n {/* Animated bunny eyes */}\n <circle\n className=\"bunny-eye-left\"\n cx=\"8.277\"\n cy=\"20.466\"\n r=\"1.8\"\n fill={color}\n />\n <circle\n className=\"bunny-eye-right\"\n cx=\"19.878\"\n cy=\"20.466\"\n r=\"1.8\"\n fill={color}\n />\n {/* Happy face on hover */}\n <text\n className=\"bunny-happy-face\"\n x=\"14\"\n y=\"26\"\n textAnchor=\"middle\"\n fontSize=\"12\"\n fontWeight=\"bold\"\n fill={color}\n fontFamily=\"system-ui, -apple-system, sans-serif\"\n >\n ˃ ᵕ ˂\n </text>\n </svg>\n);\n","// =============================================================================\n// Freeze Animations\n// =============================================================================\n//\n// Monkey-patches setTimeout, setInterval, and requestAnimationFrame so that\n// callbacks are silently skipped while frozen. Also injects CSS to pause\n// CSS animations/transitions, pauses WAAPI animations, and pauses videos.\n//\n// Toolbar/popup code must import `originalSetTimeout` etc. to bypass the patch.\n//\n// Patches are installed as a side effect of importing this module.\n// =============================================================================\n\n// Exclude selectors — agentation UI elements should never be frozen\nconst EXCLUDE_ATTRS = [\n \"data-feedback-toolbar\",\n \"data-annotation-popup\",\n \"data-annotation-marker\",\n];\nconst NOT_SELECTORS = EXCLUDE_ATTRS\n .flatMap((a) => [`:not([${a}])`, `:not([${a}] *)`])\n .join(\"\");\n\nconst STYLE_ID = \"feedback-freeze-styles\";\nconst STATE_KEY = \"__agentation_freeze\";\n\n// ---------------------------------------------------------------------------\n// Shared mutable state on window (survives HMR module re-execution)\n// ---------------------------------------------------------------------------\ninterface FreezeState {\n frozen: boolean;\n installed: boolean;\n origSetTimeout: typeof setTimeout;\n origSetInterval: typeof setInterval;\n origRAF: typeof requestAnimationFrame;\n // Queues live on window so they survive HMR module re-execution\n pausedAnimations: Animation[];\n frozenTimeoutQueue: Array<() => void>;\n frozenRAFQueue: FrameRequestCallback[];\n}\n\nfunction getState(): FreezeState {\n if (typeof window === \"undefined\") {\n // SSR stub\n return {\n frozen: false,\n installed: true, // prevent patching on server\n origSetTimeout: setTimeout,\n origSetInterval: setInterval,\n origRAF: (cb: FrameRequestCallback) => 0 as any,\n pausedAnimations: [],\n frozenTimeoutQueue: [],\n frozenRAFQueue: [],\n };\n }\n const w = window as any;\n if (!w[STATE_KEY]) {\n w[STATE_KEY] = {\n frozen: false,\n installed: false,\n origSetTimeout: null,\n origSetInterval: null,\n origRAF: null,\n pausedAnimations: [],\n frozenTimeoutQueue: [],\n frozenRAFQueue: [],\n };\n }\n return w[STATE_KEY];\n}\n\nconst _s = getState();\n\n// ---------------------------------------------------------------------------\n// Install patches (once — survives HMR because `installed` lives on window)\n// ---------------------------------------------------------------------------\nif (typeof window !== \"undefined\" && !_s.installed) {\n // Save the real functions\n _s.origSetTimeout = window.setTimeout.bind(window);\n _s.origSetInterval = window.setInterval.bind(window);\n _s.origRAF = window.requestAnimationFrame.bind(window);\n\n // Patch setTimeout — queue callback when frozen (replayed on unfreeze)\n (window as any).setTimeout = (\n handler: TimerHandler,\n timeout?: number,\n ...args: any[]\n ): ReturnType<typeof setTimeout> => {\n if (typeof handler === \"string\") {\n return _s.origSetTimeout(handler, timeout);\n }\n return _s.origSetTimeout(\n (...a: any[]) => {\n if (_s.frozen) {\n _s.frozenTimeoutQueue.push(() => (handler as Function)(...a));\n } else {\n (handler as Function)(...a);\n }\n },\n timeout,\n ...args,\n );\n };\n\n // Patch setInterval — skip callback when frozen\n (window as any).setInterval = (\n handler: TimerHandler,\n timeout?: number,\n ...args: any[]\n ): ReturnType<typeof setInterval> => {\n if (typeof handler === \"string\") {\n return _s.origSetInterval(handler, timeout);\n }\n return _s.origSetInterval(\n (...a: any[]) => {\n if (!_s.frozen) (handler as Function)(...a);\n },\n timeout,\n ...args,\n );\n };\n\n // Patch requestAnimationFrame — queue callback when frozen (no CPU spin)\n // The wrapper fires once on the next frame; if still frozen the callback\n // is stored in _s.frozenRAFQueue and replayed on unfreeze.\n (window as any).requestAnimationFrame = (\n callback: FrameRequestCallback,\n ): number => {\n return _s.origRAF((timestamp: number) => {\n if (_s.frozen) {\n _s.frozenRAFQueue.push(callback);\n } else {\n callback(timestamp);\n }\n });\n };\n\n _s.installed = true;\n}\n\n// ---------------------------------------------------------------------------\n// Exports — original (unpatched) timing functions for toolbar/popup use\n// ---------------------------------------------------------------------------\nexport const originalSetTimeout = _s.origSetTimeout;\nexport const originalSetInterval = _s.origSetInterval;\n\n// ---------------------------------------------------------------------------\n// Freeze / Unfreeze\n// ---------------------------------------------------------------------------\n\nfunction isAgentationElement(el: Element | null): boolean {\n if (!el) return false;\n return EXCLUDE_ATTRS.some((attr) => !!el.closest?.(`[${attr}]`));\n}\n\nexport function freeze(): void {\n if (typeof document === \"undefined\") return;\n if (_s.frozen) return;\n _s.frozen = true;\n _s.frozenTimeoutQueue = [];\n _s.frozenRAFQueue = [];\n\n // CSS injection — pause CSS animations and kill transitions\n let style = document.getElementById(STYLE_ID);\n if (!style) {\n style = document.createElement(\"style\");\n style.id = STYLE_ID;\n }\n style.textContent = `\n *${NOT_SELECTORS},\n *${NOT_SELECTORS}::before,\n *${NOT_SELECTORS}::after {\n animation-play-state: paused !important;\n transition: none !important;\n }\n `;\n document.head.appendChild(style);\n\n // WAAPI — pause only RUNNING non-agentation animations and store references\n // (pausing finished animations would restart them on play(), breaking entrance anims)\n _s.pausedAnimations = [];\n try {\n document.getAnimations().forEach((anim) => {\n if (anim.playState !== \"running\") return;\n const target = (anim.effect as KeyframeEffect)?.target as Element | null;\n if (!isAgentationElement(target)) {\n anim.pause();\n _s.pausedAnimations.push(anim);\n }\n });\n } catch {\n // getAnimations may not be available in all environments\n }\n\n // Pause videos\n document.querySelectorAll(\"video\").forEach((video) => {\n if (!video.paused) {\n video.dataset.wasPaused = \"false\";\n video.pause();\n }\n });\n}\n\nexport function unfreeze(): void {\n if (typeof document === \"undefined\") return;\n if (!_s.frozen) return;\n _s.frozen = false;\n\n // Replay queued setTimeout callbacks asynchronously (resolves stuck delay()\n // Promises, restarts animation loops interrupted by visibilitychange, etc.)\n // Using origSetTimeout(cb, 0) avoids blocking the main thread in one go.\n // Re-check _s.frozen before executing — if freeze() was called again between\n // scheduling and execution, re-queue the callback instead of running it.\n const timeoutQueue = _s.frozenTimeoutQueue;\n _s.frozenTimeoutQueue = [];\n for (const cb of timeoutQueue) {\n _s.origSetTimeout(() => {\n if (_s.frozen) {\n _s.frozenTimeoutQueue.push(cb);\n return;\n }\n try {\n cb();\n } catch (e) {\n console.warn(\"[agentation] Error replaying queued timeout:\", e);\n }\n }, 0);\n }\n\n // Schedule queued rAF callbacks for the next frame.\n // Re-check _s.frozen — if re-frozen before the frame fires, re-queue.\n const rafQueue = _s.frozenRAFQueue;\n _s.frozenRAFQueue = [];\n for (const cb of rafQueue) {\n _s.origRAF((ts: number) => {\n if (_s.frozen) {\n _s.frozenRAFQueue.push(cb);\n return;\n }\n cb(ts);\n });\n }\n\n // WAAPI — resume the exact animations we paused BEFORE removing CSS\n // (removing CSS first can cause the browser to replace animation objects)\n for (const anim of _s.pausedAnimations) {\n try {\n anim.play();\n } catch (e) {\n console.warn(\"[agentation] Error resuming animation:\", e);\n }\n }\n _s.pausedAnimations = [];\n\n // Now remove CSS injection\n document.getElementById(STYLE_ID)?.remove();\n\n // Resume videos\n document.querySelectorAll(\"video\").forEach((video) => {\n if (video.dataset.wasPaused === \"false\") {\n video.play().catch(() => {});\n delete video.dataset.wasPaused;\n }\n });\n}\n","// =============================================================================\n// Element Identification Utilities\n// =============================================================================\n\n// =============================================================================\n// Shadow DOM Helpers\n// =============================================================================\n\n/**\n * Gets the parent element, crossing shadow DOM boundaries.\n * When inside a shadow root with no parentElement, returns the shadow host.\n */\nfunction getParentElement(element: Element): Element | null {\n if (element.parentElement) {\n return element.parentElement;\n }\n const root = element.getRootNode();\n if (root instanceof ShadowRoot) {\n return root.host;\n }\n return null;\n}\n\n/**\n * Finds the closest ancestor matching a selector, crossing shadow DOM boundaries.\n */\nexport function closestCrossingShadow(element: Element, selector: string): Element | null {\n let current: Element | null = element;\n while (current) {\n if (current.matches(selector)) return current;\n current = getParentElement(current);\n }\n return null;\n}\n\n/**\n * Checks if an element is inside a shadow DOM\n */\nexport function isInShadowDOM(element: Element): boolean {\n return element.getRootNode() instanceof ShadowRoot;\n}\n\n/**\n * Gets the shadow host for an element, or null if not in shadow DOM\n */\nexport function getShadowHost(element: Element): Element | null {\n const root = element.getRootNode();\n if (root instanceof ShadowRoot) {\n return root.host;\n }\n return null;\n}\n\n// =============================================================================\n// Element Path Utilities\n// =============================================================================\n\n/**\n * Gets a readable path for an element (e.g., \"article > section > p\")\n * Supports elements inside shadow DOM by crossing shadow boundaries.\n */\nexport function getElementPath(target: HTMLElement, maxDepth = 4): string {\n const parts: string[] = [];\n let current: HTMLElement | null = target;\n let depth = 0;\n\n while (current && depth < maxDepth) {\n const tag = current.tagName.toLowerCase();\n\n // Skip generic wrappers\n if (tag === \"html\" || tag === \"body\") break;\n\n // Get identifier\n let identifier = tag;\n if (current.id) {\n identifier = `#${current.id}`;\n } else if (current.className && typeof current.className === \"string\") {\n const meaningfulClass = current.className\n .split(/\\s+/)\n .find(c => c.length > 2 && !c.match(/^[a-z]{1,2}$/) && !c.match(/[A-Z0-9]{5,}/));\n if (meaningfulClass) {\n identifier = `.${meaningfulClass.split(\"_\")[0]}`;\n }\n }\n\n // Mark shadow boundary crossings\n const nextParent = getParentElement(current);\n if (!current.parentElement && nextParent) {\n identifier = `⟨shadow⟩ ${identifier}`;\n }\n\n parts.unshift(identifier);\n current = nextParent as HTMLElement | null;\n depth++;\n }\n\n return parts.join(\" > \");\n}\n\n/**\n * Identifies an element and returns a human-readable name + path\n */\nexport function identifyElement(target: HTMLElement): { name: string; path: string } {\n const path = getElementPath(target);\n\n if (target.dataset.element) {\n return { name: target.dataset.element, path };\n }\n\n const tag = target.tagName.toLowerCase();\n\n // SVG elements\n if ([\"path\", \"circle\", \"rect\", \"line\", \"g\"].includes(tag)) {\n // Try to find parent SVG context (crossing shadow boundaries)\n const svg = closestCrossingShadow(target, \"svg\");\n if (svg) {\n const parent = getParentElement(svg);\n if (parent instanceof HTMLElement) {\n const parentName = identifyElement(parent).name;\n return { name: `graphic in ${parentName}`, path };\n }\n }\n return { name: \"graphic element\", path };\n }\n if (tag === \"svg\") {\n const parent = getParentElement(target);\n if (parent?.tagName.toLowerCase() === \"button\") {\n const btnText = parent.textContent?.trim();\n return { name: btnText ? `icon in \"${btnText}\" button` : \"button icon\", path };\n }\n return { name: \"icon\", path };\n }\n\n // Interactive elements\n if (tag === \"button\") {\n const text = target.textContent?.trim();\n const ariaLabel = target.getAttribute(\"aria-label\");\n if (ariaLabel) return { name: `button [${ariaLabel}]`, path };\n return { name: text ? `button \"${text.slice(0, 25)}\"` : \"button\", path };\n }\n if (tag === \"a\") {\n const text = target.textContent?.trim();\n const href = target.getAttribute(\"href\");\n if (text) return { name: `link \"${text.slice(0, 25)}\"`, path };\n if (href) return { name: `link to ${href.slice(0, 30)}`, path };\n return { name: \"link\", path };\n }\n if (tag === \"input\") {\n const type = target.getAttribute(\"type\") || \"text\";\n const placeholder = target.getAttribute(\"placeholder\");\n const name = target.getAttribute(\"name\");\n if (placeholder) return { name: `input \"${placeholder}\"`, path };\n if (name) return { name: `input [${name}]`, path };\n return { name: `${type} input`, path };\n }\n\n // Headings\n if ([\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\"].includes(tag)) {\n const text = target.textContent?.trim();\n return { name: text ? `${tag} \"${text.slice(0, 35)}\"` : tag, path };\n }\n\n // Text elements\n if (tag === \"p\") {\n const text = target.textContent?.trim();\n if (text) return { name: `paragraph: \"${text.slice(0, 40)}${text.length > 40 ? '...' : ''}\"`, path };\n return { name: \"paragraph\", path };\n }\n if (tag === \"span\" || tag === \"label\") {\n const text = target.textContent?.trim();\n if (text && text.length < 40) return { name: `\"${text}\"`, path };\n return { name: tag, path };\n }\n if (tag === \"li\") {\n const text = target.textContent?.trim();\n if (text && text.length < 40) return { name: `list item: \"${text.slice(0, 35)}\"`, path };\n return { name: \"list item\", path };\n }\n if (tag === \"blockquote\") return { name: \"blockquote\", path };\n if (tag === \"code\") {\n const text = target.textContent?.trim();\n if (text && text.length < 30) return { name: `code: \\`${text}\\``, path };\n return { name: \"code\", path };\n }\n if (tag === \"pre\") return { name: \"code block\", path };\n\n // Media\n if (tag === \"img\") {\n const alt = target.getAttribute(\"alt\");\n return { name: alt ? `image \"${alt.slice(0, 30)}\"` : \"image\", path };\n }\n if (tag === \"video\") return { name: \"video\", path };\n\n // Containers - try to infer meaningful name\n if ([\"div\", \"section\", \"article\", \"nav\", \"header\", \"footer\", \"aside\", \"main\"].includes(tag)) {\n const className = target.className;\n const role = target.getAttribute(\"role\");\n const ariaLabel = target.getAttribute(\"aria-label\");\n\n if (ariaLabel) return { name: `${tag} [${ariaLabel}]`, path };\n if (role) return { name: `${role}`, path };\n\n if (typeof className === \"string\" && className) {\n const words = className\n .split(/[\\s_-]+/)\n .map((c) => c.replace(/[A-Z0-9]{5,}.*$/, \"\")) // Remove CSS module hashes\n .filter((c) => c.length > 2 && !/^[a-z]{1,2}$/.test(c))\n .slice(0, 2);\n if (words.length > 0) return { name: words.join(\" \"), path };\n }\n\n return { name: tag === \"div\" ? \"container\" : tag, path };\n }\n\n return { name: tag, path };\n}\n\n/**\n * Gets text content from element and siblings for context\n */\nexport function getNearbyText(element: HTMLElement): string {\n const texts: string[] = [];\n\n // Own text\n const ownText = element.textContent?.trim();\n if (ownText && ownText.length < 100) {\n texts.push(ownText);\n }\n\n // Previous sibling text\n const prev = element.previousElementSibling;\n if (prev) {\n const prevText = prev.textContent?.trim();\n if (prevText && prevText.length < 50) {\n texts.unshift(`[before: \"${prevText.slice(0, 40)}\"]`);\n }\n }\n\n // Next sibling text\n const next = element.nextElementSibling;\n if (next) {\n const nextText = next.textContent?.trim();\n if (nextText && nextText.length < 50) {\n texts.push(`[after: \"${nextText.slice(0, 40)}\"]`);\n }\n }\n\n return texts.join(\" \");\n}\n\n/**\n * Simplified element identifier for animation feedback (less verbose)\n */\nexport function identifyAnimationElement(target: HTMLElement): string {\n // Allow explicit labeling via data attribute\n if (target.dataset.element) return target.dataset.element;\n\n const tag = target.tagName.toLowerCase();\n\n // SVG elements\n if (tag === \"path\") return \"path\";\n if (tag === \"circle\") return \"circle\";\n if (tag === \"rect\") return \"rectangle\";\n if (tag === \"line\") return \"line\";\n if (tag === \"ellipse\") return \"ellipse\";\n if (tag === \"polygon\") return \"polygon\";\n if (tag === \"g\") return \"group\";\n if (tag === \"svg\") return \"svg\";\n\n // Interactive elements\n if (tag === \"button\") {\n const text = target.textContent?.trim();\n return text ? `button \"${text}\"` : \"button\";\n }\n if (tag === \"input\") {\n const type = target.getAttribute(\"type\") || \"text\";\n return `input (${type})`;\n }\n\n // Text elements\n if (tag === \"span\" || tag === \"p\" || tag === \"label\") {\n const text = target.textContent?.trim();\n if (text && text.length < 30) return `\"${text}\"`;\n return \"text\";\n }\n\n // Containers - try to infer purpose from class name\n if (tag === \"div\") {\n const className = target.className;\n if (typeof className === \"string\" && className) {\n const words = className\n .split(/[\\s_-]+/)\n .map(c => c.replace(/[A-Z0-9]{5,}.*$/, \"\"))\n .filter(c => c.length > 2 && !/^[a-z]{1,2}$/.test(c))\n .slice(0, 2);\n if (words.length > 0) {\n return words.join(\" \");\n }\n }\n return \"container\";\n }\n\n return tag;\n}\n\n/**\n * Gets nearby sibling elements for structural context.\n * Supports elements inside shadow DOM.\n */\nexport function getNearbyElements(element: HTMLElement): string {\n const parent = getParentElement(element);\n if (!parent) return \"\";\n\n // Get siblings from the correct source\n const elementRoot = element.getRootNode();\n const children = (elementRoot instanceof ShadowRoot && element.parentElement)\n ? Array.from(element.parentElement.children)\n : Array.from(parent.children);\n\n const siblings = children.filter(\n (child) => child !== element && child instanceof HTMLElement\n ) as HTMLElement[];\n\n if (siblings.length === 0) return \"\";\n\n // Get concise identifiers for up to 4 nearby siblings\n const siblingIds = siblings.slice(0, 4).map((sib) => {\n const tag = sib.tagName.toLowerCase();\n const className = sib.className;\n\n // Get first meaningful class\n let cls = \"\";\n if (typeof className === \"string\" && className) {\n const meaningful = className\n .split(/\\s+/)\n .map((c) => c.replace(/[_][a-zA-Z0-9]{5,}.*$/, \"\")) // Remove module hashes\n .find((c) => c.length > 2 && !/^[a-z]{1,2}$/.test(c));\n if (meaningful) cls = `.${meaningful}`;\n }\n\n // For buttons/links, include short text\n if (tag === \"button\" || tag === \"a\") {\n const text = sib.textContent?.trim().slice(0, 15);\n if (text) return `${tag}${cls} \"${text}\"`;\n }\n\n return `${tag}${cls}`;\n });\n\n // Add parent context\n const parentTag = parent.tagName.toLowerCase();\n let parentId = parentTag;\n if (typeof parent.className === \"string\" && parent.className) {\n const parentCls = parent.className\n .split(/\\s+/)\n .map((c) => c.replace(/[_][a-zA-Z0-9]{5,}.*$/, \"\"))\n .find((c) => c.length > 2 && !/^[a-z]{1,2}$/.test(c));\n if (parentCls) parentId = `.${parentCls}`;\n }\n\n const total = parent.children.length;\n const suffix = total > siblingIds.length + 1 ? ` (${total} total in ${parentId})` : \"\";\n\n return siblingIds.join(\", \") + suffix;\n}\n\n/**\n * Gets CSS class names from an element (cleaned of module hashes)\n */\nexport function getElementClasses(target: HTMLElement): string {\n const className = target.className;\n if (typeof className !== \"string\" || !className) return \"\";\n\n // Split and clean class names (remove module hashes like _abc123)\n const classes = className\n .split(/\\s+/)\n .filter(c => c.length > 0)\n .map(c => {\n // Keep the meaningful part before the hash\n const match = c.match(/^([a-zA-Z][a-zA-Z0-9_-]*?)(?:_[a-zA-Z0-9]{5,})?$/);\n return match ? match[1] : c;\n })\n .filter((c, i, arr) => arr.indexOf(c) === i); // dedupe\n\n return classes.join(\", \");\n}\n\n/**\n * Gets key computed styles for an element (useful for styling issues)\n */\nexport function getComputedStylesSnapshot(target: HTMLElement): string {\n if (typeof window === \"undefined\") return \"\";\n\n const styles = window.getComputedStyle(target);\n const parts: string[] = [];\n\n // Color & text\n const color = styles.color;\n const bg = styles.backgroundColor;\n if (color && color !== \"rgb(0, 0, 0)\") parts.push(`color: ${color}`);\n if (bg && bg !== \"rgba(0, 0, 0, 0)\" && bg !== \"transparent\") parts.push(`bg: ${bg}`);\n\n // Typography\n const fontSize = styles.fontSize;\n const fontWeight = styles.fontWeight;\n if (fontSize) parts.push(`font: ${fontSize}`);\n if (fontWeight && fontWeight !== \"400\" && fontWeight !== \"normal\") parts.push(`weight: ${fontWeight}`);\n\n // Spacing\n const padding = styles.padding;\n const margin = styles.margin;\n if (padding && padding !== \"0px\") parts.push(`padding: ${padding}`);\n if (margin && margin !== \"0px\") parts.push(`margin: ${margin}`);\n\n // Layout\n const display = styles.display;\n const position = styles.position;\n if (display && display !== \"block\" && display !== \"inline\") parts.push(`display: ${display}`);\n if (position && position !== \"static\") parts.push(`position: ${position}`);\n\n // Border\n const borderRadius = styles.borderRadius;\n if (borderRadius && borderRadius !== \"0px\") parts.push(`radius: ${borderRadius}`);\n\n return parts.join(\", \");\n}\n\n// Values to filter out when collecting computed styles (browser defaults / uninteresting)\nconst DEFAULT_STYLE_VALUES = new Set([\n \"none\", \"normal\", \"auto\", \"0px\", \"rgba(0, 0, 0, 0)\", \"transparent\", \"static\", \"visible\"\n]);\n\n// Element type categories for style property selection\nconst TEXT_ELEMENTS = new Set([\n \"p\", \"span\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"label\", \"li\", \"td\", \"th\",\n \"blockquote\", \"figcaption\", \"caption\", \"legend\", \"dt\", \"dd\", \"pre\", \"code\",\n \"em\", \"strong\", \"b\", \"i\", \"a\", \"time\", \"cite\", \"q\"\n]);\nconst FORM_INPUT_ELEMENTS = new Set([\"input\", \"textarea\", \"select\"]);\nconst MEDIA_ELEMENTS = new Set([\"img\", \"video\", \"canvas\", \"svg\"]);\nconst CONTAINER_ELEMENTS = new Set([\n \"div\", \"section\", \"article\", \"nav\", \"header\", \"footer\", \"aside\", \"main\",\n \"ul\", \"ol\", \"form\", \"fieldset\"\n]);\n\n/**\n * Gets key computed styles for the annotation popup display.\n * Returns different properties based on element type to show the most relevant\n * CSS properties for debugging (e.g., typography for text, layout for containers).\n */\nexport function getDetailedComputedStyles(target: HTMLElement): Record<string, string> {\n if (typeof window === \"undefined\") return {};\n\n const styles = window.getComputedStyle(target);\n const result: Record<string, string> = {};\n const tag = target.tagName.toLowerCase();\n\n // Select relevant properties based on element type\n let properties: string[];\n\n if (TEXT_ELEMENTS.has(tag)) {\n // Typography-focused for text elements\n properties = [\"color\", \"fontSize\", \"fontWeight\", \"fontFamily\", \"lineHeight\"];\n } else if (tag === \"button\" || (tag === \"a\" && target.getAttribute(\"role\") === \"button\")) {\n // Appearance and spacing for interactive elements\n properties = [\"backgroundColor\", \"color\", \"padding\", \"borderRadius\", \"fontSize\"];\n } else if (FORM_INPUT_ELEMENTS.has(tag)) {\n // Form styling\n properties = [\"backgroundColor\", \"color\", \"padding\", \"borderRadius\", \"fontSize\"];\n } else if (MEDIA_ELEMENTS.has(tag)) {\n // Dimensions for media\n properties = [\"width\", \"height\", \"objectFit\", \"borderRadius\"];\n } else if (CONTAINER_ELEMENTS.has(tag)) {\n // Layout-focused for containers\n properties = [\"display\", \"padding\", \"margin\", \"gap\", \"backgroundColor\"];\n } else {\n // Default fallback\n properties = [\"color\", \"fontSize\", \"margin\", \"padding\", \"backgroundColor\"];\n }\n\n for (const prop of properties) {\n const cssPropertyName = prop.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n const value = styles.getPropertyValue(cssPropertyName);\n if (value && !DEFAULT_STYLE_VALUES.has(value)) {\n result[prop] = value;\n }\n }\n\n return result;\n}\n\n// Comprehensive list of CSS properties for forensic output\nconst FORENSIC_PROPERTIES = [\n // Colors\n \"color\", \"backgroundColor\", \"borderColor\",\n // Typography\n \"fontSize\", \"fontWeight\", \"fontFamily\", \"lineHeight\", \"letterSpacing\", \"textAlign\",\n // Box model\n \"width\", \"height\", \"padding\", \"margin\", \"border\", \"borderRadius\",\n // Layout & positioning\n \"display\", \"position\", \"top\", \"right\", \"bottom\", \"left\", \"zIndex\",\n \"flexDirection\", \"justifyContent\", \"alignItems\", \"gap\",\n // Visual effects\n \"opacity\", \"visibility\", \"overflow\", \"boxShadow\",\n // Transform\n \"transform\",\n];\n\n/**\n * Gets full computed styles for forensic output.\n * Returns a comprehensive semicolon-separated string of all relevant CSS properties\n * for maximum debugging detail in the forensic output format.\n */\nexport function getForensicComputedStyles(target: HTMLElement): string {\n if (typeof window === \"undefined\") return \"\";\n\n const styles = window.getComputedStyle(target);\n const parts: string[] = [];\n\n for (const prop of FORENSIC_PROPERTIES) {\n const cssPropertyName = prop.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n const value = styles.getPropertyValue(cssPropertyName);\n if (value && !DEFAULT_STYLE_VALUES.has(value)) {\n parts.push(`${cssPropertyName}: ${value}`);\n }\n }\n\n return parts.join(\"; \");\n}\n\n/**\n * Parses a forensic computed styles string back into a Record.\n * Inverse of getForensicComputedStyles - used when editing annotations.\n */\nexport function parseComputedStylesString(\n stylesStr: string | undefined,\n): Record<string, string> | undefined {\n if (!stylesStr) return undefined;\n\n const result: Record<string, string> = {};\n const parts = stylesStr.split(\";\").map((p) => p.trim()).filter(Boolean);\n\n for (const part of parts) {\n const colonIndex = part.indexOf(\":\");\n if (colonIndex > 0) {\n const key = part.slice(0, colonIndex).trim();\n const value = part.slice(colonIndex + 1).trim();\n if (key && value) {\n result[key] = value;\n }\n }\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\n/**\n * Gets accessibility information for an element\n */\nexport function getAccessibilityInfo(target: HTMLElement): string {\n const parts: string[] = [];\n\n const role = target.getAttribute(\"role\");\n const ariaLabel = target.getAttribute(\"aria-label\");\n const ariaDescribedBy = target.getAttribute(\"aria-describedby\");\n const tabIndex = target.getAttribute(\"tabindex\");\n const ariaHidden = target.getAttribute(\"aria-hidden\");\n\n if (role) parts.push(`role=\"${role}\"`);\n if (ariaLabel) parts.push(`aria-label=\"${ariaLabel}\"`);\n if (ariaDescribedBy) parts.push(`aria-describedby=\"${ariaDescribedBy}\"`);\n if (tabIndex) parts.push(`tabindex=${tabIndex}`);\n if (ariaHidden === \"true\") parts.push(\"aria-hidden\");\n\n // Check focusability\n const focusable = target.matches(\"a, button, input, select, textarea, [tabindex]\");\n if (focusable) parts.push(\"focusable\");\n\n return parts.join(\", \");\n}\n\n/**\n * Gets full DOM ancestry path (for forensic mode).\n * Supports elements inside shadow DOM by marking shadow boundary crossings.\n */\nexport function getFullElementPath(target: HTMLElement): string {\n const parts: string[] = [];\n let current: HTMLElement | null = target;\n\n while (current && current.tagName.toLowerCase() !== \"html\") {\n const tag = current.tagName.toLowerCase();\n let identifier = tag;\n\n if (current.id) {\n identifier = `${tag}#${current.id}`;\n } else if (current.className && typeof current.className === \"string\") {\n const cls = current.className\n .split(/\\s+/)\n .map(c => c.replace(/[_][a-zA-Z0-9]{5,}.*$/, \"\"))\n .find(c => c.length > 2);\n if (cls) identifier = `${tag}.${cls}`;\n }\n\n // Mark shadow boundary crossings\n const nextParent = getParentElement(current);\n if (!current.parentElement && nextParent) {\n identifier = `⟨shadow⟩ ${identifier}`;\n }\n\n parts.unshift(identifier);\n current = nextParent as HTMLElement | null;\n }\n\n return parts.join(\" > \");\n}\n","// =============================================================================\n// Storage Utilities\n// =============================================================================\n//\n// TODO: Abstract this to accept a StorageAdapter interface for custom storage\n// (IndexedDB, API backend, etc.)\n//\n\nimport type { Annotation } from \"../types\";\n\nconst STORAGE_PREFIX = \"feedback-annotations-\";\nconst DEFAULT_RETENTION_DAYS = 7;\n\nexport function getStorageKey(pathname: string): string {\n return `${STORAGE_PREFIX}${pathname}`;\n}\n\nexport function loadAnnotations<T = Annotation>(pathname: string): T[] {\n if (typeof window === \"undefined\") return [];\n try {\n const stored = localStorage.getItem(getStorageKey(pathname));\n if (!stored) return [];\n const data = JSON.parse(stored);\n const cutoff = Date.now() - DEFAULT_RETENTION_DAYS * 24 * 60 * 60 * 1000;\n return data.filter((a: { timestamp?: number }) => !a.timestamp || a.timestamp > cutoff);\n } catch {\n return [];\n }\n}\n\nexport function saveAnnotations<T = Annotation>(pathname: string, annotations: T[]): void {\n if (typeof window === \"undefined\") return;\n try {\n localStorage.setItem(getStorageKey(pathname), JSON.stringify(annotations));\n } catch {\n // localStorage might be full or disabled\n }\n}\n\nexport function clearAnnotations(pathname: string): void {\n if (typeof window === \"undefined\") return;\n try {\n localStorage.removeItem(getStorageKey(pathname));\n } catch {\n // ignore\n }\n}\n\n/**\n * Load all annotations from localStorage across all pages.\n * Returns a map of pathname -> annotations.\n */\nexport function loadAllAnnotations<T = Annotation>(): Map<string, T[]> {\n const result = new Map<string, T[]>();\n if (typeof window === \"undefined\") return result;\n\n try {\n const cutoff = Date.now() - DEFAULT_RETENTION_DAYS * 24 * 60 * 60 * 1000;\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(STORAGE_PREFIX)) {\n const pathname = key.slice(STORAGE_PREFIX.length);\n const stored = localStorage.getItem(key);\n if (stored) {\n const data = JSON.parse(stored);\n const filtered = data.filter(\n (a: { timestamp?: number }) => !a.timestamp || a.timestamp > cutoff\n );\n if (filtered.length > 0) {\n result.set(pathname, filtered);\n }\n }\n }\n }\n } catch {\n // ignore errors\n }\n\n return result;\n}\n\n// =============================================================================\n// Sync Marker Utilities\n// =============================================================================\n//\n// These helpers manage the `_syncedTo` field on annotations, which tracks\n// whether an annotation has been synced to a particular session/destination.\n// The underscore prefix indicates this is an internal field.\n//\n\ntype AnnotationWithSyncMarker = Annotation & { _syncedTo?: string };\n\n/**\n * Save annotations with a sync marker indicating they've been synced to a session.\n * Adds `_syncedTo: sessionId` to each annotation before saving.\n */\nexport function saveAnnotationsWithSyncMarker(\n pathname: string,\n annotations: Annotation[],\n sessionId: string\n): void {\n const marked = annotations.map((annotation) => ({\n ...annotation,\n _syncedTo: sessionId,\n }));\n saveAnnotations(pathname, marked);\n}\n\n/**\n * Get annotations that haven't been synced to the given session.\n * Returns annotations without a `_syncedTo` marker, or with a different session ID.\n * If no sessionId provided, returns annotations without any sync marker.\n */\nexport function getUnsyncedAnnotations(\n pathname: string,\n sessionId?: string\n): Annotation[] {\n const annotations = loadAnnotations<AnnotationWithSyncMarker>(pathname);\n return annotations.filter((annotation) => {\n if (!annotation._syncedTo) return true;\n if (sessionId && annotation._syncedTo !== sessionId) return true;\n return false;\n });\n}\n\n/**\n * Remove `_syncedTo` markers from all annotations for a pathname.\n * Useful when resetting sync state or changing sync destination.\n */\nexport function clearSyncMarkers(pathname: string): void {\n const annotations = loadAnnotations<AnnotationWithSyncMarker>(pathname);\n const cleaned = annotations.map((annotation) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { _syncedTo, ...rest } = annotation;\n return rest as Annotation;\n });\n saveAnnotations(pathname, cleaned);\n}\n\n// =============================================================================\n// Session Storage\n// =============================================================================\n\nconst SESSION_PREFIX = \"agentation-session-\";\n\nexport function getSessionStorageKey(pathname: string): string {\n return `${SESSION_PREFIX}${pathname}`;\n}\n\nexport function loadSessionId(pathname: string): string | null {\n if (typeof window === \"undefined\") return null;\n try {\n return localStorage.getItem(getSessionStorageKey(pathname));\n } catch {\n return null;\n }\n}\n\nexport function saveSessionId(pathname: string, sessionId: string): void {\n if (typeof window === \"undefined\") return;\n try {\n localStorage.setItem(getSessionStorageKey(pathname), sessionId);\n } catch {\n // localStorage might be full or disabled\n }\n}\n\nexport function clearSessionId(pathname: string): void {\n if (typeof window === \"undefined\") return;\n try {\n localStorage.removeItem(getSessionStorageKey(pathname));\n } catch {\n // ignore\n }\n}\n","// =============================================================================\n// Server Sync Utilities\n// =============================================================================\n//\n// Optional server synchronization for the Agentation protocol.\n// When an endpoint is provided, annotations sync to a server.\n// Falls back gracefully to local-only mode on network errors.\n//\n\nimport type { Annotation, Session, SessionWithAnnotations } from \"../types\";\n\n/**\n * List all sessions from the server.\n */\nexport async function listSessions(endpoint: string): Promise<Session[]> {\n const response = await fetch(`${endpoint}/sessions`);\n if (!response.ok) {\n throw new Error(`Failed to list sessions: ${response.status}`);\n }\n return response.json();\n}\n\n/**\n * Create a new session on the server.\n */\nexport async function createSession(\n endpoint: string,\n url: string\n): Promise<Session> {\n const response = await fetch(`${endpoint}/sessions`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ url }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to create session: ${response.status}`);\n }\n\n return response.json();\n}\n\n/**\n * Get an existing session with its annotations.\n */\nexport async function getSession(\n endpoint: string,\n sessionId: string\n): Promise<SessionWithAnnotations> {\n const response = await fetch(`${endpoint}/sessions/${sessionId}`);\n\n if (!response.ok) {\n throw new Error(`Failed to get session: ${response.status}`);\n }\n\n return response.json();\n}\n\n/**\n * Sync a new annotation to the server.\n * Returns the annotation with any server-assigned fields.\n */\nexport async function syncAnnotation(\n endpoint: string,\n sessionId: string,\n annotation: Annotation\n): Promise<Annotation> {\n const response = await fetch(`${endpoint}/sessions/${sessionId}/annotations`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(annotation),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to sync annotation: ${response.status}`);\n }\n\n return response.json();\n}\n\n/**\n * Update an annotation on the server.\n */\nexport async function updateAnnotation(\n endpoint: string,\n annotationId: string,\n data: Partial<Annotation>\n): Promise<Annotation> {\n const response = await fetch(`${endpoint}/annotations/${annotationId}`, {\n method: \"PATCH\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to update annotation: ${response.status}`);\n }\n\n return response.json();\n}\n\n/**\n * Delete an annotation from the server.\n */\nexport async function deleteAnnotation(\n endpoint: string,\n annotationId: string\n): Promise<void> {\n const response = await fetch(`${endpoint}/annotations/${annotationId}`, {\n method: \"DELETE\",\n });\n\n if (!response.ok) {\n throw new Error(`Failed to delete annotation: ${response.status}`);\n }\n}\n\nexport type ActionResponse = {\n success: boolean;\n annotationCount: number;\n delivered: {\n sseListeners: number;\n webhooks: number;\n total: number;\n };\n};\n\n/**\n * Request the agent to act on annotations.\n * Emits an action.requested event via SSE to notify connected agents.\n * Returns delivery info so the UI can show accurate feedback.\n */\nexport async function requestAction(\n endpoint: string,\n sessionId: string,\n output: string\n): Promise<ActionResponse> {\n const response = await fetch(`${endpoint}/sessions/${sessionId}/action`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ output }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to request action: ${response.status}`);\n }\n\n return response.json();\n}\n","// =============================================================================\n// React Component Name Detection\n// Uses React DevTools techniques to extract component names from fiber nodes\n// =============================================================================\n\n/**\n * React Fiber node type (minimal subset we care about)\n * Based on React internal structure\n */\ninterface ReactFiber {\n tag: number;\n type: ComponentType | string | null;\n elementType: ComponentType | null;\n return: ReactFiber | null;\n}\n\ninterface ComponentType {\n name?: string;\n displayName?: string;\n render?: { name?: string; displayName?: string };\n type?: ComponentType;\n _context?: { displayName?: string };\n _status?: number;\n _result?: ComponentType;\n $$typeof?: symbol;\n}\n\n/**\n * Fiber tags from React source (stable across versions)\n * https://github.com/facebook/react/blob/main/packages/react-reconciler/src/ReactWorkTags.js\n */\nconst FiberTags = {\n FunctionComponent: 0,\n ClassComponent: 1,\n IndeterminateComponent: 2,\n HostRoot: 3,\n HostPortal: 4,\n HostComponent: 5, // DOM elements like <div>\n HostText: 6,\n Fragment: 7,\n Mode: 8,\n ContextConsumer: 9,\n ContextProvider: 10,\n ForwardRef: 11,\n Profiler: 12,\n SuspenseComponent: 13,\n MemoComponent: 14,\n SimpleMemoComponent: 15,\n LazyComponent: 16,\n // React 18/19 additions\n IncompleteClassComponent: 17,\n DehydratedFragment: 18,\n SuspenseListComponent: 19,\n // Note: 20 is unused/reserved\n ScopeComponent: 21,\n OffscreenComponent: 22,\n LegacyHiddenComponent: 23,\n CacheComponent: 24,\n TracingMarkerComponent: 25,\n HostHoistable: 26,\n HostSingleton: 27,\n IncompleteFunctionComponent: 28,\n Throw: 29,\n ViewTransitionComponent: 30,\n ActivityComponent: 31,\n} as const;\n\n// =============================================================================\n// Default Filter Configuration\n// =============================================================================\n\n/**\n * Default exact names to always skip (React internals)\n */\nexport const DEFAULT_SKIP_EXACT = new Set([\n \"Component\",\n \"PureComponent\",\n \"Fragment\",\n \"Suspense\",\n \"Profiler\",\n \"StrictMode\",\n \"Routes\",\n \"Route\",\n \"Outlet\",\n // Framework internals - exact matches\n \"Root\",\n \"ErrorBoundaryHandler\",\n \"HotReload\",\n \"Hot\",\n]);\n\n/**\n * Default patterns for framework internals\n * Note: Patterns are designed to be specific to avoid false positives\n * (e.g., ServerStatus, ClientProfile should NOT be filtered)\n */\nexport const DEFAULT_SKIP_PATTERNS: RegExp[] = [\n /Boundary$/, // ErrorBoundary, RedirectBoundary\n /BoundaryHandler$/, // ErrorBoundaryHandler\n /Provider$/, // ThemeProvider, Context.Provider\n /Consumer$/, // Context.Consumer\n /^(Inner|Outer)/, // InnerLayoutRouter\n /Router$/, // AppRouter, BrowserRouter\n /^Client(Page|Segment|Root)/, // ClientPageRoot, ClientSegmentRoot\n /^Server(Root|Component|Render)/, // ServerRoot (not ServerStatus)\n /^RSC/, // RSCComponent\n /Context$/, // LayoutRouterContext\n /^Hot(Reload)?$/, // HotReload (exact match to avoid false positives)\n /^(Dev|React)(Overlay|Tools|Root)/, // DevTools, ReactDevOverlay\n /Overlay$/, // ReactDevOverlay, ErrorOverlay\n /Handler$/, // ScrollAndFocusHandler, ErrorBoundaryHandler\n /^With[A-Z]/, // withRouter, WithAuth (HOCs)\n /Wrapper$/, // Generic wrappers\n /^Root$/, // Generic Root component\n];\n\n/**\n * Patterns that indicate likely user-defined components\n * Used as fallback in 'smart' mode\n */\nconst DEFAULT_USER_PATTERNS: RegExp[] = [\n /Page$/, // HomePage, InstallPage\n /View$/, // ListView, DetailView\n /Screen$/, // HomeScreen\n /Section$/, // HeroSection\n /Card$/, // ProductCard\n /List$/, // UserList\n /Item$/, // ListItem, MenuItem\n /Form$/, // LoginForm\n /Modal$/, // ConfirmModal\n /Dialog$/, // AlertDialog\n /Button$/, // SubmitButton (but not all buttons)\n /Nav$/, // SideNav, TopNav\n /Header$/, // PageHeader\n /Footer$/, // PageFooter\n /Layout$/, // MainLayout (careful - could be framework)\n /Panel$/, // SidePanel\n /Tab$/, // SettingsTab\n /Menu$/, // DropdownMenu\n];\n\n// =============================================================================\n// Configuration Types\n// =============================================================================\n\nexport type ReactDetectionMode = \"all\" | \"filtered\" | \"smart\";\n\nexport interface ReactDetectionConfig {\n /**\n * How many component names to collect\n * @default 3\n */\n maxComponents?: number;\n\n /**\n * Maximum fiber depth to traverse\n * @default 25\n */\n maxDepth?: number;\n\n /**\n * Detection mode:\n * - 'smart': Only show components that correlate with DOM classes (strictest, most relevant)\n * - 'filtered': Skip known framework internals (default)\n * - 'all': Show all components (no filtering)\n * @default 'filtered'\n */\n mode?: ReactDetectionMode;\n\n /**\n * Additional exact names to skip (merged with defaults in 'filtered' mode)\n */\n skipExact?: Set<string> | string[];\n\n /**\n * Additional patterns to skip (merged with defaults in 'filtered' mode)\n */\n skipPatterns?: RegExp[];\n\n /**\n * Patterns for user components (used as fallback in 'smart' mode)\n */\n userPatterns?: RegExp[];\n\n /**\n * Custom filter function for full control\n * Return true to INCLUDE the component, false to skip\n */\n filter?: (name: string, depth: number) => boolean;\n}\n\n/**\n * Resolved configuration with all defaults applied\n */\ninterface ResolvedConfig {\n maxComponents: number;\n maxDepth: number;\n mode: ReactDetectionMode;\n skipExact: Set<string>;\n skipPatterns: RegExp[];\n userPatterns: RegExp[];\n filter?: (name: string, depth: number) => boolean;\n}\n\nfunction resolveConfig(config?: ReactDetectionConfig): ResolvedConfig {\n const mode = config?.mode ?? \"filtered\";\n\n // Convert skipExact to Set if array\n let skipExact = DEFAULT_SKIP_EXACT;\n if (config?.skipExact) {\n const additional =\n config.skipExact instanceof Set\n ? config.skipExact\n : new Set(config.skipExact);\n skipExact = new Set([...DEFAULT_SKIP_EXACT, ...additional]);\n }\n\n return {\n maxComponents: config?.maxComponents ?? 6,\n maxDepth: config?.maxDepth ?? 30,\n mode,\n skipExact,\n skipPatterns: config?.skipPatterns\n ? [...DEFAULT_SKIP_PATTERNS, ...config.skipPatterns]\n : DEFAULT_SKIP_PATTERNS,\n userPatterns: config?.userPatterns ?? DEFAULT_USER_PATTERNS,\n filter: config?.filter,\n };\n}\n\n// =============================================================================\n// Filter Logic\n// =============================================================================\n\n/**\n * Normalize a component name to match CSS class conventions\n * SideNav -> side-nav, LinkComponent -> link-component\n */\nfunction normalizeComponentName(name: string): string {\n return name\n .replace(/([a-z])([A-Z])/g, \"$1-$2\")\n .replace(/([A-Z])([A-Z][a-z])/g, \"$1-$2\")\n .toLowerCase();\n}\n\n/**\n * Collect CSS classes from an element and its ancestors\n */\nfunction getAncestorClasses(element: HTMLElement, maxDepth = 10): Set<string> {\n const classes = new Set<string>();\n let current: HTMLElement | null = element;\n let depth = 0;\n\n while (current && depth < maxDepth) {\n if (current.className && typeof current.className === \"string\") {\n current.className.split(/\\s+/).forEach((cls) => {\n if (cls.length > 1) {\n // Normalize: remove CSS module hashes, convert to lowercase\n const normalized = cls\n .replace(/[_][a-zA-Z0-9]{5,}.*$/, \"\")\n .toLowerCase();\n if (normalized.length > 1) {\n classes.add(normalized);\n }\n }\n });\n }\n current = current.parentElement;\n depth++;\n }\n\n return classes;\n}\n\n/**\n * Check if a component name correlates with any DOM class\n */\nfunction componentCorrelatesWithDOM(\n componentName: string,\n domClasses: Set<string>,\n): boolean {\n const normalized = normalizeComponentName(componentName);\n\n for (const cls of domClasses) {\n // Exact match: SideNav -> side-nav\n if (cls === normalized) return true;\n\n // Contains match: LinkComponent -> nav-link contains \"link\"\n // Split both by hyphens and check for word overlaps\n const componentWords = normalized.split(\"-\").filter((w) => w.length > 2);\n const classWords = cls.split(\"-\").filter((w) => w.length > 2);\n\n for (const cWord of componentWords) {\n for (const dWord of classWords) {\n if (cWord === dWord || cWord.includes(dWord) || dWord.includes(cWord)) {\n return true;\n }\n }\n }\n }\n\n return false;\n}\n\nfunction shouldIncludeComponent(\n name: string,\n depth: number,\n config: ResolvedConfig,\n domClasses?: Set<string>,\n): boolean {\n // Custom filter takes precedence\n if (config.filter) {\n return config.filter(name, depth);\n }\n\n switch (config.mode) {\n case \"all\":\n // \"all\" mode shows everything - no filtering at all\n return true;\n\n case \"filtered\":\n // \"filtered\" mode skips framework internals\n if (config.skipExact.has(name)) {\n return false;\n }\n if (config.skipPatterns.some((p) => p.test(name))) {\n return false;\n }\n return true;\n\n case \"smart\":\n // \"smart\" mode: first apply framework filters, then require DOM correlation\n if (config.skipExact.has(name)) {\n return false;\n }\n if (config.skipPatterns.some((p) => p.test(name))) {\n return false;\n }\n // Must correlate with DOM classes OR match user patterns\n if (domClasses && componentCorrelatesWithDOM(name, domClasses)) {\n return true;\n }\n if (config.userPatterns.some((p) => p.test(name))) {\n return true;\n }\n // Skip components that don't correlate - this mode is intentionally strict\n return false;\n\n default:\n return true;\n }\n}\n\n// =============================================================================\n// React Detection\n// =============================================================================\n\nlet reactDetectionCache: boolean | null = null;\n\n// Only cache for 'all' mode - filtered modes should NOT cache because:\n// 1. Filter results depend on config that may change between calls\n// 2. Cached results from before filter changes would return stale/unfiltered data\n// 3. The cache lookup happens BEFORE filtering, so old cached data bypasses filters\n// Using WeakMap allows garbage collection when elements are removed from DOM.\nconst componentCacheAll = new WeakMap<HTMLElement, ReactComponentInfo>();\n\n/**\n * Checks if React is present on the page\n */\n/**\n * Check if an element has React fiber keys\n */\nfunction hasReactFiber(element: Element): boolean {\n return Object.keys(element).some(\n (key) =>\n key.startsWith(\"__reactFiber$\") ||\n key.startsWith(\"__reactInternalInstance$\") ||\n key.startsWith(\"__reactProps$\"),\n );\n}\n\n/**\n * Checks if React is present on the page.\n * Scans common React root containers since React typically mounts\n * to #root, #app, #__next, etc. rather than document.body directly.\n */\nexport function isReactPage(): boolean {\n if (reactDetectionCache !== null) {\n return reactDetectionCache;\n }\n\n if (typeof document === \"undefined\") {\n return false;\n }\n\n // Check body first (some apps mount directly to body)\n if (document.body && hasReactFiber(document.body)) {\n reactDetectionCache = true;\n return true;\n }\n\n // Check common React root containers\n const commonRoots = [\"#root\", \"#app\", \"#__next\", \"[data-reactroot]\"];\n for (const selector of commonRoots) {\n const el = document.querySelector(selector);\n if (el && hasReactFiber(el)) {\n reactDetectionCache = true;\n return true;\n }\n }\n\n // Scan immediate children of body as fallback\n if (document.body) {\n for (const child of document.body.children) {\n if (hasReactFiber(child)) {\n reactDetectionCache = true;\n return true;\n }\n }\n }\n\n reactDetectionCache = false;\n return false;\n}\n\n// Wrapper object to allow cache clearing (WeakMap has no clear() method)\nlet componentCacheAllRef = { map: componentCacheAll };\n\n/**\n * Clears the React detection cache\n * Note: Only 'all' mode uses caching; filtered modes don't cache to avoid stale filter results\n */\nexport function clearReactDetectionCache(): void {\n reactDetectionCache = null;\n componentCacheAllRef.map = new WeakMap<HTMLElement, ReactComponentInfo>();\n}\n\nfunction getReactFiberKey(element: HTMLElement): string | null {\n const keys = Object.keys(element);\n return (\n keys.find(\n (key) =>\n key.startsWith(\"__reactFiber$\") ||\n key.startsWith(\"__reactInternalInstance$\"),\n ) || null\n );\n}\n\nfunction getFiberFromElement(element: HTMLElement): ReactFiber | null {\n const key = getReactFiberKey(element);\n if (!key) return null;\n return (element as unknown as Record<string, unknown>)[\n key\n ] as ReactFiber | null;\n}\n\nfunction getComponentNameFromType(type: ComponentType | null): string | null {\n if (!type) return null;\n if (type.displayName) return type.displayName;\n if (type.name) return type.name;\n return null;\n}\n\nfunction getComponentNameFromFiber(fiber: ReactFiber): string | null {\n const { tag, type, elementType } = fiber;\n\n // Skip DOM elements and host types\n if (\n tag === FiberTags.HostComponent ||\n tag === FiberTags.HostText ||\n tag === FiberTags.HostHoistable ||\n tag === FiberTags.HostSingleton\n ) {\n return null;\n }\n\n // Skip Fragment, Mode, Profiler, and related internal types\n if (\n tag === FiberTags.Fragment ||\n tag === FiberTags.Mode ||\n tag === FiberTags.Profiler ||\n tag === FiberTags.DehydratedFragment\n ) {\n return null;\n }\n\n // Skip React internal infrastructure types (these are internal implementation details)\n if (\n tag === FiberTags.HostRoot ||\n tag === FiberTags.HostPortal ||\n tag === FiberTags.ScopeComponent ||\n tag === FiberTags.OffscreenComponent ||\n tag === FiberTags.LegacyHiddenComponent ||\n tag === FiberTags.CacheComponent ||\n tag === FiberTags.TracingMarkerComponent ||\n tag === FiberTags.Throw ||\n tag === FiberTags.ViewTransitionComponent ||\n tag === FiberTags.ActivityComponent\n ) {\n return null;\n }\n\n // Handle ForwardRef\n if (tag === FiberTags.ForwardRef) {\n const elType = elementType as ComponentType | null;\n if (elType?.render) {\n const innerName = getComponentNameFromType(elType.render);\n if (innerName) return innerName;\n }\n if (elType?.displayName) return elType.displayName;\n return getComponentNameFromType(type as ComponentType);\n }\n\n // Handle Memo\n if (\n tag === FiberTags.MemoComponent ||\n tag === FiberTags.SimpleMemoComponent\n ) {\n const elType = elementType as ComponentType | null;\n if (elType?.type) {\n const innerName = getComponentNameFromType(elType.type);\n if (innerName) return innerName;\n }\n if (elType?.displayName) return elType.displayName;\n return getComponentNameFromType(type as ComponentType);\n }\n\n // Handle Context Provider\n if (tag === FiberTags.ContextProvider) {\n const elType = type as ComponentType | null;\n if (elType?._context?.displayName) {\n return `${elType._context.displayName}.Provider`;\n }\n return null;\n }\n\n // Handle Context Consumer\n if (tag === FiberTags.ContextConsumer) {\n const elType = type as ComponentType | null;\n if (elType?.displayName) {\n return `${elType.displayName}.Consumer`;\n }\n return null;\n }\n\n // Handle Lazy\n if (tag === FiberTags.LazyComponent) {\n const elType = elementType as ComponentType | null;\n if (elType?._status === 1 && elType._result) {\n return getComponentNameFromType(elType._result);\n }\n return null;\n }\n\n // Handle Suspense and SuspenseList\n if (\n tag === FiberTags.SuspenseComponent ||\n tag === FiberTags.SuspenseListComponent\n ) {\n return null;\n }\n\n // Handle incomplete components (error states during rendering)\n if (\n tag === FiberTags.IncompleteClassComponent ||\n tag === FiberTags.IncompleteFunctionComponent\n ) {\n // These are components that errored during rendering\n // Try to get the name anyway for debugging purposes\n return getComponentNameFromType(type as ComponentType);\n }\n\n // Function and Class components\n if (\n tag === FiberTags.FunctionComponent ||\n tag === FiberTags.ClassComponent ||\n tag === FiberTags.IndeterminateComponent\n ) {\n return getComponentNameFromType(type as ComponentType);\n }\n\n return null;\n}\n\n// =============================================================================\n// Public API\n// =============================================================================\n\n/**\n * Result from React component detection\n */\nexport interface ReactComponentInfo {\n /** Full component path like \"<App> <Layout> <Button>\" */\n path: string | null;\n /** Array of component names from innermost to outermost */\n components: string[];\n}\n\n/**\n * Check if a name looks like minified/production code (single letter or very short)\n */\nfunction isMinifiedName(name: string): boolean {\n // Single letter or two letters that look like minified (e.g., \"e\", \"t\", \"Zt\")\n if (name.length <= 2) return true;\n // All lowercase short names are likely minified\n if (name.length <= 3 && name === name.toLowerCase()) return true;\n return false;\n}\n\n/**\n * Walks up the fiber tree to collect React component names\n *\n * @param element - The DOM element to start from\n * @param config - Optional configuration\n * @returns ReactComponentInfo with component path and array\n */\nexport function getReactComponentName(\n element: HTMLElement,\n config?: ReactDetectionConfig,\n): ReactComponentInfo {\n const resolved = resolveConfig(config);\n\n // Only use cache for 'all' mode - filtered modes must NOT cache because:\n // - Cache lookup happens BEFORE filtering logic runs\n // - Cached results from before filter updates would bypass new filters\n // - This was causing \"Root\", \"ErrorBoundaryHandler\" to leak through\n const useCache = resolved.mode === \"all\";\n\n if (useCache) {\n const cached = componentCacheAllRef.map.get(element);\n if (cached !== undefined) {\n return cached;\n }\n }\n\n if (!isReactPage()) {\n const result: ReactComponentInfo = { path: null, components: [] };\n if (useCache) {\n componentCacheAllRef.map.set(element, result);\n }\n return result;\n }\n\n // Collect DOM classes for smart mode\n const domClasses =\n resolved.mode === \"smart\" ? getAncestorClasses(element) : undefined;\n\n const components: string[] = [];\n\n try {\n let fiber = getFiberFromElement(element);\n let depth = 0;\n\n while (\n fiber &&\n depth < resolved.maxDepth &&\n components.length < resolved.maxComponents\n ) {\n const name = getComponentNameFromFiber(fiber);\n\n // Skip minified names and apply filter\n if (\n name &&\n !isMinifiedName(name) &&\n shouldIncludeComponent(name, depth, resolved, domClasses)\n ) {\n components.push(name);\n }\n\n fiber = fiber.return;\n depth++;\n }\n } catch {\n // Fiber structure may be corrupted or inaccessible - return empty result\n const result: ReactComponentInfo = { path: null, components: [] };\n if (useCache) {\n componentCacheAllRef.map.set(element, result);\n }\n return result;\n }\n\n if (components.length === 0) {\n const result: ReactComponentInfo = { path: null, components: [] };\n if (useCache) {\n componentCacheAllRef.map.set(element, result);\n }\n return result;\n }\n\n // Build path from outermost to innermost: <App> <Layout> <Button>\n const path = components\n .slice()\n .reverse()\n .map((c) => `<${c}>`)\n .join(\" \");\n\n const result: ReactComponentInfo = { path, components };\n if (useCache) {\n componentCacheAllRef.map.set(element, result);\n }\n return result;\n}\n","\nconst css = \"svg[fill=none] {\\n fill: none !important;\\n}\\n\\n@keyframes styles-module__toolbarEnter___u8RRu {\\n from {\\n opacity: 0;\\n transform: scale(0.5) rotate(90deg);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1) rotate(0deg);\\n }\\n}\\n@keyframes styles-module__badgeEnter___mVQLj {\\n from {\\n opacity: 0;\\n transform: scale(0);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1);\\n }\\n}\\n@keyframes styles-module__scaleIn___c-r1K {\\n from {\\n opacity: 0;\\n transform: scale(0.85);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1);\\n }\\n}\\n@keyframes styles-module__scaleOut___Wctwz {\\n from {\\n opacity: 1;\\n transform: scale(1);\\n }\\n to {\\n opacity: 0;\\n transform: scale(0.85);\\n }\\n}\\n@keyframes styles-module__slideUp___kgD36 {\\n from {\\n opacity: 0;\\n transform: scale(0.85) translateY(8px);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1) translateY(0);\\n }\\n}\\n@keyframes styles-module__slideDown___zcdje {\\n from {\\n opacity: 1;\\n transform: scale(1) translateY(0);\\n }\\n to {\\n opacity: 0;\\n transform: scale(0.85) translateY(8px);\\n }\\n}\\n@keyframes styles-module__markerIn___5FaAP {\\n 0% {\\n opacity: 0;\\n transform: translate(-50%, -50%) scale(0.3);\\n }\\n 100% {\\n opacity: 1;\\n transform: translate(-50%, -50%) scale(1);\\n }\\n}\\n@keyframes styles-module__markerOut___GU5jX {\\n 0% {\\n opacity: 1;\\n transform: translate(-50%, -50%) scale(1);\\n }\\n 100% {\\n opacity: 0;\\n transform: translate(-50%, -50%) scale(0.3);\\n }\\n}\\n@keyframes styles-module__fadeIn___b9qmf {\\n from {\\n opacity: 0;\\n }\\n to {\\n opacity: 1;\\n }\\n}\\n@keyframes styles-module__fadeOut___6Ut6- {\\n from {\\n opacity: 1;\\n }\\n to {\\n opacity: 0;\\n }\\n}\\n@keyframes styles-module__tooltipIn___0N31w {\\n from {\\n opacity: 0;\\n transform: translateX(-50%) translateY(2px) scale(0.891);\\n }\\n to {\\n opacity: 1;\\n transform: translateX(-50%) translateY(0) scale(0.909);\\n }\\n}\\n@keyframes styles-module__tooltipOut___ToqlU {\\n from {\\n opacity: 1;\\n transform: translateX(-50%) translateY(0) scale(0.909);\\n }\\n to {\\n opacity: 0;\\n transform: translateX(-50%) translateY(2px) scale(0.891);\\n }\\n}\\n@keyframes styles-module__hoverHighlightIn___6WYHY {\\n from {\\n opacity: 0;\\n transform: scale(0.98);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1);\\n }\\n}\\n@keyframes styles-module__hoverTooltipIn___FYGQx {\\n from {\\n opacity: 0;\\n transform: scale(0.95) translateY(4px);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1) translateY(0);\\n }\\n}\\n@keyframes styles-module__settingsPanelIn___MGfO8 {\\n from {\\n opacity: 0;\\n transform: translateY(10px) scale(0.95);\\n filter: blur(5px);\\n }\\n to {\\n opacity: 1;\\n transform: translateY(0) scale(1);\\n filter: blur(0px);\\n }\\n}\\n@keyframes styles-module__settingsPanelOut___Zfymi {\\n from {\\n opacity: 1;\\n transform: translateY(0) scale(1);\\n filter: blur(0px);\\n }\\n to {\\n opacity: 0;\\n transform: translateY(20px) scale(0.95);\\n filter: blur(5px);\\n }\\n}\\n.styles-module__toolbar___wNsdK {\\n position: fixed;\\n bottom: 1.25rem;\\n right: 1.25rem;\\n width: 337px;\\n z-index: 100000;\\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, sans-serif;\\n pointer-events: none;\\n transition: left 0s, top 0s, right 0s, bottom 0s;\\n}\\n\\n.styles-module__toolbarContainer___dIhma {\\n user-select: none;\\n margin-left: auto;\\n align-self: flex-end;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n background: #1a1a1a;\\n color: #fff;\\n border: none;\\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2), 0 4px 16px rgba(0, 0, 0, 0.1);\\n pointer-events: auto;\\n cursor: grab;\\n transition: width 0.4s cubic-bezier(0.19, 1, 0.22, 1), transform 0.4s cubic-bezier(0.19, 1, 0.22, 1);\\n}\\n.styles-module__toolbarContainer___dIhma.styles-module__dragging___xrolZ {\\n transition: width 0.4s cubic-bezier(0.19, 1, 0.22, 1);\\n cursor: grabbing;\\n}\\n.styles-module__toolbarContainer___dIhma.styles-module__entrance___sgHd8 {\\n animation: styles-module__toolbarEnter___u8RRu 0.5s cubic-bezier(0.34, 1.2, 0.64, 1) forwards;\\n}\\n.styles-module__toolbarContainer___dIhma.styles-module__collapsed___Rydsn {\\n width: 44px;\\n height: 44px;\\n border-radius: 22px;\\n padding: 0;\\n cursor: pointer;\\n}\\n.styles-module__toolbarContainer___dIhma.styles-module__collapsed___Rydsn svg {\\n margin-top: -1px;\\n}\\n.styles-module__toolbarContainer___dIhma.styles-module__collapsed___Rydsn:hover {\\n background: #2a2a2a;\\n}\\n.styles-module__toolbarContainer___dIhma.styles-module__collapsed___Rydsn:active {\\n transform: scale(0.95);\\n}\\n.styles-module__toolbarContainer___dIhma.styles-module__expanded___ofKPx {\\n height: 44px;\\n border-radius: 1.5rem;\\n padding: 0.375rem;\\n width: 297px;\\n}\\n.styles-module__toolbarContainer___dIhma.styles-module__expanded___ofKPx.styles-module__serverConnected___Gfbou {\\n width: 337px;\\n}\\n\\n.styles-module__toggleContent___0yfyP {\\n position: absolute;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n transition: opacity 0.1s cubic-bezier(0.19, 1, 0.22, 1);\\n}\\n.styles-module__toggleContent___0yfyP.styles-module__visible___KHwEW {\\n opacity: 1;\\n visibility: visible;\\n pointer-events: auto;\\n}\\n.styles-module__toggleContent___0yfyP.styles-module__hidden___Ae8H4 {\\n opacity: 0;\\n pointer-events: none;\\n}\\n\\n.styles-module__controlsContent___9GJWU {\\n display: flex;\\n align-items: center;\\n gap: 0.375rem;\\n transition: filter 0.8s cubic-bezier(0.19, 1, 0.22, 1), opacity 0.8s cubic-bezier(0.19, 1, 0.22, 1), transform 0.6s cubic-bezier(0.19, 1, 0.22, 1);\\n}\\n.styles-module__controlsContent___9GJWU.styles-module__visible___KHwEW {\\n opacity: 1;\\n filter: blur(0px);\\n transform: scale(1);\\n visibility: visible;\\n pointer-events: auto;\\n}\\n.styles-module__controlsContent___9GJWU.styles-module__hidden___Ae8H4 {\\n pointer-events: none;\\n opacity: 0;\\n filter: blur(10px);\\n transform: scale(0.4);\\n}\\n\\n.styles-module__badge___2XsgF {\\n position: absolute;\\n top: -13px;\\n right: -13px;\\n user-select: none;\\n min-width: 18px;\\n height: 18px;\\n padding: 0 5px;\\n border-radius: 9px;\\n background: #3c82f7;\\n color: white;\\n font-size: 0.625rem;\\n font-weight: 600;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15), inset 0 0 0 1px rgba(255, 255, 255, 0.04);\\n opacity: 1;\\n transition: transform 0.3s ease, opacity 0.2s ease;\\n transform: scale(1);\\n}\\n.styles-module__badge___2XsgF.styles-module__fadeOut___6Ut6- {\\n opacity: 0;\\n transform: scale(0);\\n pointer-events: none;\\n}\\n.styles-module__badge___2XsgF.styles-module__entrance___sgHd8 {\\n animation: styles-module__badgeEnter___mVQLj 0.3s cubic-bezier(0.34, 1.2, 0.64, 1) 0.4s both;\\n}\\n\\n.styles-module__controlButton___8Q0jc {\\n position: relative;\\n cursor: pointer !important;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 34px;\\n height: 34px;\\n border-radius: 50%;\\n border: none;\\n background: transparent;\\n color: rgba(255, 255, 255, 0.85);\\n transition: background-color 0.15s ease, color 0.15s ease, transform 0.1s ease, opacity 0.2s ease;\\n}\\n.styles-module__controlButton___8Q0jc:hover:not(:disabled):not([data-active=true]):not([data-failed=true]):not([data-auto-sync=true]):not([data-error=true]):not([data-no-hover=true]) {\\n background: rgba(255, 255, 255, 0.12);\\n color: #fff;\\n}\\n.styles-module__controlButton___8Q0jc:active:not(:disabled) {\\n transform: scale(0.92);\\n}\\n.styles-module__controlButton___8Q0jc:disabled {\\n opacity: 0.35;\\n cursor: not-allowed;\\n}\\n.styles-module__controlButton___8Q0jc[data-active=true] {\\n color: #3c82f7;\\n background: rgba(60, 130, 247, 0.25);\\n}\\n.styles-module__controlButton___8Q0jc[data-error=true] {\\n color: #ff3b30;\\n background: rgba(255, 59, 48, 0.25);\\n}\\n.styles-module__controlButton___8Q0jc[data-danger]:hover:not(:disabled):not([data-active=true]):not([data-failed=true]) {\\n background: rgba(255, 59, 48, 0.25);\\n color: #ff3b30;\\n}\\n.styles-module__controlButton___8Q0jc[data-no-hover=true], .styles-module__controlButton___8Q0jc.styles-module__statusShowing___te6iu {\\n cursor: default !important;\\n pointer-events: none;\\n background: transparent !important;\\n}\\n.styles-module__controlButton___8Q0jc[data-auto-sync=true] {\\n color: #34c759;\\n background: transparent;\\n cursor: default;\\n}\\n.styles-module__controlButton___8Q0jc[data-failed=true] {\\n color: #ff3b30;\\n background: rgba(255, 59, 48, 0.25);\\n}\\n\\n.styles-module__buttonBadge___NeFWb {\\n position: absolute;\\n top: 0px;\\n right: 0px;\\n min-width: 16px;\\n height: 16px;\\n padding: 0 4px;\\n border-radius: 8px;\\n background: #3c82f7;\\n color: white;\\n font-size: 0.625rem;\\n font-weight: 600;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n box-shadow: 0 0 0 2px #1a1a1a, 0 1px 3px rgba(0, 0, 0, 0.2);\\n pointer-events: none;\\n}\\n.styles-module__buttonBadge___NeFWb.styles-module__light___r6n4Y {\\n box-shadow: 0 0 0 2px #fff, 0 1px 3px rgba(0, 0, 0, 0.2);\\n}\\n\\n@keyframes styles-module__mcpIndicatorPulseConnected___EDodZ {\\n 0%, 100% {\\n box-shadow: 0 0 0 0 rgba(52, 199, 89, 0.5);\\n }\\n 50% {\\n box-shadow: 0 0 0 5px rgba(52, 199, 89, 0);\\n }\\n}\\n@keyframes styles-module__mcpIndicatorPulseConnecting___cCYte {\\n 0%, 100% {\\n box-shadow: 0 0 0 0 rgba(245, 166, 35, 0.5);\\n }\\n 50% {\\n box-shadow: 0 0 0 5px rgba(245, 166, 35, 0);\\n }\\n}\\n.styles-module__mcpIndicator___zGJeL {\\n position: absolute;\\n top: 3px;\\n right: 3px;\\n width: 6px;\\n height: 6px;\\n border-radius: 50%;\\n pointer-events: none;\\n transition: background 0.3s ease, opacity 0.15s ease, transform 0.15s ease;\\n opacity: 1;\\n transform: scale(1);\\n}\\n.styles-module__mcpIndicator___zGJeL.styles-module__connected___7c28g {\\n background: #34c759;\\n animation: styles-module__mcpIndicatorPulseConnected___EDodZ 2.5s ease-in-out infinite;\\n}\\n.styles-module__mcpIndicator___zGJeL.styles-module__connecting___uo-CW {\\n background: #f5a623;\\n animation: styles-module__mcpIndicatorPulseConnecting___cCYte 1.5s ease-in-out infinite;\\n}\\n.styles-module__mcpIndicator___zGJeL.styles-module__hidden___Ae8H4 {\\n opacity: 0;\\n transform: scale(0);\\n animation: none;\\n}\\n\\n@keyframes styles-module__connectionPulse___-Zycw {\\n 0%, 100% {\\n opacity: 1;\\n transform: scale(1);\\n }\\n 50% {\\n opacity: 0.6;\\n transform: scale(0.9);\\n }\\n}\\n.styles-module__connectionIndicatorWrapper___L-e-3 {\\n width: 8px;\\n height: 34px;\\n margin-left: 6px;\\n margin-right: 6px;\\n}\\n\\n.styles-module__connectionIndicator___afk9p {\\n position: relative;\\n width: 8px;\\n height: 8px;\\n border-radius: 50%;\\n opacity: 0;\\n transition: opacity 0.3s ease, background 0.3s ease;\\n cursor: default;\\n}\\n\\n.styles-module__connectionIndicatorVisible___C-i5B {\\n opacity: 1;\\n}\\n\\n.styles-module__connectionIndicatorConnected___IY8pR {\\n background: #34c759;\\n animation: styles-module__connectionPulse___-Zycw 2.5s ease-in-out infinite;\\n}\\n\\n.styles-module__connectionIndicatorDisconnected___kmpaZ {\\n background: #ff3b30;\\n animation: none;\\n}\\n\\n.styles-module__connectionIndicatorConnecting___QmSLH {\\n background: #f59e0b;\\n animation: styles-module__connectionPulse___-Zycw 1s ease-in-out infinite;\\n}\\n\\n.styles-module__buttonWrapper___rBcdv {\\n position: relative;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n}\\n.styles-module__buttonWrapper___rBcdv:hover .styles-module__buttonTooltip___Burd9 {\\n opacity: 1;\\n visibility: visible;\\n transform: translateX(-50%) scale(1);\\n transition-delay: 0.85s;\\n}\\n.styles-module__buttonWrapper___rBcdv:has(.styles-module__controlButton___8Q0jc:disabled):hover .styles-module__buttonTooltip___Burd9 {\\n opacity: 0;\\n visibility: hidden;\\n}\\n\\n.styles-module__sendButtonWrapper___UUxG6 {\\n width: 0;\\n opacity: 0;\\n overflow: hidden;\\n pointer-events: none;\\n margin-left: -0.375rem;\\n transition: width 0.4s cubic-bezier(0.19, 1, 0.22, 1), opacity 0.3s cubic-bezier(0.19, 1, 0.22, 1), margin 0.4s cubic-bezier(0.19, 1, 0.22, 1);\\n}\\n.styles-module__sendButtonWrapper___UUxG6 .styles-module__controlButton___8Q0jc {\\n transform: scale(0.8);\\n transition: transform 0.4s cubic-bezier(0.19, 1, 0.22, 1);\\n}\\n.styles-module__sendButtonWrapper___UUxG6.styles-module__sendButtonVisible___WPSQU {\\n width: 34px;\\n opacity: 1;\\n overflow: visible;\\n pointer-events: auto;\\n margin-left: 0;\\n}\\n.styles-module__sendButtonWrapper___UUxG6.styles-module__sendButtonVisible___WPSQU .styles-module__controlButton___8Q0jc {\\n transform: scale(1);\\n}\\n\\n.styles-module__buttonTooltip___Burd9 {\\n position: absolute;\\n bottom: calc(100% + 14px);\\n left: 50%;\\n transform: translateX(-50%) scale(0.95);\\n padding: 6px 10px;\\n background: #1a1a1a;\\n color: rgba(255, 255, 255, 0.9);\\n font-size: 12px;\\n font-weight: 500;\\n border-radius: 8px;\\n white-space: nowrap;\\n opacity: 0;\\n visibility: hidden;\\n pointer-events: none;\\n z-index: 100001;\\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);\\n transition: opacity 0.135s ease, transform 0.135s ease, visibility 0.135s ease;\\n}\\n.styles-module__buttonTooltip___Burd9::after {\\n content: \\\"\\\";\\n position: absolute;\\n top: calc(100% - 4px);\\n left: 50%;\\n transform: translateX(-50%) rotate(45deg);\\n width: 8px;\\n height: 8px;\\n background: #1a1a1a;\\n border-radius: 0 0 2px 0;\\n}\\n\\n.styles-module__shortcut___lEAQk {\\n margin-left: 4px;\\n opacity: 0.5;\\n}\\n\\n.styles-module__tooltipBelow___m6ats .styles-module__buttonTooltip___Burd9 {\\n bottom: auto;\\n top: calc(100% + 14px);\\n transform: translateX(-50%) scale(0.95);\\n}\\n.styles-module__tooltipBelow___m6ats .styles-module__buttonTooltip___Burd9::after {\\n top: -4px;\\n bottom: auto;\\n border-radius: 2px 0 0 0;\\n}\\n\\n.styles-module__tooltipBelow___m6ats .styles-module__buttonWrapper___rBcdv:hover .styles-module__buttonTooltip___Burd9 {\\n transform: translateX(-50%) scale(1);\\n}\\n\\n.styles-module__tooltipsHidden___VtLJG .styles-module__buttonTooltip___Burd9 {\\n opacity: 0 !important;\\n visibility: hidden !important;\\n transition: none !important;\\n}\\n\\n.styles-module__tooltipVisible___0jcCv,\\n.styles-module__tooltipsHidden___VtLJG .styles-module__tooltipVisible___0jcCv {\\n opacity: 1 !important;\\n visibility: visible !important;\\n transform: translateX(-50%) scale(1) !important;\\n transition-delay: 0s !important;\\n}\\n\\n.styles-module__buttonWrapperAlignLeft___myzIp .styles-module__buttonTooltip___Burd9 {\\n left: 50%;\\n transform: translateX(-12px) scale(0.95);\\n}\\n.styles-module__buttonWrapperAlignLeft___myzIp .styles-module__buttonTooltip___Burd9::after {\\n left: 16px;\\n}\\n.styles-module__buttonWrapperAlignLeft___myzIp:hover .styles-module__buttonTooltip___Burd9 {\\n transform: translateX(-12px) scale(1);\\n}\\n\\n.styles-module__tooltipBelow___m6ats .styles-module__buttonWrapperAlignLeft___myzIp .styles-module__buttonTooltip___Burd9 {\\n transform: translateX(-12px) scale(0.95);\\n}\\n.styles-module__tooltipBelow___m6ats .styles-module__buttonWrapperAlignLeft___myzIp:hover .styles-module__buttonTooltip___Burd9 {\\n transform: translateX(-12px) scale(1);\\n}\\n\\n.styles-module__buttonWrapperAlignRight___HCQFR .styles-module__buttonTooltip___Burd9 {\\n left: 50%;\\n transform: translateX(calc(-100% + 12px)) scale(0.95);\\n}\\n.styles-module__buttonWrapperAlignRight___HCQFR .styles-module__buttonTooltip___Burd9::after {\\n left: auto;\\n right: 8px;\\n}\\n.styles-module__buttonWrapperAlignRight___HCQFR:hover .styles-module__buttonTooltip___Burd9 {\\n transform: translateX(calc(-100% + 12px)) scale(1);\\n}\\n\\n.styles-module__tooltipBelow___m6ats .styles-module__buttonWrapperAlignRight___HCQFR .styles-module__buttonTooltip___Burd9 {\\n transform: translateX(calc(-100% + 12px)) scale(0.95);\\n}\\n.styles-module__tooltipBelow___m6ats .styles-module__buttonWrapperAlignRight___HCQFR:hover .styles-module__buttonTooltip___Burd9 {\\n transform: translateX(calc(-100% + 12px)) scale(1);\\n}\\n\\n.styles-module__divider___c--s1 {\\n width: 1px;\\n height: 12px;\\n background: rgba(255, 255, 255, 0.15);\\n margin: 0 0.125rem;\\n}\\n\\n.styles-module__overlay___Q1O9y {\\n position: fixed;\\n inset: 0;\\n z-index: 99997;\\n pointer-events: none;\\n}\\n.styles-module__overlay___Q1O9y > * {\\n pointer-events: auto;\\n}\\n\\n.styles-module__hoverHighlight___ogakW {\\n position: fixed;\\n border: 2px solid rgba(60, 130, 247, 0.5);\\n border-radius: 4px;\\n pointer-events: none !important;\\n background: rgba(60, 130, 247, 0.04);\\n box-sizing: border-box;\\n will-change: opacity;\\n contain: layout style;\\n}\\n.styles-module__hoverHighlight___ogakW.styles-module__enter___WFIki {\\n animation: styles-module__hoverHighlightIn___6WYHY 0.12s ease-out forwards;\\n}\\n\\n.styles-module__multiSelectOutline___cSJ-m {\\n position: fixed;\\n border: 2px dashed rgba(52, 199, 89, 0.6);\\n border-radius: 4px;\\n pointer-events: none !important;\\n background: rgba(52, 199, 89, 0.05);\\n box-sizing: border-box;\\n will-change: opacity;\\n}\\n.styles-module__multiSelectOutline___cSJ-m.styles-module__enter___WFIki {\\n animation: styles-module__fadeIn___b9qmf 0.15s ease-out forwards;\\n}\\n.styles-module__multiSelectOutline___cSJ-m.styles-module__exit___fyOJ0 {\\n animation: styles-module__fadeOut___6Ut6- 0.15s ease-out forwards;\\n}\\n\\n.styles-module__singleSelectOutline___QhX-O {\\n position: fixed;\\n border: 2px solid rgba(60, 130, 247, 0.6);\\n border-radius: 4px;\\n pointer-events: none !important;\\n background: rgba(60, 130, 247, 0.05);\\n box-sizing: border-box;\\n will-change: opacity;\\n}\\n.styles-module__singleSelectOutline___QhX-O.styles-module__enter___WFIki {\\n animation: styles-module__fadeIn___b9qmf 0.15s ease-out forwards;\\n}\\n.styles-module__singleSelectOutline___QhX-O.styles-module__exit___fyOJ0 {\\n animation: styles-module__fadeOut___6Ut6- 0.15s ease-out forwards;\\n}\\n\\n.styles-module__hoverTooltip___bvLk7 {\\n position: fixed;\\n font-size: 0.6875rem;\\n font-weight: 500;\\n color: #fff;\\n background: rgba(0, 0, 0, 0.85);\\n padding: 0.35rem 0.6rem;\\n border-radius: 0.375rem;\\n pointer-events: none !important;\\n white-space: nowrap;\\n max-width: 280px;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.styles-module__hoverTooltip___bvLk7.styles-module__enter___WFIki {\\n animation: styles-module__hoverTooltipIn___FYGQx 0.1s ease-out forwards;\\n}\\n\\n.styles-module__hoverReactPath___gx1IJ {\\n font-size: 0.625rem;\\n color: rgba(255, 255, 255, 0.6);\\n margin-bottom: 0.15rem;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n\\n.styles-module__hoverElementName___QMLMl {\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n\\n.styles-module__markersLayer___-25j1 {\\n position: absolute;\\n top: 0;\\n left: 0;\\n right: 0;\\n height: 0;\\n z-index: 99998;\\n pointer-events: none;\\n}\\n.styles-module__markersLayer___-25j1 > * {\\n pointer-events: auto;\\n}\\n\\n.styles-module__fixedMarkersLayer___ffyX6 {\\n position: fixed;\\n top: 0;\\n left: 0;\\n right: 0;\\n bottom: 0;\\n z-index: 99998;\\n pointer-events: none;\\n}\\n.styles-module__fixedMarkersLayer___ffyX6 > * {\\n pointer-events: auto;\\n}\\n\\n.styles-module__marker___6sQrs {\\n position: absolute;\\n width: 22px;\\n height: 22px;\\n background: #3c82f7;\\n color: white;\\n border-radius: 50%;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n font-size: 0.6875rem;\\n font-weight: 600;\\n transform: translate(-50%, -50%) scale(1);\\n opacity: 1;\\n cursor: pointer;\\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2), inset 0 0 0 1px rgba(0, 0, 0, 0.04);\\n user-select: none;\\n will-change: transform, opacity;\\n contain: layout style;\\n z-index: 1;\\n}\\n.styles-module__marker___6sQrs:hover {\\n z-index: 2;\\n}\\n.styles-module__marker___6sQrs:not(.styles-module__enter___WFIki):not(.styles-module__exit___fyOJ0):not(.styles-module__clearing___FQ--7) {\\n transition: background-color 0.15s ease, transform 0.1s ease;\\n}\\n.styles-module__marker___6sQrs.styles-module__enter___WFIki {\\n animation: styles-module__markerIn___5FaAP 0.25s cubic-bezier(0.22, 1, 0.36, 1) both;\\n}\\n.styles-module__marker___6sQrs.styles-module__exit___fyOJ0 {\\n animation: styles-module__markerOut___GU5jX 0.2s ease-out both;\\n pointer-events: none;\\n}\\n.styles-module__marker___6sQrs.styles-module__clearing___FQ--7 {\\n animation: styles-module__markerOut___GU5jX 0.15s ease-out both;\\n pointer-events: none;\\n}\\n.styles-module__marker___6sQrs:not(.styles-module__enter___WFIki):not(.styles-module__exit___fyOJ0):not(.styles-module__clearing___FQ--7):hover {\\n transform: translate(-50%, -50%) scale(1.1);\\n}\\n.styles-module__marker___6sQrs.styles-module__pending___2IHLC {\\n position: fixed;\\n background: #3c82f7;\\n}\\n.styles-module__marker___6sQrs.styles-module__fixed___dBMHC {\\n position: fixed;\\n}\\n.styles-module__marker___6sQrs.styles-module__multiSelect___YWiuz {\\n background: #34c759;\\n width: 26px;\\n height: 26px;\\n border-radius: 6px;\\n font-size: 0.75rem;\\n}\\n.styles-module__marker___6sQrs.styles-module__multiSelect___YWiuz.styles-module__pending___2IHLC {\\n background: #34c759;\\n}\\n.styles-module__marker___6sQrs.styles-module__hovered___ZgXIy {\\n background: #ff3b30;\\n}\\n\\n.styles-module__renumber___nCTxD {\\n display: block;\\n animation: styles-module__renumberRoll___Wgbq3 0.2s ease-out;\\n}\\n\\n@keyframes styles-module__renumberRoll___Wgbq3 {\\n 0% {\\n transform: translateX(-40%);\\n opacity: 0;\\n }\\n 100% {\\n transform: translateX(0);\\n opacity: 1;\\n }\\n}\\n.styles-module__markerTooltip___aLJID {\\n position: absolute;\\n top: calc(100% + 10px);\\n left: 50%;\\n transform: translateX(-50%) scale(0.909);\\n z-index: 100002;\\n background: #1a1a1a;\\n padding: 8px 0.75rem;\\n border-radius: 0.75rem;\\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, sans-serif;\\n font-weight: 400;\\n color: #fff;\\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(255, 255, 255, 0.08);\\n min-width: 120px;\\n max-width: 200px;\\n pointer-events: none;\\n cursor: default;\\n}\\n.styles-module__markerTooltip___aLJID.styles-module__enter___WFIki {\\n animation: styles-module__tooltipIn___0N31w 0.1s ease-out forwards;\\n}\\n.styles-module__markerTooltip___aLJID.styles-module__exit___fyOJ0 {\\n animation: styles-module__tooltipOut___ToqlU 0.1s ease-out forwards;\\n}\\n\\n.styles-module__markerQuote___FHmrz {\\n display: block;\\n font-size: 12px;\\n font-style: italic;\\n color: rgba(255, 255, 255, 0.6);\\n margin-bottom: 0.3125rem;\\n line-height: 1.4;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n\\n.styles-module__markerNote___QkrrS {\\n display: block;\\n font-size: 13px;\\n font-weight: 400;\\n line-height: 1.4;\\n color: #fff;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n padding-bottom: 2px;\\n}\\n\\n.styles-module__markerHint___2iF-6 {\\n display: block;\\n font-size: 0.625rem;\\n font-weight: 400;\\n color: rgba(255, 255, 255, 0.6);\\n margin-top: 0.375rem;\\n white-space: nowrap;\\n}\\n\\n.styles-module__settingsPanel___OxX3Y {\\n position: absolute;\\n right: 5px;\\n bottom: calc(100% + 0.5rem);\\n z-index: 1;\\n overflow: hidden;\\n background: #1c1c1c;\\n border-radius: 1rem;\\n padding: 13px 0 16px;\\n min-width: 205px;\\n cursor: default;\\n opacity: 1;\\n box-shadow: 0 1px 8px rgba(0, 0, 0, 0.25), 0 0 0 1px rgba(0, 0, 0, 0.04);\\n transition: background 0.25s ease, box-shadow 0.25s ease;\\n}\\n.styles-module__settingsPanel___OxX3Y::before, .styles-module__settingsPanel___OxX3Y::after {\\n content: \\\"\\\";\\n position: absolute;\\n top: 0;\\n bottom: 0;\\n width: 16px;\\n z-index: 2;\\n pointer-events: none;\\n}\\n.styles-module__settingsPanel___OxX3Y::before {\\n left: 0;\\n background: linear-gradient(to right, #1c1c1c 0%, transparent 100%);\\n}\\n.styles-module__settingsPanel___OxX3Y::after {\\n right: 0;\\n background: linear-gradient(to left, #1c1c1c 0%, transparent 100%);\\n}\\n.styles-module__settingsPanel___OxX3Y .styles-module__settingsHeader___pwDY9,\\n.styles-module__settingsPanel___OxX3Y .styles-module__settingsBrand___0gJeM,\\n.styles-module__settingsPanel___OxX3Y .styles-module__settingsBrandSlash___uTG18,\\n.styles-module__settingsPanel___OxX3Y .styles-module__settingsVersion___TUcFq,\\n.styles-module__settingsPanel___OxX3Y .styles-module__settingsSection___m-YM2,\\n.styles-module__settingsPanel___OxX3Y .styles-module__settingsLabel___8UjfX,\\n.styles-module__settingsPanel___OxX3Y .styles-module__cycleButton___FMKfw,\\n.styles-module__settingsPanel___OxX3Y .styles-module__cycleDot___nPgLY,\\n.styles-module__settingsPanel___OxX3Y .styles-module__dropdownButton___16NPz,\\n.styles-module__settingsPanel___OxX3Y .styles-module__toggleLabel___Xm8Aa,\\n.styles-module__settingsPanel___OxX3Y .styles-module__customCheckbox___U39ax,\\n.styles-module__settingsPanel___OxX3Y .styles-module__sliderLabel___U8sPr,\\n.styles-module__settingsPanel___OxX3Y .styles-module__slider___GLdxp,\\n.styles-module__settingsPanel___OxX3Y .styles-module__helpIcon___xQg56,\\n.styles-module__settingsPanel___OxX3Y .styles-module__themeToggle___2rUjA {\\n transition: background 0.25s ease, color 0.25s ease, border-color 0.25s ease;\\n}\\n.styles-module__settingsPanel___OxX3Y.styles-module__enter___WFIki {\\n opacity: 1;\\n transform: translateY(0) scale(1);\\n filter: blur(0px);\\n transition: opacity 0.2s ease, transform 0.2s ease, filter 0.2s ease;\\n}\\n.styles-module__settingsPanel___OxX3Y.styles-module__exit___fyOJ0 {\\n opacity: 0;\\n transform: translateY(8px) scale(0.95);\\n filter: blur(5px);\\n pointer-events: none;\\n transition: opacity 0.1s ease, transform 0.1s ease, filter 0.1s ease;\\n}\\n.styles-module__settingsPanel___OxX3Y.styles-module__dark___ILIQf {\\n background: #1a1a1a;\\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(255, 255, 255, 0.08);\\n}\\n.styles-module__settingsPanel___OxX3Y.styles-module__dark___ILIQf .styles-module__settingsLabel___8UjfX {\\n color: rgba(255, 255, 255, 0.6);\\n}\\n.styles-module__settingsPanel___OxX3Y.styles-module__dark___ILIQf .styles-module__settingsOption___UNa12 {\\n color: rgba(255, 255, 255, 0.85);\\n}\\n.styles-module__settingsPanel___OxX3Y.styles-module__dark___ILIQf .styles-module__settingsOption___UNa12:hover {\\n background: rgba(255, 255, 255, 0.1);\\n}\\n.styles-module__settingsPanel___OxX3Y.styles-module__dark___ILIQf .styles-module__settingsOption___UNa12.styles-module__selected___OwRqP {\\n background: rgba(255, 255, 255, 0.15);\\n color: #fff;\\n}\\n.styles-module__settingsPanel___OxX3Y.styles-module__dark___ILIQf .styles-module__toggleLabel___Xm8Aa {\\n color: rgba(255, 255, 255, 0.85);\\n}\\n\\n.styles-module__settingsPanelContainer___Xksv8 {\\n overflow: visible;\\n position: relative;\\n display: flex;\\n padding: 0 1rem;\\n}\\n.styles-module__settingsPanelContainer___Xksv8.styles-module__transitioning___qxzCk {\\n overflow-x: clip;\\n overflow-y: visible;\\n}\\n\\n.styles-module__settingsPage___6YfHH {\\n min-width: 100%;\\n flex-shrink: 0;\\n transition: transform 0.35s cubic-bezier(0.32, 0.72, 0, 1), opacity 0.2s ease-out;\\n opacity: 1;\\n}\\n\\n.styles-module__settingsPage___6YfHH.styles-module__slideLeft___Ps01J {\\n transform: translateX(-100%);\\n opacity: 0;\\n}\\n\\n.styles-module__automationsPage___uvCq6 {\\n position: absolute;\\n top: 0;\\n left: 100%;\\n width: 100%;\\n height: 100%;\\n padding: 3px 1rem 0;\\n box-sizing: border-box;\\n display: flex;\\n flex-direction: column;\\n transition: transform 0.35s cubic-bezier(0.32, 0.72, 0, 1), opacity 0.25s ease-out 0.1s;\\n opacity: 0;\\n}\\n\\n.styles-module__automationsPage___uvCq6.styles-module__slideIn___4-qXe {\\n transform: translateX(-100%);\\n opacity: 1;\\n}\\n\\n.styles-module__settingsNavLink___wCzJt {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n width: 100%;\\n padding: 0;\\n border: none;\\n background: transparent;\\n font-family: inherit;\\n font-size: 0.8125rem;\\n font-weight: 400;\\n color: rgba(255, 255, 255, 0.5);\\n cursor: pointer;\\n transition: color 0.15s ease;\\n}\\n.styles-module__settingsNavLink___wCzJt:hover {\\n color: rgba(255, 255, 255, 0.9);\\n}\\n.styles-module__settingsNavLink___wCzJt.styles-module__light___r6n4Y {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n.styles-module__settingsNavLink___wCzJt.styles-module__light___r6n4Y:hover {\\n color: rgba(0, 0, 0, 0.8);\\n}\\n.styles-module__settingsNavLink___wCzJt svg {\\n color: rgba(255, 255, 255, 0.4);\\n transition: color 0.15s ease;\\n}\\n.styles-module__settingsNavLink___wCzJt:hover svg {\\n color: #fff;\\n}\\n.styles-module__settingsNavLink___wCzJt.styles-module__light___r6n4Y svg {\\n color: rgba(0, 0, 0, 0.25);\\n}\\n.styles-module__settingsNavLink___wCzJt.styles-module__light___r6n4Y:hover svg {\\n color: rgba(0, 0, 0, 0.8);\\n}\\n\\n.styles-module__settingsNavLinkRight___ZWwhj {\\n display: flex;\\n align-items: center;\\n gap: 6px;\\n}\\n\\n.styles-module__mcpNavIndicator___cl9pO {\\n width: 8px;\\n height: 8px;\\n border-radius: 50%;\\n flex-shrink: 0;\\n}\\n.styles-module__mcpNavIndicator___cl9pO.styles-module__connected___7c28g {\\n background: #34c759;\\n animation: styles-module__mcpPulse___uNggr 2.5s ease-in-out infinite;\\n}\\n.styles-module__mcpNavIndicator___cl9pO.styles-module__connecting___uo-CW {\\n background: #f5a623;\\n animation: styles-module__mcpPulse___uNggr 1.5s ease-in-out infinite;\\n}\\n\\n.styles-module__settingsBackButton___bIe2j {\\n display: flex;\\n align-items: center;\\n gap: 4px;\\n padding: 6px 0 12px 0;\\n margin: -6px 0 0.5rem 0;\\n border: none;\\n border-bottom: 1px solid rgba(255, 255, 255, 0.07);\\n border-radius: 0;\\n background: transparent;\\n font-family: inherit;\\n font-size: 0.8125rem;\\n font-weight: 500;\\n letter-spacing: -0.15px;\\n color: #fff;\\n cursor: pointer;\\n transition: transform 0.12s cubic-bezier(0.32, 0.72, 0, 1);\\n}\\n.styles-module__settingsBackButton___bIe2j svg {\\n opacity: 0.4;\\n flex-shrink: 0;\\n transition: opacity 0.15s ease, transform 0.18s cubic-bezier(0.32, 0.72, 0, 1);\\n}\\n.styles-module__settingsBackButton___bIe2j:hover svg {\\n opacity: 1;\\n}\\n.styles-module__settingsBackButton___bIe2j.styles-module__light___r6n4Y {\\n color: rgba(0, 0, 0, 0.85);\\n border-bottom-color: rgba(0, 0, 0, 0.08);\\n}\\n\\n.styles-module__automationHeader___InP0r {\\n display: flex;\\n align-items: center;\\n gap: 0.125rem;\\n font-size: 0.8125rem;\\n font-weight: 400;\\n color: #fff;\\n}\\n.styles-module__automationHeader___InP0r .styles-module__helpIcon___xQg56 svg {\\n transform: none;\\n}\\n.styles-module__automationHeader___InP0r.styles-module__light___r6n4Y {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n\\n.styles-module__automationDescription___NKlmo {\\n font-size: 0.6875rem;\\n font-weight: 300;\\n color: rgba(255, 255, 255, 0.5);\\n margin-top: 2px;\\n line-height: 14px;\\n}\\n.styles-module__automationDescription___NKlmo.styles-module__light___r6n4Y {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n\\n.styles-module__learnMoreLink___8xv-x {\\n color: rgba(255, 255, 255, 0.8);\\n text-decoration: underline dotted;\\n text-decoration-color: rgba(255, 255, 255, 0.2);\\n text-underline-offset: 2px;\\n transition: color 0.15s ease;\\n}\\n.styles-module__learnMoreLink___8xv-x:hover {\\n color: #fff;\\n}\\n.styles-module__learnMoreLink___8xv-x.styles-module__light___r6n4Y {\\n color: rgba(0, 0, 0, 0.6);\\n text-decoration-color: rgba(0, 0, 0, 0.2);\\n}\\n.styles-module__learnMoreLink___8xv-x.styles-module__light___r6n4Y:hover {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n\\n.styles-module__autoSendRow___UblX5 {\\n display: flex;\\n align-items: center;\\n gap: 8px;\\n}\\n\\n.styles-module__autoSendLabel___icDc2 {\\n font-size: 0.6875rem;\\n font-weight: 400;\\n color: rgba(255, 255, 255, 0.4);\\n transition: color 0.15s ease;\\n}\\n.styles-module__autoSendLabel___icDc2.styles-module__active___-zoN6 {\\n color: #66b8ff;\\n}\\n.styles-module__autoSendLabel___icDc2.styles-module__light___r6n4Y {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n.styles-module__autoSendLabel___icDc2.styles-module__light___r6n4Y.styles-module__active___-zoN6 {\\n color: #3c82f7;\\n}\\n\\n.styles-module__webhookUrlInput___2375C {\\n display: block;\\n width: 100%;\\n flex: 1;\\n min-height: 60px;\\n box-sizing: border-box;\\n margin-top: 11px;\\n padding: 8px 10px;\\n border: 1px solid rgba(255, 255, 255, 0.1);\\n border-radius: 6px;\\n background: rgba(255, 255, 255, 0.03);\\n font-family: inherit;\\n font-size: 0.75rem;\\n font-weight: 400;\\n color: #fff;\\n outline: none;\\n resize: none;\\n cursor: text !important;\\n user-select: text;\\n transition: border-color 0.15s ease, background 0.15s ease, box-shadow 0.15s ease;\\n}\\n.styles-module__webhookUrlInput___2375C::placeholder {\\n color: rgba(255, 255, 255, 0.3);\\n}\\n.styles-module__webhookUrlInput___2375C:focus {\\n border-color: rgba(255, 255, 255, 0.3);\\n background: rgba(255, 255, 255, 0.08);\\n}\\n.styles-module__webhookUrlInput___2375C.styles-module__light___r6n4Y {\\n border-color: rgba(0, 0, 0, 0.1);\\n background: rgba(0, 0, 0, 0.03);\\n color: rgba(0, 0, 0, 0.85);\\n}\\n.styles-module__webhookUrlInput___2375C.styles-module__light___r6n4Y::placeholder {\\n color: rgba(0, 0, 0, 0.3);\\n}\\n.styles-module__webhookUrlInput___2375C.styles-module__light___r6n4Y:focus {\\n border-color: rgba(0, 0, 0, 0.25);\\n background: rgba(0, 0, 0, 0.05);\\n}\\n\\n.styles-module__settingsHeader___pwDY9 {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n min-height: 24px;\\n margin-bottom: 0.5rem;\\n padding-bottom: 9px;\\n border-bottom: 1px solid rgba(255, 255, 255, 0.07);\\n}\\n\\n.styles-module__settingsBrand___0gJeM {\\n font-size: 0.8125rem;\\n font-weight: 600;\\n letter-spacing: -0.0094em;\\n color: #fff;\\n}\\n\\n.styles-module__settingsBrandSlash___uTG18 {\\n color: rgba(255, 255, 255, 0.5);\\n}\\n\\n.styles-module__settingsVersion___TUcFq {\\n font-size: 11px;\\n font-weight: 400;\\n color: rgba(255, 255, 255, 0.4);\\n margin-left: auto;\\n letter-spacing: -0.0094em;\\n}\\n\\n.styles-module__settingsSection___m-YM2 + .styles-module__settingsSection___m-YM2 {\\n margin-top: 0.5rem;\\n padding-top: 0.5rem;\\n border-top: 1px solid rgba(255, 255, 255, 0.07);\\n}\\n.styles-module__settingsSection___m-YM2.styles-module__settingsSectionExtraPadding___jdhFV {\\n padding-top: calc(0.5rem + 4px);\\n}\\n\\n.styles-module__settingsSectionGrow___h-5HZ {\\n flex: 1;\\n display: flex;\\n flex-direction: column;\\n}\\n\\n.styles-module__settingsRow___3sdhc {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n min-height: 24px;\\n}\\n.styles-module__settingsRow___3sdhc.styles-module__settingsRowMarginTop___zA0Sp {\\n margin-top: 8px;\\n}\\n\\n.styles-module__dropdownContainer___BVnxe {\\n position: relative;\\n}\\n\\n.styles-module__dropdownButton___16NPz {\\n display: flex;\\n align-items: center;\\n gap: 0.5rem;\\n padding: 0.25rem 0.5rem;\\n border: none;\\n border-radius: 0.375rem;\\n background: transparent;\\n font-size: 0.8125rem;\\n font-weight: 600;\\n color: #fff;\\n cursor: pointer;\\n transition: background-color 0.15s ease, color 0.15s ease;\\n letter-spacing: -0.0094em;\\n}\\n.styles-module__dropdownButton___16NPz:hover {\\n background: rgba(255, 255, 255, 0.08);\\n}\\n.styles-module__dropdownButton___16NPz svg {\\n opacity: 0.6;\\n}\\n\\n.styles-module__cycleButton___FMKfw {\\n display: flex;\\n align-items: center;\\n gap: 0.5rem;\\n padding: 0;\\n border: none;\\n background: transparent;\\n font-size: 0.8125rem;\\n font-weight: 500;\\n color: #fff;\\n cursor: pointer;\\n letter-spacing: -0.0094em;\\n}\\n.styles-module__cycleButton___FMKfw.styles-module__light___r6n4Y {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n.styles-module__cycleButton___FMKfw:disabled {\\n opacity: 0.35;\\n cursor: not-allowed;\\n}\\n\\n.styles-module__settingsRowDisabled___EgS0V .styles-module__settingsLabel___8UjfX {\\n color: rgba(255, 255, 255, 0.2);\\n}\\n.styles-module__settingsRowDisabled___EgS0V .styles-module__settingsLabel___8UjfX.styles-module__light___r6n4Y {\\n color: rgba(0, 0, 0, 0.2);\\n}\\n.styles-module__settingsRowDisabled___EgS0V .styles-module__toggleSwitch___l4Ygm {\\n opacity: 0.4;\\n cursor: not-allowed;\\n}\\n\\n@keyframes styles-module__cycleTextIn___Q6zJf {\\n 0% {\\n opacity: 0;\\n transform: translateY(-6px);\\n }\\n 100% {\\n opacity: 1;\\n transform: translateY(0);\\n }\\n}\\n.styles-module__cycleButtonText___fD1LR {\\n display: inline-block;\\n animation: styles-module__cycleTextIn___Q6zJf 0.2s ease-out;\\n}\\n\\n.styles-module__cycleDots___LWuoQ {\\n display: flex;\\n flex-direction: column;\\n gap: 2px;\\n}\\n\\n.styles-module__cycleDot___nPgLY {\\n width: 3px;\\n height: 3px;\\n border-radius: 50%;\\n background: rgba(255, 255, 255, 0.3);\\n transform: scale(0.667);\\n transition: background-color 0.25s ease-out, transform 0.25s ease-out;\\n}\\n.styles-module__cycleDot___nPgLY.styles-module__active___-zoN6 {\\n background: #fff;\\n transform: scale(1);\\n}\\n.styles-module__cycleDot___nPgLY.styles-module__light___r6n4Y {\\n background: rgba(0, 0, 0, 0.2);\\n}\\n.styles-module__cycleDot___nPgLY.styles-module__light___r6n4Y.styles-module__active___-zoN6 {\\n background: rgba(0, 0, 0, 0.7);\\n}\\n\\n.styles-module__dropdownMenu___k73ER {\\n position: absolute;\\n right: 0;\\n top: calc(100% + 0.25rem);\\n background: #1a1a1a;\\n border-radius: 0.5rem;\\n padding: 0.25rem;\\n min-width: 120px;\\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(255, 255, 255, 0.1);\\n z-index: 10;\\n animation: styles-module__scaleIn___c-r1K 0.15s ease-out;\\n}\\n\\n.styles-module__dropdownItem___ylsLj {\\n width: 100%;\\n display: flex;\\n align-items: center;\\n padding: 0.5rem 0.625rem;\\n border: none;\\n border-radius: 0.375rem;\\n background: transparent;\\n font-size: 0.8125rem;\\n font-weight: 500;\\n color: rgba(255, 255, 255, 0.85);\\n cursor: pointer;\\n text-align: left;\\n transition: background-color 0.15s ease, color 0.15s ease;\\n letter-spacing: -0.0094em;\\n}\\n.styles-module__dropdownItem___ylsLj:hover {\\n background: rgba(255, 255, 255, 0.08);\\n}\\n.styles-module__dropdownItem___ylsLj.styles-module__selected___OwRqP {\\n background: rgba(255, 255, 255, 0.12);\\n color: #fff;\\n font-weight: 600;\\n}\\n\\n.styles-module__settingsLabel___8UjfX {\\n font-size: 0.8125rem;\\n font-weight: 400;\\n letter-spacing: -0.0094em;\\n color: rgba(255, 255, 255, 0.5);\\n display: flex;\\n align-items: center;\\n gap: 0.125rem;\\n}\\n.styles-module__settingsLabel___8UjfX.styles-module__light___r6n4Y {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n\\n.styles-module__settingsLabelMarker___ewdtV {\\n padding-top: 3px;\\n margin-bottom: 10px;\\n}\\n\\n.styles-module__settingsOptions___LyrBA {\\n display: flex;\\n gap: 0.25rem;\\n}\\n\\n.styles-module__settingsOption___UNa12 {\\n flex: 1;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n gap: 0.25rem;\\n padding: 0.375rem 0.5rem;\\n border: none;\\n border-radius: 0.375rem;\\n background: transparent;\\n font-size: 0.6875rem;\\n font-weight: 500;\\n color: rgba(0, 0, 0, 0.7);\\n cursor: pointer;\\n transition: background-color 0.15s ease, color 0.15s ease;\\n}\\n.styles-module__settingsOption___UNa12:hover {\\n background: rgba(0, 0, 0, 0.05);\\n}\\n.styles-module__settingsOption___UNa12.styles-module__selected___OwRqP {\\n background: rgba(60, 130, 247, 0.15);\\n color: #3c82f7;\\n}\\n\\n.styles-module__sliderContainer___ducXj {\\n display: flex;\\n flex-direction: column;\\n gap: 0.5rem;\\n}\\n\\n.styles-module__slider___GLdxp {\\n -webkit-appearance: none;\\n appearance: none;\\n width: 100%;\\n height: 4px;\\n background: rgba(255, 255, 255, 0.15);\\n border-radius: 2px;\\n outline: none;\\n cursor: pointer;\\n}\\n.styles-module__slider___GLdxp::-webkit-slider-thumb {\\n -webkit-appearance: none;\\n appearance: none;\\n width: 14px;\\n height: 14px;\\n background: white;\\n border-radius: 50%;\\n cursor: pointer;\\n transition: transform 0.15s ease, box-shadow 0.15s ease;\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);\\n}\\n.styles-module__slider___GLdxp::-moz-range-thumb {\\n width: 14px;\\n height: 14px;\\n background: white;\\n border: none;\\n border-radius: 50%;\\n cursor: pointer;\\n transition: transform 0.15s ease, box-shadow 0.15s ease;\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);\\n}\\n.styles-module__slider___GLdxp:hover::-webkit-slider-thumb {\\n transform: scale(1.15);\\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.4);\\n}\\n.styles-module__slider___GLdxp:hover::-moz-range-thumb {\\n transform: scale(1.15);\\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.4);\\n}\\n\\n.styles-module__sliderLabels___FhLDB {\\n display: flex;\\n justify-content: space-between;\\n}\\n\\n.styles-module__sliderLabel___U8sPr {\\n font-size: 0.625rem;\\n font-weight: 500;\\n color: rgba(255, 255, 255, 0.4);\\n cursor: pointer;\\n transition: color 0.15s ease;\\n}\\n.styles-module__sliderLabel___U8sPr:hover {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.styles-module__sliderLabel___U8sPr.styles-module__active___-zoN6 {\\n color: rgba(255, 255, 255, 0.9);\\n}\\n\\n.styles-module__colorOptions___iHCNX {\\n display: flex;\\n gap: 0.5rem;\\n margin-top: 0.375rem;\\n margin-bottom: 1px;\\n}\\n\\n.styles-module__colorOption___IodiY {\\n display: block;\\n width: 20px;\\n height: 20px;\\n border-radius: 50%;\\n border: 2px solid transparent;\\n cursor: pointer;\\n transition: transform 0.2s cubic-bezier(0.25, 1, 0.5, 1);\\n}\\n.styles-module__colorOption___IodiY:hover {\\n transform: scale(1.15);\\n}\\n.styles-module__colorOption___IodiY.styles-module__selected___OwRqP {\\n transform: scale(0.83);\\n}\\n\\n.styles-module__colorOptionRing___U2xpo {\\n display: flex;\\n width: 24px;\\n height: 24px;\\n border: 2px solid transparent;\\n border-radius: 50%;\\n transition: border-color 0.3s ease;\\n}\\n.styles-module__settingsToggle___fBrFn {\\n display: flex;\\n align-items: center;\\n gap: 0.5rem;\\n cursor: pointer;\\n}\\n.styles-module__settingsToggle___fBrFn + .styles-module__settingsToggle___fBrFn {\\n margin-top: calc(0.5rem + 6px);\\n}\\n.styles-module__settingsToggle___fBrFn input[type=checkbox] {\\n position: absolute;\\n opacity: 0;\\n width: 0;\\n height: 0;\\n}\\n.styles-module__settingsToggle___fBrFn.styles-module__settingsToggleMarginBottom___MZUyF {\\n margin-bottom: calc(0.5rem + 6px);\\n}\\n\\n.styles-module__customCheckbox___U39ax {\\n position: relative;\\n width: 14px;\\n height: 14px;\\n border: 1px solid rgba(255, 255, 255, 0.2);\\n border-radius: 4px;\\n background: rgba(255, 255, 255, 0.05);\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n flex-shrink: 0;\\n transition: background 0.25s ease, border-color 0.25s ease;\\n}\\n.styles-module__customCheckbox___U39ax svg {\\n color: #1a1a1a;\\n opacity: 1;\\n transition: opacity 0.15s ease;\\n}\\ninput[type=checkbox]:checked + .styles-module__customCheckbox___U39ax {\\n border-color: rgba(255, 255, 255, 0.3);\\n background: rgb(255, 255, 255);\\n}\\n.styles-module__customCheckbox___U39ax.styles-module__light___r6n4Y {\\n border: 1px solid rgba(0, 0, 0, 0.15);\\n background: #fff;\\n}\\n.styles-module__customCheckbox___U39ax.styles-module__light___r6n4Y.styles-module__checked___mnZLo {\\n border-color: #1a1a1a;\\n background: #1a1a1a;\\n}\\n.styles-module__customCheckbox___U39ax.styles-module__light___r6n4Y.styles-module__checked___mnZLo svg {\\n color: #fff;\\n}\\n\\n.styles-module__toggleLabel___Xm8Aa {\\n font-size: 0.8125rem;\\n font-weight: 400;\\n color: rgba(255, 255, 255, 0.5);\\n letter-spacing: -0.0094em;\\n display: flex;\\n align-items: center;\\n gap: 0.25rem;\\n}\\n.styles-module__toggleLabel___Xm8Aa.styles-module__light___r6n4Y {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n\\n.styles-module__toggleSwitch___l4Ygm {\\n position: relative;\\n display: inline-block;\\n width: 24px;\\n height: 16px;\\n flex-shrink: 0;\\n cursor: pointer;\\n transition: opacity 0.15s ease;\\n}\\n.styles-module__toggleSwitch___l4Ygm input {\\n opacity: 0;\\n width: 0;\\n height: 0;\\n}\\n.styles-module__toggleSwitch___l4Ygm input:checked + .styles-module__toggleSlider___wprIn {\\n background: #3c82f7;\\n}\\n.styles-module__toggleSwitch___l4Ygm input:checked + .styles-module__toggleSlider___wprIn::before {\\n transform: translateX(8px);\\n}\\n.styles-module__toggleSwitch___l4Ygm.styles-module__disabled___332Jw {\\n opacity: 0.4;\\n pointer-events: none;\\n}\\n.styles-module__toggleSwitch___l4Ygm.styles-module__disabled___332Jw .styles-module__toggleSlider___wprIn {\\n cursor: not-allowed;\\n}\\n\\n.styles-module__toggleSlider___wprIn {\\n position: absolute;\\n cursor: pointer;\\n inset: 0;\\n border-radius: 16px;\\n background: #484848;\\n}\\n.styles-module__light___r6n4Y .styles-module__toggleSlider___wprIn {\\n background: #dddddd;\\n}\\n.styles-module__toggleSlider___wprIn::before {\\n content: \\\"\\\";\\n position: absolute;\\n height: 12px;\\n width: 12px;\\n left: 2px;\\n bottom: 2px;\\n background: white;\\n border-radius: 50%;\\n transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);\\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);\\n}\\n\\n@keyframes styles-module__mcpPulse___uNggr {\\n 0% {\\n box-shadow: 0 0 0 0 rgba(52, 199, 89, 0.5);\\n }\\n 70% {\\n box-shadow: 0 0 0 6px rgba(52, 199, 89, 0);\\n }\\n 100% {\\n box-shadow: 0 0 0 0 rgba(52, 199, 89, 0);\\n }\\n}\\n@keyframes styles-module__mcpPulseError___fov9B {\\n 0% {\\n box-shadow: 0 0 0 0 rgba(255, 59, 48, 0.5);\\n }\\n 70% {\\n box-shadow: 0 0 0 6px rgba(255, 59, 48, 0);\\n }\\n 100% {\\n box-shadow: 0 0 0 0 rgba(255, 59, 48, 0);\\n }\\n}\\n.styles-module__mcpStatusDot___ibgkc {\\n width: 8px;\\n height: 8px;\\n border-radius: 50%;\\n flex-shrink: 0;\\n}\\n.styles-module__mcpStatusDot___ibgkc.styles-module__connecting___uo-CW {\\n background: #f5a623;\\n animation: styles-module__mcpPulse___uNggr 1.5s infinite;\\n}\\n.styles-module__mcpStatusDot___ibgkc.styles-module__connected___7c28g {\\n background: #34c759;\\n animation: styles-module__mcpPulse___uNggr 2.5s ease-in-out infinite;\\n}\\n.styles-module__mcpStatusDot___ibgkc.styles-module__disconnected___cHPxR {\\n background: #ff3b30;\\n animation: styles-module__mcpPulseError___fov9B 2s infinite;\\n}\\n\\n.styles-module__helpIcon___xQg56 {\\n position: relative;\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n cursor: help;\\n margin-left: 0;\\n}\\n.styles-module__helpIcon___xQg56 svg {\\n display: block;\\n transform: translateY(1px);\\n color: rgba(255, 255, 255, 0.2);\\n transition: color 0.15s ease;\\n}\\n.styles-module__helpIcon___xQg56:hover svg {\\n color: rgba(255, 255, 255, 0.5);\\n}\\n.styles-module__helpIcon___xQg56.styles-module__helpIconNudgeDown___0cqpM svg {\\n transform: translateY(1px);\\n}\\n.styles-module__helpIcon___xQg56.styles-module__helpIconNoNudge___abogC svg {\\n transform: translateY(0.5px);\\n}\\n.styles-module__helpIcon___xQg56.styles-module__helpIconNudge1-5___DM2TQ svg {\\n transform: translateY(1.5px);\\n}\\n.styles-module__helpIcon___xQg56.styles-module__helpIconNudge2___TfWgC svg {\\n transform: translateY(2px);\\n}\\n\\n.styles-module__drawCanvas___7cG9U {\\n position: fixed;\\n inset: 0;\\n z-index: 99996;\\n pointer-events: none !important;\\n}\\n.styles-module__drawCanvas___7cG9U.styles-module__active___-zoN6 {\\n pointer-events: auto !important;\\n cursor: crosshair !important;\\n}\\n.styles-module__drawCanvas___7cG9U.styles-module__active___-zoN6[data-stroke-hover] {\\n cursor: pointer !important;\\n}\\n\\n.styles-module__dragSelection___kZLq2 {\\n position: fixed;\\n top: 0;\\n left: 0;\\n border: 2px solid rgba(52, 199, 89, 0.6);\\n border-radius: 4px;\\n background: rgba(52, 199, 89, 0.08);\\n pointer-events: none;\\n z-index: 99997;\\n will-change: transform, width, height;\\n contain: layout style;\\n}\\n\\n.styles-module__dragCount___KM90j {\\n position: absolute;\\n top: 50%;\\n left: 50%;\\n transform: translate(-50%, -50%);\\n background: #34c759;\\n color: white;\\n font-size: 0.875rem;\\n font-weight: 600;\\n padding: 0.25rem 0.5rem;\\n border-radius: 1rem;\\n min-width: 1.5rem;\\n text-align: center;\\n}\\n\\n.styles-module__highlightsContainer___-0xzG {\\n position: fixed;\\n top: 0;\\n left: 0;\\n pointer-events: none;\\n z-index: 99996;\\n}\\n\\n.styles-module__selectedElementHighlight___fyVlI {\\n position: fixed;\\n top: 0;\\n left: 0;\\n border: 2px solid rgba(52, 199, 89, 0.5);\\n border-radius: 4px;\\n background: rgba(52, 199, 89, 0.06);\\n pointer-events: none;\\n will-change: transform, width, height;\\n contain: layout style;\\n}\\n\\n.styles-module__light___r6n4Y.styles-module__toolbarContainer___dIhma {\\n background: #fff;\\n color: rgba(0, 0, 0, 0.85);\\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08), 0 4px 16px rgba(0, 0, 0, 0.06), 0 0 0 1px rgba(0, 0, 0, 0.04);\\n}\\n.styles-module__light___r6n4Y.styles-module__toolbarContainer___dIhma.styles-module__collapsed___Rydsn:hover {\\n background: #f5f5f5;\\n}\\n.styles-module__light___r6n4Y.styles-module__controlButton___8Q0jc {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n.styles-module__light___r6n4Y.styles-module__controlButton___8Q0jc:hover:not(:disabled):not([data-active=true]):not([data-failed=true]):not([data-auto-sync=true]):not([data-error=true]):not([data-no-hover=true]) {\\n background: rgba(0, 0, 0, 0.06);\\n color: rgba(0, 0, 0, 0.85);\\n}\\n.styles-module__light___r6n4Y.styles-module__controlButton___8Q0jc[data-active=true] {\\n color: #3c82f7;\\n background: rgba(60, 130, 247, 0.15);\\n}\\n.styles-module__light___r6n4Y.styles-module__controlButton___8Q0jc[data-error=true] {\\n color: #ff3b30;\\n background: rgba(255, 59, 48, 0.15);\\n}\\n.styles-module__light___r6n4Y.styles-module__controlButton___8Q0jc[data-danger]:hover:not(:disabled):not([data-active=true]):not([data-failed=true]) {\\n background: rgba(255, 59, 48, 0.15);\\n color: #ff3b30;\\n}\\n.styles-module__light___r6n4Y.styles-module__controlButton___8Q0jc[data-auto-sync=true] {\\n color: #34c759;\\n background: transparent;\\n}\\n.styles-module__light___r6n4Y.styles-module__controlButton___8Q0jc[data-failed=true] {\\n color: #ff3b30;\\n background: rgba(255, 59, 48, 0.15);\\n}\\n.styles-module__light___r6n4Y.styles-module__buttonTooltip___Burd9 {\\n background: #fff;\\n color: rgba(0, 0, 0, 0.85);\\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08), 0 4px 16px rgba(0, 0, 0, 0.06), 0 0 0 1px rgba(0, 0, 0, 0.04);\\n}\\n.styles-module__light___r6n4Y.styles-module__buttonTooltip___Burd9::after {\\n background: #fff;\\n}\\n.styles-module__light___r6n4Y.styles-module__divider___c--s1 {\\n background: rgba(0, 0, 0, 0.1);\\n}\\n.styles-module__light___r6n4Y.styles-module__markerTooltip___aLJID {\\n background: #fff;\\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(0, 0, 0, 0.06);\\n}\\n.styles-module__light___r6n4Y.styles-module__markerTooltip___aLJID .styles-module__markerQuote___FHmrz {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n.styles-module__light___r6n4Y.styles-module__markerTooltip___aLJID .styles-module__markerNote___QkrrS {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n.styles-module__light___r6n4Y.styles-module__markerTooltip___aLJID .styles-module__markerHint___2iF-6 {\\n color: rgba(0, 0, 0, 0.35);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y {\\n background: #fff;\\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08), 0 4px 16px rgba(0, 0, 0, 0.06), 0 0 0 1px rgba(0, 0, 0, 0.04);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y::before {\\n background: linear-gradient(to right, #fff 0%, transparent 100%);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y::after {\\n background: linear-gradient(to left, #fff 0%, transparent 100%);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__settingsHeader___pwDY9 {\\n border-bottom-color: rgba(0, 0, 0, 0.08);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__settingsBrand___0gJeM {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__settingsBrandSlash___uTG18 {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__settingsVersion___TUcFq {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__settingsSection___m-YM2 {\\n border-top-color: rgba(0, 0, 0, 0.08);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__settingsLabel___8UjfX {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__cycleButton___FMKfw {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__cycleDot___nPgLY {\\n background: rgba(0, 0, 0, 0.2);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__cycleDot___nPgLY.styles-module__active___-zoN6 {\\n background: rgba(0, 0, 0, 0.7);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__dropdownButton___16NPz {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__dropdownButton___16NPz:hover {\\n background: rgba(0, 0, 0, 0.05);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__toggleLabel___Xm8Aa {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__customCheckbox___U39ax {\\n border: 1px solid rgba(0, 0, 0, 0.15);\\n background: #fff;\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__customCheckbox___U39ax.styles-module__checked___mnZLo {\\n border-color: #1a1a1a;\\n background: #1a1a1a;\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__customCheckbox___U39ax.styles-module__checked___mnZLo svg {\\n color: #fff;\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__sliderLabel___U8sPr {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__sliderLabel___U8sPr:hover {\\n color: rgba(0, 0, 0, 0.7);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__sliderLabel___U8sPr.styles-module__active___-zoN6 {\\n color: rgba(0, 0, 0, 0.9);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__slider___GLdxp {\\n background: rgba(0, 0, 0, 0.1);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__slider___GLdxp::-webkit-slider-thumb {\\n background: #1a1a1a;\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__slider___GLdxp::-moz-range-thumb {\\n background: #1a1a1a;\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__helpIcon___xQg56 svg {\\n color: rgba(0, 0, 0, 0.2);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__helpIcon___xQg56:hover svg {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n\\n.styles-module__themeToggle___2rUjA {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 22px;\\n height: 22px;\\n margin-left: 0.5rem;\\n border: none;\\n border-radius: 6px;\\n background: transparent;\\n color: rgba(255, 255, 255, 0.4);\\n cursor: pointer;\\n transition: background-color 0.15s ease, color 0.15s ease;\\n}\\n.styles-module__themeToggle___2rUjA:hover {\\n background: rgba(255, 255, 255, 0.1);\\n color: rgba(255, 255, 255, 0.8);\\n}\\n.styles-module__light___r6n4Y .styles-module__themeToggle___2rUjA {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n.styles-module__light___r6n4Y .styles-module__themeToggle___2rUjA:hover {\\n background: rgba(0, 0, 0, 0.06);\\n color: rgba(0, 0, 0, 0.7);\\n}\\n\\n.styles-module__themeIconWrapper___LsJIM {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n position: relative;\\n width: 20px;\\n height: 20px;\\n}\\n\\n.styles-module__themeIcon___lCCmo {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n animation: styles-module__themeIconIn___TU6ML 0.35s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;\\n}\\n\\n@keyframes styles-module__themeIconIn___TU6ML {\\n 0% {\\n opacity: 0;\\n transform: scale(0.8) rotate(-30deg);\\n }\\n 100% {\\n opacity: 1;\\n transform: scale(1) rotate(0deg);\\n }\\n}\";\nconst classNames = {\"toolbar\":\"styles-module__toolbar___wNsdK\",\"toolbarContainer\":\"styles-module__toolbarContainer___dIhma\",\"dragging\":\"styles-module__dragging___xrolZ\",\"entrance\":\"styles-module__entrance___sgHd8\",\"toolbarEnter\":\"styles-module__toolbarEnter___u8RRu\",\"collapsed\":\"styles-module__collapsed___Rydsn\",\"expanded\":\"styles-module__expanded___ofKPx\",\"serverConnected\":\"styles-module__serverConnected___Gfbou\",\"toggleContent\":\"styles-module__toggleContent___0yfyP\",\"visible\":\"styles-module__visible___KHwEW\",\"hidden\":\"styles-module__hidden___Ae8H4\",\"controlsContent\":\"styles-module__controlsContent___9GJWU\",\"badge\":\"styles-module__badge___2XsgF\",\"fadeOut\":\"styles-module__fadeOut___6Ut6-\",\"badgeEnter\":\"styles-module__badgeEnter___mVQLj\",\"controlButton\":\"styles-module__controlButton___8Q0jc\",\"statusShowing\":\"styles-module__statusShowing___te6iu\",\"buttonBadge\":\"styles-module__buttonBadge___NeFWb\",\"light\":\"styles-module__light___r6n4Y\",\"mcpIndicator\":\"styles-module__mcpIndicator___zGJeL\",\"connected\":\"styles-module__connected___7c28g\",\"mcpIndicatorPulseConnected\":\"styles-module__mcpIndicatorPulseConnected___EDodZ\",\"connecting\":\"styles-module__connecting___uo-CW\",\"mcpIndicatorPulseConnecting\":\"styles-module__mcpIndicatorPulseConnecting___cCYte\",\"connectionIndicatorWrapper\":\"styles-module__connectionIndicatorWrapper___L-e-3\",\"connectionIndicator\":\"styles-module__connectionIndicator___afk9p\",\"connectionIndicatorVisible\":\"styles-module__connectionIndicatorVisible___C-i5B\",\"connectionIndicatorConnected\":\"styles-module__connectionIndicatorConnected___IY8pR\",\"connectionPulse\":\"styles-module__connectionPulse___-Zycw\",\"connectionIndicatorDisconnected\":\"styles-module__connectionIndicatorDisconnected___kmpaZ\",\"connectionIndicatorConnecting\":\"styles-module__connectionIndicatorConnecting___QmSLH\",\"buttonWrapper\":\"styles-module__buttonWrapper___rBcdv\",\"buttonTooltip\":\"styles-module__buttonTooltip___Burd9\",\"sendButtonWrapper\":\"styles-module__sendButtonWrapper___UUxG6\",\"sendButtonVisible\":\"styles-module__sendButtonVisible___WPSQU\",\"shortcut\":\"styles-module__shortcut___lEAQk\",\"tooltipBelow\":\"styles-module__tooltipBelow___m6ats\",\"tooltipsHidden\":\"styles-module__tooltipsHidden___VtLJG\",\"tooltipVisible\":\"styles-module__tooltipVisible___0jcCv\",\"buttonWrapperAlignLeft\":\"styles-module__buttonWrapperAlignLeft___myzIp\",\"buttonWrapperAlignRight\":\"styles-module__buttonWrapperAlignRight___HCQFR\",\"divider\":\"styles-module__divider___c--s1\",\"overlay\":\"styles-module__overlay___Q1O9y\",\"hoverHighlight\":\"styles-module__hoverHighlight___ogakW\",\"enter\":\"styles-module__enter___WFIki\",\"hoverHighlightIn\":\"styles-module__hoverHighlightIn___6WYHY\",\"multiSelectOutline\":\"styles-module__multiSelectOutline___cSJ-m\",\"fadeIn\":\"styles-module__fadeIn___b9qmf\",\"exit\":\"styles-module__exit___fyOJ0\",\"singleSelectOutline\":\"styles-module__singleSelectOutline___QhX-O\",\"hoverTooltip\":\"styles-module__hoverTooltip___bvLk7\",\"hoverTooltipIn\":\"styles-module__hoverTooltipIn___FYGQx\",\"hoverReactPath\":\"styles-module__hoverReactPath___gx1IJ\",\"hoverElementName\":\"styles-module__hoverElementName___QMLMl\",\"markersLayer\":\"styles-module__markersLayer___-25j1\",\"fixedMarkersLayer\":\"styles-module__fixedMarkersLayer___ffyX6\",\"marker\":\"styles-module__marker___6sQrs\",\"clearing\":\"styles-module__clearing___FQ--7\",\"markerIn\":\"styles-module__markerIn___5FaAP\",\"markerOut\":\"styles-module__markerOut___GU5jX\",\"pending\":\"styles-module__pending___2IHLC\",\"fixed\":\"styles-module__fixed___dBMHC\",\"multiSelect\":\"styles-module__multiSelect___YWiuz\",\"hovered\":\"styles-module__hovered___ZgXIy\",\"renumber\":\"styles-module__renumber___nCTxD\",\"renumberRoll\":\"styles-module__renumberRoll___Wgbq3\",\"markerTooltip\":\"styles-module__markerTooltip___aLJID\",\"tooltipIn\":\"styles-module__tooltipIn___0N31w\",\"tooltipOut\":\"styles-module__tooltipOut___ToqlU\",\"markerQuote\":\"styles-module__markerQuote___FHmrz\",\"markerNote\":\"styles-module__markerNote___QkrrS\",\"markerHint\":\"styles-module__markerHint___2iF-6\",\"settingsPanel\":\"styles-module__settingsPanel___OxX3Y\",\"settingsHeader\":\"styles-module__settingsHeader___pwDY9\",\"settingsBrand\":\"styles-module__settingsBrand___0gJeM\",\"settingsBrandSlash\":\"styles-module__settingsBrandSlash___uTG18\",\"settingsVersion\":\"styles-module__settingsVersion___TUcFq\",\"settingsSection\":\"styles-module__settingsSection___m-YM2\",\"settingsLabel\":\"styles-module__settingsLabel___8UjfX\",\"cycleButton\":\"styles-module__cycleButton___FMKfw\",\"cycleDot\":\"styles-module__cycleDot___nPgLY\",\"dropdownButton\":\"styles-module__dropdownButton___16NPz\",\"toggleLabel\":\"styles-module__toggleLabel___Xm8Aa\",\"customCheckbox\":\"styles-module__customCheckbox___U39ax\",\"sliderLabel\":\"styles-module__sliderLabel___U8sPr\",\"slider\":\"styles-module__slider___GLdxp\",\"helpIcon\":\"styles-module__helpIcon___xQg56\",\"themeToggle\":\"styles-module__themeToggle___2rUjA\",\"dark\":\"styles-module__dark___ILIQf\",\"settingsOption\":\"styles-module__settingsOption___UNa12\",\"selected\":\"styles-module__selected___OwRqP\",\"settingsPanelContainer\":\"styles-module__settingsPanelContainer___Xksv8\",\"transitioning\":\"styles-module__transitioning___qxzCk\",\"settingsPage\":\"styles-module__settingsPage___6YfHH\",\"slideLeft\":\"styles-module__slideLeft___Ps01J\",\"automationsPage\":\"styles-module__automationsPage___uvCq6\",\"slideIn\":\"styles-module__slideIn___4-qXe\",\"settingsNavLink\":\"styles-module__settingsNavLink___wCzJt\",\"settingsNavLinkRight\":\"styles-module__settingsNavLinkRight___ZWwhj\",\"mcpNavIndicator\":\"styles-module__mcpNavIndicator___cl9pO\",\"mcpPulse\":\"styles-module__mcpPulse___uNggr\",\"settingsBackButton\":\"styles-module__settingsBackButton___bIe2j\",\"automationHeader\":\"styles-module__automationHeader___InP0r\",\"automationDescription\":\"styles-module__automationDescription___NKlmo\",\"learnMoreLink\":\"styles-module__learnMoreLink___8xv-x\",\"autoSendRow\":\"styles-module__autoSendRow___UblX5\",\"autoSendLabel\":\"styles-module__autoSendLabel___icDc2\",\"active\":\"styles-module__active___-zoN6\",\"webhookUrlInput\":\"styles-module__webhookUrlInput___2375C\",\"settingsSectionExtraPadding\":\"styles-module__settingsSectionExtraPadding___jdhFV\",\"settingsSectionGrow\":\"styles-module__settingsSectionGrow___h-5HZ\",\"settingsRow\":\"styles-module__settingsRow___3sdhc\",\"settingsRowMarginTop\":\"styles-module__settingsRowMarginTop___zA0Sp\",\"dropdownContainer\":\"styles-module__dropdownContainer___BVnxe\",\"settingsRowDisabled\":\"styles-module__settingsRowDisabled___EgS0V\",\"toggleSwitch\":\"styles-module__toggleSwitch___l4Ygm\",\"cycleButtonText\":\"styles-module__cycleButtonText___fD1LR\",\"cycleTextIn\":\"styles-module__cycleTextIn___Q6zJf\",\"cycleDots\":\"styles-module__cycleDots___LWuoQ\",\"dropdownMenu\":\"styles-module__dropdownMenu___k73ER\",\"scaleIn\":\"styles-module__scaleIn___c-r1K\",\"dropdownItem\":\"styles-module__dropdownItem___ylsLj\",\"settingsLabelMarker\":\"styles-module__settingsLabelMarker___ewdtV\",\"settingsOptions\":\"styles-module__settingsOptions___LyrBA\",\"sliderContainer\":\"styles-module__sliderContainer___ducXj\",\"sliderLabels\":\"styles-module__sliderLabels___FhLDB\",\"colorOptions\":\"styles-module__colorOptions___iHCNX\",\"colorOption\":\"styles-module__colorOption___IodiY\",\"colorOptionRing\":\"styles-module__colorOptionRing___U2xpo\",\"settingsToggle\":\"styles-module__settingsToggle___fBrFn\",\"settingsToggleMarginBottom\":\"styles-module__settingsToggleMarginBottom___MZUyF\",\"checked\":\"styles-module__checked___mnZLo\",\"toggleSlider\":\"styles-module__toggleSlider___wprIn\",\"disabled\":\"styles-module__disabled___332Jw\",\"mcpStatusDot\":\"styles-module__mcpStatusDot___ibgkc\",\"disconnected\":\"styles-module__disconnected___cHPxR\",\"mcpPulseError\":\"styles-module__mcpPulseError___fov9B\",\"helpIconNudgeDown\":\"styles-module__helpIconNudgeDown___0cqpM\",\"helpIconNoNudge\":\"styles-module__helpIconNoNudge___abogC\",\"helpIconNudge1-5\":\"styles-module__helpIconNudge1-5___DM2TQ\",\"helpIconNudge2\":\"styles-module__helpIconNudge2___TfWgC\",\"drawCanvas\":\"styles-module__drawCanvas___7cG9U\",\"dragSelection\":\"styles-module__dragSelection___kZLq2\",\"dragCount\":\"styles-module__dragCount___KM90j\",\"highlightsContainer\":\"styles-module__highlightsContainer___-0xzG\",\"selectedElementHighlight\":\"styles-module__selectedElementHighlight___fyVlI\",\"themeIconWrapper\":\"styles-module__themeIconWrapper___LsJIM\",\"themeIcon\":\"styles-module__themeIcon___lCCmo\",\"themeIconIn\":\"styles-module__themeIconIn___TU6ML\",\"scaleOut\":\"styles-module__scaleOut___Wctwz\",\"slideUp\":\"styles-module__slideUp___kgD36\",\"slideDown\":\"styles-module__slideDown___zcdje\",\"settingsPanelIn\":\"styles-module__settingsPanelIn___MGfO8\",\"settingsPanelOut\":\"styles-module__settingsPanelOut___Zfymi\"};\n\n// SSR-safe style injection\nif (typeof document !== 'undefined') {\n let style = document.getElementById('feedback-tool-styles-page-toolbar-css-styles');\n if (!style) {\n style = document.createElement('style');\n style.id = 'feedback-tool-styles-page-toolbar-css-styles';\n style.textContent = css;\n document.head.appendChild(style);\n }\n}\n\nexport default classNames;\n"],"mappings":"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","names":["import_react","import_jsx_runtime","AnnotationPopupCSS","result","css","classNames","styles_module_default","import_jsx_runtime","annotations","elementUnder","name","path","reactComponents","computedStylesStr","computedStylesObj","isFixed","rect","left","top","styles_module_default","scrollY","deleteAnnotation","updateAnnotation","DRAG_THRESHOLD","bb"]}
|