@critique.work/agentation 2.2.2 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/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":["\"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 &ldquo;{selectedText.slice(0, 80)}\n {selectedText.length > 80 ? \"...\" : \"\"}&rdquo;\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":["useState","useCallback","useEffect","useRef","jsx","jsxs","AnnotationPopupCSS","result","css","classNames","styles_module_default","jsx","jsxs","useState","useRef","useEffect","jsxs","jsx","annotations","useCallback","elementUnder","name","path","reactComponents","computedStylesStr","computedStylesObj","isFixed","rect","left","top","styles_module_default","scrollY","deleteAnnotation","updateAnnotation","DRAG_THRESHOLD","bb"]}
1
+ {"version":3,"sources":["../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/src/constants.js","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/src/util.js","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/src/options.js","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/src/create-element.js","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/src/component.js","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/src/diff/props.js","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/src/create-context.js","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/src/diff/children.js","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/src/diff/index.js","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/src/render.js","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/src/clone-element.js","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/src/diff/catch-error.js","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/hooks/src/index.js","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/compat/src/util.js","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/compat/src/hooks.js","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/compat/src/PureComponent.js","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/compat/src/memo.js","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/compat/src/forwardRef.js","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/compat/src/Children.js","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/compat/src/suspense.js","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/compat/src/suspense-list.js","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/src/constants.js","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/compat/src/portals.js","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/compat/src/render.js","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/compat/src/index.js","../src/components/annotation-popup-css/styles.module.scss","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/jsx-runtime/src/utils.js","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/src/constants.js","../../node_modules/.pnpm/preact@10.28.4/node_modules/preact/jsx-runtime/src/index.js","../src/components/icons.tsx","../src/utils/freeze-animations.ts","../src/components/annotation-popup-css/index.tsx","../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","../src/components/page-toolbar-css/index.tsx"],"sourcesContent":["/** Normal hydration that attaches to a DOM tree but does not diff it. */\nexport const MODE_HYDRATE = 1 << 5;\n/** Signifies this VNode suspended on the previous render */\nexport const MODE_SUSPENDED = 1 << 7;\n/** Indicates that this node needs to be inserted while patching children */\nexport const INSERT_VNODE = 1 << 2;\n/** Indicates a VNode has been matched with another VNode in the diff */\nexport const MATCHED = 1 << 1;\n\n/** Reset all mode flags */\nexport const RESET_MODE = ~(MODE_HYDRATE | MODE_SUSPENDED);\n\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\nexport const XHTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\nexport const MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n\nexport const NULL = null;\nexport const UNDEFINED = undefined;\nexport const EMPTY_OBJ = /** @type {any} */ ({});\nexport const EMPTY_ARR = [];\nexport const IS_NON_DIMENSIONAL =\n\t/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;\n","import { EMPTY_ARR } from './constants';\n\nexport const isArray = Array.isArray;\n\n/**\n * Assign properties from `props` to `obj`\n * @template O, P The obj and props types\n * @param {O} obj The object to copy properties to\n * @param {P} props The object to copy properties from\n * @returns {O & P}\n */\nexport function assign(obj, props) {\n\t// @ts-expect-error We change the type of `obj` to be `O & P`\n\tfor (let i in props) obj[i] = props[i];\n\treturn /** @type {O & P} */ (obj);\n}\n\n/**\n * Remove a child node from its parent if attached. This is a workaround for\n * IE11 which doesn't support `Element.prototype.remove()`. Using this function\n * is smaller than including a dedicated polyfill.\n * @param {import('./index').ContainerNode} node The node to remove\n */\nexport function removeNode(node) {\n\tif (node && node.parentNode) node.parentNode.removeChild(node);\n}\n\nexport const slice = EMPTY_ARR.slice;\n","import { _catchError } from './diff/catch-error';\n\n/**\n * The `option` object can potentially contain callback functions\n * that are called during various stages of our renderer. This is the\n * foundation on which all our addons like `preact/debug`, `preact/compat`,\n * and `preact/hooks` are based on. See the `Options` type in `internal.d.ts`\n * for a full list of available option hooks (most editors/IDEs allow you to\n * ctrl+click or cmd+click on mac the type definition below).\n * @type {import('./internal').Options}\n */\nconst options = {\n\t_catchError\n};\n\nexport default options;\n","import { slice } from './util';\nimport options from './options';\nimport { NULL, UNDEFINED } from './constants';\n\nlet vnodeId = 0;\n\n/**\n * Create an virtual node (used for JSX)\n * @param {import('./internal').VNode[\"type\"]} type The node name or Component constructor for this\n * virtual node\n * @param {object | null | undefined} [props] The properties of the virtual node\n * @param {Array<import('.').ComponentChildren>} [children] The children of the\n * virtual node\n * @returns {import('./internal').VNode}\n */\nexport function createElement(type, props, children) {\n\tlet normalizedProps = {},\n\t\tkey,\n\t\tref,\n\t\ti;\n\tfor (i in props) {\n\t\tif (i == 'key') key = props[i];\n\t\telse if (i == 'ref') ref = props[i];\n\t\telse normalizedProps[i] = props[i];\n\t}\n\n\tif (arguments.length > 2) {\n\t\tnormalizedProps.children =\n\t\t\targuments.length > 3 ? slice.call(arguments, 2) : children;\n\t}\n\n\t// If a Component VNode, check for and apply defaultProps\n\t// Note: type may be undefined in development, must never error here.\n\tif (typeof type == 'function' && type.defaultProps != NULL) {\n\t\tfor (i in type.defaultProps) {\n\t\t\tif (normalizedProps[i] === UNDEFINED) {\n\t\t\t\tnormalizedProps[i] = type.defaultProps[i];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn createVNode(type, normalizedProps, key, ref, NULL);\n}\n\n/**\n * Create a VNode (used internally by Preact)\n * @param {import('./internal').VNode[\"type\"]} type The node name or Component\n * Constructor for this virtual node\n * @param {object | string | number | null} props The properties of this virtual node.\n * If this virtual node represents a text node, this is the text of the node (string or number).\n * @param {string | number | null} key The key for this virtual node, used when\n * diffing it against its children\n * @param {import('./internal').VNode[\"ref\"]} ref The ref property that will\n * receive a reference to its created child\n * @returns {import('./internal').VNode}\n */\nexport function createVNode(type, props, key, ref, original) {\n\t// V8 seems to be better at detecting type shapes if the object is allocated from the same call site\n\t// Do not inline into createElement and coerceToVNode!\n\t/** @type {import('./internal').VNode} */\n\tconst vnode = {\n\t\ttype,\n\t\tprops,\n\t\tkey,\n\t\tref,\n\t\t_children: NULL,\n\t\t_parent: NULL,\n\t\t_depth: 0,\n\t\t_dom: NULL,\n\t\t_component: NULL,\n\t\tconstructor: UNDEFINED,\n\t\t_original: original == NULL ? ++vnodeId : original,\n\t\t_index: -1,\n\t\t_flags: 0\n\t};\n\n\t// Only invoke the vnode hook if this was *not* a direct copy:\n\tif (original == NULL && options.vnode != NULL) options.vnode(vnode);\n\n\treturn vnode;\n}\n\nexport function createRef() {\n\treturn { current: NULL };\n}\n\nexport function Fragment(props) {\n\treturn props.children;\n}\n\n/**\n * Check if a the argument is a valid Preact VNode.\n * @param {*} vnode\n * @returns {vnode is VNode}\n */\nexport const isValidElement = vnode =>\n\tvnode != NULL && vnode.constructor === UNDEFINED;\n","import { assign } from './util';\nimport { diff, commitRoot } from './diff/index';\nimport options from './options';\nimport { Fragment } from './create-element';\nimport { MODE_HYDRATE, NULL } from './constants';\n\n/**\n * Base Component class. Provides `setState()` and `forceUpdate()`, which\n * trigger rendering\n * @param {object} props The initial component props\n * @param {object} context The initial context from parent components'\n * getChildContext\n */\nexport function BaseComponent(props, context) {\n\tthis.props = props;\n\tthis.context = context;\n}\n\n/**\n * Update component state and schedule a re-render.\n * @this {import('./internal').Component}\n * @param {object | ((s: object, p: object) => object)} update A hash of state\n * properties to update with new values or a function that given the current\n * state and props returns a new partial state\n * @param {() => void} [callback] A function to be called once component state is\n * updated\n */\nBaseComponent.prototype.setState = function (update, callback) {\n\t// only clone state when copying to nextState the first time.\n\tlet s;\n\tif (this._nextState != NULL && this._nextState != this.state) {\n\t\ts = this._nextState;\n\t} else {\n\t\ts = this._nextState = assign({}, this.state);\n\t}\n\n\tif (typeof update == 'function') {\n\t\t// Some libraries like `immer` mark the current state as readonly,\n\t\t// preventing us from mutating it, so we need to clone it. See #2716\n\t\tupdate = update(assign({}, s), this.props);\n\t}\n\n\tif (update) {\n\t\tassign(s, update);\n\t}\n\n\t// Skip update if updater function returned null\n\tif (update == NULL) return;\n\n\tif (this._vnode) {\n\t\tif (callback) {\n\t\t\tthis._stateCallbacks.push(callback);\n\t\t}\n\t\tenqueueRender(this);\n\t}\n};\n\n/**\n * Immediately perform a synchronous re-render of the component\n * @this {import('./internal').Component}\n * @param {() => void} [callback] A function to be called after component is\n * re-rendered\n */\nBaseComponent.prototype.forceUpdate = function (callback) {\n\tif (this._vnode) {\n\t\t// Set render mode so that we can differentiate where the render request\n\t\t// is coming from. We need this because forceUpdate should never call\n\t\t// shouldComponentUpdate\n\t\tthis._force = true;\n\t\tif (callback) this._renderCallbacks.push(callback);\n\t\tenqueueRender(this);\n\t}\n};\n\n/**\n * Accepts `props` and `state`, and returns a new Virtual DOM tree to build.\n * Virtual DOM is generally constructed via [JSX](https://jasonformat.com/wtf-is-jsx).\n * @param {object} props Props (eg: JSX attributes) received from parent\n * element/component\n * @param {object} state The component's current state\n * @param {object} context Context object, as returned by the nearest\n * ancestor's `getChildContext()`\n * @returns {ComponentChildren | void}\n */\nBaseComponent.prototype.render = Fragment;\n\n/**\n * @param {import('./internal').VNode} vnode\n * @param {number | null} [childIndex]\n */\nexport function getDomSibling(vnode, childIndex) {\n\tif (childIndex == NULL) {\n\t\t// Use childIndex==null as a signal to resume the search from the vnode's sibling\n\t\treturn vnode._parent\n\t\t\t? getDomSibling(vnode._parent, vnode._index + 1)\n\t\t\t: NULL;\n\t}\n\n\tlet sibling;\n\tfor (; childIndex < vnode._children.length; childIndex++) {\n\t\tsibling = vnode._children[childIndex];\n\n\t\tif (sibling != NULL && sibling._dom != NULL) {\n\t\t\t// Since updateParentDomPointers keeps _dom pointer correct,\n\t\t\t// we can rely on _dom to tell us if this subtree contains a\n\t\t\t// rendered DOM node, and what the first rendered DOM node is\n\t\t\treturn sibling._dom;\n\t\t}\n\t}\n\n\t// If we get here, we have not found a DOM node in this vnode's children.\n\t// We must resume from this vnode's sibling (in it's parent _children array)\n\t// Only climb up and search the parent if we aren't searching through a DOM\n\t// VNode (meaning we reached the DOM parent of the original vnode that began\n\t// the search)\n\treturn typeof vnode.type == 'function' ? getDomSibling(vnode) : NULL;\n}\n\n/**\n * Trigger in-place re-rendering of a component.\n * @param {import('./internal').Component} component The component to rerender\n */\nfunction renderComponent(component) {\n\tif (component._parentDom && component._dirty) {\n\t\tlet oldVNode = component._vnode,\n\t\t\toldDom = oldVNode._dom,\n\t\t\tcommitQueue = [],\n\t\t\trefQueue = [],\n\t\t\tnewVNode = assign({}, oldVNode);\n\t\tnewVNode._original = oldVNode._original + 1;\n\t\tif (options.vnode) options.vnode(newVNode);\n\n\t\tdiff(\n\t\t\tcomponent._parentDom,\n\t\t\tnewVNode,\n\t\t\toldVNode,\n\t\t\tcomponent._globalContext,\n\t\t\tcomponent._parentDom.namespaceURI,\n\t\t\toldVNode._flags & MODE_HYDRATE ? [oldDom] : NULL,\n\t\t\tcommitQueue,\n\t\t\toldDom == NULL ? getDomSibling(oldVNode) : oldDom,\n\t\t\t!!(oldVNode._flags & MODE_HYDRATE),\n\t\t\trefQueue\n\t\t);\n\n\t\tnewVNode._original = oldVNode._original;\n\t\tnewVNode._parent._children[newVNode._index] = newVNode;\n\t\tcommitRoot(commitQueue, newVNode, refQueue);\n\t\toldVNode._dom = oldVNode._parent = null;\n\n\t\tif (newVNode._dom != oldDom) {\n\t\t\tupdateParentDomPointers(newVNode);\n\t\t}\n\t}\n}\n\n/**\n * @param {import('./internal').VNode} vnode\n */\nfunction updateParentDomPointers(vnode) {\n\tif ((vnode = vnode._parent) != NULL && vnode._component != NULL) {\n\t\tvnode._dom = vnode._component.base = NULL;\n\t\tvnode._children.some(child => {\n\t\t\tif (child != NULL && child._dom != NULL) {\n\t\t\t\treturn (vnode._dom = vnode._component.base = child._dom);\n\t\t\t}\n\t\t});\n\n\t\treturn updateParentDomPointers(vnode);\n\t}\n}\n\n/**\n * The render queue\n * @type {Array<import('./internal').Component>}\n */\nlet rerenderQueue = [];\n\n/*\n * The value of `Component.debounce` must asynchronously invoke the passed in callback. It is\n * important that contributors to Preact can consistently reason about what calls to `setState`, etc.\n * do, and when their effects will be applied. See the links below for some further reading on designing\n * asynchronous APIs.\n * * [Designing APIs for Asynchrony](https://blog.izs.me/2013/08/designing-apis-for-asynchrony)\n * * [Callbacks synchronous and asynchronous](https://blog.ometer.com/2011/07/24/callbacks-synchronous-and-asynchronous/)\n */\n\nlet prevDebounce;\n\nconst defer =\n\ttypeof Promise == 'function'\n\t\t? Promise.prototype.then.bind(Promise.resolve())\n\t\t: setTimeout;\n\n/**\n * Enqueue a rerender of a component\n * @param {import('./internal').Component} c The component to rerender\n */\nexport function enqueueRender(c) {\n\tif (\n\t\t(!c._dirty &&\n\t\t\t(c._dirty = true) &&\n\t\t\trerenderQueue.push(c) &&\n\t\t\t!process._rerenderCount++) ||\n\t\tprevDebounce != options.debounceRendering\n\t) {\n\t\tprevDebounce = options.debounceRendering;\n\t\t(prevDebounce || defer)(process);\n\t}\n}\n\n/**\n * @param {import('./internal').Component} a\n * @param {import('./internal').Component} b\n */\nconst depthSort = (a, b) => a._vnode._depth - b._vnode._depth;\n\n/** Flush the render queue by rerendering all queued components */\nfunction process() {\n\tlet c,\n\t\tl = 1;\n\n\t// Don't update `renderCount` yet. Keep its value non-zero to prevent unnecessary\n\t// process() calls from getting scheduled while `queue` is still being consumed.\n\twhile (rerenderQueue.length) {\n\t\t// Keep the rerender queue sorted by (depth, insertion order). The queue\n\t\t// will initially be sorted on the first iteration only if it has more than 1 item.\n\t\t//\n\t\t// New items can be added to the queue e.g. when rerendering a provider, so we want to\n\t\t// keep the order from top to bottom with those new items so we can handle them in a\n\t\t// single pass\n\t\tif (rerenderQueue.length > l) {\n\t\t\trerenderQueue.sort(depthSort);\n\t\t}\n\n\t\tc = rerenderQueue.shift();\n\t\tl = rerenderQueue.length;\n\n\t\trenderComponent(c);\n\t}\n\tprocess._rerenderCount = 0;\n}\n\nprocess._rerenderCount = 0;\n","import { IS_NON_DIMENSIONAL, NULL, SVG_NAMESPACE } from '../constants';\nimport options from '../options';\n\nfunction setStyle(style, key, value) {\n\tif (key[0] == '-') {\n\t\tstyle.setProperty(key, value == NULL ? '' : value);\n\t} else if (value == NULL) {\n\t\tstyle[key] = '';\n\t} else if (typeof value != 'number' || IS_NON_DIMENSIONAL.test(key)) {\n\t\tstyle[key] = value;\n\t} else {\n\t\tstyle[key] = value + 'px';\n\t}\n}\n\nconst CAPTURE_REGEX = /(PointerCapture)$|Capture$/i;\n\n// A logical clock to solve issues like https://github.com/preactjs/preact/issues/3927.\n// When the DOM performs an event it leaves micro-ticks in between bubbling up which means that\n// an event can trigger on a newly reated DOM-node while the event bubbles up.\n//\n// Originally inspired by Vue\n// (https://github.com/vuejs/core/blob/caeb8a68811a1b0f79/packages/runtime-dom/src/modules/events.ts#L90-L101),\n// but modified to use a logical clock instead of Date.now() in case event handlers get attached\n// and events get dispatched during the same millisecond.\n//\n// The clock is incremented after each new event dispatch. This allows 1 000 000 new events\n// per second for over 280 years before the value reaches Number.MAX_SAFE_INTEGER (2**53 - 1).\nlet eventClock = 0;\n\n/**\n * Set a property value on a DOM node\n * @param {import('../internal').PreactElement} dom The DOM node to modify\n * @param {string} name The name of the property to set\n * @param {*} value The value to set the property to\n * @param {*} oldValue The old value the property had\n * @param {string} namespace Whether or not this DOM node is an SVG node or not\n */\nexport function setProperty(dom, name, value, oldValue, namespace) {\n\tlet useCapture;\n\n\to: if (name == 'style') {\n\t\tif (typeof value == 'string') {\n\t\t\tdom.style.cssText = value;\n\t\t} else {\n\t\t\tif (typeof oldValue == 'string') {\n\t\t\t\tdom.style.cssText = oldValue = '';\n\t\t\t}\n\n\t\t\tif (oldValue) {\n\t\t\t\tfor (name in oldValue) {\n\t\t\t\t\tif (!(value && name in value)) {\n\t\t\t\t\t\tsetStyle(dom.style, name, '');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (value) {\n\t\t\t\tfor (name in value) {\n\t\t\t\t\tif (!oldValue || value[name] != oldValue[name]) {\n\t\t\t\t\t\tsetStyle(dom.style, name, value[name]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Benchmark for comparison: https://esbench.com/bench/574c954bdb965b9a00965ac6\n\telse if (name[0] == 'o' && name[1] == 'n') {\n\t\tuseCapture = name != (name = name.replace(CAPTURE_REGEX, '$1'));\n\t\tconst lowerCaseName = name.toLowerCase();\n\n\t\t// Infer correct casing for DOM built-in events:\n\t\tif (lowerCaseName in dom || name == 'onFocusOut' || name == 'onFocusIn')\n\t\t\tname = lowerCaseName.slice(2);\n\t\telse name = name.slice(2);\n\n\t\tif (!dom._listeners) dom._listeners = {};\n\t\tdom._listeners[name + useCapture] = value;\n\n\t\tif (value) {\n\t\t\tif (!oldValue) {\n\t\t\t\tvalue._attached = eventClock;\n\t\t\t\tdom.addEventListener(\n\t\t\t\t\tname,\n\t\t\t\t\tuseCapture ? eventProxyCapture : eventProxy,\n\t\t\t\t\tuseCapture\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tvalue._attached = oldValue._attached;\n\t\t\t}\n\t\t} else {\n\t\t\tdom.removeEventListener(\n\t\t\t\tname,\n\t\t\t\tuseCapture ? eventProxyCapture : eventProxy,\n\t\t\t\tuseCapture\n\t\t\t);\n\t\t}\n\t} else {\n\t\tif (namespace == SVG_NAMESPACE) {\n\t\t\t// Normalize incorrect prop usage for SVG:\n\t\t\t// - xlink:href / xlinkHref --> href (xlink:href was removed from SVG and isn't needed)\n\t\t\t// - className --> class\n\t\t\tname = name.replace(/xlink(H|:h)/, 'h').replace(/sName$/, 's');\n\t\t} else if (\n\t\t\tname != 'width' &&\n\t\t\tname != 'height' &&\n\t\t\tname != 'href' &&\n\t\t\tname != 'list' &&\n\t\t\tname != 'form' &&\n\t\t\t// Default value in browsers is `-1` and an empty string is\n\t\t\t// cast to `0` instead\n\t\t\tname != 'tabIndex' &&\n\t\t\tname != 'download' &&\n\t\t\tname != 'rowSpan' &&\n\t\t\tname != 'colSpan' &&\n\t\t\tname != 'role' &&\n\t\t\tname != 'popover' &&\n\t\t\tname in dom\n\t\t) {\n\t\t\ttry {\n\t\t\t\tdom[name] = value == NULL ? '' : value;\n\t\t\t\t// labelled break is 1b smaller here than a return statement (sorry)\n\t\t\t\tbreak o;\n\t\t\t} catch (e) {}\n\t\t}\n\n\t\t// aria- and data- attributes have no boolean representation.\n\t\t// A `false` value is different from the attribute not being\n\t\t// present, so we can't remove it. For non-boolean aria\n\t\t// attributes we could treat false as a removal, but the\n\t\t// amount of exceptions would cost too many bytes. On top of\n\t\t// that other frameworks generally stringify `false`.\n\n\t\tif (typeof value == 'function') {\n\t\t\t// never serialize functions as attribute values\n\t\t} else if (value != NULL && (value !== false || name[4] == '-')) {\n\t\t\tdom.setAttribute(name, name == 'popover' && value == true ? '' : value);\n\t\t} else {\n\t\t\tdom.removeAttribute(name);\n\t\t}\n\t}\n}\n\n/**\n * Create an event proxy function.\n * @param {boolean} useCapture Is the event handler for the capture phase.\n * @private\n */\nfunction createEventProxy(useCapture) {\n\t/**\n\t * Proxy an event to hooked event handlers\n\t * @param {import('../internal').PreactEvent} e The event object from the browser\n\t * @private\n\t */\n\treturn function (e) {\n\t\tif (this._listeners) {\n\t\t\tconst eventHandler = this._listeners[e.type + useCapture];\n\t\t\tif (e._dispatched == NULL) {\n\t\t\t\te._dispatched = eventClock++;\n\n\t\t\t\t// When `e._dispatched` is smaller than the time when the targeted event\n\t\t\t\t// handler was attached we know we have bubbled up to an element that was added\n\t\t\t\t// during patching the DOM.\n\t\t\t} else if (e._dispatched < eventHandler._attached) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn eventHandler(options.event ? options.event(e) : e);\n\t\t}\n\t};\n}\n\nconst eventProxy = createEventProxy(false);\nconst eventProxyCapture = createEventProxy(true);\n","import { enqueueRender } from './component';\nimport { NULL } from './constants';\n\nexport let i = 0;\n\nexport function createContext(defaultValue) {\n\tfunction Context(props) {\n\t\tif (!this.getChildContext) {\n\t\t\t/** @type {Set<import('./internal').Component> | null} */\n\t\t\tlet subs = new Set();\n\t\t\tlet ctx = {};\n\t\t\tctx[Context._id] = this;\n\n\t\t\tthis.getChildContext = () => ctx;\n\n\t\t\tthis.componentWillUnmount = () => {\n\t\t\t\tsubs = NULL;\n\t\t\t};\n\n\t\t\tthis.shouldComponentUpdate = function (_props) {\n\t\t\t\t// @ts-expect-error even\n\t\t\t\tif (this.props.value != _props.value) {\n\t\t\t\t\tsubs.forEach(c => {\n\t\t\t\t\t\tc._force = true;\n\t\t\t\t\t\tenqueueRender(c);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis.sub = c => {\n\t\t\t\tsubs.add(c);\n\t\t\t\tlet old = c.componentWillUnmount;\n\t\t\t\tc.componentWillUnmount = () => {\n\t\t\t\t\tif (subs) {\n\t\t\t\t\t\tsubs.delete(c);\n\t\t\t\t\t}\n\t\t\t\t\tif (old) old.call(c);\n\t\t\t\t};\n\t\t\t};\n\t\t}\n\n\t\treturn props.children;\n\t}\n\n\tContext._id = '__cC' + i++;\n\tContext._defaultValue = defaultValue;\n\n\t/** @type {import('./internal').FunctionComponent} */\n\tContext.Consumer = (props, contextValue) => {\n\t\treturn props.children(contextValue);\n\t};\n\n\t// we could also get rid of _contextRef entirely\n\tContext.Provider =\n\t\tContext._contextRef =\n\t\tContext.Consumer.contextType =\n\t\t\tContext;\n\n\treturn Context;\n}\n","import { diff, unmount, applyRef } from './index';\nimport { createVNode, Fragment } from '../create-element';\nimport {\n\tEMPTY_OBJ,\n\tEMPTY_ARR,\n\tINSERT_VNODE,\n\tMATCHED,\n\tUNDEFINED,\n\tNULL\n} from '../constants';\nimport { isArray } from '../util';\nimport { getDomSibling } from '../component';\n\n/**\n * @typedef {import('../internal').ComponentChildren} ComponentChildren\n * @typedef {import('../internal').Component} Component\n * @typedef {import('../internal').PreactElement} PreactElement\n * @typedef {import('../internal').VNode} VNode\n */\n\n/**\n * Diff the children of a virtual node\n * @param {PreactElement} parentDom The DOM element whose children are being\n * diffed\n * @param {ComponentChildren[]} renderResult\n * @param {VNode} newParentVNode The new virtual node whose children should be\n * diff'ed against oldParentVNode\n * @param {VNode} oldParentVNode The old virtual node whose children should be\n * diff'ed against newParentVNode\n * @param {object} globalContext The current context object - modified by\n * getChildContext\n * @param {string} namespace Current namespace of the DOM node (HTML, SVG, or MathML)\n * @param {Array<PreactElement>} excessDomChildren\n * @param {Array<Component>} commitQueue List of components which have callbacks\n * to invoke in commitRoot\n * @param {PreactElement} oldDom The current attached DOM element any new dom\n * elements should be placed around. Likely `null` on first render (except when\n * hydrating). Can be a sibling DOM element when diffing Fragments that have\n * siblings. In most cases, it starts out as `oldChildren[0]._dom`.\n * @param {boolean} isHydrating Whether or not we are in hydration\n * @param {any[]} refQueue an array of elements needed to invoke refs\n */\nexport function diffChildren(\n\tparentDom,\n\trenderResult,\n\tnewParentVNode,\n\toldParentVNode,\n\tglobalContext,\n\tnamespace,\n\texcessDomChildren,\n\tcommitQueue,\n\toldDom,\n\tisHydrating,\n\trefQueue\n) {\n\tlet i,\n\t\t/** @type {VNode} */\n\t\toldVNode,\n\t\t/** @type {VNode} */\n\t\tchildVNode,\n\t\t/** @type {PreactElement} */\n\t\tnewDom,\n\t\t/** @type {PreactElement} */\n\t\tfirstChildDom;\n\n\t// This is a compression of oldParentVNode!=null && oldParentVNode != EMPTY_OBJ && oldParentVNode._children || EMPTY_ARR\n\t// as EMPTY_OBJ._children should be `undefined`.\n\t/** @type {VNode[]} */\n\tlet oldChildren = (oldParentVNode && oldParentVNode._children) || EMPTY_ARR;\n\n\tlet newChildrenLength = renderResult.length;\n\n\toldDom = constructNewChildrenArray(\n\t\tnewParentVNode,\n\t\trenderResult,\n\t\toldChildren,\n\t\toldDom,\n\t\tnewChildrenLength\n\t);\n\n\tfor (i = 0; i < newChildrenLength; i++) {\n\t\tchildVNode = newParentVNode._children[i];\n\t\tif (childVNode == NULL) continue;\n\n\t\t// At this point, constructNewChildrenArray has assigned _index to be the\n\t\t// matchingIndex for this VNode's oldVNode (or -1 if there is no oldVNode).\n\t\toldVNode =\n\t\t\t(childVNode._index != -1 && oldChildren[childVNode._index]) || EMPTY_OBJ;\n\n\t\t// Update childVNode._index to its final index\n\t\tchildVNode._index = i;\n\n\t\t// Morph the old element into the new one, but don't append it to the dom yet\n\t\tlet result = diff(\n\t\t\tparentDom,\n\t\t\tchildVNode,\n\t\t\toldVNode,\n\t\t\tglobalContext,\n\t\t\tnamespace,\n\t\t\texcessDomChildren,\n\t\t\tcommitQueue,\n\t\t\toldDom,\n\t\t\tisHydrating,\n\t\t\trefQueue\n\t\t);\n\n\t\t// Adjust DOM nodes\n\t\tnewDom = childVNode._dom;\n\t\tif (childVNode.ref && oldVNode.ref != childVNode.ref) {\n\t\t\tif (oldVNode.ref) {\n\t\t\t\tapplyRef(oldVNode.ref, NULL, childVNode);\n\t\t\t}\n\t\t\trefQueue.push(\n\t\t\t\tchildVNode.ref,\n\t\t\t\tchildVNode._component || newDom,\n\t\t\t\tchildVNode\n\t\t\t);\n\t\t}\n\n\t\tif (firstChildDom == NULL && newDom != NULL) {\n\t\t\tfirstChildDom = newDom;\n\t\t}\n\n\t\tlet shouldPlace = !!(childVNode._flags & INSERT_VNODE);\n\t\tif (shouldPlace || oldVNode._children === childVNode._children) {\n\t\t\toldDom = insert(childVNode, oldDom, parentDom, shouldPlace);\n\t\t} else if (typeof childVNode.type == 'function' && result !== UNDEFINED) {\n\t\t\toldDom = result;\n\t\t} else if (newDom) {\n\t\t\toldDom = newDom.nextSibling;\n\t\t}\n\n\t\t// Unset diffing flags\n\t\tchildVNode._flags &= ~(INSERT_VNODE | MATCHED);\n\t}\n\n\tnewParentVNode._dom = firstChildDom;\n\n\treturn oldDom;\n}\n\n/**\n * @param {VNode} newParentVNode\n * @param {ComponentChildren[]} renderResult\n * @param {VNode[]} oldChildren\n */\nfunction constructNewChildrenArray(\n\tnewParentVNode,\n\trenderResult,\n\toldChildren,\n\toldDom,\n\tnewChildrenLength\n) {\n\t/** @type {number} */\n\tlet i;\n\t/** @type {VNode} */\n\tlet childVNode;\n\t/** @type {VNode} */\n\tlet oldVNode;\n\n\tlet oldChildrenLength = oldChildren.length,\n\t\tremainingOldChildren = oldChildrenLength;\n\n\tlet skew = 0;\n\n\tnewParentVNode._children = new Array(newChildrenLength);\n\tfor (i = 0; i < newChildrenLength; i++) {\n\t\t// @ts-expect-error We are reusing the childVNode variable to hold both the\n\t\t// pre and post normalized childVNode\n\t\tchildVNode = renderResult[i];\n\n\t\tif (\n\t\t\tchildVNode == NULL ||\n\t\t\ttypeof childVNode == 'boolean' ||\n\t\t\ttypeof childVNode == 'function'\n\t\t) {\n\t\t\tnewParentVNode._children[i] = NULL;\n\t\t\tcontinue;\n\t\t}\n\t\t// If this newVNode is being reused (e.g. <div>{reuse}{reuse}</div>) in the same diff,\n\t\t// or we are rendering a component (e.g. setState) copy the oldVNodes so it can have\n\t\t// it's own DOM & etc. pointers\n\t\telse if (\n\t\t\ttypeof childVNode == 'string' ||\n\t\t\ttypeof childVNode == 'number' ||\n\t\t\t// eslint-disable-next-line valid-typeof\n\t\t\ttypeof childVNode == 'bigint' ||\n\t\t\tchildVNode.constructor == String\n\t\t) {\n\t\t\tchildVNode = newParentVNode._children[i] = createVNode(\n\t\t\t\tNULL,\n\t\t\t\tchildVNode,\n\t\t\t\tNULL,\n\t\t\t\tNULL,\n\t\t\t\tNULL\n\t\t\t);\n\t\t} else if (isArray(childVNode)) {\n\t\t\tchildVNode = newParentVNode._children[i] = createVNode(\n\t\t\t\tFragment,\n\t\t\t\t{ children: childVNode },\n\t\t\t\tNULL,\n\t\t\t\tNULL,\n\t\t\t\tNULL\n\t\t\t);\n\t\t} else if (childVNode.constructor === UNDEFINED && childVNode._depth > 0) {\n\t\t\t// VNode is already in use, clone it. This can happen in the following\n\t\t\t// scenario:\n\t\t\t// const reuse = <div />\n\t\t\t// <div>{reuse}<span />{reuse}</div>\n\t\t\tchildVNode = newParentVNode._children[i] = createVNode(\n\t\t\t\tchildVNode.type,\n\t\t\t\tchildVNode.props,\n\t\t\t\tchildVNode.key,\n\t\t\t\tchildVNode.ref ? childVNode.ref : NULL,\n\t\t\t\tchildVNode._original\n\t\t\t);\n\t\t} else {\n\t\t\tnewParentVNode._children[i] = childVNode;\n\t\t}\n\n\t\tconst skewedIndex = i + skew;\n\t\tchildVNode._parent = newParentVNode;\n\t\tchildVNode._depth = newParentVNode._depth + 1;\n\n\t\t// Temporarily store the matchingIndex on the _index property so we can pull\n\t\t// out the oldVNode in diffChildren. We'll override this to the VNode's\n\t\t// final index after using this property to get the oldVNode\n\t\tconst matchingIndex = (childVNode._index = findMatchingIndex(\n\t\t\tchildVNode,\n\t\t\toldChildren,\n\t\t\tskewedIndex,\n\t\t\tremainingOldChildren\n\t\t));\n\n\t\toldVNode = NULL;\n\t\tif (matchingIndex != -1) {\n\t\t\toldVNode = oldChildren[matchingIndex];\n\t\t\tremainingOldChildren--;\n\t\t\tif (oldVNode) {\n\t\t\t\toldVNode._flags |= MATCHED;\n\t\t\t}\n\t\t}\n\n\t\t// Here, we define isMounting for the purposes of the skew diffing\n\t\t// algorithm. Nodes that are unsuspending are considered mounting and we detect\n\t\t// this by checking if oldVNode._original == null\n\t\tconst isMounting = oldVNode == NULL || oldVNode._original == NULL;\n\n\t\tif (isMounting) {\n\t\t\tif (matchingIndex == -1) {\n\t\t\t\t// When the array of children is growing we need to decrease the skew\n\t\t\t\t// as we are adding a new element to the array.\n\t\t\t\t// Example:\n\t\t\t\t// [1, 2, 3] --> [0, 1, 2, 3]\n\t\t\t\t// oldChildren newChildren\n\t\t\t\t//\n\t\t\t\t// The new element is at index 0, so our skew is 0,\n\t\t\t\t// we need to decrease the skew as we are adding a new element.\n\t\t\t\t// The decrease will cause us to compare the element at position 1\n\t\t\t\t// with value 1 with the element at position 0 with value 0.\n\t\t\t\t//\n\t\t\t\t// A linear concept is applied when the array is shrinking,\n\t\t\t\t// if the length is unchanged we can assume that no skew\n\t\t\t\t// changes are needed.\n\t\t\t\tif (newChildrenLength > oldChildrenLength) {\n\t\t\t\t\tskew--;\n\t\t\t\t} else if (newChildrenLength < oldChildrenLength) {\n\t\t\t\t\tskew++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If we are mounting a DOM VNode, mark it for insertion\n\t\t\tif (typeof childVNode.type != 'function') {\n\t\t\t\tchildVNode._flags |= INSERT_VNODE;\n\t\t\t}\n\t\t} else if (matchingIndex != skewedIndex) {\n\t\t\t// When we move elements around i.e. [0, 1, 2] --> [1, 0, 2]\n\t\t\t// --> we diff 1, we find it at position 1 while our skewed index is 0 and our skew is 0\n\t\t\t// we set the skew to 1 as we found an offset.\n\t\t\t// --> we diff 0, we find it at position 0 while our skewed index is at 2 and our skew is 1\n\t\t\t// this makes us increase the skew again.\n\t\t\t// --> we diff 2, we find it at position 2 while our skewed index is at 4 and our skew is 2\n\t\t\t//\n\t\t\t// this becomes an optimization question where currently we see a 1 element offset as an insertion\n\t\t\t// or deletion i.e. we optimize for [0, 1, 2] --> [9, 0, 1, 2]\n\t\t\t// while a more than 1 offset we see as a swap.\n\t\t\t// We could probably build heuristics for having an optimized course of action here as well, but\n\t\t\t// might go at the cost of some bytes.\n\t\t\t//\n\t\t\t// If we wanted to optimize for i.e. only swaps we'd just do the last two code-branches and have\n\t\t\t// only the first item be a re-scouting and all the others fall in their skewed counter-part.\n\t\t\t// We could also further optimize for swaps\n\t\t\tif (matchingIndex == skewedIndex - 1) {\n\t\t\t\tskew--;\n\t\t\t} else if (matchingIndex == skewedIndex + 1) {\n\t\t\t\tskew++;\n\t\t\t} else {\n\t\t\t\tif (matchingIndex > skewedIndex) {\n\t\t\t\t\tskew--;\n\t\t\t\t} else {\n\t\t\t\t\tskew++;\n\t\t\t\t}\n\n\t\t\t\t// Move this VNode's DOM if the original index (matchingIndex) doesn't\n\t\t\t\t// match the new skew index (i + new skew)\n\t\t\t\t// In the former two branches we know that it matches after skewing\n\t\t\t\tchildVNode._flags |= INSERT_VNODE;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove remaining oldChildren if there are any. Loop forwards so that as we\n\t// unmount DOM from the beginning of the oldChildren, we can adjust oldDom to\n\t// point to the next child, which needs to be the first DOM node that won't be\n\t// unmounted.\n\tif (remainingOldChildren) {\n\t\tfor (i = 0; i < oldChildrenLength; i++) {\n\t\t\toldVNode = oldChildren[i];\n\t\t\tif (oldVNode != NULL && (oldVNode._flags & MATCHED) == 0) {\n\t\t\t\tif (oldVNode._dom == oldDom) {\n\t\t\t\t\toldDom = getDomSibling(oldVNode);\n\t\t\t\t}\n\n\t\t\t\tunmount(oldVNode, oldVNode);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn oldDom;\n}\n\n/**\n * @param {VNode} parentVNode\n * @param {PreactElement} oldDom\n * @param {PreactElement} parentDom\n * @param {boolean} shouldPlace\n * @returns {PreactElement}\n */\nfunction insert(parentVNode, oldDom, parentDom, shouldPlace) {\n\t// Note: VNodes in nested suspended trees may be missing _children.\n\n\tif (typeof parentVNode.type == 'function') {\n\t\tlet children = parentVNode._children;\n\t\tfor (let i = 0; children && i < children.length; i++) {\n\t\t\tif (children[i]) {\n\t\t\t\t// If we enter this code path on sCU bailout, where we copy\n\t\t\t\t// oldVNode._children to newVNode._children, we need to update the old\n\t\t\t\t// children's _parent pointer to point to the newVNode (parentVNode\n\t\t\t\t// here).\n\t\t\t\tchildren[i]._parent = parentVNode;\n\t\t\t\toldDom = insert(children[i], oldDom, parentDom, shouldPlace);\n\t\t\t}\n\t\t}\n\n\t\treturn oldDom;\n\t} else if (parentVNode._dom != oldDom) {\n\t\tif (shouldPlace) {\n\t\t\tif (oldDom && parentVNode.type && !oldDom.parentNode) {\n\t\t\t\toldDom = getDomSibling(parentVNode);\n\t\t\t}\n\t\t\tparentDom.insertBefore(parentVNode._dom, oldDom || NULL);\n\t\t}\n\t\toldDom = parentVNode._dom;\n\t}\n\n\tdo {\n\t\toldDom = oldDom && oldDom.nextSibling;\n\t} while (oldDom != NULL && oldDom.nodeType == 8);\n\n\treturn oldDom;\n}\n\n/**\n * Flatten and loop through the children of a virtual node\n * @param {ComponentChildren} children The unflattened children of a virtual\n * node\n * @returns {VNode[]}\n */\nexport function toChildArray(children, out) {\n\tout = out || [];\n\tif (children == NULL || typeof children == 'boolean') {\n\t} else if (isArray(children)) {\n\t\tchildren.some(child => {\n\t\t\ttoChildArray(child, out);\n\t\t});\n\t} else {\n\t\tout.push(children);\n\t}\n\treturn out;\n}\n\n/**\n * @param {VNode} childVNode\n * @param {VNode[]} oldChildren\n * @param {number} skewedIndex\n * @param {number} remainingOldChildren\n * @returns {number}\n */\nfunction findMatchingIndex(\n\tchildVNode,\n\toldChildren,\n\tskewedIndex,\n\tremainingOldChildren\n) {\n\tconst key = childVNode.key;\n\tconst type = childVNode.type;\n\tlet oldVNode = oldChildren[skewedIndex];\n\tconst matched = oldVNode != NULL && (oldVNode._flags & MATCHED) == 0;\n\n\t// We only need to perform a search if there are more children\n\t// (remainingOldChildren) to search. However, if the oldVNode we just looked\n\t// at skewedIndex was not already used in this diff, then there must be at\n\t// least 1 other (so greater than 1) remainingOldChildren to attempt to match\n\t// against. So the following condition checks that ensuring\n\t// remainingOldChildren > 1 if the oldVNode is not already used/matched. Else\n\t// if the oldVNode was null or matched, then there could needs to be at least\n\t// 1 (aka `remainingOldChildren > 0`) children to find and compare against.\n\t//\n\t// If there is an unkeyed functional VNode, that isn't a built-in like our Fragment,\n\t// we should not search as we risk re-using state of an unrelated VNode. (reverted for now)\n\tlet shouldSearch =\n\t\t// (typeof type != 'function' || type === Fragment || key) &&\n\t\tremainingOldChildren > (matched ? 1 : 0);\n\n\tif (\n\t\t(oldVNode === NULL && key == null) ||\n\t\t(matched && key == oldVNode.key && type == oldVNode.type)\n\t) {\n\t\treturn skewedIndex;\n\t} else if (shouldSearch) {\n\t\tlet x = skewedIndex - 1;\n\t\tlet y = skewedIndex + 1;\n\t\twhile (x >= 0 || y < oldChildren.length) {\n\t\t\tconst childIndex = x >= 0 ? x-- : y++;\n\t\t\toldVNode = oldChildren[childIndex];\n\t\t\tif (\n\t\t\t\toldVNode != NULL &&\n\t\t\t\t(oldVNode._flags & MATCHED) == 0 &&\n\t\t\t\tkey == oldVNode.key &&\n\t\t\t\ttype == oldVNode.type\n\t\t\t) {\n\t\t\t\treturn childIndex;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn -1;\n}\n","import {\n\tEMPTY_ARR,\n\tEMPTY_OBJ,\n\tMATH_NAMESPACE,\n\tMODE_HYDRATE,\n\tMODE_SUSPENDED,\n\tNULL,\n\tRESET_MODE,\n\tSVG_NAMESPACE,\n\tUNDEFINED,\n\tXHTML_NAMESPACE\n} from '../constants';\nimport { BaseComponent, getDomSibling } from '../component';\nimport { Fragment } from '../create-element';\nimport { diffChildren } from './children';\nimport { setProperty } from './props';\nimport { assign, isArray, removeNode, slice } from '../util';\nimport options from '../options';\n\n/**\n * @typedef {import('../internal').ComponentChildren} ComponentChildren\n * @typedef {import('../internal').Component} Component\n * @typedef {import('../internal').PreactElement} PreactElement\n * @typedef {import('../internal').VNode} VNode\n */\n\n/**\n * @template {any} T\n * @typedef {import('../internal').Ref<T>} Ref<T>\n */\n\n/**\n * Diff two virtual nodes and apply proper changes to the DOM\n * @param {PreactElement} parentDom The parent of the DOM element\n * @param {VNode} newVNode The new virtual node\n * @param {VNode} oldVNode The old virtual node\n * @param {object} globalContext The current context object. Modified by\n * getChildContext\n * @param {string} namespace Current namespace of the DOM node (HTML, SVG, or MathML)\n * @param {Array<PreactElement>} excessDomChildren\n * @param {Array<Component>} commitQueue List of components which have callbacks\n * to invoke in commitRoot\n * @param {PreactElement} oldDom The current attached DOM element any new dom\n * elements should be placed around. Likely `null` on first render (except when\n * hydrating). Can be a sibling DOM element when diffing Fragments that have\n * siblings. In most cases, it starts out as `oldChildren[0]._dom`.\n * @param {boolean} isHydrating Whether or not we are in hydration\n * @param {any[]} refQueue an array of elements needed to invoke refs\n */\nexport function diff(\n\tparentDom,\n\tnewVNode,\n\toldVNode,\n\tglobalContext,\n\tnamespace,\n\texcessDomChildren,\n\tcommitQueue,\n\toldDom,\n\tisHydrating,\n\trefQueue\n) {\n\t/** @type {any} */\n\tlet tmp,\n\t\tnewType = newVNode.type;\n\n\t// When passing through createElement it assigns the object\n\t// constructor as undefined. This to prevent JSON-injection.\n\tif (newVNode.constructor !== UNDEFINED) return NULL;\n\n\t// If the previous diff bailed out, resume creating/hydrating.\n\tif (oldVNode._flags & MODE_SUSPENDED) {\n\t\tisHydrating = !!(oldVNode._flags & MODE_HYDRATE);\n\t\toldDom = newVNode._dom = oldVNode._dom;\n\t\texcessDomChildren = [oldDom];\n\t}\n\n\tif ((tmp = options._diff)) tmp(newVNode);\n\n\touter: if (typeof newType == 'function') {\n\t\ttry {\n\t\t\tlet c, isNew, oldProps, oldState, snapshot, clearProcessingException;\n\t\t\tlet newProps = newVNode.props;\n\t\t\tconst isClassComponent =\n\t\t\t\t'prototype' in newType && newType.prototype.render;\n\n\t\t\t// Necessary for createContext api. Setting this property will pass\n\t\t\t// the context value as `this.context` just for this component.\n\t\t\ttmp = newType.contextType;\n\t\t\tlet provider = tmp && globalContext[tmp._id];\n\t\t\tlet componentContext = tmp\n\t\t\t\t? provider\n\t\t\t\t\t? provider.props.value\n\t\t\t\t\t: tmp._defaultValue\n\t\t\t\t: globalContext;\n\n\t\t\t// Get component and set it to `c`\n\t\t\tif (oldVNode._component) {\n\t\t\t\tc = newVNode._component = oldVNode._component;\n\t\t\t\tclearProcessingException = c._processingException = c._pendingError;\n\t\t\t} else {\n\t\t\t\t// Instantiate the new component\n\t\t\t\tif (isClassComponent) {\n\t\t\t\t\t// @ts-expect-error The check above verifies that newType is suppose to be constructed\n\t\t\t\t\tnewVNode._component = c = new newType(newProps, componentContext); // eslint-disable-line new-cap\n\t\t\t\t} else {\n\t\t\t\t\t// @ts-expect-error Trust me, Component implements the interface we want\n\t\t\t\t\tnewVNode._component = c = new BaseComponent(\n\t\t\t\t\t\tnewProps,\n\t\t\t\t\t\tcomponentContext\n\t\t\t\t\t);\n\t\t\t\t\tc.constructor = newType;\n\t\t\t\t\tc.render = doRender;\n\t\t\t\t}\n\t\t\t\tif (provider) provider.sub(c);\n\n\t\t\t\tif (!c.state) c.state = {};\n\t\t\t\tc._globalContext = globalContext;\n\t\t\t\tisNew = c._dirty = true;\n\t\t\t\tc._renderCallbacks = [];\n\t\t\t\tc._stateCallbacks = [];\n\t\t\t}\n\n\t\t\t// Invoke getDerivedStateFromProps\n\t\t\tif (isClassComponent && c._nextState == NULL) {\n\t\t\t\tc._nextState = c.state;\n\t\t\t}\n\n\t\t\tif (isClassComponent && newType.getDerivedStateFromProps != NULL) {\n\t\t\t\tif (c._nextState == c.state) {\n\t\t\t\t\tc._nextState = assign({}, c._nextState);\n\t\t\t\t}\n\n\t\t\t\tassign(\n\t\t\t\t\tc._nextState,\n\t\t\t\t\tnewType.getDerivedStateFromProps(newProps, c._nextState)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\toldProps = c.props;\n\t\t\toldState = c.state;\n\t\t\tc._vnode = newVNode;\n\n\t\t\t// Invoke pre-render lifecycle methods\n\t\t\tif (isNew) {\n\t\t\t\tif (\n\t\t\t\t\tisClassComponent &&\n\t\t\t\t\tnewType.getDerivedStateFromProps == NULL &&\n\t\t\t\t\tc.componentWillMount != NULL\n\t\t\t\t) {\n\t\t\t\t\tc.componentWillMount();\n\t\t\t\t}\n\n\t\t\t\tif (isClassComponent && c.componentDidMount != NULL) {\n\t\t\t\t\tc._renderCallbacks.push(c.componentDidMount);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\tisClassComponent &&\n\t\t\t\t\tnewType.getDerivedStateFromProps == NULL &&\n\t\t\t\t\tnewProps !== oldProps &&\n\t\t\t\t\tc.componentWillReceiveProps != NULL\n\t\t\t\t) {\n\t\t\t\t\tc.componentWillReceiveProps(newProps, componentContext);\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tnewVNode._original == oldVNode._original ||\n\t\t\t\t\t(!c._force &&\n\t\t\t\t\t\tc.shouldComponentUpdate != NULL &&\n\t\t\t\t\t\tc.shouldComponentUpdate(\n\t\t\t\t\t\t\tnewProps,\n\t\t\t\t\t\t\tc._nextState,\n\t\t\t\t\t\t\tcomponentContext\n\t\t\t\t\t\t) === false)\n\t\t\t\t) {\n\t\t\t\t\t// More info about this here: https://gist.github.com/JoviDeCroock/bec5f2ce93544d2e6070ef8e0036e4e8\n\t\t\t\t\tif (newVNode._original != oldVNode._original) {\n\t\t\t\t\t\t// When we are dealing with a bail because of sCU we have to update\n\t\t\t\t\t\t// the props, state and dirty-state.\n\t\t\t\t\t\t// when we are dealing with strict-equality we don't as the child could still\n\t\t\t\t\t\t// be dirtied see #3883\n\t\t\t\t\t\tc.props = newProps;\n\t\t\t\t\t\tc.state = c._nextState;\n\t\t\t\t\t\tc._dirty = false;\n\t\t\t\t\t}\n\n\t\t\t\t\tnewVNode._dom = oldVNode._dom;\n\t\t\t\t\tnewVNode._children = oldVNode._children;\n\t\t\t\t\tnewVNode._children.some(vnode => {\n\t\t\t\t\t\tif (vnode) vnode._parent = newVNode;\n\t\t\t\t\t});\n\n\t\t\t\t\tEMPTY_ARR.push.apply(c._renderCallbacks, c._stateCallbacks);\n\t\t\t\t\tc._stateCallbacks = [];\n\n\t\t\t\t\tif (c._renderCallbacks.length) {\n\t\t\t\t\t\tcommitQueue.push(c);\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\n\t\t\t\tif (c.componentWillUpdate != NULL) {\n\t\t\t\t\tc.componentWillUpdate(newProps, c._nextState, componentContext);\n\t\t\t\t}\n\n\t\t\t\tif (isClassComponent && c.componentDidUpdate != NULL) {\n\t\t\t\t\tc._renderCallbacks.push(() => {\n\t\t\t\t\t\tc.componentDidUpdate(oldProps, oldState, snapshot);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tc.context = componentContext;\n\t\t\tc.props = newProps;\n\t\t\tc._parentDom = parentDom;\n\t\t\tc._force = false;\n\n\t\t\tlet renderHook = options._render,\n\t\t\t\tcount = 0;\n\t\t\tif (isClassComponent) {\n\t\t\t\tc.state = c._nextState;\n\t\t\t\tc._dirty = false;\n\n\t\t\t\tif (renderHook) renderHook(newVNode);\n\n\t\t\t\ttmp = c.render(c.props, c.state, c.context);\n\n\t\t\t\tEMPTY_ARR.push.apply(c._renderCallbacks, c._stateCallbacks);\n\t\t\t\tc._stateCallbacks = [];\n\t\t\t} else {\n\t\t\t\tdo {\n\t\t\t\t\tc._dirty = false;\n\t\t\t\t\tif (renderHook) renderHook(newVNode);\n\n\t\t\t\t\ttmp = c.render(c.props, c.state, c.context);\n\n\t\t\t\t\t// Handle setState called in render, see #2553\n\t\t\t\t\tc.state = c._nextState;\n\t\t\t\t} while (c._dirty && ++count < 25);\n\t\t\t}\n\n\t\t\t// Handle setState called in render, see #2553\n\t\t\tc.state = c._nextState;\n\n\t\t\tif (c.getChildContext != NULL) {\n\t\t\t\tglobalContext = assign(assign({}, globalContext), c.getChildContext());\n\t\t\t}\n\n\t\t\tif (isClassComponent && !isNew && c.getSnapshotBeforeUpdate != NULL) {\n\t\t\t\tsnapshot = c.getSnapshotBeforeUpdate(oldProps, oldState);\n\t\t\t}\n\n\t\t\tlet renderResult =\n\t\t\t\ttmp != NULL && tmp.type === Fragment && tmp.key == NULL\n\t\t\t\t\t? cloneNode(tmp.props.children)\n\t\t\t\t\t: tmp;\n\n\t\t\toldDom = diffChildren(\n\t\t\t\tparentDom,\n\t\t\t\tisArray(renderResult) ? renderResult : [renderResult],\n\t\t\t\tnewVNode,\n\t\t\t\toldVNode,\n\t\t\t\tglobalContext,\n\t\t\t\tnamespace,\n\t\t\t\texcessDomChildren,\n\t\t\t\tcommitQueue,\n\t\t\t\toldDom,\n\t\t\t\tisHydrating,\n\t\t\t\trefQueue\n\t\t\t);\n\n\t\t\tc.base = newVNode._dom;\n\n\t\t\t// We successfully rendered this VNode, unset any stored hydration/bailout state:\n\t\t\tnewVNode._flags &= RESET_MODE;\n\n\t\t\tif (c._renderCallbacks.length) {\n\t\t\t\tcommitQueue.push(c);\n\t\t\t}\n\n\t\t\tif (clearProcessingException) {\n\t\t\t\tc._pendingError = c._processingException = NULL;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tnewVNode._original = NULL;\n\t\t\t// if hydrating or creating initial tree, bailout preserves DOM:\n\t\t\tif (isHydrating || excessDomChildren != NULL) {\n\t\t\t\tif (e.then) {\n\t\t\t\t\tnewVNode._flags |= isHydrating\n\t\t\t\t\t\t? MODE_HYDRATE | MODE_SUSPENDED\n\t\t\t\t\t\t: MODE_SUSPENDED;\n\n\t\t\t\t\twhile (oldDom && oldDom.nodeType == 8 && oldDom.nextSibling) {\n\t\t\t\t\t\toldDom = oldDom.nextSibling;\n\t\t\t\t\t}\n\n\t\t\t\t\texcessDomChildren[excessDomChildren.indexOf(oldDom)] = NULL;\n\t\t\t\t\tnewVNode._dom = oldDom;\n\t\t\t\t} else {\n\t\t\t\t\tfor (let i = excessDomChildren.length; i--; ) {\n\t\t\t\t\t\tremoveNode(excessDomChildren[i]);\n\t\t\t\t\t}\n\t\t\t\t\tmarkAsForce(newVNode);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnewVNode._dom = oldVNode._dom;\n\t\t\t\tnewVNode._children = oldVNode._children;\n\t\t\t\tif (!e.then) markAsForce(newVNode);\n\t\t\t}\n\t\t\toptions._catchError(e, newVNode, oldVNode);\n\t\t}\n\t} else if (\n\t\texcessDomChildren == NULL &&\n\t\tnewVNode._original == oldVNode._original\n\t) {\n\t\tnewVNode._children = oldVNode._children;\n\t\tnewVNode._dom = oldVNode._dom;\n\t} else {\n\t\toldDom = newVNode._dom = diffElementNodes(\n\t\t\toldVNode._dom,\n\t\t\tnewVNode,\n\t\t\toldVNode,\n\t\t\tglobalContext,\n\t\t\tnamespace,\n\t\t\texcessDomChildren,\n\t\t\tcommitQueue,\n\t\t\tisHydrating,\n\t\t\trefQueue\n\t\t);\n\t}\n\n\tif ((tmp = options.diffed)) tmp(newVNode);\n\n\treturn newVNode._flags & MODE_SUSPENDED ? undefined : oldDom;\n}\n\nfunction markAsForce(vnode) {\n\tif (vnode) {\n\t\tif (vnode._component) vnode._component._force = true;\n\t\tif (vnode._children) vnode._children.some(markAsForce);\n\t}\n}\n\n/**\n * @param {Array<Component>} commitQueue List of components\n * which have callbacks to invoke in commitRoot\n * @param {VNode} root\n */\nexport function commitRoot(commitQueue, root, refQueue) {\n\tfor (let i = 0; i < refQueue.length; i++) {\n\t\tapplyRef(refQueue[i], refQueue[++i], refQueue[++i]);\n\t}\n\n\tif (options._commit) options._commit(root, commitQueue);\n\n\tcommitQueue.some(c => {\n\t\ttry {\n\t\t\t// @ts-expect-error Reuse the commitQueue variable here so the type changes\n\t\t\tcommitQueue = c._renderCallbacks;\n\t\t\tc._renderCallbacks = [];\n\t\t\tcommitQueue.some(cb => {\n\t\t\t\t// @ts-expect-error See above comment on commitQueue\n\t\t\t\tcb.call(c);\n\t\t\t});\n\t\t} catch (e) {\n\t\t\toptions._catchError(e, c._vnode);\n\t\t}\n\t});\n}\n\nfunction cloneNode(node) {\n\tif (typeof node != 'object' || node == NULL || node._depth > 0) {\n\t\treturn node;\n\t}\n\n\tif (isArray(node)) {\n\t\treturn node.map(cloneNode);\n\t}\n\n\treturn assign({}, node);\n}\n\n/**\n * Diff two virtual nodes representing DOM element\n * @param {PreactElement} dom The DOM element representing the virtual nodes\n * being diffed\n * @param {VNode} newVNode The new virtual node\n * @param {VNode} oldVNode The old virtual node\n * @param {object} globalContext The current context object\n * @param {string} namespace Current namespace of the DOM node (HTML, SVG, or MathML)\n * @param {Array<PreactElement>} excessDomChildren\n * @param {Array<Component>} commitQueue List of components which have callbacks\n * to invoke in commitRoot\n * @param {boolean} isHydrating Whether or not we are in hydration\n * @param {any[]} refQueue an array of elements needed to invoke refs\n * @returns {PreactElement}\n */\nfunction diffElementNodes(\n\tdom,\n\tnewVNode,\n\toldVNode,\n\tglobalContext,\n\tnamespace,\n\texcessDomChildren,\n\tcommitQueue,\n\tisHydrating,\n\trefQueue\n) {\n\tlet oldProps = oldVNode.props || EMPTY_OBJ;\n\tlet newProps = newVNode.props;\n\tlet nodeType = /** @type {string} */ (newVNode.type);\n\t/** @type {any} */\n\tlet i;\n\t/** @type {{ __html?: string }} */\n\tlet newHtml;\n\t/** @type {{ __html?: string }} */\n\tlet oldHtml;\n\t/** @type {ComponentChildren} */\n\tlet newChildren;\n\tlet value;\n\tlet inputValue;\n\tlet checked;\n\n\t// Tracks entering and exiting namespaces when descending through the tree.\n\tif (nodeType == 'svg') namespace = SVG_NAMESPACE;\n\telse if (nodeType == 'math') namespace = MATH_NAMESPACE;\n\telse if (!namespace) namespace = XHTML_NAMESPACE;\n\n\tif (excessDomChildren != NULL) {\n\t\tfor (i = 0; i < excessDomChildren.length; i++) {\n\t\t\tvalue = excessDomChildren[i];\n\n\t\t\t// if newVNode matches an element in excessDomChildren or the `dom`\n\t\t\t// argument matches an element in excessDomChildren, remove it from\n\t\t\t// excessDomChildren so it isn't later removed in diffChildren\n\t\t\tif (\n\t\t\t\tvalue &&\n\t\t\t\t'setAttribute' in value == !!nodeType &&\n\t\t\t\t(nodeType ? value.localName == nodeType : value.nodeType == 3)\n\t\t\t) {\n\t\t\t\tdom = value;\n\t\t\t\texcessDomChildren[i] = NULL;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (dom == NULL) {\n\t\tif (nodeType == NULL) {\n\t\t\treturn document.createTextNode(newProps);\n\t\t}\n\n\t\tdom = document.createElementNS(\n\t\t\tnamespace,\n\t\t\tnodeType,\n\t\t\tnewProps.is && newProps\n\t\t);\n\n\t\t// we are creating a new node, so we can assume this is a new subtree (in\n\t\t// case we are hydrating), this deopts the hydrate\n\t\tif (isHydrating) {\n\t\t\tif (options._hydrationMismatch)\n\t\t\t\toptions._hydrationMismatch(newVNode, excessDomChildren);\n\t\t\tisHydrating = false;\n\t\t}\n\t\t// we created a new parent, so none of the previously attached children can be reused:\n\t\texcessDomChildren = NULL;\n\t}\n\n\tif (nodeType == NULL) {\n\t\t// During hydration, we still have to split merged text from SSR'd HTML.\n\t\tif (oldProps !== newProps && (!isHydrating || dom.data != newProps)) {\n\t\t\tdom.data = newProps;\n\t\t}\n\t} else {\n\t\t// If excessDomChildren was not null, repopulate it with the current element's children:\n\t\texcessDomChildren = excessDomChildren && slice.call(dom.childNodes);\n\n\t\t// If we are in a situation where we are not hydrating but are using\n\t\t// existing DOM (e.g. replaceNode) we should read the existing DOM\n\t\t// attributes to diff them\n\t\tif (!isHydrating && excessDomChildren != NULL) {\n\t\t\toldProps = {};\n\t\t\tfor (i = 0; i < dom.attributes.length; i++) {\n\t\t\t\tvalue = dom.attributes[i];\n\t\t\t\toldProps[value.name] = value.value;\n\t\t\t}\n\t\t}\n\n\t\tfor (i in oldProps) {\n\t\t\tvalue = oldProps[i];\n\t\t\tif (i == 'dangerouslySetInnerHTML') {\n\t\t\t\toldHtml = value;\n\t\t\t} else if (\n\t\t\t\ti != 'children' &&\n\t\t\t\t!(i in newProps) &&\n\t\t\t\t!(i == 'value' && 'defaultValue' in newProps) &&\n\t\t\t\t!(i == 'checked' && 'defaultChecked' in newProps)\n\t\t\t) {\n\t\t\t\tsetProperty(dom, i, NULL, value, namespace);\n\t\t\t}\n\t\t}\n\n\t\t// During hydration, props are not diffed at all (including dangerouslySetInnerHTML)\n\t\t// @TODO we should warn in debug mode when props don't match here.\n\t\tfor (i in newProps) {\n\t\t\tvalue = newProps[i];\n\t\t\tif (i == 'children') {\n\t\t\t\tnewChildren = value;\n\t\t\t} else if (i == 'dangerouslySetInnerHTML') {\n\t\t\t\tnewHtml = value;\n\t\t\t} else if (i == 'value') {\n\t\t\t\tinputValue = value;\n\t\t\t} else if (i == 'checked') {\n\t\t\t\tchecked = value;\n\t\t\t} else if (\n\t\t\t\t(!isHydrating || typeof value == 'function') &&\n\t\t\t\toldProps[i] !== value\n\t\t\t) {\n\t\t\t\tsetProperty(dom, i, value, oldProps[i], namespace);\n\t\t\t}\n\t\t}\n\n\t\t// If the new vnode didn't have dangerouslySetInnerHTML, diff its children\n\t\tif (newHtml) {\n\t\t\t// Avoid re-applying the same '__html' if it did not changed between re-render\n\t\t\tif (\n\t\t\t\t!isHydrating &&\n\t\t\t\t(!oldHtml ||\n\t\t\t\t\t(newHtml.__html != oldHtml.__html && newHtml.__html != dom.innerHTML))\n\t\t\t) {\n\t\t\t\tdom.innerHTML = newHtml.__html;\n\t\t\t}\n\n\t\t\tnewVNode._children = [];\n\t\t} else {\n\t\t\tif (oldHtml) dom.innerHTML = '';\n\n\t\t\tdiffChildren(\n\t\t\t\t// @ts-expect-error\n\t\t\t\tnewVNode.type == 'template' ? dom.content : dom,\n\t\t\t\tisArray(newChildren) ? newChildren : [newChildren],\n\t\t\t\tnewVNode,\n\t\t\t\toldVNode,\n\t\t\t\tglobalContext,\n\t\t\t\tnodeType == 'foreignObject' ? XHTML_NAMESPACE : namespace,\n\t\t\t\texcessDomChildren,\n\t\t\t\tcommitQueue,\n\t\t\t\texcessDomChildren\n\t\t\t\t\t? excessDomChildren[0]\n\t\t\t\t\t: oldVNode._children && getDomSibling(oldVNode, 0),\n\t\t\t\tisHydrating,\n\t\t\t\trefQueue\n\t\t\t);\n\n\t\t\t// Remove children that are not part of any vnode.\n\t\t\tif (excessDomChildren != NULL) {\n\t\t\t\tfor (i = excessDomChildren.length; i--; ) {\n\t\t\t\t\tremoveNode(excessDomChildren[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// As above, don't diff props during hydration\n\t\tif (!isHydrating) {\n\t\t\ti = 'value';\n\t\t\tif (nodeType == 'progress' && inputValue == NULL) {\n\t\t\t\tdom.removeAttribute('value');\n\t\t\t} else if (\n\t\t\t\tinputValue != UNDEFINED &&\n\t\t\t\t// #2756 For the <progress>-element the initial value is 0,\n\t\t\t\t// despite the attribute not being present. When the attribute\n\t\t\t\t// is missing the progress bar is treated as indeterminate.\n\t\t\t\t// To fix that we'll always update it when it is 0 for progress elements\n\t\t\t\t(inputValue !== dom[i] ||\n\t\t\t\t\t(nodeType == 'progress' && !inputValue) ||\n\t\t\t\t\t// This is only for IE 11 to fix <select> value not being updated.\n\t\t\t\t\t// To avoid a stale select value we need to set the option.value\n\t\t\t\t\t// again, which triggers IE11 to re-evaluate the select value\n\t\t\t\t\t(nodeType == 'option' && inputValue != oldProps[i]))\n\t\t\t) {\n\t\t\t\tsetProperty(dom, i, inputValue, oldProps[i], namespace);\n\t\t\t}\n\n\t\t\ti = 'checked';\n\t\t\tif (checked != UNDEFINED && checked != dom[i]) {\n\t\t\t\tsetProperty(dom, i, checked, oldProps[i], namespace);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn dom;\n}\n\n/**\n * Invoke or update a ref, depending on whether it is a function or object ref.\n * @param {Ref<any> & { _unmount?: unknown }} ref\n * @param {any} value\n * @param {VNode} vnode\n */\nexport function applyRef(ref, value, vnode) {\n\ttry {\n\t\tif (typeof ref == 'function') {\n\t\t\tlet hasRefUnmount = typeof ref._unmount == 'function';\n\t\t\tif (hasRefUnmount) {\n\t\t\t\t// @ts-ignore TS doesn't like moving narrowing checks into variables\n\t\t\t\tref._unmount();\n\t\t\t}\n\n\t\t\tif (!hasRefUnmount || value != NULL) {\n\t\t\t\t// Store the cleanup function on the function\n\t\t\t\t// instance object itself to avoid shape\n\t\t\t\t// transitioning vnode\n\t\t\t\tref._unmount = ref(value);\n\t\t\t}\n\t\t} else ref.current = value;\n\t} catch (e) {\n\t\toptions._catchError(e, vnode);\n\t}\n}\n\n/**\n * Unmount a virtual node from the tree and apply DOM changes\n * @param {VNode} vnode The virtual node to unmount\n * @param {VNode} parentVNode The parent of the VNode that initiated the unmount\n * @param {boolean} [skipRemove] Flag that indicates that a parent node of the\n * current element is already detached from the DOM.\n */\nexport function unmount(vnode, parentVNode, skipRemove) {\n\tlet r;\n\tif (options.unmount) options.unmount(vnode);\n\n\tif ((r = vnode.ref)) {\n\t\tif (!r.current || r.current == vnode._dom) {\n\t\t\tapplyRef(r, NULL, parentVNode);\n\t\t}\n\t}\n\n\tif ((r = vnode._component) != NULL) {\n\t\tif (r.componentWillUnmount) {\n\t\t\ttry {\n\t\t\t\tr.componentWillUnmount();\n\t\t\t} catch (e) {\n\t\t\t\toptions._catchError(e, parentVNode);\n\t\t\t}\n\t\t}\n\n\t\tr.base = r._parentDom = NULL;\n\t}\n\n\tif ((r = vnode._children)) {\n\t\tfor (let i = 0; i < r.length; i++) {\n\t\t\tif (r[i]) {\n\t\t\t\tunmount(\n\t\t\t\t\tr[i],\n\t\t\t\t\tparentVNode,\n\t\t\t\t\tskipRemove || typeof vnode.type != 'function'\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!skipRemove) {\n\t\tremoveNode(vnode._dom);\n\t}\n\n\tvnode._component = vnode._parent = vnode._dom = UNDEFINED;\n}\n\n/** The `.render()` method for a PFC backing instance. */\nfunction doRender(props, state, context) {\n\treturn this.constructor(props, context);\n}\n","import { EMPTY_OBJ, NULL } from './constants';\nimport { commitRoot, diff } from './diff/index';\nimport { createElement, Fragment } from './create-element';\nimport options from './options';\nimport { slice } from './util';\n\n/**\n * Render a Preact virtual node into a DOM element\n * @param {import('./internal').ComponentChild} vnode The virtual node to render\n * @param {import('./internal').PreactElement} parentDom The DOM element to render into\n * @param {import('./internal').PreactElement | object} [replaceNode] Optional: Attempt to re-use an\n * existing DOM tree rooted at `replaceNode`\n */\nexport function render(vnode, parentDom, replaceNode) {\n\t// https://github.com/preactjs/preact/issues/3794\n\tif (parentDom == document) {\n\t\tparentDom = document.documentElement;\n\t}\n\n\tif (options._root) options._root(vnode, parentDom);\n\n\t// We abuse the `replaceNode` parameter in `hydrate()` to signal if we are in\n\t// hydration mode or not by passing the `hydrate` function instead of a DOM\n\t// element..\n\tlet isHydrating = typeof replaceNode == 'function';\n\n\t// To be able to support calling `render()` multiple times on the same\n\t// DOM node, we need to obtain a reference to the previous tree. We do\n\t// this by assigning a new `_children` property to DOM nodes which points\n\t// to the last rendered tree. By default this property is not present, which\n\t// means that we are mounting a new tree for the first time.\n\tlet oldVNode = isHydrating\n\t\t? NULL\n\t\t: (replaceNode && replaceNode._children) || parentDom._children;\n\n\tvnode = ((!isHydrating && replaceNode) || parentDom)._children =\n\t\tcreateElement(Fragment, NULL, [vnode]);\n\n\t// List of effects that need to be called after diffing.\n\tlet commitQueue = [],\n\t\trefQueue = [];\n\tdiff(\n\t\tparentDom,\n\t\t// Determine the new vnode tree and store it on the DOM element on\n\t\t// our custom `_children` property.\n\t\tvnode,\n\t\toldVNode || EMPTY_OBJ,\n\t\tEMPTY_OBJ,\n\t\tparentDom.namespaceURI,\n\t\t!isHydrating && replaceNode\n\t\t\t? [replaceNode]\n\t\t\t: oldVNode\n\t\t\t\t? NULL\n\t\t\t\t: parentDom.firstChild\n\t\t\t\t\t? slice.call(parentDom.childNodes)\n\t\t\t\t\t: NULL,\n\t\tcommitQueue,\n\t\t!isHydrating && replaceNode\n\t\t\t? replaceNode\n\t\t\t: oldVNode\n\t\t\t\t? oldVNode._dom\n\t\t\t\t: parentDom.firstChild,\n\t\tisHydrating,\n\t\trefQueue\n\t);\n\n\t// Flush all queued effects\n\tcommitRoot(commitQueue, vnode, refQueue);\n}\n\n/**\n * Update an existing DOM element with data from a Preact virtual node\n * @param {import('./internal').ComponentChild} vnode The virtual node to render\n * @param {import('./internal').PreactElement} parentDom The DOM element to update\n */\nexport function hydrate(vnode, parentDom) {\n\trender(vnode, parentDom, hydrate);\n}\n","import { assign, slice } from './util';\nimport { createVNode } from './create-element';\nimport { NULL, UNDEFINED } from './constants';\n\n/**\n * Clones the given VNode, optionally adding attributes/props and replacing its\n * children.\n * @param {import('./internal').VNode} vnode The virtual DOM element to clone\n * @param {object} props Attributes/props to add when cloning\n * @param {Array<import('./internal').ComponentChildren>} rest Any additional arguments will be used\n * as replacement children.\n * @returns {import('./internal').VNode}\n */\nexport function cloneElement(vnode, props, children) {\n\tlet normalizedProps = assign({}, vnode.props),\n\t\tkey,\n\t\tref,\n\t\ti;\n\n\tlet defaultProps;\n\n\tif (vnode.type && vnode.type.defaultProps) {\n\t\tdefaultProps = vnode.type.defaultProps;\n\t}\n\n\tfor (i in props) {\n\t\tif (i == 'key') key = props[i];\n\t\telse if (i == 'ref') ref = props[i];\n\t\telse if (props[i] === UNDEFINED && defaultProps != UNDEFINED) {\n\t\t\tnormalizedProps[i] = defaultProps[i];\n\t\t} else {\n\t\t\tnormalizedProps[i] = props[i];\n\t\t}\n\t}\n\n\tif (arguments.length > 2) {\n\t\tnormalizedProps.children =\n\t\t\targuments.length > 3 ? slice.call(arguments, 2) : children;\n\t}\n\n\treturn createVNode(\n\t\tvnode.type,\n\t\tnormalizedProps,\n\t\tkey || vnode.key,\n\t\tref || vnode.ref,\n\t\tNULL\n\t);\n}\n","import { NULL } from '../constants';\n\n/**\n * Find the closest error boundary to a thrown error and call it\n * @param {object} error The thrown value\n * @param {import('../internal').VNode} vnode The vnode that threw the error that was caught (except\n * for unmounting when this parameter is the highest parent that was being\n * unmounted)\n * @param {import('../internal').VNode} [oldVNode]\n * @param {import('../internal').ErrorInfo} [errorInfo]\n */\nexport function _catchError(error, vnode, oldVNode, errorInfo) {\n\t/** @type {import('../internal').Component} */\n\tlet component,\n\t\t/** @type {import('../internal').ComponentType} */\n\t\tctor,\n\t\t/** @type {boolean} */\n\t\thandled;\n\n\tfor (; (vnode = vnode._parent); ) {\n\t\tif ((component = vnode._component) && !component._processingException) {\n\t\t\ttry {\n\t\t\t\tctor = component.constructor;\n\n\t\t\t\tif (ctor && ctor.getDerivedStateFromError != NULL) {\n\t\t\t\t\tcomponent.setState(ctor.getDerivedStateFromError(error));\n\t\t\t\t\thandled = component._dirty;\n\t\t\t\t}\n\n\t\t\t\tif (component.componentDidCatch != NULL) {\n\t\t\t\t\tcomponent.componentDidCatch(error, errorInfo || {});\n\t\t\t\t\thandled = component._dirty;\n\t\t\t\t}\n\n\t\t\t\t// This is an error boundary. Mark it as having bailed out, and whether it was mid-hydration.\n\t\t\t\tif (handled) {\n\t\t\t\t\treturn (component._pendingError = component);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\terror = e;\n\t\t\t}\n\t\t}\n\t}\n\n\tthrow error;\n}\n","import { options as _options } from 'preact';\n\n/** @type {number} */\nlet currentIndex;\n\n/** @type {import('./internal').Component} */\nlet currentComponent;\n\n/** @type {import('./internal').Component} */\nlet previousComponent;\n\n/** @type {number} */\nlet currentHook = 0;\n\n/** @type {Array<import('./internal').Component>} */\nlet afterPaintEffects = [];\n\n// Cast to use internal Options type\nconst options = /** @type {import('./internal').Options} */ (_options);\n\nlet oldBeforeDiff = options._diff;\nlet oldBeforeRender = options._render;\nlet oldAfterDiff = options.diffed;\nlet oldCommit = options._commit;\nlet oldBeforeUnmount = options.unmount;\nlet oldRoot = options._root;\n\n// We take the minimum timeout for requestAnimationFrame to ensure that\n// the callback is invoked after the next frame. 35ms is based on a 30hz\n// refresh rate, which is the minimum rate for a smooth user experience.\nconst RAF_TIMEOUT = 35;\nlet prevRaf;\n\n/** @type {(vnode: import('./internal').VNode) => void} */\noptions._diff = vnode => {\n\tcurrentComponent = null;\n\tif (oldBeforeDiff) oldBeforeDiff(vnode);\n};\n\noptions._root = (vnode, parentDom) => {\n\tif (vnode && parentDom._children && parentDom._children._mask) {\n\t\tvnode._mask = parentDom._children._mask;\n\t}\n\n\tif (oldRoot) oldRoot(vnode, parentDom);\n};\n\n/** @type {(vnode: import('./internal').VNode) => void} */\noptions._render = vnode => {\n\tif (oldBeforeRender) oldBeforeRender(vnode);\n\n\tcurrentComponent = vnode._component;\n\tcurrentIndex = 0;\n\n\tconst hooks = currentComponent.__hooks;\n\tif (hooks) {\n\t\tif (previousComponent === currentComponent) {\n\t\t\thooks._pendingEffects = [];\n\t\t\tcurrentComponent._renderCallbacks = [];\n\t\t\thooks._list.some(hookItem => {\n\t\t\t\tif (hookItem._nextValue) {\n\t\t\t\t\thookItem._value = hookItem._nextValue;\n\t\t\t\t}\n\t\t\t\thookItem._pendingArgs = hookItem._nextValue = undefined;\n\t\t\t});\n\t\t} else {\n\t\t\thooks._pendingEffects.some(invokeCleanup);\n\t\t\thooks._pendingEffects.some(invokeEffect);\n\t\t\thooks._pendingEffects = [];\n\t\t\tcurrentIndex = 0;\n\t\t}\n\t}\n\tpreviousComponent = currentComponent;\n};\n\n/** @type {(vnode: import('./internal').VNode) => void} */\noptions.diffed = vnode => {\n\tif (oldAfterDiff) oldAfterDiff(vnode);\n\n\tconst c = vnode._component;\n\tif (c && c.__hooks) {\n\t\tif (c.__hooks._pendingEffects.length) afterPaint(afterPaintEffects.push(c));\n\t\tc.__hooks._list.some(hookItem => {\n\t\t\tif (hookItem._pendingArgs) {\n\t\t\t\thookItem._args = hookItem._pendingArgs;\n\t\t\t}\n\t\t\thookItem._pendingArgs = undefined;\n\t\t});\n\t}\n\tpreviousComponent = currentComponent = null;\n};\n\n// TODO: Improve typing of commitQueue parameter\n/** @type {(vnode: import('./internal').VNode, commitQueue: any) => void} */\noptions._commit = (vnode, commitQueue) => {\n\tcommitQueue.some(component => {\n\t\ttry {\n\t\t\tcomponent._renderCallbacks.some(invokeCleanup);\n\t\t\tcomponent._renderCallbacks = component._renderCallbacks.filter(cb =>\n\t\t\t\tcb._value ? invokeEffect(cb) : true\n\t\t\t);\n\t\t} catch (e) {\n\t\t\tcommitQueue.some(c => {\n\t\t\t\tif (c._renderCallbacks) c._renderCallbacks = [];\n\t\t\t});\n\t\t\tcommitQueue = [];\n\t\t\toptions._catchError(e, component._vnode);\n\t\t}\n\t});\n\n\tif (oldCommit) oldCommit(vnode, commitQueue);\n};\n\n/** @type {(vnode: import('./internal').VNode) => void} */\noptions.unmount = vnode => {\n\tif (oldBeforeUnmount) oldBeforeUnmount(vnode);\n\n\tconst c = vnode._component;\n\tif (c && c.__hooks) {\n\t\tlet hasErrored;\n\t\tc.__hooks._list.some(s => {\n\t\t\ttry {\n\t\t\t\tinvokeCleanup(s);\n\t\t\t} catch (e) {\n\t\t\t\thasErrored = e;\n\t\t\t}\n\t\t});\n\t\tc.__hooks = undefined;\n\t\tif (hasErrored) options._catchError(hasErrored, c._vnode);\n\t}\n};\n\n/**\n * Get a hook's state from the currentComponent\n * @param {number} index The index of the hook to get\n * @param {number} type The index of the hook to get\n * @returns {any}\n */\nfunction getHookState(index, type) {\n\tif (options._hook) {\n\t\toptions._hook(currentComponent, index, currentHook || type);\n\t}\n\tcurrentHook = 0;\n\n\t// Largely inspired by:\n\t// * https://github.com/michael-klein/funcy.js/blob/f6be73468e6ec46b0ff5aa3cc4c9baf72a29025a/src/hooks/core_hooks.mjs\n\t// * https://github.com/michael-klein/funcy.js/blob/650beaa58c43c33a74820a3c98b3c7079cf2e333/src/renderer.mjs\n\t// Other implementations to look at:\n\t// * https://codesandbox.io/s/mnox05qp8\n\tconst hooks =\n\t\tcurrentComponent.__hooks ||\n\t\t(currentComponent.__hooks = {\n\t\t\t_list: [],\n\t\t\t_pendingEffects: []\n\t\t});\n\n\tif (index >= hooks._list.length) {\n\t\thooks._list.push({});\n\t}\n\n\treturn hooks._list[index];\n}\n\n/**\n * @template {unknown} S\n * @param {import('./index').Dispatch<import('./index').StateUpdater<S>>} [initialState]\n * @returns {[S, (state: S) => void]}\n */\nexport function useState(initialState) {\n\tcurrentHook = 1;\n\treturn useReducer(invokeOrReturn, initialState);\n}\n\n/**\n * @template {unknown} S\n * @template {unknown} A\n * @param {import('./index').Reducer<S, A>} reducer\n * @param {import('./index').Dispatch<import('./index').StateUpdater<S>>} initialState\n * @param {(initialState: any) => void} [init]\n * @returns {[ S, (state: S) => void ]}\n */\nexport function useReducer(reducer, initialState, init) {\n\t/** @type {import('./internal').ReducerHookState} */\n\tconst hookState = getHookState(currentIndex++, 2);\n\thookState._reducer = reducer;\n\tif (!hookState._component) {\n\t\thookState._value = [\n\t\t\t!init ? invokeOrReturn(undefined, initialState) : init(initialState),\n\n\t\t\taction => {\n\t\t\t\tconst currentValue = hookState._nextValue\n\t\t\t\t\t? hookState._nextValue[0]\n\t\t\t\t\t: hookState._value[0];\n\t\t\t\tconst nextValue = hookState._reducer(currentValue, action);\n\n\t\t\t\tif (currentValue !== nextValue) {\n\t\t\t\t\thookState._nextValue = [nextValue, hookState._value[1]];\n\t\t\t\t\thookState._component.setState({});\n\t\t\t\t}\n\t\t\t}\n\t\t];\n\n\t\thookState._component = currentComponent;\n\n\t\tif (!currentComponent._hasScuFromHooks) {\n\t\t\tcurrentComponent._hasScuFromHooks = true;\n\t\t\tlet prevScu = currentComponent.shouldComponentUpdate;\n\t\t\tconst prevCWU = currentComponent.componentWillUpdate;\n\n\t\t\t// If we're dealing with a forced update `shouldComponentUpdate` will\n\t\t\t// not be called. But we use that to update the hook values, so we\n\t\t\t// need to call it.\n\t\t\tcurrentComponent.componentWillUpdate = function (p, s, c) {\n\t\t\t\tif (this._force) {\n\t\t\t\t\tlet tmp = prevScu;\n\t\t\t\t\t// Clear to avoid other sCU hooks from being called\n\t\t\t\t\tprevScu = undefined;\n\t\t\t\t\tupdateHookState(p, s, c);\n\t\t\t\t\tprevScu = tmp;\n\t\t\t\t}\n\n\t\t\t\tif (prevCWU) prevCWU.call(this, p, s, c);\n\t\t\t};\n\n\t\t\t// This SCU has the purpose of bailing out after repeated updates\n\t\t\t// to stateful hooks.\n\t\t\t// we store the next value in _nextValue[0] and keep doing that for all\n\t\t\t// state setters, if we have next states and\n\t\t\t// all next states within a component end up being equal to their original state\n\t\t\t// we are safe to bail out for this specific component.\n\t\t\t/**\n\t\t\t *\n\t\t\t * @type {import('./internal').Component[\"shouldComponentUpdate\"]}\n\t\t\t */\n\t\t\t// @ts-ignore - We don't use TS to downtranspile\n\t\t\t// eslint-disable-next-line no-inner-declarations\n\t\t\tfunction updateHookState(p, s, c) {\n\t\t\t\tif (!hookState._component.__hooks) return true;\n\n\t\t\t\tconst stateHooks = hookState._component.__hooks._list.filter(\n\t\t\t\t\tx => x._component\n\t\t\t\t);\n\n\t\t\t\tconst allHooksEmpty = stateHooks.every(x => !x._nextValue);\n\t\t\t\t// When we have no updated hooks in the component we invoke the previous SCU or\n\t\t\t\t// traverse the VDOM tree further.\n\t\t\t\tif (allHooksEmpty) {\n\t\t\t\t\treturn prevScu ? prevScu.call(this, p, s, c) : true;\n\t\t\t\t}\n\n\t\t\t\t// We check whether we have components with a nextValue set that\n\t\t\t\t// have values that aren't equal to one another this pushes\n\t\t\t\t// us to update further down the tree\n\t\t\t\tlet shouldUpdate = hookState._component.props !== p;\n\t\t\t\tstateHooks.some(hookItem => {\n\t\t\t\t\tif (hookItem._nextValue) {\n\t\t\t\t\t\tconst currentValue = hookItem._value[0];\n\t\t\t\t\t\thookItem._value = hookItem._nextValue;\n\t\t\t\t\t\thookItem._nextValue = undefined;\n\t\t\t\t\t\tif (currentValue !== hookItem._value[0]) shouldUpdate = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn prevScu\n\t\t\t\t\t? prevScu.call(this, p, s, c) || shouldUpdate\n\t\t\t\t\t: shouldUpdate;\n\t\t\t}\n\n\t\t\tcurrentComponent.shouldComponentUpdate = updateHookState;\n\t\t}\n\t}\n\n\treturn hookState._nextValue || hookState._value;\n}\n\n/**\n * @param {import('./internal').Effect} callback\n * @param {unknown[]} args\n * @returns {void}\n */\nexport function useEffect(callback, args) {\n\t/** @type {import('./internal').EffectHookState} */\n\tconst state = getHookState(currentIndex++, 3);\n\tif (!options._skipEffects && argsChanged(state._args, args)) {\n\t\tstate._value = callback;\n\t\tstate._pendingArgs = args;\n\n\t\tcurrentComponent.__hooks._pendingEffects.push(state);\n\t}\n}\n\n/**\n * @param {import('./internal').Effect} callback\n * @param {unknown[]} args\n * @returns {void}\n */\nexport function useLayoutEffect(callback, args) {\n\t/** @type {import('./internal').EffectHookState} */\n\tconst state = getHookState(currentIndex++, 4);\n\tif (!options._skipEffects && argsChanged(state._args, args)) {\n\t\tstate._value = callback;\n\t\tstate._pendingArgs = args;\n\n\t\tcurrentComponent._renderCallbacks.push(state);\n\t}\n}\n\n/** @type {(initialValue: unknown) => unknown} */\nexport function useRef(initialValue) {\n\tcurrentHook = 5;\n\treturn useMemo(() => ({ current: initialValue }), []);\n}\n\n/**\n * @param {object} ref\n * @param {() => object} createHandle\n * @param {unknown[]} args\n * @returns {void}\n */\nexport function useImperativeHandle(ref, createHandle, args) {\n\tcurrentHook = 6;\n\tuseLayoutEffect(\n\t\t() => {\n\t\t\tif (typeof ref == 'function') {\n\t\t\t\tconst result = ref(createHandle());\n\t\t\t\treturn () => {\n\t\t\t\t\tref(null);\n\t\t\t\t\tif (result && typeof result == 'function') result();\n\t\t\t\t};\n\t\t\t} else if (ref) {\n\t\t\t\tref.current = createHandle();\n\t\t\t\treturn () => (ref.current = null);\n\t\t\t}\n\t\t},\n\t\targs == null ? args : args.concat(ref)\n\t);\n}\n\n/**\n * @template {unknown} T\n * @param {() => T} factory\n * @param {unknown[]} args\n * @returns {T}\n */\nexport function useMemo(factory, args) {\n\t/** @type {import('./internal').MemoHookState<T>} */\n\tconst state = getHookState(currentIndex++, 7);\n\tif (argsChanged(state._args, args)) {\n\t\tstate._value = factory();\n\t\tstate._args = args;\n\t\tstate._factory = factory;\n\t}\n\n\treturn state._value;\n}\n\n/**\n * @param {() => void} callback\n * @param {unknown[]} args\n * @returns {() => void}\n */\nexport function useCallback(callback, args) {\n\tcurrentHook = 8;\n\treturn useMemo(() => callback, args);\n}\n\n/**\n * @param {import('./internal').PreactContext} context\n */\nexport function useContext(context) {\n\tconst provider = currentComponent.context[context._id];\n\t// We could skip this call here, but than we'd not call\n\t// `options._hook`. We need to do that in order to make\n\t// the devtools aware of this hook.\n\t/** @type {import('./internal').ContextHookState} */\n\tconst state = getHookState(currentIndex++, 9);\n\t// The devtools needs access to the context object to\n\t// be able to pull of the default value when no provider\n\t// is present in the tree.\n\tstate._context = context;\n\tif (!provider) return context._defaultValue;\n\t// This is probably not safe to convert to \"!\"\n\tif (state._value == null) {\n\t\tstate._value = true;\n\t\tprovider.sub(currentComponent);\n\t}\n\treturn provider.props.value;\n}\n\n/**\n * Display a custom label for a custom hook for the devtools panel\n * @type {<T>(value: T, cb?: (value: T) => string | number) => void}\n */\nexport function useDebugValue(value, formatter) {\n\tif (options.useDebugValue) {\n\t\toptions.useDebugValue(\n\t\t\tformatter ? formatter(value) : /** @type {any}*/ (value)\n\t\t);\n\t}\n}\n\n/**\n * @param {(error: unknown, errorInfo: import('preact').ErrorInfo) => void} cb\n * @returns {[unknown, () => void]}\n */\nexport function useErrorBoundary(cb) {\n\t/** @type {import('./internal').ErrorBoundaryHookState} */\n\tconst state = getHookState(currentIndex++, 10);\n\tconst errState = useState();\n\tstate._value = cb;\n\tif (!currentComponent.componentDidCatch) {\n\t\tcurrentComponent.componentDidCatch = (err, errorInfo) => {\n\t\t\tif (state._value) state._value(err, errorInfo);\n\t\t\terrState[1](err);\n\t\t};\n\t}\n\treturn [\n\t\terrState[0],\n\t\t() => {\n\t\t\terrState[1](undefined);\n\t\t}\n\t];\n}\n\n/** @type {() => string} */\nexport function useId() {\n\t/** @type {import('./internal').IdHookState} */\n\tconst state = getHookState(currentIndex++, 11);\n\tif (!state._value) {\n\t\t// Grab either the root node or the nearest async boundary node.\n\t\t/** @type {import('./internal').VNode} */\n\t\tlet root = currentComponent._vnode;\n\t\twhile (root !== null && !root._mask && root._parent !== null) {\n\t\t\troot = root._parent;\n\t\t}\n\n\t\tlet mask = root._mask || (root._mask = [0, 0]);\n\t\tstate._value = 'P' + mask[0] + '-' + mask[1]++;\n\t}\n\n\treturn state._value;\n}\n\n/**\n * After paint effects consumer.\n */\nfunction flushAfterPaintEffects() {\n\tlet component;\n\twhile ((component = afterPaintEffects.shift())) {\n\t\tconst hooks = component.__hooks;\n\t\tif (!component._parentDom || !hooks) continue;\n\t\ttry {\n\t\t\thooks._pendingEffects.some(invokeCleanup);\n\t\t\thooks._pendingEffects.some(invokeEffect);\n\t\t\thooks._pendingEffects = [];\n\t\t} catch (e) {\n\t\t\thooks._pendingEffects = [];\n\t\t\toptions._catchError(e, component._vnode);\n\t\t}\n\t}\n}\n\nlet HAS_RAF = typeof requestAnimationFrame == 'function';\n\n/**\n * Schedule a callback to be invoked after the browser has a chance to paint a new frame.\n * Do this by combining requestAnimationFrame (rAF) + setTimeout to invoke a callback after\n * the next browser frame.\n *\n * Also, schedule a timeout in parallel to the the rAF to ensure the callback is invoked\n * even if RAF doesn't fire (for example if the browser tab is not visible)\n *\n * @param {() => void} callback\n */\nfunction afterNextFrame(callback) {\n\tconst done = () => {\n\t\tclearTimeout(timeout);\n\t\tif (HAS_RAF) cancelAnimationFrame(raf);\n\t\tsetTimeout(callback);\n\t};\n\tconst timeout = setTimeout(done, RAF_TIMEOUT);\n\n\tlet raf;\n\tif (HAS_RAF) {\n\t\traf = requestAnimationFrame(done);\n\t}\n}\n\n// Note: if someone used options.debounceRendering = requestAnimationFrame,\n// then effects will ALWAYS run on the NEXT frame instead of the current one, incurring a ~16ms delay.\n// Perhaps this is not such a big deal.\n/**\n * Schedule afterPaintEffects flush after the browser paints\n * @param {number} newQueueLength\n * @returns {void}\n */\nfunction afterPaint(newQueueLength) {\n\tif (newQueueLength === 1 || prevRaf !== options.requestAnimationFrame) {\n\t\tprevRaf = options.requestAnimationFrame;\n\t\t(prevRaf || afterNextFrame)(flushAfterPaintEffects);\n\t}\n}\n\n/**\n * @param {import('./internal').HookState} hook\n * @returns {void}\n */\nfunction invokeCleanup(hook) {\n\t// A hook cleanup can introduce a call to render which creates a new root, this will call options.vnode\n\t// and move the currentComponent away.\n\tconst comp = currentComponent;\n\tlet cleanup = hook._cleanup;\n\tif (typeof cleanup == 'function') {\n\t\thook._cleanup = undefined;\n\t\tcleanup();\n\t}\n\n\tcurrentComponent = comp;\n}\n\n/**\n * Invoke a Hook's effect\n * @param {import('./internal').EffectHookState} hook\n * @returns {void}\n */\nfunction invokeEffect(hook) {\n\t// A hook call can introduce a call to render which creates a new root, this will call options.vnode\n\t// and move the currentComponent away.\n\tconst comp = currentComponent;\n\thook._cleanup = hook._value();\n\tcurrentComponent = comp;\n}\n\n/**\n * @param {unknown[]} oldArgs\n * @param {unknown[]} newArgs\n * @returns {boolean}\n */\nfunction argsChanged(oldArgs, newArgs) {\n\treturn (\n\t\t!oldArgs ||\n\t\toldArgs.length !== newArgs.length ||\n\t\tnewArgs.some((arg, index) => arg !== oldArgs[index])\n\t);\n}\n\n/**\n * @template Arg\n * @param {Arg} arg\n * @param {(arg: Arg) => any} f\n * @returns {any}\n */\nfunction invokeOrReturn(arg, f) {\n\treturn typeof f == 'function' ? f(arg) : f;\n}\n","/**\n * Assign properties from `props` to `obj`\n * @template O, P The obj and props types\n * @param {O} obj The object to copy properties to\n * @param {P} props The object to copy properties from\n * @returns {O & P}\n */\nexport function assign(obj, props) {\n\tfor (let i in props) obj[i] = props[i];\n\treturn /** @type {O & P} */ (obj);\n}\n\n/**\n * Check if two objects have a different shape\n * @param {object} a\n * @param {object} b\n * @returns {boolean}\n */\nexport function shallowDiffers(a, b) {\n\tfor (let i in a) if (i !== '__source' && !(i in b)) return true;\n\tfor (let i in b) if (i !== '__source' && a[i] !== b[i]) return true;\n\treturn false;\n}\n\n/**\n * Check if two values are the same value\n * @param {*} x\n * @param {*} y\n * @returns {boolean}\n */\nexport function is(x, y) {\n\treturn (x === y && (x !== 0 || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\n","import { useState, useLayoutEffect, useEffect } from 'preact/hooks';\nimport { is } from './util';\n\n/**\n * This is taken from https://github.com/facebook/react/blob/main/packages/use-sync-external-store/src/useSyncExternalStoreShimClient.js#L84\n * on a high level this cuts out the warnings, ... and attempts a smaller implementation\n * @typedef {{ _value: any; _getSnapshot: () => any }} Store\n */\nexport function useSyncExternalStore(subscribe, getSnapshot) {\n\tconst value = getSnapshot();\n\n\t/**\n\t * @typedef {{ _instance: Store }} StoreRef\n\t * @type {[StoreRef, (store: StoreRef) => void]}\n\t */\n\tconst [{ _instance }, forceUpdate] = useState({\n\t\t_instance: { _value: value, _getSnapshot: getSnapshot }\n\t});\n\n\tuseLayoutEffect(() => {\n\t\t_instance._value = value;\n\t\t_instance._getSnapshot = getSnapshot;\n\n\t\tif (didSnapshotChange(_instance)) {\n\t\t\tforceUpdate({ _instance });\n\t\t}\n\t}, [subscribe, value, getSnapshot]);\n\n\tuseEffect(() => {\n\t\tif (didSnapshotChange(_instance)) {\n\t\t\tforceUpdate({ _instance });\n\t\t}\n\n\t\treturn subscribe(() => {\n\t\t\tif (didSnapshotChange(_instance)) {\n\t\t\t\tforceUpdate({ _instance });\n\t\t\t}\n\t\t});\n\t}, [subscribe]);\n\n\treturn value;\n}\n\n/** @type {(inst: Store) => boolean} */\nfunction didSnapshotChange(inst) {\n\ttry {\n\t\treturn !is(inst._value, inst._getSnapshot());\n\t} catch (error) {\n\t\treturn true;\n\t}\n}\n\nexport function startTransition(cb) {\n\tcb();\n}\n\nexport function useDeferredValue(val) {\n\treturn val;\n}\n\nexport function useTransition() {\n\treturn [false, startTransition];\n}\n\n// TODO: in theory this should be done after a VNode is diffed as we want to insert\n// styles/... before it attaches\nexport const useInsertionEffect = useLayoutEffect;\n","import { Component } from 'preact';\nimport { shallowDiffers } from './util';\n\n/**\n * Component class with a predefined `shouldComponentUpdate` implementation\n */\nexport function PureComponent(p, c) {\n\tthis.props = p;\n\tthis.context = c;\n}\nPureComponent.prototype = new Component();\n// Some third-party libraries check if this property is present\nPureComponent.prototype.isPureReactComponent = true;\nPureComponent.prototype.shouldComponentUpdate = function (props, state) {\n\treturn shallowDiffers(this.props, props) || shallowDiffers(this.state, state);\n};\n","import { createElement } from 'preact';\nimport { shallowDiffers } from './util';\n\n/**\n * Memoize a component, so that it only updates when the props actually have\n * changed. This was previously known as `React.pure`.\n * @param {import('./internal').FunctionComponent} c functional component\n * @param {(prev: object, next: object) => boolean} [comparer] Custom equality function\n * @returns {import('./internal').FunctionComponent}\n */\nexport function memo(c, comparer) {\n\tfunction shouldUpdate(nextProps) {\n\t\tlet ref = this.props.ref;\n\t\tlet updateRef = ref == nextProps.ref;\n\t\tif (!updateRef && ref) {\n\t\t\tref.call ? ref(null) : (ref.current = null);\n\t\t}\n\n\t\tif (!comparer) {\n\t\t\treturn shallowDiffers(this.props, nextProps);\n\t\t}\n\n\t\treturn !comparer(this.props, nextProps) || !updateRef;\n\t}\n\n\tfunction Memoed(props) {\n\t\tthis.shouldComponentUpdate = shouldUpdate;\n\t\treturn createElement(c, props);\n\t}\n\tMemoed.displayName = 'Memo(' + (c.displayName || c.name) + ')';\n\tMemoed.prototype.isReactComponent = true;\n\tMemoed._forwarded = true;\n\tMemoed.type = c;\n\treturn Memoed;\n}\n","import { options } from 'preact';\nimport { assign } from './util';\n\nlet oldDiffHook = options._diff;\noptions._diff = vnode => {\n\tif (vnode.type && vnode.type._forwarded && vnode.ref) {\n\t\tvnode.props.ref = vnode.ref;\n\t\tvnode.ref = null;\n\t}\n\tif (oldDiffHook) oldDiffHook(vnode);\n};\n\nexport const REACT_FORWARD_SYMBOL =\n\t(typeof Symbol != 'undefined' &&\n\t\tSymbol.for &&\n\t\tSymbol.for('react.forward_ref')) ||\n\t0xf47;\n\n/**\n * Pass ref down to a child. This is mainly used in libraries with HOCs that\n * wrap components. Using `forwardRef` there is an easy way to get a reference\n * of the wrapped component instead of one of the wrapper itself.\n * @param {import('./index').ForwardFn} fn\n * @returns {import('./internal').FunctionComponent}\n */\nexport function forwardRef(fn) {\n\tfunction Forwarded(props) {\n\t\tlet clone = assign({}, props);\n\t\tdelete clone.ref;\n\t\treturn fn(clone, props.ref || null);\n\t}\n\n\t// mobx-react checks for this being present\n\tForwarded.$$typeof = REACT_FORWARD_SYMBOL;\n\t// mobx-react heavily relies on implementation details.\n\t// It expects an object here with a `render` property,\n\t// and prototype.render will fail. Without this\n\t// mobx-react throws.\n\tForwarded.render = fn;\n\n\tForwarded.prototype.isReactComponent = Forwarded._forwarded = true;\n\tForwarded.displayName = 'ForwardRef(' + (fn.displayName || fn.name) + ')';\n\treturn Forwarded;\n}\n","import { toChildArray } from 'preact';\n\nconst mapFn = (children, fn) => {\n\tif (children == null) return null;\n\treturn toChildArray(toChildArray(children).map(fn));\n};\n\n// This API is completely unnecessary for Preact, so it's basically passthrough.\nexport const Children = {\n\tmap: mapFn,\n\tforEach: mapFn,\n\tcount(children) {\n\t\treturn children ? toChildArray(children).length : 0;\n\t},\n\tonly(children) {\n\t\tconst normalized = toChildArray(children);\n\t\tif (normalized.length !== 1) throw 'Children.only';\n\t\treturn normalized[0];\n\t},\n\ttoArray: toChildArray\n};\n","import { Component, createElement, options, Fragment } from 'preact';\nimport { MODE_HYDRATE } from '../../src/constants';\nimport { assign } from './util';\n\nconst oldCatchError = options._catchError;\noptions._catchError = function (error, newVNode, oldVNode, errorInfo) {\n\tif (error.then) {\n\t\t/** @type {import('./internal').Component} */\n\t\tlet component;\n\t\tlet vnode = newVNode;\n\n\t\tfor (; (vnode = vnode._parent); ) {\n\t\t\tif ((component = vnode._component) && component._childDidSuspend) {\n\t\t\t\tif (newVNode._dom == null) {\n\t\t\t\t\tnewVNode._dom = oldVNode._dom;\n\t\t\t\t\tnewVNode._children = oldVNode._children;\n\t\t\t\t}\n\t\t\t\t// Don't call oldCatchError if we found a Suspense\n\t\t\t\treturn component._childDidSuspend(error, newVNode);\n\t\t\t}\n\t\t}\n\t}\n\toldCatchError(error, newVNode, oldVNode, errorInfo);\n};\n\nconst oldUnmount = options.unmount;\noptions.unmount = function (vnode) {\n\t/** @type {import('./internal').Component} */\n\tconst component = vnode._component;\n\tif (component) component._unmounted = true;\n\tif (component && component._onResolve) {\n\t\tcomponent._onResolve();\n\t}\n\n\t// if the component is still hydrating\n\t// most likely it is because the component is suspended\n\t// we set the vnode.type as `null` so that it is not a typeof function\n\t// so the unmount will remove the vnode._dom\n\tif (component && vnode._flags & MODE_HYDRATE) {\n\t\tvnode.type = null;\n\t}\n\n\tif (oldUnmount) oldUnmount(vnode);\n};\n\nfunction detachedClone(vnode, detachedParent, parentDom) {\n\tif (vnode) {\n\t\tif (vnode._component && vnode._component.__hooks) {\n\t\t\tvnode._component.__hooks._list.forEach(effect => {\n\t\t\t\tif (typeof effect._cleanup == 'function') effect._cleanup();\n\t\t\t});\n\n\t\t\tvnode._component.__hooks = null;\n\t\t}\n\n\t\tvnode = assign({}, vnode);\n\t\tif (vnode._component != null) {\n\t\t\tif (vnode._component._parentDom === parentDom) {\n\t\t\t\tvnode._component._parentDom = detachedParent;\n\t\t\t}\n\n\t\t\tvnode._component._force = true;\n\n\t\t\tvnode._component = null;\n\t\t}\n\n\t\tvnode._children =\n\t\t\tvnode._children &&\n\t\t\tvnode._children.map(child =>\n\t\t\t\tdetachedClone(child, detachedParent, parentDom)\n\t\t\t);\n\t}\n\n\treturn vnode;\n}\n\nfunction removeOriginal(vnode, detachedParent, originalParent) {\n\tif (vnode && originalParent) {\n\t\tvnode._original = null;\n\t\tvnode._children =\n\t\t\tvnode._children &&\n\t\t\tvnode._children.map(child =>\n\t\t\t\tremoveOriginal(child, detachedParent, originalParent)\n\t\t\t);\n\n\t\tif (vnode._component) {\n\t\t\tif (vnode._component._parentDom === detachedParent) {\n\t\t\t\tif (vnode._dom) {\n\t\t\t\t\toriginalParent.appendChild(vnode._dom);\n\t\t\t\t}\n\t\t\t\tvnode._component._force = true;\n\t\t\t\tvnode._component._parentDom = originalParent;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn vnode;\n}\n\n// having custom inheritance instead of a class here saves a lot of bytes\nexport function Suspense() {\n\t// we do not call super here to golf some bytes...\n\tthis._pendingSuspensionCount = 0;\n\tthis._suspenders = null;\n\tthis._detachOnNextRender = null;\n}\n\n// Things we do here to save some bytes but are not proper JS inheritance:\n// - call `new Component()` as the prototype\n// - do not set `Suspense.prototype.constructor` to `Suspense`\nSuspense.prototype = new Component();\n\n/**\n * @this {import('./internal').SuspenseComponent}\n * @param {Promise} promise The thrown promise\n * @param {import('./internal').VNode<any, any>} suspendingVNode The suspending component\n */\nSuspense.prototype._childDidSuspend = function (promise, suspendingVNode) {\n\tconst suspendingComponent = suspendingVNode._component;\n\n\t/** @type {import('./internal').SuspenseComponent} */\n\tconst c = this;\n\n\tif (c._suspenders == null) {\n\t\tc._suspenders = [];\n\t}\n\tc._suspenders.push(suspendingComponent);\n\n\tconst resolve = suspended(c._vnode);\n\n\tlet resolved = false;\n\tconst onResolved = () => {\n\t\tif (resolved || c._unmounted) return;\n\n\t\tresolved = true;\n\t\tsuspendingComponent._onResolve = null;\n\n\t\tif (resolve) {\n\t\t\tresolve(onSuspensionComplete);\n\t\t} else {\n\t\t\tonSuspensionComplete();\n\t\t}\n\t};\n\n\tsuspendingComponent._onResolve = onResolved;\n\n\t// Store and null _parentDom to prevent setState/forceUpdate from\n\t// scheduling renders while suspended. Render would be a no-op anyway\n\t// since renderComponent checks _parentDom, but this avoids queue churn.\n\tconst originalParentDom = suspendingComponent._parentDom;\n\tsuspendingComponent._parentDom = null;\n\n\tconst onSuspensionComplete = () => {\n\t\tif (!--c._pendingSuspensionCount) {\n\t\t\t// If the suspension was during hydration we don't need to restore the\n\t\t\t// suspended children into the _children array\n\t\t\tif (c.state._suspended) {\n\t\t\t\tconst suspendedVNode = c.state._suspended;\n\t\t\t\tc._vnode._children[0] = removeOriginal(\n\t\t\t\t\tsuspendedVNode,\n\t\t\t\t\tsuspendedVNode._component._parentDom,\n\t\t\t\t\tsuspendedVNode._component._originalParentDom\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tc.setState({ _suspended: (c._detachOnNextRender = null) });\n\n\t\t\tlet suspended;\n\t\t\twhile ((suspended = c._suspenders.pop())) {\n\t\t\t\t// Restore _parentDom before forceUpdate so render can proceed\n\t\t\t\tsuspended._parentDom = originalParentDom;\n\t\t\t\tsuspended.forceUpdate();\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * We do not set `suspended: true` during hydration because we want the actual markup\n\t * to remain on screen and hydrate it when the suspense actually gets resolved.\n\t * While in non-hydration cases the usual fallback -> component flow would occour.\n\t */\n\tif (\n\t\t!c._pendingSuspensionCount++ &&\n\t\t!(suspendingVNode._flags & MODE_HYDRATE)\n\t) {\n\t\tc.setState({ _suspended: (c._detachOnNextRender = c._vnode._children[0]) });\n\t}\n\tpromise.then(onResolved, onResolved);\n};\n\nSuspense.prototype.componentWillUnmount = function () {\n\tthis._suspenders = [];\n};\n\n/**\n * @this {import('./internal').SuspenseComponent}\n * @param {import('./internal').SuspenseComponent[\"props\"]} props\n * @param {import('./internal').SuspenseState} state\n */\nSuspense.prototype.render = function (props, state) {\n\tif (this._detachOnNextRender) {\n\t\t// When the Suspense's _vnode was created by a call to createVNode\n\t\t// (i.e. due to a setState further up in the tree)\n\t\t// it's _children prop is null, in this case we \"forget\" about the parked vnodes to detach\n\t\tif (this._vnode._children) {\n\t\t\tconst detachedParent = document.createElement('div');\n\t\t\tconst detachedComponent = this._vnode._children[0]._component;\n\t\t\tthis._vnode._children[0] = detachedClone(\n\t\t\t\tthis._detachOnNextRender,\n\t\t\t\tdetachedParent,\n\t\t\t\t(detachedComponent._originalParentDom = detachedComponent._parentDom)\n\t\t\t);\n\t\t}\n\n\t\tthis._detachOnNextRender = null;\n\t}\n\n\t// Wrap fallback tree in a VNode that prevents itself from being marked as aborting mid-hydration:\n\t/** @type {import('./internal').VNode} */\n\tconst fallback =\n\t\tstate._suspended && createElement(Fragment, null, props.fallback);\n\tif (fallback) fallback._flags &= ~MODE_HYDRATE;\n\n\treturn [\n\t\tcreateElement(Fragment, null, state._suspended ? null : props.children),\n\t\tfallback\n\t];\n};\n\n/**\n * Checks and calls the parent component's _suspended method, passing in the\n * suspended vnode. This is a way for a parent (e.g. SuspenseList) to get notified\n * that one of its children/descendants suspended.\n *\n * The parent MAY return a callback. The callback will get called when the\n * suspension resolves, notifying the parent of the fact.\n * Moreover, the callback gets function `unsuspend` as a parameter. The resolved\n * child descendant will not actually get unsuspended until `unsuspend` gets called.\n * This is a way for the parent to delay unsuspending.\n *\n * If the parent does not return a callback then the resolved vnode\n * gets unsuspended immediately when it resolves.\n *\n * @param {import('./internal').VNode} vnode\n * @returns {((unsuspend: () => void) => void)?}\n */\nexport function suspended(vnode) {\n\tif (!vnode._parent) return null;\n\t/** @type {import('./internal').Component} */\n\tlet component = vnode._parent._component;\n\treturn component && component._suspended && component._suspended(vnode);\n}\n\nexport function lazy(loader) {\n\tlet prom;\n\tlet component = null;\n\tlet error;\n\tlet resolved;\n\n\tfunction Lazy(props) {\n\t\tif (!prom) {\n\t\t\tprom = loader();\n\t\t\tprom.then(\n\t\t\t\texports => {\n\t\t\t\t\tif (exports) {\n\t\t\t\t\t\tcomponent = exports.default || exports;\n\t\t\t\t\t}\n\t\t\t\t\tresolved = true;\n\t\t\t\t},\n\t\t\t\te => {\n\t\t\t\t\terror = e;\n\t\t\t\t\tresolved = true;\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tif (error) {\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (!resolved) {\n\t\t\tthrow prom;\n\t\t}\n\n\t\treturn component ? createElement(component, props) : null;\n\t}\n\n\tLazy.displayName = 'Lazy';\n\tLazy._forwarded = true;\n\treturn Lazy;\n}\n","import { Component, toChildArray } from 'preact';\nimport { suspended } from './suspense.js';\n\n// Indexes to linked list nodes (nodes are stored as arrays to save bytes).\nconst SUSPENDED_COUNT = 0;\nconst RESOLVED_COUNT = 1;\nconst NEXT_NODE = 2;\n\n// Having custom inheritance instead of a class here saves a lot of bytes.\nexport function SuspenseList() {\n\tthis._next = null;\n\tthis._map = null;\n}\n\n// Mark one of child's earlier suspensions as resolved.\n// Some pending callbacks may become callable due to this\n// (e.g. the last suspended descendant gets resolved when\n// revealOrder === 'together'). Process those callbacks as well.\nconst resolve = (list, child, node) => {\n\tif (++node[RESOLVED_COUNT] === node[SUSPENDED_COUNT]) {\n\t\t// The number a child (or any of its descendants) has been suspended\n\t\t// matches the number of times it's been resolved. Therefore we\n\t\t// mark the child as completely resolved by deleting it from ._map.\n\t\t// This is used to figure out when *all* children have been completely\n\t\t// resolved when revealOrder is 'together'.\n\t\tlist._map.delete(child);\n\t}\n\n\t// If revealOrder is falsy then we can do an early exit, as the\n\t// callbacks won't get queued in the node anyway.\n\t// If revealOrder is 'together' then also do an early exit\n\t// if all suspended descendants have not yet been resolved.\n\tif (\n\t\t!list.props.revealOrder ||\n\t\t(list.props.revealOrder[0] === 't' && list._map.size)\n\t) {\n\t\treturn;\n\t}\n\n\t// Walk the currently suspended children in order, calling their\n\t// stored callbacks on the way. Stop if we encounter a child that\n\t// has not been completely resolved yet.\n\tnode = list._next;\n\twhile (node) {\n\t\twhile (node.length > 3) {\n\t\t\tnode.pop()();\n\t\t}\n\t\tif (node[RESOLVED_COUNT] < node[SUSPENDED_COUNT]) {\n\t\t\tbreak;\n\t\t}\n\t\tlist._next = node = node[NEXT_NODE];\n\t}\n};\n\n// Things we do here to save some bytes but are not proper JS inheritance:\n// - call `new Component()` as the prototype\n// - do not set `Suspense.prototype.constructor` to `Suspense`\nSuspenseList.prototype = new Component();\n\nSuspenseList.prototype._suspended = function (child) {\n\tconst list = this;\n\tconst delegated = suspended(list._vnode);\n\n\tlet node = list._map.get(child);\n\tnode[SUSPENDED_COUNT]++;\n\n\treturn unsuspend => {\n\t\tconst wrappedUnsuspend = () => {\n\t\t\tif (!list.props.revealOrder) {\n\t\t\t\t// Special case the undefined (falsy) revealOrder, as there\n\t\t\t\t// is no need to coordinate a specific order or unsuspends.\n\t\t\t\tunsuspend();\n\t\t\t} else {\n\t\t\t\tnode.push(unsuspend);\n\t\t\t\tresolve(list, child, node);\n\t\t\t}\n\t\t};\n\t\tif (delegated) {\n\t\t\tdelegated(wrappedUnsuspend);\n\t\t} else {\n\t\t\twrappedUnsuspend();\n\t\t}\n\t};\n};\n\nSuspenseList.prototype.render = function (props) {\n\tthis._next = null;\n\tthis._map = new Map();\n\n\tconst children = toChildArray(props.children);\n\tif (props.revealOrder && props.revealOrder[0] === 'b') {\n\t\t// If order === 'backwards' (or, well, anything starting with a 'b')\n\t\t// then flip the child list around so that the last child will be\n\t\t// the first in the linked list.\n\t\tchildren.reverse();\n\t}\n\t// Build the linked list. Iterate through the children in reverse order\n\t// so that `_next` points to the first linked list node to be resolved.\n\tfor (let i = children.length; i--; ) {\n\t\t// Create a new linked list node as an array of form:\n\t\t// \t[suspended_count, resolved_count, next_node]\n\t\t// where suspended_count and resolved_count are numeric counters for\n\t\t// keeping track how many times a node has been suspended and resolved.\n\t\t//\n\t\t// Note that suspended_count starts from 1 instead of 0, so we can block\n\t\t// processing callbacks until componentDidMount has been called. In a sense\n\t\t// node is suspended at least until componentDidMount gets called!\n\t\t//\n\t\t// Pending callbacks are added to the end of the node:\n\t\t// \t[suspended_count, resolved_count, next_node, callback_0, callback_1, ...]\n\t\tthis._map.set(children[i], (this._next = [1, 0, this._next]));\n\t}\n\treturn props.children;\n};\n\nSuspenseList.prototype.componentDidUpdate =\n\tSuspenseList.prototype.componentDidMount = function () {\n\t\t// Iterate through all children after mounting for two reasons:\n\t\t// 1. As each node[SUSPENDED_COUNT] starts from 1, this iteration increases\n\t\t// each node[RELEASED_COUNT] by 1, therefore balancing the counters.\n\t\t// The nodes can now be completely consumed from the linked list.\n\t\t// 2. Handle nodes that might have gotten resolved between render and\n\t\t// componentDidMount.\n\t\tthis._map.forEach((node, child) => {\n\t\t\tresolve(this, child, node);\n\t\t});\n\t};\n","/** Normal hydration that attaches to a DOM tree but does not diff it. */\nexport const MODE_HYDRATE = 1 << 5;\n/** Signifies this VNode suspended on the previous render */\nexport const MODE_SUSPENDED = 1 << 7;\n/** Indicates that this node needs to be inserted while patching children */\nexport const INSERT_VNODE = 1 << 2;\n/** Indicates a VNode has been matched with another VNode in the diff */\nexport const MATCHED = 1 << 1;\n\n/** Reset all mode flags */\nexport const RESET_MODE = ~(MODE_HYDRATE | MODE_SUSPENDED);\n\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\nexport const XHTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\nexport const MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n\nexport const NULL = null;\nexport const UNDEFINED = undefined;\nexport const EMPTY_OBJ = /** @type {any} */ ({});\nexport const EMPTY_ARR = [];\nexport const IS_NON_DIMENSIONAL =\n\t/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;\n","import { createElement, render } from 'preact';\n\n/**\n * @param {import('../../src/index').RenderableProps<{ context: any }>} props\n */\nfunction ContextProvider(props) {\n\tthis.getChildContext = () => props.context;\n\treturn props.children;\n}\n\n/**\n * Portal component\n * @this {import('./internal').Component}\n * @param {object | null | undefined} props\n *\n * TODO: use createRoot() instead of fake root\n */\nfunction Portal(props) {\n\tconst _this = this;\n\tlet container = props._container;\n\n\t_this.componentWillUnmount = function () {\n\t\trender(null, _this._temp);\n\t\t_this._temp = null;\n\t\t_this._container = null;\n\t};\n\n\t// When we change container we should clear our old container and\n\t// indicate a new mount.\n\tif (_this._container && _this._container !== container) {\n\t\t_this.componentWillUnmount();\n\t}\n\n\tif (!_this._temp) {\n\t\t// Ensure the element has a mask for useId invocations\n\t\tlet root = _this._vnode;\n\t\twhile (root !== null && !root._mask && root._parent !== null) {\n\t\t\troot = root._parent;\n\t\t}\n\n\t\t_this._container = container;\n\n\t\t// Create a fake DOM parent node that manages a subset of `container`'s children:\n\t\t_this._temp = {\n\t\t\tnodeType: 1,\n\t\t\tparentNode: container,\n\t\t\tchildNodes: [],\n\t\t\t_children: { _mask: root._mask },\n\t\t\tcontains: () => true,\n\t\t\tnamespaceURI: container.namespaceURI,\n\t\t\tinsertBefore(child, before) {\n\t\t\t\tthis.childNodes.push(child);\n\t\t\t\t_this._container.insertBefore(child, before);\n\t\t\t},\n\t\t\tremoveChild(child) {\n\t\t\t\tthis.childNodes.splice(this.childNodes.indexOf(child) >>> 1, 1);\n\t\t\t\t_this._container.removeChild(child);\n\t\t\t}\n\t\t};\n\t}\n\n\t// Render our wrapping element into temp.\n\trender(\n\t\tcreateElement(ContextProvider, { context: _this.context }, props._vnode),\n\t\t_this._temp\n\t);\n}\n\n/**\n * Create a `Portal` to continue rendering the vnode tree at a different DOM node\n * @param {import('./internal').VNode} vnode The vnode to render\n * @param {import('./internal').PreactElement} container The DOM node to continue rendering in to.\n */\nexport function createPortal(vnode, container) {\n\tconst el = createElement(Portal, { _vnode: vnode, _container: container });\n\tel.containerInfo = container;\n\treturn el;\n}\n","import {\n\trender as preactRender,\n\thydrate as preactHydrate,\n\toptions,\n\ttoChildArray,\n\tComponent\n} from 'preact';\nimport {\n\tuseCallback,\n\tuseContext,\n\tuseDebugValue,\n\tuseEffect,\n\tuseId,\n\tuseImperativeHandle,\n\tuseLayoutEffect,\n\tuseMemo,\n\tuseReducer,\n\tuseRef,\n\tuseState\n} from 'preact/hooks';\nimport {\n\tuseDeferredValue,\n\tuseInsertionEffect,\n\tuseSyncExternalStore,\n\tuseTransition\n} from './index';\n\nexport const REACT_ELEMENT_TYPE =\n\t(typeof Symbol != 'undefined' && Symbol.for && Symbol.for('react.element')) ||\n\t0xeac7;\n\nconst CAMEL_PROPS =\n\t/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image(!S)|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/;\nconst ON_ANI = /^on(Ani|Tra|Tou|BeforeInp|Compo)/;\nconst CAMEL_REPLACE = /[A-Z0-9]/g;\nconst IS_DOM = typeof document !== 'undefined';\n\n// Input types for which onchange should not be converted to oninput.\n// type=\"file|checkbox|radio\", plus \"range\" in IE11.\n// (IE11 doesn't support Symbol, which we use here to turn `rad` into `ra` which matches \"range\")\nconst onChangeInputType = type =>\n\t(typeof Symbol != 'undefined' && typeof Symbol() == 'symbol'\n\t\t? /fil|che|rad/\n\t\t: /fil|che|ra/\n\t).test(type);\n\n// Some libraries like `react-virtualized` explicitly check for this.\nComponent.prototype.isReactComponent = {};\n\n// `UNSAFE_*` lifecycle hooks\n// Preact only ever invokes the unprefixed methods.\n// Here we provide a base \"fallback\" implementation that calls any defined UNSAFE_ prefixed method.\n// - If a component defines its own `componentDidMount()` (including via defineProperty), use that.\n// - If a component defines `UNSAFE_componentDidMount()`, `componentDidMount` is the alias getter/setter.\n// - If anything assigns to an `UNSAFE_*` property, the assignment is forwarded to the unprefixed property.\n// See https://github.com/preactjs/preact/issues/1941\n[\n\t'componentWillMount',\n\t'componentWillReceiveProps',\n\t'componentWillUpdate'\n].forEach(key => {\n\tObject.defineProperty(Component.prototype, key, {\n\t\tconfigurable: true,\n\t\tget() {\n\t\t\treturn this['UNSAFE_' + key];\n\t\t},\n\t\tset(v) {\n\t\t\tObject.defineProperty(this, key, {\n\t\t\t\tconfigurable: true,\n\t\t\t\twritable: true,\n\t\t\t\tvalue: v\n\t\t\t});\n\t\t}\n\t});\n});\n\n/**\n * Proxy render() since React returns a Component reference.\n * @param {import('./internal').VNode} vnode VNode tree to render\n * @param {import('./internal').PreactElement} parent DOM node to render vnode tree into\n * @param {() => void} [callback] Optional callback that will be called after rendering\n * @returns {import('./internal').Component | null} The root component reference or null\n */\nexport function render(vnode, parent, callback) {\n\t// React destroys any existing DOM nodes, see #1727\n\t// ...but only on the first render, see #1828\n\tif (parent._children == null) {\n\t\tparent.textContent = '';\n\t}\n\n\tpreactRender(vnode, parent);\n\tif (typeof callback == 'function') callback();\n\n\treturn vnode ? vnode._component : null;\n}\n\nexport function hydrate(vnode, parent, callback) {\n\tpreactHydrate(vnode, parent);\n\tif (typeof callback == 'function') callback();\n\n\treturn vnode ? vnode._component : null;\n}\n\nlet oldEventHook = options.event;\noptions.event = e => {\n\tif (oldEventHook) e = oldEventHook(e);\n\n\te.persist = empty;\n\te.isPropagationStopped = isPropagationStopped;\n\te.isDefaultPrevented = isDefaultPrevented;\n\treturn (e.nativeEvent = e);\n};\n\nfunction empty() {}\n\nfunction isPropagationStopped() {\n\treturn this.cancelBubble;\n}\n\nfunction isDefaultPrevented() {\n\treturn this.defaultPrevented;\n}\n\nconst classNameDescriptorNonEnumberable = {\n\tenumerable: false,\n\tconfigurable: true,\n\tget() {\n\t\treturn this.class;\n\t}\n};\n\nfunction handleDomVNode(vnode) {\n\tlet props = vnode.props,\n\t\ttype = vnode.type,\n\t\tnormalizedProps = {};\n\n\tlet isNonDashedType = type.indexOf('-') === -1;\n\tfor (let i in props) {\n\t\tlet value = props[i];\n\n\t\tif (\n\t\t\t(i === 'value' && 'defaultValue' in props && value == null) ||\n\t\t\t// Emulate React's behavior of not rendering the contents of noscript tags on the client.\n\t\t\t(IS_DOM && i === 'children' && type === 'noscript') ||\n\t\t\ti === 'class' ||\n\t\t\ti === 'className'\n\t\t) {\n\t\t\t// Skip applying value if it is null/undefined and we already set\n\t\t\t// a default value\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet lowerCased = i.toLowerCase();\n\t\tif (i === 'defaultValue' && 'value' in props && props.value == null) {\n\t\t\t// `defaultValue` is treated as a fallback `value` when a value prop is present but null/undefined.\n\t\t\t// `defaultValue` for Elements with no value prop is the same as the DOM defaultValue property.\n\t\t\ti = 'value';\n\t\t} else if (i === 'download' && value === true) {\n\t\t\t// Calling `setAttribute` with a truthy value will lead to it being\n\t\t\t// passed as a stringified value, e.g. `download=\"true\"`. React\n\t\t\t// converts it to an empty string instead, otherwise the attribute\n\t\t\t// value will be used as the file name and the file will be called\n\t\t\t// \"true\" upon downloading it.\n\t\t\tvalue = '';\n\t\t} else if (lowerCased === 'translate' && value === 'no') {\n\t\t\tvalue = false;\n\t\t} else if (lowerCased[0] === 'o' && lowerCased[1] === 'n') {\n\t\t\tif (lowerCased === 'ondoubleclick') {\n\t\t\t\ti = 'ondblclick';\n\t\t\t} else if (\n\t\t\t\tlowerCased === 'onchange' &&\n\t\t\t\t(type === 'input' || type === 'textarea') &&\n\t\t\t\t!onChangeInputType(props.type)\n\t\t\t) {\n\t\t\t\tlowerCased = i = 'oninput';\n\t\t\t} else if (lowerCased === 'onfocus') {\n\t\t\t\ti = 'onfocusin';\n\t\t\t} else if (lowerCased === 'onblur') {\n\t\t\t\ti = 'onfocusout';\n\t\t\t} else if (ON_ANI.test(i)) {\n\t\t\t\ti = lowerCased;\n\t\t\t}\n\t\t} else if (isNonDashedType && CAMEL_PROPS.test(i)) {\n\t\t\ti = i.replace(CAMEL_REPLACE, '-$&').toLowerCase();\n\t\t} else if (value === null) {\n\t\t\tvalue = undefined;\n\t\t}\n\n\t\t// Add support for onInput and onChange, see #3561\n\t\t// if we have an oninput prop already change it to oninputCapture\n\t\tif (lowerCased === 'oninput') {\n\t\t\ti = lowerCased;\n\t\t\tif (normalizedProps[i]) {\n\t\t\t\ti = 'oninputCapture';\n\t\t\t}\n\t\t}\n\n\t\tnormalizedProps[i] = value;\n\t}\n\n\t// Add support for array select values: <select multiple value={[]} />\n\tif (\n\t\ttype == 'select' &&\n\t\tnormalizedProps.multiple &&\n\t\tArray.isArray(normalizedProps.value)\n\t) {\n\t\t// forEach() always returns undefined, which we abuse here to unset the value prop.\n\t\tnormalizedProps.value = toChildArray(props.children).forEach(child => {\n\t\t\tchild.props.selected =\n\t\t\t\tnormalizedProps.value.indexOf(child.props.value) != -1;\n\t\t});\n\t}\n\n\t// Adding support for defaultValue in select tag\n\tif (type == 'select' && normalizedProps.defaultValue != null) {\n\t\tnormalizedProps.value = toChildArray(props.children).forEach(child => {\n\t\t\tif (normalizedProps.multiple) {\n\t\t\t\tchild.props.selected =\n\t\t\t\t\tnormalizedProps.defaultValue.indexOf(child.props.value) != -1;\n\t\t\t} else {\n\t\t\t\tchild.props.selected =\n\t\t\t\t\tnormalizedProps.defaultValue == child.props.value;\n\t\t\t}\n\t\t});\n\t}\n\n\tif (props.class && !props.className) {\n\t\tnormalizedProps.class = props.class;\n\t\tObject.defineProperty(\n\t\t\tnormalizedProps,\n\t\t\t'className',\n\t\t\tclassNameDescriptorNonEnumberable\n\t\t);\n\t} else if (props.className) {\n\t\tnormalizedProps.class = normalizedProps.className = props.className;\n\t}\n\n\tvnode.props = normalizedProps;\n}\n\nlet oldVNodeHook = options.vnode;\noptions.vnode = vnode => {\n\t// only normalize props on Element nodes\n\tif (typeof vnode.type === 'string') {\n\t\thandleDomVNode(vnode);\n\t}\n\n\tvnode.$$typeof = REACT_ELEMENT_TYPE;\n\n\tif (oldVNodeHook) oldVNodeHook(vnode);\n};\n\n// Only needed for react-relay\nlet currentComponent;\nconst oldBeforeRender = options._render;\noptions._render = function (vnode) {\n\tif (oldBeforeRender) {\n\t\toldBeforeRender(vnode);\n\t}\n\tcurrentComponent = vnode._component;\n};\n\nconst oldDiffed = options.diffed;\n/** @type {(vnode: import('./internal').VNode) => void} */\noptions.diffed = function (vnode) {\n\tif (oldDiffed) {\n\t\toldDiffed(vnode);\n\t}\n\n\tconst props = vnode.props;\n\tconst dom = vnode._dom;\n\n\tif (\n\t\tdom != null &&\n\t\tvnode.type === 'textarea' &&\n\t\t'value' in props &&\n\t\tprops.value !== dom.value\n\t) {\n\t\tdom.value = props.value == null ? '' : props.value;\n\t}\n\n\tcurrentComponent = null;\n};\n\n// This is a very very private internal function for React it\n// is used to sort-of do runtime dependency injection.\nexport const __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = {\n\tReactCurrentDispatcher: {\n\t\tcurrent: {\n\t\t\treadContext(context) {\n\t\t\t\treturn currentComponent._globalContext[context._id].props.value;\n\t\t\t},\n\t\t\tuseCallback,\n\t\t\tuseContext,\n\t\t\tuseDebugValue,\n\t\t\tuseDeferredValue,\n\t\t\tuseEffect,\n\t\t\tuseId,\n\t\t\tuseImperativeHandle,\n\t\t\tuseInsertionEffect,\n\t\t\tuseLayoutEffect,\n\t\t\tuseMemo,\n\t\t\t// useMutableSource, // experimental-only and replaced by uSES, likely not worth supporting\n\t\t\tuseReducer,\n\t\t\tuseRef,\n\t\t\tuseState,\n\t\t\tuseSyncExternalStore,\n\t\t\tuseTransition\n\t\t}\n\t}\n};\n","import {\n\tcreateElement,\n\trender as preactRender,\n\tcloneElement as preactCloneElement,\n\tcreateRef,\n\tComponent,\n\tcreateContext,\n\tFragment\n} from 'preact';\nimport {\n\tuseState,\n\tuseId,\n\tuseReducer,\n\tuseEffect,\n\tuseLayoutEffect,\n\tuseRef,\n\tuseImperativeHandle,\n\tuseMemo,\n\tuseCallback,\n\tuseContext,\n\tuseDebugValue\n} from 'preact/hooks';\nimport {\n\tuseInsertionEffect,\n\tstartTransition,\n\tuseDeferredValue,\n\tuseSyncExternalStore,\n\tuseTransition\n} from './hooks';\nimport { PureComponent } from './PureComponent';\nimport { memo } from './memo';\nimport { forwardRef } from './forwardRef';\nimport { Children } from './Children';\nimport { Suspense, lazy } from './suspense';\nimport { SuspenseList } from './suspense-list';\nimport { createPortal } from './portals';\nimport {\n\thydrate,\n\trender,\n\tREACT_ELEMENT_TYPE,\n\t__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED\n} from './render';\n\nconst version = '18.3.1'; // trick libraries to think we are react\n\n/**\n * Legacy version of createElement.\n * @param {import('./internal').VNode[\"type\"]} type The node name or Component constructor\n */\nfunction createFactory(type) {\n\treturn createElement.bind(null, type);\n}\n\n/**\n * Check if the passed element is a valid (p)react node.\n * @param {*} element The element to check\n * @returns {boolean}\n */\nfunction isValidElement(element) {\n\treturn !!element && element.$$typeof === REACT_ELEMENT_TYPE;\n}\n\n/**\n * Check if the passed element is a Fragment node.\n * @param {*} element The element to check\n * @returns {boolean}\n */\nfunction isFragment(element) {\n\treturn isValidElement(element) && element.type === Fragment;\n}\n\n/**\n * Check if the passed element is a Memo node.\n * @param {*} element The element to check\n * @returns {boolean}\n */\nfunction isMemo(element) {\n\treturn (\n\t\t!!element &&\n\t\ttypeof element.displayName == 'string' &&\n\t\telement.displayName.startsWith('Memo(')\n\t);\n}\n\n/**\n * Wrap `cloneElement` to abort if the passed element is not a valid element and apply\n * all vnode normalizations.\n * @param {import('./internal').VNode} element The vnode to clone\n * @param {object} props Props to add when cloning\n * @param {Array<import('./internal').ComponentChildren>} rest Optional component children\n */\nfunction cloneElement(element) {\n\tif (!isValidElement(element)) return element;\n\treturn preactCloneElement.apply(null, arguments);\n}\n\n/**\n * Remove a component tree from the DOM, including state and event handlers.\n * @param {import('./internal').PreactElement} container\n * @returns {boolean}\n */\nfunction unmountComponentAtNode(container) {\n\tif (container._children) {\n\t\tpreactRender(null, container);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n/**\n * Get the matching DOM node for a component\n * @param {import('./internal').Component} component\n * @returns {import('./internal').PreactElement | null}\n */\nfunction findDOMNode(component) {\n\treturn (\n\t\t(component &&\n\t\t\t(component.base || (component.nodeType === 1 && component))) ||\n\t\tnull\n\t);\n}\n\n/**\n * Deprecated way to control batched rendering inside the reconciler, but we\n * already schedule in batches inside our rendering code\n * @template Arg\n * @param {(arg: Arg) => void} callback function that triggers the updated\n * @param {Arg} [arg] Optional argument that can be passed to the callback\n */\n// eslint-disable-next-line camelcase\nconst unstable_batchedUpdates = (callback, arg) => callback(arg);\n\n/**\n * In React, `flushSync` flushes the entire tree and forces a rerender. It's\n * implmented here as a no-op.\n * @template Arg\n * @template Result\n * @param {(arg: Arg) => Result} callback function that runs before the flush\n * @param {Arg} [arg] Optional argument that can be passed to the callback\n * @returns\n */\nconst flushSync = (callback, arg) => callback(arg);\n\n/**\n * Strict Mode is not implemented in Preact, so we provide a stand-in for it\n * that just renders its children without imposing any restrictions.\n */\nconst StrictMode = Fragment;\n\n// compat to react-is\nexport const isElement = isValidElement;\n\nexport * from 'preact/hooks';\nexport {\n\tversion,\n\tChildren,\n\trender,\n\thydrate,\n\tunmountComponentAtNode,\n\tcreatePortal,\n\tcreateElement,\n\tcreateContext,\n\tcreateFactory,\n\tcloneElement,\n\tcreateRef,\n\tFragment,\n\tisValidElement,\n\tisFragment,\n\tisMemo,\n\tfindDOMNode,\n\tComponent,\n\tPureComponent,\n\tmemo,\n\tforwardRef,\n\tflushSync,\n\tuseInsertionEffect,\n\tstartTransition,\n\tuseDeferredValue,\n\tuseSyncExternalStore,\n\tuseTransition,\n\t// eslint-disable-next-line camelcase\n\tunstable_batchedUpdates,\n\tStrictMode,\n\tSuspense,\n\tSuspenseList,\n\tlazy,\n\t__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED\n};\n\n// React copies the named exports to the default one.\nexport default {\n\tuseState,\n\tuseId,\n\tuseReducer,\n\tuseEffect,\n\tuseLayoutEffect,\n\tuseInsertionEffect,\n\tuseTransition,\n\tuseDeferredValue,\n\tuseSyncExternalStore,\n\tstartTransition,\n\tuseRef,\n\tuseImperativeHandle,\n\tuseMemo,\n\tuseCallback,\n\tuseContext,\n\tuseDebugValue,\n\tversion,\n\tChildren,\n\trender,\n\thydrate,\n\tunmountComponentAtNode,\n\tcreatePortal,\n\tcreateElement,\n\tcreateContext,\n\tcreateFactory,\n\tcloneElement,\n\tcreateRef,\n\tFragment,\n\tisValidElement,\n\tisElement,\n\tisFragment,\n\tisMemo,\n\tfindDOMNode,\n\tComponent,\n\tPureComponent,\n\tmemo,\n\tforwardRef,\n\tflushSync,\n\tunstable_batchedUpdates,\n\tStrictMode,\n\tSuspense,\n\tSuspenseList,\n\tlazy,\n\t__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED\n};\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","const ENCODED_ENTITIES = /[\"&<]/;\n\n/** @param {string} str */\nexport function encodeEntities(str) {\n\t// Skip all work for strings with no entities needing encoding:\n\tif (str.length === 0 || ENCODED_ENTITIES.test(str) === false) return str;\n\n\tlet last = 0,\n\t\ti = 0,\n\t\tout = '',\n\t\tch = '';\n\n\t// Seek forward in str until the next entity char:\n\tfor (; i < str.length; i++) {\n\t\tswitch (str.charCodeAt(i)) {\n\t\t\tcase 34:\n\t\t\t\tch = '&quot;';\n\t\t\t\tbreak;\n\t\t\tcase 38:\n\t\t\t\tch = '&amp;';\n\t\t\t\tbreak;\n\t\t\tcase 60:\n\t\t\t\tch = '&lt;';\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tcontinue;\n\t\t}\n\t\t// Append skipped/buffered characters and the encoded entity:\n\t\tif (i !== last) out += str.slice(last, i);\n\t\tout += ch;\n\t\t// Start the next seek/buffer after the entity's offset:\n\t\tlast = i + 1;\n\t}\n\tif (i !== last) out += str.slice(last, i);\n\treturn out;\n}\n","/** Normal hydration that attaches to a DOM tree but does not diff it. */\nexport const MODE_HYDRATE = 1 << 5;\n/** Signifies this VNode suspended on the previous render */\nexport const MODE_SUSPENDED = 1 << 7;\n/** Indicates that this node needs to be inserted while patching children */\nexport const INSERT_VNODE = 1 << 2;\n/** Indicates a VNode has been matched with another VNode in the diff */\nexport const MATCHED = 1 << 1;\n\n/** Reset all mode flags */\nexport const RESET_MODE = ~(MODE_HYDRATE | MODE_SUSPENDED);\n\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\nexport const XHTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\nexport const MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n\nexport const NULL = null;\nexport const UNDEFINED = undefined;\nexport const EMPTY_OBJ = /** @type {any} */ ({});\nexport const EMPTY_ARR = [];\nexport const IS_NON_DIMENSIONAL =\n\t/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;\n","import { options, Fragment } from 'preact';\nimport { encodeEntities } from './utils';\nimport { IS_NON_DIMENSIONAL } from '../../src/constants';\n\nlet vnodeId = 0;\n\nconst isArray = Array.isArray;\n\n/**\n * @fileoverview\n * This file exports various methods that implement Babel's \"automatic\" JSX runtime API:\n * - jsx(type, props, key)\n * - jsxs(type, props, key)\n * - jsxDEV(type, props, key, __source, __self)\n *\n * The implementation of createVNode here is optimized for performance.\n * Benchmarks: https://esbench.com/bench/5f6b54a0b4632100a7dcd2b3\n */\n\n/**\n * JSX.Element factory used by Babel's {runtime:\"automatic\"} JSX transform\n * @param {VNode['type']} type\n * @param {VNode['props']} props\n * @param {VNode['key']} [key]\n * @param {unknown} [isStaticChildren]\n * @param {unknown} [__source]\n * @param {unknown} [__self]\n */\nfunction createVNode(type, props, key, isStaticChildren, __source, __self) {\n\tif (!props) props = {};\n\t// We'll want to preserve `ref` in props to get rid of the need for\n\t// forwardRef components in the future, but that should happen via\n\t// a separate PR.\n\tlet normalizedProps = props,\n\t\tref,\n\t\ti;\n\n\tif ('ref' in normalizedProps) {\n\t\tnormalizedProps = {};\n\t\tfor (i in props) {\n\t\t\tif (i == 'ref') {\n\t\t\t\tref = props[i];\n\t\t\t} else {\n\t\t\t\tnormalizedProps[i] = props[i];\n\t\t\t}\n\t\t}\n\t}\n\n\t/** @type {VNode & { __source: any; __self: any }} */\n\tconst vnode = {\n\t\ttype,\n\t\tprops: normalizedProps,\n\t\tkey,\n\t\tref,\n\t\t_children: null,\n\t\t_parent: null,\n\t\t_depth: 0,\n\t\t_dom: null,\n\t\t_component: null,\n\t\tconstructor: undefined,\n\t\t_original: --vnodeId,\n\t\t_index: -1,\n\t\t_flags: 0,\n\t\t__source,\n\t\t__self\n\t};\n\n\t// If a Component VNode, check for and apply defaultProps.\n\t// Note: `type` is often a String, and can be `undefined` in development.\n\tif (typeof type === 'function' && (ref = type.defaultProps)) {\n\t\tfor (i in ref)\n\t\t\tif (normalizedProps[i] === undefined) {\n\t\t\t\tnormalizedProps[i] = ref[i];\n\t\t\t}\n\t}\n\n\tif (options.vnode) options.vnode(vnode);\n\treturn vnode;\n}\n\n/**\n * Create a template vnode. This function is not expected to be\n * used directly, but rather through a precompile JSX transform\n * @param {string[]} templates\n * @param {Array<string | null | VNode>} exprs\n * @returns {VNode}\n */\nfunction jsxTemplate(templates, ...exprs) {\n\tconst vnode = createVNode(Fragment, { tpl: templates, exprs });\n\t// Bypass render to string top level Fragment optimization\n\tvnode.key = vnode._vnode;\n\treturn vnode;\n}\n\nconst JS_TO_CSS = {};\nconst CSS_REGEX = /[A-Z]/g;\n\n/**\n * Unwrap potential signals.\n * @param {*} value\n * @returns {*}\n */\nfunction normalizeAttrValue(value) {\n\treturn value !== null &&\n\t\ttypeof value === 'object' &&\n\t\ttypeof value.valueOf === 'function'\n\t\t? value.valueOf()\n\t\t: value;\n}\n\n/**\n * Serialize an HTML attribute to a string. This function is not\n * expected to be used directly, but rather through a precompile\n * JSX transform\n * @param {string} name The attribute name\n * @param {*} value The attribute value\n * @returns {string}\n */\nfunction jsxAttr(name, value) {\n\tif (options.attr) {\n\t\tconst result = options.attr(name, value);\n\t\tif (typeof result === 'string') return result;\n\t}\n\n\tvalue = normalizeAttrValue(value);\n\n\tif (name === 'ref' || name === 'key') return '';\n\tif (name === 'style' && typeof value === 'object') {\n\t\tlet str = '';\n\t\tfor (let prop in value) {\n\t\t\tlet val = value[prop];\n\t\t\tif (val != null && val !== '') {\n\t\t\t\tconst name =\n\t\t\t\t\tprop[0] == '-'\n\t\t\t\t\t\t? prop\n\t\t\t\t\t\t: JS_TO_CSS[prop] ||\n\t\t\t\t\t\t\t(JS_TO_CSS[prop] = prop.replace(CSS_REGEX, '-$&').toLowerCase());\n\n\t\t\t\tlet suffix = ';';\n\t\t\t\tif (\n\t\t\t\t\ttypeof val === 'number' &&\n\t\t\t\t\t// Exclude custom-attributes\n\t\t\t\t\t!name.startsWith('--') &&\n\t\t\t\t\t!IS_NON_DIMENSIONAL.test(name)\n\t\t\t\t) {\n\t\t\t\t\tsuffix = 'px;';\n\t\t\t\t}\n\t\t\t\tstr = str + name + ':' + val + suffix;\n\t\t\t}\n\t\t}\n\t\treturn name + '=\"' + encodeEntities(str) + '\"';\n\t}\n\n\tif (\n\t\tvalue == null ||\n\t\tvalue === false ||\n\t\ttypeof value === 'function' ||\n\t\ttypeof value === 'object'\n\t) {\n\t\treturn '';\n\t} else if (value === true) return name;\n\n\treturn name + '=\"' + encodeEntities('' + value) + '\"';\n}\n\n/**\n * Escape a dynamic child passed to `jsxTemplate`. This function\n * is not expected to be used directly, but rather through a\n * precompile JSX transform\n * @param {*} value\n * @returns {string | null | VNode | Array<string | null | VNode>}\n */\nfunction jsxEscape(value) {\n\tif (\n\t\tvalue == null ||\n\t\ttypeof value === 'boolean' ||\n\t\ttypeof value === 'function'\n\t) {\n\t\treturn null;\n\t}\n\n\tif (typeof value === 'object') {\n\t\t// Check for VNode\n\t\tif (value.constructor === undefined) return value;\n\n\t\tif (isArray(value)) {\n\t\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\t\tvalue[i] = jsxEscape(value[i]);\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t}\n\n\treturn encodeEntities('' + value);\n}\n\nexport {\n\tcreateVNode as jsx,\n\tcreateVNode as jsxs,\n\tcreateVNode as jsxDEV,\n\tFragment,\n\t// precompiled JSX transform\n\tjsxTemplate,\n\tjsxAttr,\n\tjsxEscape\n};\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","\"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 &ldquo;{selectedText.slice(0, 80)}\n {selectedText.length > 80 ? \"...\" : \"\"}&rdquo;\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","// =============================================================================\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","\"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"],"mappings":"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","names":["slice","options","vnodeId","isValidElement","rerenderQueue","prevDebounce","defer","depthSort","CAPTURE_REGEX","eventClock","eventProxy","eventProxyCapture","i","EMPTY_OBJ","EMPTY_ARR","IS_NON_DIMENSIONAL","isArray","Array","assign","obj","props","removeNode","node","parentNode","removeChild","createElement","type","children","key","ref","normalizedProps","arguments","length","call","defaultProps","createVNode","original","vnode","__k","__","__b","__e","__c","constructor","__v","__i","__u","Fragment","props","children","BaseComponent","context","this","getDomSibling","vnode","childIndex","__","__i","sibling","__k","length","__e","type","renderComponent","component","__P","__d","oldVNode","__v","oldDom","commitQueue","refQueue","newVNode","assign","options","diff","__n","namespaceURI","__u","commitRoot","updateParentDomPointers","__c","base","some","child","enqueueRender","c","rerenderQueue","push","process","__r","prevDebounce","debounceRendering","defer","l","sort","depthSort","shift","diffChildren","parentDom","renderResult","newParentVNode","oldParentVNode","globalContext","namespace","excessDomChildren","isHydrating","i","childVNode","newDom","firstChildDom","result","shouldPlace","oldChildren","EMPTY_ARR","newChildrenLength","constructNewChildrenArray","EMPTY_OBJ","ref","applyRef","insert","nextSibling","skewedIndex","matchingIndex","oldChildrenLength","remainingOldChildren","skew","Array","constructor","String","createVNode","isArray","__b","key","findMatchingIndex","unmount","parentVNode","parentNode","insertBefore","nodeType","toChildArray","out","x","y","matched","shouldSearch","setStyle","style","value","setProperty","IS_NON_DIMENSIONAL","test","dom","name","oldValue","useCapture","lowerCaseName","o","cssText","replace","CAPTURE_REGEX","toLowerCase","slice","_attached","eventClock","addEventListener","eventProxyCapture","eventProxy","removeEventListener","e","removeAttribute","setAttribute","createEventProxy","eventHandler","_dispatched","event","tmp","isNew","oldProps","oldState","snapshot","clearProcessingException","newProps","isClassComponent","provider","componentContext","renderHook","count","newType","outer","prototype","render","contextType","__E","doRender","sub","state","__h","_sb","__s","getDerivedStateFromProps","componentWillMount","componentDidMount","componentWillReceiveProps","shouldComponentUpdate","apply","componentWillUpdate","componentDidUpdate","getChildContext","getSnapshotBeforeUpdate","cloneNode","then","MODE_HYDRATE","indexOf","removeNode","markAsForce","diffElementNodes","diffed","root","cb","call","node","map","newHtml","oldHtml","newChildren","inputValue","checked","localName","document","createTextNode","createElementNS","is","__m","data","childNodes","attributes","__html","innerHTML","content","undefined","hasRefUnmount","current","skipRemove","r","componentWillUnmount","replaceNode","documentElement","createElement","firstChild","slice","EMPTY_ARR","options","__e","error","vnode","oldVNode","errorInfo","component","ctor","handled","__","__c","constructor","getDerivedStateFromError","setState","__d","componentDidCatch","__E","e","vnodeId","isValidElement","BaseComponent","prototype","update","callback","s","this","__s","state","assign","props","__v","_sb","push","enqueueRender","forceUpdate","__h","render","Fragment","rerenderQueue","defer","Promise","then","bind","resolve","setTimeout","depthSort","a","b","__b","process","__r","CAPTURE_REGEX","eventClock","eventProxy","createEventProxy","eventProxyCapture","i","currentIndex","currentComponent","previousComponent","prevRaf","currentHook","afterPaintEffects","options","_options","oldBeforeDiff","__b","oldBeforeRender","__r","oldAfterDiff","diffed","oldCommit","__c","oldBeforeUnmount","unmount","oldRoot","__","getHookState","index","type","__h","hooks","__H","length","push","useState","initialState","useReducer","invokeOrReturn","reducer","init","hookState","_reducer","action","currentValue","__N","nextValue","setState","__f","updateHookState","p","s","c","stateHooks","filter","x","every","prevScu","call","this","shouldUpdate","props","some","hookItem","shouldComponentUpdate","prevCWU","componentWillUpdate","__e","tmp","useEffect","callback","args","state","__s","argsChanged","_pendingArgs","useLayoutEffect","useRef","initialValue","useMemo","current","useImperativeHandle","ref","createHandle","result","concat","factory","useCallback","flushAfterPaintEffects","component","afterPaintEffects","shift","hooks","__H","__P","__h","some","invokeCleanup","invokeEffect","e","options","__e","__v","__b","vnode","currentComponent","oldBeforeDiff","__","parentDom","__k","__m","oldRoot","__r","oldBeforeRender","currentIndex","__c","previousComponent","hookItem","__N","_pendingArgs","diffed","oldAfterDiff","c","length","push","prevRaf","requestAnimationFrame","afterNextFrame","commitQueue","filter","cb","oldCommit","unmount","oldBeforeUnmount","hasErrored","s","HAS_RAF","callback","raf","done","clearTimeout","timeout","cancelAnimationFrame","setTimeout","hook","comp","cleanup","argsChanged","oldArgs","newArgs","arg","index","invokeOrReturn","f","assign","obj","props","i","shallowDiffers","a","b","useLayoutEffect","PureComponent","p","c","this","props","context","PureComponent","prototype","Component","isPureReactComponent","shouldComponentUpdate","props","state","shallowDiffers","this","oldDiffHook","options","__b","vnode","type","__f","ref","REACT_FORWARD_SYMBOL","Symbol","for","forwardRef","fn","Forwarded","clone","assign","$$typeof","render","isReactComponent","displayName","name","oldCatchError","options","__e","error","newVNode","oldVNode","errorInfo","then","component","vnode","__","__c","__k","oldUnmount","unmount","detachedClone","detachedParent","parentDom","__H","forEach","effect","assign","__P","map","child","removeOriginal","originalParent","__v","appendChild","Suspense","this","__u","_suspenders","__b","suspended","__a","SuspenseList","this","_next","_map","options","unmount","vnode","component","__c","__z","__R","__u","type","oldUnmount","Suspense","prototype","Component","promise","suspendingVNode","suspendingComponent","c","_suspenders","push","resolve","suspended","__v","resolved","onResolved","onSuspensionComplete","originalParentDom","__P","state","__a","suspendedVNode","__k","removeOriginal","__O","setState","__b","pop","forceUpdate","then","componentWillUnmount","render","props","detachedParent","document","createElement","detachedComponent","detachedClone","fallback","Fragment","children","list","child","node","delete","revealOrder","size","length","ContextProvider","getChildContext","context","Portal","_this","container","_container","_temp","root","__m","__","nodeType","parentNode","childNodes","contains","namespaceURI","insertBefore","before","removeChild","splice","indexOf","createPortal","el","containerInfo","delegated","get","unsuspend","wrappedUnsuspend","Map","toChildArray","reverse","i","set","componentDidUpdate","componentDidMount","forEach","REACT_ELEMENT_TYPE","Symbol","for","CAMEL_PROPS","ON_ANI","CAMEL_REPLACE","IS_DOM","onChangeInputType","test","Component","prototype","isReactComponent","forEach","key","Object","defineProperty","configurable","get","this","set","v","writable","value","oldEventHook","options","event","empty","isPropagationStopped","cancelBubble","isDefaultPrevented","defaultPrevented","e","persist","nativeEvent","currentComponent","classNameDescriptorNonEnumberable","enumerable","class","oldVNodeHook","vnode","type","props","normalizedProps","isNonDashedType","indexOf","i","IS_DOM","lowerCased","toLowerCase","onChangeInputType","ON_ANI","test","CAMEL_PROPS","replace","CAMEL_REPLACE","multiple","Array","isArray","toChildArray","children","child","selected","defaultValue","className","$$typeof","REACT_ELEMENT_TYPE","oldBeforeRender","__r","__c","oldDiffed","diffed","dom","__e","vnodeId","createVNode","type","props","key","isStaticChildren","__source","__self","ref","i","normalizedProps","vnode","__k","__","__b","__e","__c","constructor","__v","vnodeId","__i","__u","defaultProps","options","u","a","w","e","D","AnnotationPopupCSS","d","A","y","q","F","e","u","c","i","p","c","a","i","a","w","p","result","c","css","classNames","styles_module_default","x","y","i","j","a","b","t","p","a","i","d","A","y","u","$","e","annotations","q","r","elementUnder","name","path","reactComponents","computedStylesStr","computedStylesObj","isFixed","rect","_","x","left","top","styles_module_default","scrollY","p","t","s","deleteAnnotation","updateAnnotation","DRAG_THRESHOLD","bb"]}