agentation 2.3.3 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -4
- package/dist/index.d.mts +36 -6
- package/dist/index.d.ts +36 -6
- package/dist/index.js +7379 -1760
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7372 -1754
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -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/icon-transitions.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/utils/source-location.ts","../src/components/page-toolbar-css/styles.module.scss","../src/components/tooltip/index.tsx","../src/components/help-tooltip/styles.module.scss","../src/components/help-tooltip/index.tsx"],"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} 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 loadToolbarHidden,\n saveToolbarHidden,\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 getSourceLocation,\n findNearestComponentSource,\n formatSourceLocation,\n} from \"../../utils/source-location\";\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\";\nimport { Tooltip } from \"../tooltip\";\nimport { HelpTooltip } from \"../help-tooltip\";\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 annotationColorId: string;\n blockInteractions: boolean;\n reactEnabled: boolean;\n markerClickBehavior: MarkerClickBehavior;\n webhookUrl: string;\n webhooksEnabled: boolean;\n};\n\nconst DEFAULT_SETTINGS: ToolbarSettings = {\n outputDetail: \"standard\",\n autoClearAfterCopy: false,\n annotationColorId: \"blue\",\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 { id: \"indigo\", label: \"Indigo\", srgb: \"#6155F5\", p3: \"color(display-p3 0.38 0.33 0.96)\" },\n { id: \"blue\", label: \"Blue\", srgb: \"#0088FF\", p3: \"color(display-p3 0.00 0.53 1.00)\" },\n { id: \"cyan\", label: \"Cyan\", srgb: \"#00C3D0\", p3: \"color(display-p3 0.00 0.76 0.82)\" },\n { id: \"green\", label: \"Green\", srgb: \"#34C759\", p3: \"color(display-p3 0.20 0.78 0.35)\" },\n { id: \"yellow\", label: \"Yellow\", srgb: \"#FFCC00\", p3: \"color(display-p3 1.00 0.80 0.00)\" },\n { id: \"orange\", label: \"Orange\", srgb: \"#FF8D28\", p3: \"color(display-p3 1.00 0.55 0.16)\" },\n { id: \"red\", label: \"Red\", srgb: \"#FF383C\", p3: \"color(display-p3 1.00 0.22 0.24)\" },\n];\n\nconst injectAgentationColorTokens = () => {\n if (typeof document === \"undefined\") return;\n if (document.getElementById(\"agentation-color-tokens\")) return;\n const style = document.createElement(\"style\");\n style.id = \"agentation-color-tokens\";\n style.textContent = [\n ...COLOR_OPTIONS.map(c => `\n [data-agentation-accent=\"${c.id}\"] {\n --agentation-color-accent: ${c.srgb};\n }\n\n @supports (color: color(display-p3 0 0 0)) {\n [data-agentation-accent=\"${c.id}\"] {\n --agentation-color-accent: ${c.p3};\n }\n }\n `),\n `:root {\n ${COLOR_OPTIONS.map(c => `--agentation-color-${c.id}: ${c.srgb};`).join(\"\\n\")}\n }`,\n `@supports (color: color(display-p3 0 0 0)) {\n :root {\n ${COLOR_OPTIONS.map(c => `--agentation-color-${c.id}: ${c.p3};`).join(\"\\n\")}\n }\n }`,\n ].join(\"\");\n document.head.appendChild(style);\n}\n\ninjectAgentationColorTokens();\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 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 isRenderableAnnotation(annotation: Annotation): boolean {\n return annotation.status !== \"resolved\" && annotation.status !== \"dismissed\";\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 detectSourceFile(element: Element): string | undefined {\n const result = getSourceLocation(element as HTMLElement);\n const loc = result.found ? result : findNearestComponentSource(element as HTMLElement);\n if (loc.found && loc.source) {\n return formatSourceLocation(loc.source, \"path\");\n }\n return undefined;\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.sourceFile ? ` (${a.sourceFile})` : \"\"}: ${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.sourceFile) {\n output += `**Source:** ${a.sourceFile}\\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 if (a.sourceFile) {\n output += `**Source:** ${a.sourceFile}\\n`;\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 /** Custom class name applied to the toolbar container. Use to adjust positioning or z-index. */\n className?: 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 className: userClassName,\n}: PageFeedbackToolbarCSSProps = {}) {\n const [isActive, setIsActive] = useState(false);\n const [annotations, setAnnotations] = useState<Annotation[]>([]);\n const [showMarkers, setShowMarkers] = useState(true);\n const [isToolbarHidden, setIsToolbarHidden] = useState(() => loadToolbarHidden());\n const [isToolbarHiding, setIsToolbarHiding] = useState(false);\n\n // Stop native events from bubbling past document.body when they originate\n // inside the toolbar portal. Without this, clicks on the toolbar propagate to\n // document-level listeners, triggering \"click outside\" handlers that close\n // modals, dropdowns, and drawers. We attach to body (not a wrapper div) so\n // React's synthetic event delegation (which also listens on body/root) still\n // works — we only block propagation from body → document/window.\n const portalWrapperRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const stop = (e: Event) => {\n const wrapper = portalWrapperRef.current;\n if (wrapper && wrapper.contains(e.target as Node)) {\n e.stopPropagation();\n }\n };\n const events = [\"mousedown\", \"click\", \"pointerdown\"] as const;\n events.forEach((evt) => document.body.addEventListener(evt, stop));\n return () => {\n events.forEach((evt) => document.body.removeEventListener(evt, stop));\n };\n }, []);\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 sourceFile?: 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 } | 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 [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 [tooltipsHidden, setTooltipsHidden] = useState(false);\n const [tooltipSessionActive, setTooltipSessionActive] = useState(false);\n const tooltipSessionTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\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 const handleControlsMouseEnter = () => {\n if (!tooltipSessionActive) {\n tooltipSessionTimerRef.current = setTimeout(\n () => setTooltipSessionActive(true),\n 850,\n );\n }\n };\n\n const handleControlsMouseLeave = () => {\n if (tooltipSessionTimerRef.current) {\n clearTimeout(tooltipSessionTimerRef.current);\n tooltipSessionTimerRef.current = null;\n }\n setTooltipSessionActive(false);\n showTooltipsAgain();\n };\n\n useEffect(() => {\n return () => {\n if (tooltipSessionTimerRef.current)\n clearTimeout(tooltipSessionTimerRef.current);\n };\n }, []);\n\nconst [settings, setSettings] = useState<ToolbarSettings>(() => {\n try {\n const saved = JSON.parse(localStorage.getItem(\"feedback-toolbar-settings\") ?? \"\");\n return {\n ...DEFAULT_SETTINGS,\n ...saved,\n annotationColorId: COLOR_OPTIONS.find(c => c.id === saved.annotationColorId)\n ? saved.annotationColorId\n : DEFAULT_SETTINGS.annotationColorId,\n };\n } catch {\n return DEFAULT_SETTINGS;\n }\n});\n const [isDarkMode, setIsDarkMode] = useState(true);\n const [showEntranceAnimation, setShowEntranceAnimation] = useState(false);\n\n const toggleTheme = () => {\n portalWrapperRef.current?.classList.add(styles.disableTransitions);\n setIsDarkMode((previous) => !previous);\n requestAnimationFrame(() => {\n portalWrapperRef.current?.classList.remove(styles.disableTransitions);\n });\n }\n\n // Check if running in development mode - React detection only works in development mode\n const isDevMode = process.env.NODE_ENV === \"development\";\n\n // Effective React mode - derived from outputDetail when enabled\n const effectiveReactMode: ReactComponentMode =\n isDevMode && 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 // 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 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 }, 350);\n return () => clearTimeout(timer);\n } else if (markersVisible) {\n // Hide markers - start exit animation, then unmount\n setMarkersExiting(true);\n const timer = originalSetTimeout(() => {\n setMarkersVisible(false);\n setMarkersExiting(false);\n }, 250);\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.filter(isRenderableAnnotation));\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 // 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.filter(isRenderableAnnotation));\n saveAnnotationsWithSyncMarker(\n pathname,\n allAnnotations.filter(isRenderableAnnotation),\n session.id,\n );\n } else {\n setAnnotations(\n session.annotations.filter(isRenderableAnnotation),\n );\n saveAnnotationsWithSyncMarker(\n pathname,\n session.annotations.filter(isRenderableAnnotation),\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 const renderableSyncedAnnotations = syncedAnnotations.filter(\n isRenderableAnnotation,\n );\n\n // Save with sync marker\n saveAnnotationsWithSyncMarker(\n pagePath,\n renderableSyncedAnnotations,\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 [...renderableSyncedAnnotations, ...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 updates (e.g. resolved by agent)\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 handler = (e: MessageEvent) => {\n try {\n const event = JSON.parse(e.data);\n if (removedStatuses.includes(event.payload?.status)) {\n const id = event.payload.id as string;\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 }\n } catch {\n // Ignore parse errors\n }\n };\n\n eventSource.addEventListener(\"annotation.updated\", handler);\n\n return () => {\n eventSource.removeEventListener(\"annotation.updated\", handler);\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 const renderableAnnotations = allAnnotations.filter(\n isRenderableAnnotation,\n );\n setAnnotations(renderableAnnotations);\n saveAnnotationsWithSyncMarker(\n pathname,\n renderableAnnotations,\n sessionId!,\n );\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 const hideToolbarTemporarily = useCallback(() => {\n if (isToolbarHiding) return;\n setIsToolbarHiding(true);\n setShowSettings(false);\n setIsActive(false);\n originalSetTimeout(() => {\n saveToolbarHidden(true);\n setIsToolbarHidden(true);\n setIsToolbarHiding(false);\n }, 400);\n }, [isToolbarHiding]);\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 sourceFile: detectSourceFile(firstEl),\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 sourceFile: detectSourceFile(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 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: auto !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 `;\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 // Handle mouse move\n useEffect(() => {\n if (!isActive || pendingAnnotation) 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 return;\n }\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, effectiveReactMode]);\n\n // Handle click\n useEffect(() => {\n if (!isActive) 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 // 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 sourceFile: detectSourceFile(elementUnder),\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 pendingAnnotation,\n editingAnnotation,\n settings.blockInteractions,\n effectiveReactMode,\n pendingMultiSelectElements,\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) 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]);\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 sourceFile: detectSourceFile(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 // 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 sourceFile: pendingAnnotation.sourceFile,\n elementBoundingBoxes: pendingAnnotation.elementBoundingBoxes,\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 setPendingExiting(true);\n originalSetTimeout(() => {\n setPendingAnnotation(null);\n setPendingExiting(false);\n }, 150); // Match exit animation duration\n }, []);\n\n // Delete annotation with exit animation\n const deleteAnnotation = useCallback(\n (id: string) => {\n const deletedIndex = annotations.findIndex((a) => a.id === id);\n const deletedAnnotation = annotations[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 // Wait for exit animation then remove\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 setDeletingMarkerId(null);\n\n // Trigger renumber animation for markers after deleted one\n if (deletedIndex < annotations.length - 1) {\n setRenumberFrom(deletedIndex);\n originalSetTimeout(() => setRenumberFrom(null), 200);\n }\n }, 150);\n },\n [annotations, editingAnnotation, onAnnotationDelete, fireWebhook, endpoint],\n );\n\n // Start editing an annotation (right-click)\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 marker hover - finds element(s) for live position tracking\n const handleMarkerHover = useCallback(\n (annotation: Annotation | null) => {\n if (!annotation) {\n setHoveredMarkerId(null);\n setHoveredTargetElement(null);\n setHoveredTargetElements([]);\n return;\n }\n\n setHoveredMarkerId(annotation.id);\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 [],\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) 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 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, 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 const output = generateOutput(\n annotations,\n displayUrl,\n settings.outputDetail,\n effectiveReactMode,\n );\n if (!output) return;\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 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 = 297; // .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 ? 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 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 = 297; // .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 // 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 // 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 // \"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 }\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 pendingAnnotation,\n annotations.length,\n settings.webhookUrl,\n webhookUrl,\n sendState,\n sendToWebhook,\n toggleFreeze,\n copyOutput,\n clearAll,\n pendingMultiSelectElements,\n ]);\n\n if (!mounted) return null;\n if (isToolbarHidden) 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) && isRenderableAnnotation(a),\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 <div ref={portalWrapperRef} style={{ display: \"contents\" }} data-agentation-theme={isDarkMode ? \"dark\" : \"light\"} data-agentation-accent={settings.annotationColorId}>\n {/* Toolbar */}\n <div\n className={`${styles.toolbar}${userClassName ? ` ${userClassName}` : \"\"}`}\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} ${isActive ? styles.expanded : styles.collapsed} ${showEntranceAnimation ? styles.entrance : \"\"} ${isToolbarHiding ? styles.hiding : \"\"} ${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 >\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 : \"\"} ${tooltipSessionActive ? styles.tooltipsInSession : \"\"}`}\n onMouseEnter={handleControlsMouseEnter}\n onMouseLeave={handleControlsMouseLeave}\n >\n <div\n className={`${styles.buttonWrapper} ${\n toolbarPosition && toolbarPosition.x < 120\n ? styles.buttonWrapperAlignLeft\n : \"\"\n }`}\n >\n <button\n className={styles.controlButton}\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}\n onClick={(e) => {\n e.stopPropagation();\n hideTooltipsUntilMouseLeave();\n setShowMarkers(!showMarkers);\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} ${copied ? styles.statusShowing : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n hideTooltipsUntilMouseLeave();\n copyOutput();\n }}\n disabled={!hasAnnotations}\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} ${isActive && !settings.webhooksEnabled && (isValidUrl(settings.webhookUrl) || isValidUrl(webhookUrl || \"\")) ? styles.sendButtonVisible : \"\"}`}\n >\n <button\n className={`${styles.controlButton} ${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}\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}\n onClick={(e) => {\n e.stopPropagation();\n hideTooltipsUntilMouseLeave();\n clearAll();\n }}\n disabled={!hasAnnotations}\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}\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} ${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}\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}\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} ${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}\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 >\n /\n </span>\n agentation\n </span>\n <span className={styles.settingsVersion}>v{__VERSION__}</span>\n <button\n className={styles.themeToggle}\n onClick={toggleTheme}\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}\n >\n Output Detail\n <HelpTooltip content=\"Controls how much detail is included in the copied output\" />\n </div>\n <button\n className={styles.cycleButton}\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} ${settings.outputDetail === option.value ? styles.active : \"\"}`}\n />\n ))}\n </span>\n </button>\n </div>\n\n <div\n className={`${styles.settingsRow} ${styles.settingsRowMarginTop} ${!isDevMode ? styles.settingsRowDisabled : \"\"}`}\n >\n <div\n className={styles.settingsLabel}\n >\n React Components\n <HelpTooltip\n content={\n !isDevMode\n ? \"Disabled — production builds minify component names, making detection unreliable. Use in development mode.\"\n : \"Include React component names in annotations\"\n }\n />\n </div>\n <label\n className={`${styles.toggleSwitch} ${!isDevMode ? styles.disabled : \"\"}`}\n >\n <input\n type=\"checkbox\"\n checked={isDevMode && settings.reactEnabled}\n disabled={!isDevMode}\n onChange={() =>\n setSettings((s) => ({\n ...s,\n reactEnabled: !s.reactEnabled,\n }))\n }\n />\n <span className={styles.toggleSlider} />\n </label>\n </div>\n\n <div className={`${styles.settingsRow} ${styles.settingsRowMarginTop}`}>\n <div\n className={styles.settingsLabel}\n >\n Hide Until Restart\n <HelpTooltip content=\"Hides the toolbar until you open a new tab\" />\n </div>\n <label className={styles.toggleSwitch}>\n <input\n type=\"checkbox\"\n checked={false}\n onChange={(e) => {\n if (e.target.checked) {\n hideToolbarTemporarily();\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}`}\n >\n Marker Color\n </div>\n <div className={styles.colorOptions}>\n {COLOR_OPTIONS.map((color) => (\n <div\n key={color.id}\n role=\"button\"\n onClick={() => setSettings((s) => ({ ...s, annotationColorId: color.id }))}\n style={{\n \"--swatch\": color.srgb,\n \"--swatch-p3\": color.p3,\n } as React.CSSProperties}\n className={`${styles.colorOptionRing} ${settings.annotationColorId === color.id ? styles.selected : \"\"}`}\n >\n <div\n className={`${styles.colorOption} ${settings.annotationColorId === color.id ? styles.selected : \"\"}`}\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}\n >\n Clear on copy/send\n <HelpTooltip content=\"Automatically clear annotations after copying\" />\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}\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}\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}\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}\n >\n MCP Connection\n <HelpTooltip content=\"Connect via Model Context Protocol to let AI agents like Claude Code receive annotations in real-time.\" />\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}\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}\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}\n >\n Webhooks\n <HelpTooltip content=\"Send annotation data to any URL endpoint when annotations change. Useful for custom integrations.\" />\n </span>\n <div className={styles.autoSendRow}>\n <span\n className={`${styles.autoSendLabel} ${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}\n >\n The webhook URL will receive live annotation changes and\n annotation data.\n </p>\n <textarea\n className={styles.webhookUrlInput}\n placeholder=\"Webhook URL\"\n value={settings.webhookUrl}\n onKeyDown={(e) => e.stopPropagation()}\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 {/* 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 ? \"var(--agentation-color-green)\"\n : \"var(--agentation-color-accent)\";\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 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 : `${index * 20}ms`,\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 && !editingAnnotation && (\n <div\n className={`${styles.markerTooltip} ${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 ? \"var(--agentation-color-green)\"\n : \"var(--agentation-color-accent)\";\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 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 : `${index * 20}ms`,\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 && !editingAnnotation && (\n <div\n className={`${styles.markerTooltip} ${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 <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: \"color-mix(in srgb, var(--agentation-color-accent) 50%, transparent)\",\n backgroundColor: \"color-mix(in srgb, var(--agentation-color-accent) 4%, transparent)\",\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: \"color-mix(in srgb, var(--agentation-color-accent) 60%, transparent)\",\n backgroundColor: \"color-mix(in srgb, var(--agentation-color-accent) 5%, transparent)\",\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\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: \"color-mix(in srgb, var(--agentation-color-accent) 60%, transparent)\",\n backgroundColor: \"color-mix(in srgb, var(--agentation-color-accent) 5%, transparent)\",\n }),\n }}\n />\n );\n })()}\n\n {/* Hover tooltip */}\n {hoverInfo && !pendingAnnotation && !isScrolling && !isDragging && (\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 */}\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: \"color-mix(in srgb, var(--agentation-color-accent) 60%, transparent)\",\n backgroundColor: \"color-mix(in srgb, var(--agentation-color-accent) 5%, transparent)\",\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: \"color-mix(in srgb, var(--agentation-color-accent) 60%, transparent)\",\n backgroundColor: \"color-mix(in srgb, var(--agentation-color-accent) 5%, transparent)\",\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 ? \"var(--agentation-color-green)\"\n : \"var(--agentation-color-accent)\",\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 ? \"var(--agentation-color-green)\"\n : \"var(--agentation-color-accent)\"\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 */}\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: \"color-mix(in srgb, var(--agentation-color-accent) 60%, transparent)\",\n backgroundColor: \"color-mix(in srgb, var(--agentation-color-accent) 5%, transparent)\",\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 ? \"var(--agentation-color-green)\"\n : \"var(--agentation-color-accent)\"\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 </div>,\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// Helpers\n// =============================================================================\n\n/** Focus an element while temporarily blocking focus-trap libraries (e.g. Radix\n * FocusScope) from reclaiming focus via focusin/focusout handlers. */\nfunction focusBypassingTraps(el: HTMLElement | null) {\n if (!el) return;\n const trap = (e: Event) => e.stopImmediatePropagation();\n document.addEventListener(\"focusin\", trap, true);\n document.addEventListener(\"focusout\", trap, true);\n try {\n el.focus();\n } finally {\n document.removeEventListener(\"focusin\", trap, true);\n document.removeEventListener(\"focusout\", trap, true);\n }\n}\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 focusBypassingTraps(textarea);\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 focusBypassingTraps(textareaRef.current);\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 e.stopPropagation();\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(() => focusBypassingTraps(textareaRef.current), 0);\n }\n }}\n type=\"button\"\n >\n <svg\n className={`${styles.chevron} ${isStylesExpanded ? styles.expanded : \"\"}`}\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5.5 10.25L9 7.25L5.75 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span className={styles.element}>{element}</span>\n </button>\n ) : (\n <span className={styles.element}>{element}</span>\n )}\n {timestamp && <span className={styles.timestamp}>{timestamp}</span>}\n </div>\n\n {/* Collapsible computed styles section - uses grid-template-rows for smooth animation */}\n {computedStyles && Object.keys(computedStyles).length > 0 && (\n <div className={`${styles.stylesWrapper} ${isStylesExpanded ? styles.expanded : \"\"}`}>\n <div className={styles.stylesInner}>\n <div className={styles.stylesBlock}>\n {Object.entries(computedStyles).map(([key, value]) => (\n <div key={key} className={styles.styleLine}>\n <span className={styles.styleProperty}>\n {key.replace(/([A-Z])/g, \"-$1\").toLowerCase()}\n </span>\n : <span className={styles.styleValue}>{value}</span>;\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {selectedText && (\n <div className={styles.quote}>\n “{selectedText.slice(0, 80)}\n {selectedText.length > 80 ? \"...\" : \"\"}”\n </div>\n )}\n\n <textarea\n ref={textareaRef}\n className={styles.textarea}\n style={{ borderColor: isFocused ? accentColor : undefined }}\n placeholder={placeholder}\n value={text}\n onChange={(e) => setText(e.target.value)}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n rows={2}\n onKeyDown={handleKeyDown}\n />\n\n <div className={styles.actions}>\n {onDelete && (\n <div className={styles.deleteWrapper}>\n <button className={styles.deleteButton} onClick={onDelete} type=\"button\">\n <IconTrash size={22} />\n </button>\n </div>\n )}\n <button className={styles.cancel} onClick={handleCancel}>\n Cancel\n </button>\n <button\n className={styles.submit}\n style={{\n backgroundColor: accentColor,\n opacity: text.trim() ? 1 : 0.4,\n }}\n onClick={handleSubmit}\n disabled={!text.trim()}\n >\n {submitLabel}\n </button>\n </div>\n </div>\n );\n }\n);\n\nexport default AnnotationPopupCSS;\n","\nconst css = \".styles-module__popup___IhzrD svg[fill=none] {\\n fill: none !important;\\n}\\n.styles-module__popup___IhzrD svg[fill=none] :not([fill]) {\\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: var(--agentation-color-blue);\\n}\\n.styles-module__textarea___jrSae.styles-module__green___99l3h:focus {\\n border-color: var(--agentation-color-green);\\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-color: color-mix(in srgb, var(--agentation-color-red) 25%, transparent);\\n color: var(--agentation-color-red);\\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-color: color-mix(in srgb, var(--agentation-color-red) 25%, transparent);\\n color: var(--agentation-color-red);\\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","\nconst css = \".icon-transitions-module__iconState___uqK9J {\\n transition: opacity 0.2s ease, transform 0.2s ease;\\n transform-origin: center;\\n}\\n\\n.icon-transitions-module__iconStateFast___HxlMm {\\n transition: opacity 0.15s ease, transform 0.15s ease;\\n transform-origin: center;\\n}\\n\\n.icon-transitions-module__iconFade___nPwXg {\\n transition: opacity 0.2s ease;\\n}\\n\\n.icon-transitions-module__iconFadeFast___Ofb2t {\\n transition: opacity 0.15s ease;\\n}\\n\\n.icon-transitions-module__visible___PlHsU {\\n opacity: 1 !important;\\n}\\n\\n.icon-transitions-module__visibleScaled___8Qog- {\\n opacity: 1 !important;\\n transform: scale(1);\\n}\\n\\n.icon-transitions-module__hidden___ETykt {\\n opacity: 0 !important;\\n}\\n\\n.icon-transitions-module__hiddenScaled___JXn-m {\\n opacity: 0 !important;\\n transform: scale(0.8);\\n}\\n\\n.icon-transitions-module__sending___uaLN- {\\n opacity: 0.5 !important;\\n transform: scale(0.8);\\n}\";\nconst classNames = {\"iconState\":\"icon-transitions-module__iconState___uqK9J\",\"iconStateFast\":\"icon-transitions-module__iconStateFast___HxlMm\",\"iconFade\":\"icon-transitions-module__iconFade___nPwXg\",\"iconFadeFast\":\"icon-transitions-module__iconFadeFast___Ofb2t\",\"visible\":\"icon-transitions-module__visible___PlHsU\",\"visibleScaled\":\"icon-transitions-module__visibleScaled___8Qog-\",\"hidden\":\"icon-transitions-module__hidden___ETykt\",\"hiddenScaled\":\"icon-transitions-module__hiddenScaled___JXn-m\",\"sending\":\"icon-transitions-module__sending___uaLN-\"};\n\n// SSR-safe style injection\nif (typeof document !== 'undefined') {\n let style = document.getElementById('feedback-tool-styles-components-icon-transitions');\n if (!style) {\n style = document.createElement('style');\n style.id = 'feedback-tool-styles-components-icon-transitions';\n style.textContent = css;\n document.head.appendChild(style);\n }\n}\n\nexport default classNames;\n","\"use client\";\n\nimport s from './icon-transitions.module.scss';\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, ...props }: { size?: number } & React.SVGProps<SVGSVGElement>) => (\n <svg width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\" {...props}>\n <circle cx=\"10\" cy=\"10\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.25\"/>\n <path d=\"M8.24 8.19C8.38 7.78 8.66 7.44 9.03 7.23C9.4 7.01 9.84 6.93 10.26 7C10.68 7.07 11.06 7.29 11.34 7.62C11.61 7.95 11.76 8.36 11.76 8.79152C11.76 10 10 10.6 10 10.6V10.83\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <circle cx=\"10\" cy=\"13\" r=\"0.625\" 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 {/* Copy icon */}\n <g className={`${s.iconState} ${copied ? s.hiddenScaled : s.visibleScaled}`}>\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={`${s.iconState} ${copied ? s.visibleScaled : s.hiddenScaled}`}>\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=\"var(--agentation-color-green)\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M15 10L11 14.25L9.25 12.25\"\n stroke=\"var(--agentation-color-green)\"\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 {/* Send arrow */}\n <g className={`${s.iconStateFast} ${showArrow ? s.visibleScaled : isSending ? s.sending : s.hiddenScaled}`}>\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={`${s.iconStateFast} ${showCheck ? s.visibleScaled : s.hiddenScaled}`}>\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=\"var(--agentation-color-green)\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M15 10L11 14.25L9.25 12.25\"\n stroke=\"var(--agentation-color-green)\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n {/* Red error circle with exclamation */}\n <g className={`${s.iconStateFast} ${showError ? s.visibleScaled : s.hiddenScaled}`}>\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=\"var(--agentation-color-red)\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 8V12\"\n stroke=\"var(--agentation-color-red)\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"12\" cy=\"15\" r=\"0.5\" fill=\"var(--agentation-color-red)\" stroke=\"var(--agentation-color-red)\" 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 {/* Send icon (document with arrow) */}\n <g className={`${s.iconState} ${sent ? s.hiddenScaled : s.visibleScaled}`}>\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={`${s.iconState} ${sent ? s.visibleScaled : s.hiddenScaled}`}>\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 {/* Open state - full outline + pupil */}\n <g className={`${s.iconFade} ${isOpen ? s.visible : s.hidden}`}>\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={`${s.iconFade} ${isOpen ? s.hidden : s.visible}`}>\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 {/* Pause bars - visible when not paused */}\n <g className={`${s.iconFadeFast} ${isPaused ? s.hidden : s.visible}`}>\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 </g>\n {/* Play triangle - visible when paused */}\n <path\n className={`${s.iconFadeFast} ${isPaused ? s.visible : s.hidden}`}\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// 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// 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// =============================================================================\n// Toolbar Visibility (per-tab session)\n// =============================================================================\n\nconst TOOLBAR_HIDDEN_SESSION_KEY = `${SESSION_PREFIX}toolbar-hidden`;\n\nexport function loadToolbarHidden(): boolean {\n if (typeof window === \"undefined\") return false;\n try {\n return sessionStorage.getItem(TOOLBAR_HIDDEN_SESSION_KEY) === \"1\";\n } catch {\n return false;\n }\n}\n\nexport function saveToolbarHidden(hidden: boolean): void {\n if (typeof window === \"undefined\") return;\n try {\n if (hidden) {\n sessionStorage.setItem(TOOLBAR_HIDDEN_SESSION_KEY, \"1\");\n } else {\n sessionStorage.removeItem(TOOLBAR_HIDDEN_SESSION_KEY);\n }\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 /^Segment(ViewNode|Node)$/, // Next.js App Router internals\n /^LayoutSegment/, // Next.js layout segment wrappers\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","import React from \"react\";\n\n// =============================================================================\n// Source Location Detection Utilities\n// =============================================================================\n//\n// This module provides utilities for detecting React source file locations from\n// DOM elements. It works by accessing React's internal fiber tree and extracting\n// _debugSource information that's available in development builds.\n//\n// Compatibility:\n// - React 16.8+ (Hooks era)\n// - React 17.x\n// - React 18.x\n// - React 19.x (with fallbacks for changed internals)\n//\n// Limitations:\n// - Only works in development builds (production builds strip _debugSource)\n// - Requires React DevTools-style fiber access\n// - Some bundlers may strip debug info even in development\n// =============================================================================\n\n/**\n * Source location information for a React component\n */\nexport interface SourceLocation {\n /** Absolute or relative file path */\n fileName: string;\n /** Line number (1-indexed) */\n lineNumber: number;\n /** Column number (0-indexed, may be undefined) */\n columnNumber?: number;\n /** Component display name if available */\n componentName?: string;\n /** React version detected */\n reactVersion?: string;\n}\n\n/**\n * Result of source location detection\n */\nexport interface SourceLocationResult {\n /** Whether source location was found */\n found: boolean;\n /** Source location data (if found) */\n source?: SourceLocation;\n /** Reason if not found */\n reason?: SourceLocationNotFoundReason;\n /** Whether the app appears to be a React app */\n isReactApp: boolean;\n /** Whether running in production mode */\n isProduction: boolean;\n}\n\n/**\n * Reasons why source location might not be found\n */\nexport type SourceLocationNotFoundReason =\n | \"not-react-app\"\n | \"production-build\"\n | \"no-fiber\"\n | \"no-debug-source\"\n | \"react-19-changed\"\n | \"element-not-in-react-tree\"\n | \"unknown\";\n\n/**\n * React Fiber node structure (partial, for type safety)\n * Based on React's internal FiberNode type\n */\ninterface ReactFiber {\n // Debug source info (only in development)\n _debugSource?: {\n fileName: string;\n lineNumber: number;\n columnNumber?: number;\n };\n // Owner info (React 19 may use this differently)\n _debugOwner?: ReactFiber;\n // Component type\n type?: {\n name?: string;\n displayName?: string;\n // For class components\n prototype?: {\n isReactComponent?: boolean;\n };\n } | string | null;\n // Element type for built-in elements\n elementType?: unknown;\n // Tag indicating fiber type\n tag?: number;\n // Fiber tree navigation\n return?: ReactFiber | null;\n child?: ReactFiber | null;\n sibling?: ReactFiber | null;\n // Memoized props (for context)\n memoizedProps?: Record<string, unknown>;\n // State node for class components\n stateNode?: unknown;\n}\n\n/**\n * Extended HTMLElement with React fiber properties\n */\ninterface ReactDOMElement extends HTMLElement {\n // React 16-17 fiber key\n __reactFiber$?: string;\n // React 18+ fiber key pattern\n __reactFiber?: ReactFiber;\n // React internal instance (older pattern)\n __reactInternalInstance$?: string;\n // Alternative patterns\n _reactRootContainer?: unknown;\n}\n\n// React fiber tag constants (for reference)\nconst FIBER_TAGS = {\n FunctionComponent: 0,\n ClassComponent: 1,\n IndeterminateComponent: 2,\n HostRoot: 3,\n HostPortal: 4,\n HostComponent: 5,\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} as const;\n\n/**\n * Checks if the page appears to be running a React application\n *\n * @returns Object with detection results\n */\nexport function detectReactApp(): {\n isReact: boolean;\n version?: string;\n isProduction: boolean;\n} {\n if (typeof window === \"undefined\") {\n return { isReact: false, isProduction: true };\n }\n\n // Check for React DevTools hook (most reliable)\n const devToolsHook = (window as unknown as Record<string, unknown>).__REACT_DEVTOOLS_GLOBAL_HOOK__;\n\n if (devToolsHook && typeof devToolsHook === \"object\") {\n const hook = devToolsHook as Record<string, unknown>;\n\n // Check for renderers (React 16+)\n const renderers = hook.renderers as Map<number, { version?: string }> | undefined;\n if (renderers && renderers.size > 0) {\n // Get version from first renderer\n const firstRenderer = renderers.values().next().value;\n const version = firstRenderer?.version;\n\n // Check for production mode via lack of development tools\n const isProduction = !hook.supportsFiber;\n\n return {\n isReact: true,\n version: version || \"unknown\",\n isProduction,\n };\n }\n }\n\n // Fallback: Check for React root markers on DOM\n const hasReactRoot = document.querySelector(\"[data-reactroot]\") !== null;\n const hasReactContainer = document.getElementById(\"root\")?._reactRootContainer !== undefined;\n\n // Check for fiber keys on body's children\n const bodyChildren = document.body.children;\n let hasFiberKey = false;\n\n for (let i = 0; i < bodyChildren.length && !hasFiberKey; i++) {\n const child = bodyChildren[i];\n const keys = Object.keys(child);\n hasFiberKey = keys.some(\n (key) => key.startsWith(\"__reactFiber$\") || key.startsWith(\"__reactInternalInstance$\")\n );\n }\n\n if (hasReactRoot || hasReactContainer || hasFiberKey) {\n return {\n isReact: true,\n version: \"unknown\",\n // Assume production if we can't detect dev tools\n isProduction: !devToolsHook,\n };\n }\n\n return { isReact: false, isProduction: true };\n}\n\n/**\n * Gets the React fiber node associated with a DOM element\n *\n * @param element - DOM element to get fiber for\n * @returns React fiber node or null if not found\n */\nexport function getFiberFromElement(element: HTMLElement): ReactFiber | null {\n if (!element || typeof element !== \"object\") {\n return null;\n }\n\n const keys = Object.keys(element);\n\n // React 18+ uses __reactFiber$ prefix\n const fiberKey = keys.find((key) => key.startsWith(\"__reactFiber$\"));\n if (fiberKey) {\n return (element as unknown as Record<string, ReactFiber>)[fiberKey] || null;\n }\n\n // React 16-17 uses __reactInternalInstance$ prefix\n const instanceKey = keys.find((key) => key.startsWith(\"__reactInternalInstance$\"));\n if (instanceKey) {\n return (element as unknown as Record<string, ReactFiber>)[instanceKey] || null;\n }\n\n // React 19 may use different patterns - check for any fiber-like object\n const possibleFiberKey = keys.find((key) => {\n if (!key.startsWith(\"__react\")) return false;\n const value = (element as unknown as Record<string, unknown>)[key];\n return value && typeof value === \"object\" && \"_debugSource\" in (value as object);\n });\n\n if (possibleFiberKey) {\n return (element as unknown as Record<string, ReactFiber>)[possibleFiberKey] || null;\n }\n\n return null;\n}\n\n/**\n * Gets the display name of a React component from its fiber\n *\n * @param fiber - React fiber node\n * @returns Component name or null\n */\nfunction getComponentName(fiber: ReactFiber): string | null {\n if (!fiber.type) {\n return null;\n }\n\n // String type means host component (div, span, etc.)\n if (typeof fiber.type === \"string\") {\n return null; // We want React component names, not HTML tags\n }\n\n // Function/class component\n if (typeof fiber.type === \"object\" || typeof fiber.type === \"function\") {\n const type = fiber.type as { displayName?: string; name?: string };\n\n // Prefer displayName (set by React DevTools or manually)\n if (type.displayName) {\n return type.displayName;\n }\n\n // Fall back to function/class name\n if (type.name) {\n return type.name;\n }\n }\n\n return null;\n}\n\n/**\n * Walks up the fiber tree to find the nearest component with _debugSource\n *\n * @param fiber - Starting fiber node\n * @param maxDepth - Maximum tree depth to traverse (default: 50)\n * @returns Object with source info and component name, or null\n */\nfunction findDebugSource(\n fiber: ReactFiber,\n maxDepth = 50\n): { source: ReactFiber[\"_debugSource\"]; componentName: string | null } | null {\n let current: ReactFiber | null | undefined = fiber;\n let depth = 0;\n\n while (current && depth < maxDepth) {\n // Check current fiber for debug source\n if (current._debugSource) {\n return {\n source: current._debugSource,\n componentName: getComponentName(current),\n };\n }\n\n // Check debug owner (for components that wrap the element)\n if (current._debugOwner?._debugSource) {\n return {\n source: current._debugOwner._debugSource,\n componentName: getComponentName(current._debugOwner),\n };\n }\n\n // Move up the tree\n current = current.return;\n depth++;\n }\n\n return null;\n}\n\n/**\n * Attempts to find source location using React 19's potentially different structure\n *\n * @param fiber - Starting fiber node\n * @returns Source location info or null\n */\nfunction findDebugSourceReact19(\n fiber: ReactFiber\n): { source: ReactFiber[\"_debugSource\"]; componentName: string | null } | null {\n // React 19 may store debug info differently\n // This is a forward-compatible attempt based on React 19 RFCs\n\n let current: ReactFiber | null | undefined = fiber;\n let depth = 0;\n const maxDepth = 50;\n\n while (current && depth < maxDepth) {\n // Check for new React 19 debug patterns\n const anyFiber = current as unknown as Record<string, unknown>;\n\n // Possible React 19 locations for debug info\n const possibleSourceKeys = [\n \"_debugSource\",\n \"__source\",\n \"_source\",\n \"debugSource\",\n ];\n\n for (const key of possibleSourceKeys) {\n const source = anyFiber[key];\n if (source && typeof source === \"object\" && \"fileName\" in source) {\n return {\n source: source as ReactFiber[\"_debugSource\"],\n componentName: getComponentName(current),\n };\n }\n }\n\n // Check if debug info is in the element itself\n if (current.memoizedProps) {\n const props = current.memoizedProps as Record<string, unknown>;\n if (props.__source && typeof props.__source === \"object\") {\n const source = props.__source as { fileName?: string; lineNumber?: number };\n if (source.fileName && source.lineNumber) {\n return {\n source: {\n fileName: source.fileName,\n lineNumber: source.lineNumber,\n columnNumber: (source as { columnNumber?: number }).columnNumber,\n },\n componentName: getComponentName(current),\n };\n }\n }\n }\n\n current = current.return;\n depth++;\n }\n\n return null;\n}\n\n// =============================================================================\n// Stack-Trace Fallback for Source File Detection\n// =============================================================================\n//\n// When _debugSource is unavailable (e.g. Next.js with SWC), we fall back to\n// invoking the component function with a throwing hooks dispatcher, parsing\n// the error stack trace, and stripping bundler URL prefixes. In dev mode,\n// stack frames already contain original source paths.\n// =============================================================================\n\n/** Cache: component function → probed SourceLocation (or null if unresolvable) */\nconst sourceProbeCache = new Map<Function, SourceLocation | null>();\n\n/**\n * Extract the callable function from a fiber, handling wrappers.\n * Returns null for class components, host elements, or unrecognized types.\n */\nfunction unwrapComponentType(fiber: ReactFiber): Function | null {\n const tag = fiber.tag;\n const type = fiber.type;\n const elementType = fiber.elementType as Record<string, unknown> | null | undefined;\n\n // Host elements (div, span, etc.)\n if (typeof type === \"string\" || type == null) return null;\n\n // Class components — skip (need `new`, different lifecycle)\n if (\n typeof type === \"function\" &&\n (type as { prototype?: { isReactComponent?: boolean } }).prototype?.isReactComponent\n ) {\n return null;\n }\n\n // FunctionComponent / IndeterminateComponent\n if (\n (tag === FIBER_TAGS.FunctionComponent || tag === FIBER_TAGS.IndeterminateComponent) &&\n typeof type === \"function\"\n ) {\n return type as Function;\n }\n\n // ForwardRef\n if (tag === FIBER_TAGS.ForwardRef && elementType) {\n const render = elementType.render;\n if (typeof render === \"function\") return render as Function;\n }\n\n // Memo / SimpleMemo\n if (\n (tag === FIBER_TAGS.MemoComponent || tag === FIBER_TAGS.SimpleMemoComponent) &&\n elementType\n ) {\n const inner = elementType.type;\n if (typeof inner === \"function\") return inner as Function;\n }\n\n // Generic fallback: if type is a plain function, use it\n if (typeof type === \"function\") return type as Function;\n\n return null;\n}\n\n/**\n * Access the React hooks dispatcher from React's module internals.\n * These are properties on the `react` module export, NOT on `window`.\n * Returns get/set helpers or null if not found.\n */\nfunction getReactDispatcher(): {\n get: () => unknown;\n set: (d: unknown) => void;\n} | null {\n // Access React internals from the imported module\n const reactModule = React as unknown as Record<string, unknown>;\n\n // React 19: __CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE.H\n const r19 = reactModule.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE as\n | Record<string, unknown>\n | undefined;\n if (r19 && \"H\" in r19) {\n return {\n get: () => r19.H,\n set: (d: unknown) => { r19.H = d; },\n };\n }\n\n // React 16-18: __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentDispatcher.current\n const r18 = reactModule.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED as\n | Record<string, unknown>\n | undefined;\n if (r18) {\n const dispatcher = r18.ReactCurrentDispatcher as\n | { current: unknown }\n | undefined;\n if (dispatcher && \"current\" in dispatcher) {\n return {\n get: () => dispatcher.current,\n set: (d: unknown) => { dispatcher.current = d; },\n };\n }\n }\n\n return null;\n}\n\n/**\n * Parse the first non-internal frame from an error stack string.\n */\nfunction parseComponentFrame(\n stack: string\n): { fileName: string; line: number; column?: number } | null {\n const lines = stack.split(\"\\n\");\n\n // Patterns to skip: our own bundle, React internals, node_modules, chunk files\n const skipPatterns = [\n /source-location/,\n /\\/dist\\/index\\./, // Our bundled output (dist/index.mjs, dist/index.js)\n /node_modules\\//, // Any package in node_modules\n /react-dom/,\n /react\\.development/,\n /react\\.production/,\n /chunk-[A-Z0-9]+/i,\n /react-stack-bottom-frame/,\n /react-reconciler/,\n /scheduler/,\n /<anonymous>/, // Proxy handler frames\n ];\n\n // V8 format: \" at FnName (file:line:col)\" or \" at file:line:col\"\n const v8Re = /^\\s*at\\s+(?:.*?\\s+\\()?(.+?):(\\d+):(\\d+)\\)?$/;\n // WebKit/Gecko: \"FnName@file:line:col\" or \"@file:line:col\"\n const webkitRe = /^[^@]*@(.+?):(\\d+):(\\d+)$/;\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n // Skip frames from internal files\n if (skipPatterns.some((p) => p.test(trimmed))) continue;\n\n const match = v8Re.exec(trimmed) || webkitRe.exec(trimmed);\n if (match) {\n return {\n fileName: match[1],\n line: parseInt(match[2], 10),\n column: parseInt(match[3], 10),\n };\n }\n }\n\n return null;\n}\n\n/**\n * Strip bundler URL prefixes from a raw source path.\n */\nfunction cleanSourcePath(rawPath: string): string {\n let path = rawPath;\n\n // 1. Strip query params and hashes\n path = path.replace(/[?#].*$/, \"\");\n\n // 2. Turbopack project prefix\n path = path.replace(/^turbopack:\\/\\/\\/\\[project\\]\\//, \"\");\n\n // 3. webpack-internal\n path = path.replace(/^webpack-internal:\\/\\/\\/\\.\\//, \"\");\n path = path.replace(/^webpack-internal:\\/\\/\\//, \"\");\n\n // 4. webpack\n path = path.replace(/^webpack:\\/\\/\\/\\.\\//, \"\");\n path = path.replace(/^webpack:\\/\\/\\//, \"\");\n\n // 5. turbopack generic\n path = path.replace(/^turbopack:\\/\\/\\//, \"\");\n\n // 6. http(s)://host:port/\n path = path.replace(/^https?:\\/\\/[^/]+\\//, \"\");\n\n // 7. file:///\n path = path.replace(/^file:\\/\\/\\//, \"/\");\n\n // 8. Webpack chunk group prefixes like (app-pages-browser)/./\n path = path.replace(/^\\([^)]+\\)\\/\\.\\//, \"\");\n\n // 9. Leading ./\n path = path.replace(/^\\.\\//, \"\");\n\n return path;\n}\n\n/**\n * Probe a single fiber's component function by invoking it with a\n * throwing hooks dispatcher and parsing the resulting error stack.\n */\nfunction probeComponentSource(fiber: ReactFiber): SourceLocation | null {\n const fn = unwrapComponentType(fiber);\n if (!fn) return null;\n\n // Check cache\n if (sourceProbeCache.has(fn)) {\n return sourceProbeCache.get(fn)!;\n }\n\n const dispatcher = getReactDispatcher();\n if (!dispatcher) {\n sourceProbeCache.set(fn, null);\n return null;\n }\n\n const original = dispatcher.get();\n let result: SourceLocation | null = null;\n\n try {\n // Install a proxy dispatcher that throws an Error (with stack) on any hook access.\n // When the component calls useState/useEffect/etc., the proxy's get trap fires,\n // creating an Error whose stack trace includes the component's source location.\n const stackCapturingDispatcher = new Proxy(\n {},\n {\n get() {\n throw new Error(\"probe\");\n },\n }\n );\n dispatcher.set(stackCapturingDispatcher);\n\n try {\n // Invoke the component — it will either:\n // 1. Call a hook → throws Error with stack (ideal case)\n // 2. Have no hooks → runs to completion (harmless, discarded), no stack to parse\n fn({});\n } catch (e) {\n if (e instanceof Error && e.message === \"probe\" && e.stack) {\n const frame = parseComponentFrame(e.stack);\n if (frame) {\n const cleaned = cleanSourcePath(frame.fileName);\n result = {\n fileName: cleaned,\n lineNumber: frame.line,\n columnNumber: frame.column,\n componentName: getComponentName(fiber) || undefined,\n };\n }\n }\n }\n } finally {\n dispatcher.set(original);\n }\n\n sourceProbeCache.set(fn, result);\n return result;\n}\n\n/**\n * Walk the fiber tree via .return, probing each fiber for source info.\n * Stops at the first success.\n */\nfunction probeSourceWalk(\n fiber: ReactFiber,\n maxDepth = 15\n): SourceLocation | null {\n let current: ReactFiber | null | undefined = fiber;\n let depth = 0;\n\n while (current && depth < maxDepth) {\n const source = probeComponentSource(current);\n if (source) return source;\n\n current = current.return;\n depth++;\n }\n\n return null;\n}\n\n/**\n * Gets the source file location for a DOM element in a React application\n *\n * This function attempts to extract the source file path and line number\n * where a React component is defined. This only works in development mode\n * as production builds strip debug information.\n *\n * @param element - DOM element to get source location for\n * @returns SourceLocationResult with location info or reason for failure\n *\n * @example\n * ```ts\n * const result = getSourceLocation(element);\n * if (result.found && result.source) {\n * console.log(`${result.source.fileName}:${result.source.lineNumber}`);\n * // Output: \"/src/components/Button.tsx:42\"\n * }\n * ```\n */\nexport function getSourceLocation(element: HTMLElement): SourceLocationResult {\n // Try to get fiber directly from the element (same approach as getReactComponentName)\n // This avoids detectReactApp() whose production heuristic can give false positives\n const fiber = getFiberFromElement(element);\n\n if (!fiber) {\n return {\n found: false,\n reason: \"no-fiber\",\n isReactApp: false,\n isProduction: false,\n };\n }\n\n // Try standard React 16-18 debug source finding\n let debugInfo = findDebugSource(fiber);\n\n // If not found, try React 19 patterns\n if (!debugInfo) {\n debugInfo = findDebugSourceReact19(fiber);\n }\n\n if (debugInfo?.source) {\n return {\n found: true,\n source: {\n fileName: debugInfo.source.fileName,\n lineNumber: debugInfo.source.lineNumber,\n columnNumber: debugInfo.source.columnNumber,\n componentName: debugInfo.componentName || undefined,\n },\n isReactApp: true,\n isProduction: false,\n };\n }\n\n // Fallback: probe component via stack trace\n const probed = probeSourceWalk(fiber);\n if (probed) {\n return { found: true, source: probed, isReactApp: true, isProduction: false };\n }\n\n return {\n found: false,\n reason: \"no-debug-source\",\n isReactApp: true,\n isProduction: false,\n };\n}\n\n/**\n * Formats a source location as a clickable file path string\n *\n * @param source - Source location object\n * @param format - Output format: \"vscode\" for VSCode URL, \"path\" for file:line format\n * @returns Formatted string\n *\n * @example\n * ```ts\n * formatSourceLocation(source, \"path\")\n * // Returns: \"src/components/Button.tsx:42:8\"\n *\n * formatSourceLocation(source, \"vscode\")\n * // Returns: \"vscode://file/absolute/path/src/components/Button.tsx:42:8\"\n * ```\n */\nexport function formatSourceLocation(\n source: SourceLocation,\n format: \"path\" | \"vscode\" = \"path\"\n): string {\n const { fileName, lineNumber, columnNumber } = source;\n\n // Build line:column suffix\n let location = `${fileName}:${lineNumber}`;\n if (columnNumber !== undefined) {\n location += `:${columnNumber}`;\n }\n\n if (format === \"vscode\") {\n // VSCode can open files via URL protocol\n // Assumes fileName is absolute or can be resolved\n return `vscode://file${fileName.startsWith(\"/\") ? \"\" : \"/\"}${location}`;\n }\n\n return location;\n}\n\n/**\n * Gets source locations for multiple elements at once\n *\n * @param elements - Array of DOM elements\n * @returns Array of source location results\n */\nexport function getSourceLocations(elements: HTMLElement[]): SourceLocationResult[] {\n return elements.map((element) => getSourceLocation(element));\n}\n\n/**\n * Finds the nearest React component ancestor that has source info\n *\n * Useful when clicking on a deeply nested element (like text or an icon)\n * and wanting to find the component that contains it.\n *\n * @param element - Starting DOM element\n * @param maxAncestors - Maximum DOM ancestors to check (default: 10)\n * @returns Source location result\n */\nexport function findNearestComponentSource(\n element: HTMLElement,\n maxAncestors = 10\n): SourceLocationResult {\n let current: HTMLElement | null = element;\n let depth = 0;\n\n while (current && depth < maxAncestors) {\n const result = getSourceLocation(current);\n\n // Return first successful result\n if (result.found) {\n return result;\n }\n\n // If we found fiber but no source, keep looking up DOM\n // (might find a parent component with source info)\n current = current.parentElement;\n depth++;\n }\n\n // Return result for original element (will explain why not found)\n return getSourceLocation(element);\n}\n\n/**\n * Gets all component sources in the ancestor chain\n *\n * Useful for understanding the component hierarchy.\n *\n * @param element - Starting DOM element\n * @returns Array of unique source locations from element up to root\n */\nexport function getComponentHierarchy(element: HTMLElement): SourceLocation[] {\n const fiber = getFiberFromElement(element);\n if (!fiber) {\n return [];\n }\n\n const sources: SourceLocation[] = [];\n const seenFiles = new Set<string>();\n\n let current: ReactFiber | null | undefined = fiber;\n let depth = 0;\n const maxDepth = 100;\n\n while (current && depth < maxDepth) {\n if (current._debugSource) {\n const key = `${current._debugSource.fileName}:${current._debugSource.lineNumber}`;\n\n // Avoid duplicates\n if (!seenFiles.has(key)) {\n seenFiles.add(key);\n sources.push({\n fileName: current._debugSource.fileName,\n lineNumber: current._debugSource.lineNumber,\n columnNumber: current._debugSource.columnNumber,\n componentName: getComponentName(current) || undefined,\n });\n }\n }\n\n current = current.return;\n depth++;\n }\n\n return sources;\n}\n\n/**\n * Checks if source location detection is likely to work in the current environment\n *\n * @returns Object describing support status\n */\nexport function checkSourceLocationSupport(): {\n supported: boolean;\n reason: string;\n suggestions: string[];\n} {\n const reactInfo = detectReactApp();\n\n if (!reactInfo.isReact) {\n return {\n supported: false,\n reason: \"No React application detected on this page\",\n suggestions: [\n \"Ensure you're on a page built with React\",\n \"The page may use a different framework (Vue, Angular, etc.)\",\n ],\n };\n }\n\n if (reactInfo.isProduction) {\n return {\n supported: false,\n reason: \"Production build detected - source info is stripped\",\n suggestions: [\n \"Run the application in development mode\",\n \"Set NODE_ENV=development\",\n \"Ensure your bundler includes source info in development\",\n ],\n };\n }\n\n // Check for DevTools\n const hasDevTools = typeof window !== \"undefined\" &&\n !!(window as unknown as Record<string, unknown>).__REACT_DEVTOOLS_GLOBAL_HOOK__;\n\n if (!hasDevTools) {\n return {\n supported: true,\n reason: \"Development mode detected, but React DevTools not installed\",\n suggestions: [\n \"Install React DevTools browser extension for best results\",\n \"Source detection may still work without it\",\n ],\n };\n }\n\n return {\n supported: true,\n reason: `React ${reactInfo.version || \"unknown\"} development mode detected`,\n suggestions: [],\n };\n}\n","\nconst css = \".styles-module__toolbar___wNsdK svg[fill=none],\\n.styles-module__markersLayer___-25j1 svg[fill=none],\\n.styles-module__fixedMarkersLayer___ffyX6 svg[fill=none] {\\n fill: none !important;\\n}\\n.styles-module__toolbar___wNsdK svg[fill=none] :not([fill]),\\n.styles-module__markersLayer___-25j1 svg[fill=none] :not([fill]),\\n.styles-module__fixedMarkersLayer___ffyX6 svg[fill=none] :not([fill]) {\\n fill: none !important;\\n}\\n\\n.styles-module__toolbar___wNsdK :where(button, input, select, textarea, label) {\\n background: unset;\\n border: unset;\\n border-radius: unset;\\n padding: unset;\\n margin: unset;\\n color: unset;\\n font: unset;\\n letter-spacing: unset;\\n text-transform: unset;\\n text-decoration: unset;\\n box-shadow: unset;\\n outline: unset;\\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__toolbarHide___y8kaT {\\n from {\\n opacity: 1;\\n transform: scale(1);\\n }\\n to {\\n opacity: 0;\\n transform: scale(0.8);\\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__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__disableTransitions___EopxO :is(*, *::before, *::after) {\\n transition: none !important;\\n}\\n\\n.styles-module__toolbar___wNsdK {\\n position: fixed;\\n width: 297px;\\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:where(.styles-module__toolbar___wNsdK) {\\n bottom: 1.25rem;\\n right: 1.25rem;\\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__hiding___1td44 {\\n animation: styles-module__toolbarHide___y8kaT 0.4s cubic-bezier(0.4, 0, 1, 1) forwards;\\n pointer-events: none;\\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: 257px;\\n}\\n.styles-module__toolbarContainer___dIhma.styles-module__expanded___ofKPx.styles-module__serverConnected___Gfbou {\\n width: 297px;\\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-color: var(--agentation-color-accent);\\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: var(--agentation-color-blue);\\n background-color: color-mix(in srgb, var(--agentation-color-blue) 25%, transparent);\\n}\\n.styles-module__controlButton___8Q0jc[data-error=true] {\\n color: var(--agentation-color-red);\\n background-color: color-mix(in srgb, var(--agentation-color-red) 25%, transparent);\\n}\\n.styles-module__controlButton___8Q0jc[data-danger]:hover:not(:disabled):not([data-active=true]):not([data-failed=true]) {\\n background-color: color-mix(in srgb, var(--agentation-color-red) 25%, transparent);\\n color: var(--agentation-color-red);\\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: var(--agentation-color-green);\\n background: transparent;\\n cursor: default;\\n}\\n.styles-module__controlButton___8Q0jc[data-failed=true] {\\n color: var(--agentation-color-red);\\n background-color: color-mix(in srgb, var(--agentation-color-red) 25%, transparent);\\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-color: var(--agentation-color-accent);\\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[data-agentation-theme=light] .styles-module__buttonBadge___NeFWb {\\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 color-mix(in srgb, var(--agentation-color-green) 50%, transparent);\\n }\\n 50% {\\n box-shadow: 0 0 0 5px color-mix(in srgb, var(--agentation-color-green) 0%, transparent);\\n }\\n}\\n@keyframes styles-module__mcpIndicatorPulseConnecting___cCYte {\\n 0%, 100% {\\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--agentation-color-yellow) 50%, transparent);\\n }\\n 50% {\\n box-shadow: 0 0 0 5px color-mix(in srgb, var(--agentation-color-yellow) 0%, transparent);\\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-color 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-color: var(--agentation-color-green);\\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-color: var(--agentation-color-yellow);\\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-color 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-color: var(--agentation-color-green);\\n animation: styles-module__connectionPulse___-Zycw 2.5s ease-in-out infinite;\\n}\\n\\n.styles-module__connectionIndicatorDisconnected___kmpaZ {\\n background-color: var(--agentation-color-red);\\n animation: none;\\n}\\n\\n.styles-module__connectionIndicatorConnecting___QmSLH {\\n background-color: var(--agentation-color-yellow);\\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__tooltipsInSession___-0lHH .styles-module__buttonWrapper___rBcdv:hover .styles-module__buttonTooltip___Burd9 {\\n transition-delay: 0s;\\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 color-mix(in srgb, var(--agentation-color-accent) 50%, transparent);\\n border-radius: 4px;\\n background-color: color-mix(in srgb, var(--agentation-color-accent) 4%, transparent);\\n pointer-events: none !important;\\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 color-mix(in srgb, var(--agentation-color-green) 60%, transparent);\\n border-radius: 4px;\\n pointer-events: none !important;\\n background-color: color-mix(in srgb, var(--agentation-color-green) 5%, transparent);\\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 color-mix(in srgb, var(--agentation-color-blue) 60%, transparent);\\n border-radius: 4px;\\n pointer-events: none !important;\\n background-color: color-mix(in srgb, var(--agentation-color-blue) 5%, transparent);\\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: var(--agentation-color-blue);\\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-color: var(--agentation-color-blue);\\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-color: var(--agentation-color-green);\\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-color: var(--agentation-color-green);\\n}\\n.styles-module__marker___6sQrs.styles-module__hovered___ZgXIy {\\n background-color: var(--agentation-color-red);\\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\\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-color 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__themeToggle___2rUjA {\\n transition: background-color 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[data-agentation-theme=dark] .styles-module__settingsPanel___OxX3Y {\\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[data-agentation-theme=dark] .styles-module__settingsPanel___OxX3Y .styles-module__settingsLabel___8UjfX {\\n color: rgba(255, 255, 255, 0.6);\\n}\\n[data-agentation-theme=dark] .styles-module__settingsPanel___OxX3Y .styles-module__settingsOption___UNa12 {\\n color: rgba(255, 255, 255, 0.85);\\n}\\n[data-agentation-theme=dark] .styles-module__settingsPanel___OxX3Y .styles-module__settingsOption___UNa12:hover {\\n background: rgba(255, 255, 255, 0.1);\\n}\\n[data-agentation-theme=dark] .styles-module__settingsPanel___OxX3Y .styles-module__settingsOption___UNa12.styles-module__selected___OwRqP {\\n background: rgba(255, 255, 255, 0.15);\\n color: #fff;\\n}\\n[data-agentation-theme=dark] .styles-module__settingsPanel___OxX3Y .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\\n.styles-module__settingsPage___6YfHH {\\n min-width: 100%;\\n flex-shrink: 0;\\n transition: transform 0.2s ease, opacity 0.2s ease;\\n transition-delay: 0s;\\n opacity: 1;\\n}\\n\\n.styles-module__settingsPage___6YfHH.styles-module__slideLeft___Ps01J {\\n transform: translateX(-24px);\\n opacity: 0;\\n pointer-events: none;\\n}\\n\\n.styles-module__automationsPage___uvCq6 {\\n position: absolute;\\n top: 0;\\n left: 24px;\\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.2s ease, opacity 0.2s ease;\\n opacity: 0;\\n pointer-events: none;\\n}\\n\\n.styles-module__automationsPage___uvCq6.styles-module__slideIn___4-qXe {\\n transform: translateX(-24px);\\n opacity: 1;\\n pointer-events: auto;\\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[data-agentation-theme=light] .styles-module__settingsNavLink___wCzJt {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n[data-agentation-theme=light] .styles-module__settingsNavLink___wCzJt: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[data-agentation-theme=light] .styles-module__settingsNavLink___wCzJt svg {\\n color: rgba(0, 0, 0, 0.25);\\n}\\n[data-agentation-theme=light] .styles-module__settingsNavLink___wCzJt: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-color: var(--agentation-color-green);\\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-color: var(--agentation-color-yellow);\\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 {\\n border-bottom-color: rgba(255, 255, 255, 0.07);\\n}\\n.styles-module__settingsBackButton___bIe2j:hover svg {\\n opacity: 1;\\n}\\n[data-agentation-theme=light] .styles-module__settingsBackButton___bIe2j {\\n color: rgba(0, 0, 0, 0.85);\\n border-bottom-color: rgba(0, 0, 0, 0.08);\\n}\\n[data-agentation-theme=light] .styles-module__settingsBackButton___bIe2j:hover {\\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[data-agentation-theme=light] .styles-module__automationHeader___InP0r {\\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[data-agentation-theme=light] .styles-module__automationDescription___NKlmo {\\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[data-agentation-theme=light] .styles-module__learnMoreLink___8xv-x {\\n color: rgba(0, 0, 0, 0.6);\\n text-decoration-color: rgba(0, 0, 0, 0.2);\\n}\\n[data-agentation-theme=light] .styles-module__learnMoreLink___8xv-x: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 color: color(display-p3 0.4 0.72 1);\\n}\\n[data-agentation-theme=light] .styles-module__autoSendLabel___icDc2 {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n[data-agentation-theme=light] .styles-module__autoSendLabel___icDc2.styles-module__active___-zoN6 {\\n color: var(--agentation-color-blue);\\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-color 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[data-agentation-theme=light] .styles-module__webhookUrlInput___2375C {\\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[data-agentation-theme=light] .styles-module__webhookUrlInput___2375C::placeholder {\\n color: rgba(0, 0, 0, 0.3);\\n}\\n[data-agentation-theme=light] .styles-module__webhookUrlInput___2375C: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: var(--agentation-color-accent);\\n transition: color 0.2s ease;\\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[data-agentation-theme=light] .styles-module__cycleButton___FMKfw {\\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[data-agentation-theme=light] .styles-module__settingsRowDisabled___EgS0V .styles-module__settingsLabel___8UjfX {\\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[data-agentation-theme=light] .styles-module__cycleDot___nPgLY {\\n background: rgba(0, 0, 0, 0.2);\\n}\\n[data-agentation-theme=light] .styles-module__cycleDot___nPgLY.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[data-agentation-theme=light] .styles-module__settingsLabel___8UjfX {\\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: color-mix(in srgb, var(--agentation-color-blue) 15%, transparent);\\n color: var(--agentation-color-blue);\\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 background-color: var(--swatch);\\n cursor: pointer;\\n transition: transform 0.2s cubic-bezier(0.25, 1, 0.5, 1);\\n}\\n@supports (color: color(display-p3 0 0 0)) {\\n .styles-module__colorOption___IodiY {\\n background-color: var(--swatch-p3);\\n }\\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__colorOptionRing___U2xpo.styles-module__selected___OwRqP {\\n border-color: var(--swatch);\\n}\\n@supports (color: color(display-p3 0 0 0)) {\\n .styles-module__colorOptionRing___U2xpo.styles-module__selected___OwRqP {\\n border-color: var(--swatch-p3);\\n }\\n}\\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-color 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[data-agentation-theme=light] .styles-module__customCheckbox___U39ax {\\n border: 1px solid rgba(0, 0, 0, 0.15);\\n background: #fff;\\n}\\n[data-agentation-theme=light] .styles-module__customCheckbox___U39ax.styles-module__checked___mnZLo {\\n border-color: #1a1a1a;\\n background: #1a1a1a;\\n}\\n[data-agentation-theme=light] .styles-module__customCheckbox___U39ax.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[data-agentation-theme=light] .styles-module__toggleLabel___Xm8Aa {\\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: background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1);\\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-color: var(--agentation-color-blue);\\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[data-agentation-theme=light] .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}\\n\\n@keyframes styles-module__mcpPulse___uNggr {\\n 0% {\\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--agentation-color-green) 50%, transparent);\\n }\\n 70% {\\n box-shadow: 0 0 0 6px color-mix(in srgb, var(--agentation-color-green) 0%, transparent);\\n }\\n 100% {\\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--agentation-color-green) 0%, transparent);\\n }\\n}\\n@keyframes styles-module__mcpPulseError___fov9B {\\n 0% {\\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--agentation-color-red) 50%, transparent);\\n }\\n 70% {\\n box-shadow: 0 0 0 6px color-mix(in srgb, var(--agentation-color-red) 0%, transparent);\\n }\\n 100% {\\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--agentation-color-red) 0%, transparent);\\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-color: var(--agentation-color-yellow);\\n animation: styles-module__mcpPulse___uNggr 1.5s infinite;\\n}\\n.styles-module__mcpStatusDot___ibgkc.styles-module__connected___7c28g {\\n background-color: var(--agentation-color-green);\\n animation: styles-module__mcpPulse___uNggr 2.5s ease-in-out infinite;\\n}\\n.styles-module__mcpStatusDot___ibgkc.styles-module__disconnected___cHPxR {\\n background-color: var(--agentation-color-red);\\n animation: styles-module__mcpPulseError___fov9B 2s infinite;\\n}\\n\\n.styles-module__dragSelection___kZLq2 {\\n position: fixed;\\n top: 0;\\n left: 0;\\n border: 2px solid color-mix(in srgb, var(--agentation-color-green) 60%, transparent);\\n border-radius: 4px;\\n background-color: color-mix(in srgb, var(--agentation-color-green) 8%, transparent);\\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-color: var(--agentation-color-green);\\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 color-mix(in srgb, var(--agentation-color-green) 50%, transparent);\\n border-radius: 4px;\\n background: color-mix(in srgb, var(--agentation-color-green) 6%, transparent);\\n pointer-events: none;\\n will-change: transform, width, height;\\n contain: layout style;\\n}\\n\\n[data-agentation-theme=light] .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[data-agentation-theme=light] .styles-module__toolbarContainer___dIhma.styles-module__collapsed___Rydsn:hover {\\n background: #f5f5f5;\\n}\\n[data-agentation-theme=light] .styles-module__controlButton___8Q0jc {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n[data-agentation-theme=light] .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[data-agentation-theme=light] .styles-module__controlButton___8Q0jc[data-active=true] {\\n color: var(--agentation-color-blue);\\n background: color-mix(in srgb, var(--agentation-color-blue) 15%, transparent);\\n}\\n[data-agentation-theme=light] .styles-module__controlButton___8Q0jc[data-error=true] {\\n color: var(--agentation-color-red);\\n background: color-mix(in srgb, var(--agentation-color-red) 15%, transparent);\\n}\\n[data-agentation-theme=light] .styles-module__controlButton___8Q0jc[data-danger]:hover:not(:disabled):not([data-active=true]):not([data-failed=true]) {\\n color: var(--agentation-color-red);\\n background: color-mix(in srgb, var(--agentation-color-red) 15%, transparent);\\n}\\n[data-agentation-theme=light] .styles-module__controlButton___8Q0jc[data-auto-sync=true] {\\n color: var(--agentation-color-green);\\n background: transparent;\\n}\\n[data-agentation-theme=light] .styles-module__controlButton___8Q0jc[data-failed=true] {\\n color: var(--agentation-color-red);\\n background: color-mix(in srgb, var(--agentation-color-red) 15%, transparent);\\n}\\n[data-agentation-theme=light] .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[data-agentation-theme=light] .styles-module__buttonTooltip___Burd9::after {\\n background: #fff;\\n}\\n[data-agentation-theme=light] .styles-module__divider___c--s1 {\\n background: rgba(0, 0, 0, 0.1);\\n}\\n[data-agentation-theme=light] .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[data-agentation-theme=light] .styles-module__markerTooltip___aLJID .styles-module__markerQuote___FHmrz {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n[data-agentation-theme=light] .styles-module__markerTooltip___aLJID .styles-module__markerNote___QkrrS {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n[data-agentation-theme=light] .styles-module__markerTooltip___aLJID .styles-module__markerHint___2iF-6 {\\n color: rgba(0, 0, 0, 0.35);\\n}\\n[data-agentation-theme=light] .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[data-agentation-theme=light] .styles-module__settingsPanel___OxX3Y::before {\\n background: linear-gradient(to right, #fff 0%, transparent 100%);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___OxX3Y::after {\\n background: linear-gradient(to left, #fff 0%, transparent 100%);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___OxX3Y .styles-module__settingsHeader___pwDY9 {\\n border-bottom-color: rgba(0, 0, 0, 0.08);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___OxX3Y .styles-module__settingsBrand___0gJeM {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___OxX3Y .styles-module__settingsVersion___TUcFq {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___OxX3Y .styles-module__settingsSection___m-YM2 {\\n border-top-color: rgba(0, 0, 0, 0.08);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___OxX3Y .styles-module__settingsLabel___8UjfX {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___OxX3Y .styles-module__cycleButton___FMKfw {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___OxX3Y .styles-module__cycleDot___nPgLY {\\n background: rgba(0, 0, 0, 0.2);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___OxX3Y .styles-module__cycleDot___nPgLY.styles-module__active___-zoN6 {\\n background: rgba(0, 0, 0, 0.7);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___OxX3Y .styles-module__dropdownButton___16NPz {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___OxX3Y .styles-module__dropdownButton___16NPz:hover {\\n background: rgba(0, 0, 0, 0.05);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___OxX3Y .styles-module__toggleLabel___Xm8Aa {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___OxX3Y .styles-module__customCheckbox___U39ax {\\n border: 1px solid rgba(0, 0, 0, 0.15);\\n background: #fff;\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___OxX3Y .styles-module__customCheckbox___U39ax.styles-module__checked___mnZLo {\\n border-color: #1a1a1a;\\n background: #1a1a1a;\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___OxX3Y .styles-module__customCheckbox___U39ax.styles-module__checked___mnZLo svg {\\n color: #fff;\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___OxX3Y .styles-module__sliderLabel___U8sPr {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___OxX3Y .styles-module__sliderLabel___U8sPr:hover {\\n color: rgba(0, 0, 0, 0.7);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___OxX3Y .styles-module__sliderLabel___U8sPr.styles-module__active___-zoN6 {\\n color: rgba(0, 0, 0, 0.9);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___OxX3Y .styles-module__slider___GLdxp {\\n background: rgba(0, 0, 0, 0.1);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___OxX3Y .styles-module__slider___GLdxp::-webkit-slider-thumb {\\n background: #1a1a1a;\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___OxX3Y .styles-module__slider___GLdxp::-moz-range-thumb {\\n background: #1a1a1a;\\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[data-agentation-theme=light] .styles-module__themeToggle___2rUjA {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n[data-agentation-theme=light] .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\",\"markersLayer\":\"styles-module__markersLayer___-25j1\",\"fixedMarkersLayer\":\"styles-module__fixedMarkersLayer___ffyX6\",\"disableTransitions\":\"styles-module__disableTransitions___EopxO\",\"toolbarContainer\":\"styles-module__toolbarContainer___dIhma\",\"dragging\":\"styles-module__dragging___xrolZ\",\"entrance\":\"styles-module__entrance___sgHd8\",\"toolbarEnter\":\"styles-module__toolbarEnter___u8RRu\",\"hiding\":\"styles-module__hiding___1td44\",\"toolbarHide\":\"styles-module__toolbarHide___y8kaT\",\"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\",\"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\",\"tooltipsInSession\":\"styles-module__tooltipsInSession___-0lHH\",\"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\",\"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\",\"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\",\"themeToggle\":\"styles-module__themeToggle___2rUjA\",\"settingsOption\":\"styles-module__settingsOption___UNa12\",\"selected\":\"styles-module__selected___OwRqP\",\"settingsPanelContainer\":\"styles-module__settingsPanelContainer___Xksv8\",\"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\",\"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","import { useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { originalSetTimeout } from \"../../utils/freeze-animations\";\n\nexport const Tooltip = ({\n content,\n children,\n ...props\n}: {\n content: string;\n children: React.ReactNode;\n} & React.HTMLAttributes<HTMLSpanElement>) => {\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 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);\n };\n\n const handleMouseLeave = () => {\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 {...props}\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 ? 1 : 0,\n transition: \"opacity 0.15s ease\",\n }}\n >\n {content}\n </div>,\n document.body\n )}\n </>\n );\n};\n","\nconst css = \".styles-module__tooltip___mcXL2 {\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n cursor: help;\\n}\\n\\n.styles-module__tooltipIcon___Nq2nD {\\n transform: translateY(0.5px);\\n color: #fff;\\n opacity: 0.2;\\n transition: opacity 0.15s ease;\\n will-change: transform;\\n}\\n.styles-module__tooltip___mcXL2:hover .styles-module__tooltipIcon___Nq2nD {\\n opacity: 0.5;\\n}\\n[data-agentation-theme=light] .styles-module__tooltipIcon___Nq2nD {\\n color: #000;\\n}\";\nconst classNames = {\"tooltip\":\"styles-module__tooltip___mcXL2\",\"tooltipIcon\":\"styles-module__tooltipIcon___Nq2nD\"};\n\n// SSR-safe style injection\nif (typeof document !== 'undefined') {\n let style = document.getElementById('feedback-tool-styles-help-tooltip-styles');\n if (!style) {\n style = document.createElement('style');\n style.id = 'feedback-tool-styles-help-tooltip-styles';\n style.textContent = css;\n document.head.appendChild(style);\n }\n}\n\nexport default classNames;\n","import { Tooltip } from \"../tooltip\";\nimport { IconHelp } from \"../icons\";\nimport styles from \"./styles.module.scss\";\n\ninterface HelpTooltipProps {\n content: string;\n}\n\nexport const HelpTooltip = ({ content }: HelpTooltipProps) => {\n return (\n <Tooltip className={styles.tooltip} content={content}>\n <IconHelp className={styles.tooltipIcon} />\n </Tooltip>\n );\n};\n"],"mappings":"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","names":["useState","useCallback","useEffect","useRef","createPortal","css","classNames","jsx","jsxs","AnnotationPopupCSS","result","getFiberFromElement","css","classNames","styles_module_default","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","css","classNames","styles_module_default","jsx","styles_module_default","Fragment","jsx","jsxs","useState","useRef","useEffect","styles_module_default","annotations","useCallback","elementUnder","rect","name","path","reactComponents","left","top","deleteAnnotation","updateAnnotation","DRAG_THRESHOLD","createPortal","jsxs","jsx","bb","Fragment"]}
|
|
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/icon-transitions.module.scss","../src/components/icons.tsx","../src/utils/freeze-animations.ts","../src/components/tooltip/index.tsx","../src/components/help-tooltip/styles.module.scss","../src/components/help-tooltip/index.tsx","../src/components/design-mode/index.tsx","../src/components/design-mode/types.ts","../src/components/design-mode/skeletons.tsx","../src/components/design-mode/styles.module.scss","../src/components/design-mode/palette.tsx","../src/components/design-mode/rearrange.tsx","../src/utils/element-identification.ts","../src/components/design-mode/section-detection.ts","../src/components/design-mode/spatial.ts","../src/components/design-mode/output.ts","../src/utils/storage.ts","../src/utils/sync.ts","../src/utils/react-detection.ts","../src/utils/source-location.ts","../src/components/page-toolbar-css/styles.module.scss","../src/utils/generate-output.ts","../src/components/page-toolbar-css/annotation-marker/styles.module.scss","../src/components/page-toolbar-css/annotation-marker/index.tsx","../src/components/switch/styles.module.scss","../src/components/switch/index.tsx","../src/components/page-toolbar-css/settings-panel/checkbox-field/index.tsx","../src/components/checkbox/styles.module.scss","../src/components/checkbox/index.tsx","../src/components/page-toolbar-css/settings-panel/checkbox-field/styles.module.scss","../src/components/page-toolbar-css/settings-panel/styles.module.scss","../src/components/page-toolbar-css/settings-panel/index.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useCallback, useEffect, useLayoutEffect, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport {\n AnnotationPopupCSS,\n AnnotationPopupCSSHandle,\n} from \"../annotation-popup-css\";\nimport {\n IconListSparkle,\n IconGear,\n IconCopyAnimated,\n IconSendArrow,\n IconTrashAlt,\n IconEyeAnimated,\n IconPausePlayAnimated,\n IconXmarkLarge,\n IconEdit,\n IconChevronLeft,\n IconChevronRight,\n IconLayout,\n} from \"../icons\";\nimport { HelpTooltip } from \"../help-tooltip\";\nimport { DesignMode } from \"../design-mode\";\nimport { DesignPalette } from \"../design-mode/palette\";\nimport designStyles from \"../design-mode/styles.module.scss\";\nimport { RearrangeOverlay } from \"../design-mode/rearrange\";\nimport { generateDesignOutput, generateRearrangeOutput } from \"../design-mode/output\";\nimport { detectPageSections } from \"../design-mode/section-detection\";\nimport { DEFAULT_SIZES, type DesignPlacement, type ComponentType as DesignComponentType, type RearrangeState } from \"../design-mode/types\";\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 loadDesignPlacements,\n saveDesignPlacements,\n clearDesignPlacements,\n loadRearrangeState,\n saveRearrangeState,\n clearRearrangeState,\n loadWireframeState,\n saveWireframeState,\n clearWireframeState,\n loadToolbarHidden,\n saveToolbarHidden,\n} from \"../../utils/storage\";\nimport {\n createSession,\n getSession,\n syncAnnotation,\n updateAnnotation as updateAnnotationOnServer,\n deleteAnnotation as deleteAnnotationFromServer,\n} from \"../../utils/sync\";\nimport { getReactComponentName } from \"../../utils/react-detection\";\nimport {\n getSourceLocation,\n findNearestComponentSource,\n formatSourceLocation,\n} from \"../../utils/source-location\";\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\";\nimport { generateOutput } from \"../../utils/generate-output\";\nimport { AnnotationMarker, ExitingMarker, PendingMarker } from \"./annotation-marker\";\nimport { SettingsPanel } from \"./settings-panel\";\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\nexport type OutputDetailLevel = \"compact\" | \"standard\" | \"detailed\" | \"forensic\";\n// ReactComponentMode is now derived from outputDetail when reactEnabled is true\nexport type ReactComponentMode = \"smart\" | \"filtered\" | \"all\" | \"off\";\ntype MarkerClickBehavior = \"edit\" | \"delete\";\n\nexport type ToolbarSettings = {\n outputDetail: OutputDetailLevel;\n autoClearAfterCopy: boolean;\n annotationColorId: string;\n blockInteractions: boolean;\n reactEnabled: boolean;\n markerClickBehavior: MarkerClickBehavior;\n webhookUrl: string;\n webhooksEnabled: boolean;\n};\n\nconst DEFAULT_SETTINGS: ToolbarSettings = {\n outputDetail: \"standard\",\n autoClearAfterCopy: false,\n annotationColorId: \"blue\",\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\nexport const COLOR_OPTIONS = [\n { id: \"indigo\", label: \"Indigo\", srgb: \"#6155F5\", p3: \"color(display-p3 0.38 0.33 0.96)\" },\n { id: \"blue\", label: \"Blue\", srgb: \"#0088FF\", p3: \"color(display-p3 0.00 0.53 1.00)\" },\n { id: \"cyan\", label: \"Cyan\", srgb: \"#00C3D0\", p3: \"color(display-p3 0.00 0.76 0.82)\" },\n { id: \"green\", label: \"Green\", srgb: \"#34C759\", p3: \"color(display-p3 0.20 0.78 0.35)\" },\n { id: \"yellow\", label: \"Yellow\", srgb: \"#FFCC00\", p3: \"color(display-p3 1.00 0.80 0.00)\" },\n { id: \"orange\", label: \"Orange\", srgb: \"#FF8D28\", p3: \"color(display-p3 1.00 0.55 0.16)\" },\n { id: \"red\", label: \"Red\", srgb: \"#FF383C\", p3: \"color(display-p3 1.00 0.22 0.24)\" },\n];\n\nconst injectAgentationColorTokens = () => {\n if (typeof document === \"undefined\") return;\n if (document.getElementById(\"agentation-color-tokens\")) return;\n const style = document.createElement(\"style\");\n style.id = \"agentation-color-tokens\";\n style.textContent = [\n ...COLOR_OPTIONS.map(c => `\n [data-agentation-accent=\"${c.id}\"] {\n --agentation-color-accent: ${c.srgb};\n }\n\n @supports (color: color(display-p3 0 0 0)) {\n [data-agentation-accent=\"${c.id}\"] {\n --agentation-color-accent: ${c.p3};\n }\n }\n `),\n `:root {\n ${COLOR_OPTIONS.map(c => `--agentation-color-${c.id}: ${c.srgb};`).join(\"\\n\")}\n }`,\n `@supports (color: color(display-p3 0 0 0)) {\n :root {\n ${COLOR_OPTIONS.map(c => `--agentation-color-${c.id}: ${c.p3};`).join(\"\\n\")}\n }\n }`,\n ].join(\"\");\n document.head.appendChild(style);\n}\n\ninjectAgentationColorTokens();\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 isRenderableAnnotation(annotation: Annotation): boolean {\n return annotation.status !== \"resolved\" && annotation.status !== \"dismissed\";\n}\n\nfunction detectSourceFile(element: Element): string | undefined {\n const result = getSourceLocation(element as HTMLElement);\n const loc = result.found ? result : findNearestComponentSource(element as HTMLElement);\n if (loc.found && loc.source) {\n return formatSourceLocation(loc.source, \"path\");\n }\n return undefined;\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 /** Custom class name applied to the toolbar container. Use to adjust positioning or z-index. */\n className?: 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 className: userClassName,\n}: PageFeedbackToolbarCSSProps = {}) {\n const [isActive, setIsActive] = useState(false);\n const [annotations, setAnnotations] = useState<Annotation[]>([]);\n const [showMarkers, setShowMarkers] = useState(true);\n const [isToolbarHidden, setIsToolbarHidden] = useState(() => loadToolbarHidden());\n const [isToolbarHiding, setIsToolbarHiding] = useState(false);\n\n // Stop native events from bubbling past document.body when they originate\n // inside the toolbar portal. Without this, clicks on the toolbar propagate to\n // document-level listeners, triggering \"click outside\" handlers that close\n // modals, dropdowns, and drawers. We attach to body (not a wrapper div) so\n // React's synthetic event delegation (which also listens on body/root) still\n // works — we only block propagation from body → document/window.\n const portalWrapperRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const stop = (e: Event) => {\n const wrapper = portalWrapperRef.current;\n if (wrapper && wrapper.contains(e.target as Node)) {\n e.stopPropagation();\n }\n };\n const events = [\"mousedown\", \"click\", \"pointerdown\"] as const;\n events.forEach((evt) => document.body.addEventListener(evt, stop));\n return () => {\n events.forEach((evt) => document.body.removeEventListener(evt, stop));\n };\n }, []);\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 sourceFile?: 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 } | 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 [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 [tooltipsHidden, setTooltipsHidden] = useState(false);\n\n // Layout mode state\n const [isDesignMode, setIsDesignMode] = useState(false);\n const [designOverlayExiting, setDesignOverlayExiting] = useState(false);\n const [designPlacements, setDesignPlacements] = useState<DesignPlacement[]>([]);\n const [activeDesignComponent, setActiveDesignComponent] = useState<DesignComponentType | null>(null);\n const designPlacementsLoaded = useRef(false);\n // Sub-mode state removed — unified mode renders both overlays simultaneously\n const [blankCanvas, setBlankCanvas] = useState(false);\n const [canvasReady, setCanvasReady] = useState(false); // delays .visible by one frame on mount\n const [canvasOpacity, setCanvasOpacity] = useState(1);\n const [canvasPurpose, setCanvasPurpose] = useState<import(\"../design-mode/types\").CanvasPurpose>(\"new-page\");\n const [wireframePurpose, setWireframePurpose] = useState(\"\");\n const [designInteracting, setDesignInteracting] = useState(false);\n const [rearrangeState, setRearrangeState] = useState<RearrangeState | null>(null);\n const rearrangeLoaded = useRef(false);\n // Stash explore/wireframe state for full isolation between modes\n const exploreStashRef = useRef<{ rearrange: RearrangeState | null; placements: DesignPlacement[] }>({ rearrange: null, placements: [] });\n const wireframeStashRef = useRef<{ rearrange: RearrangeState | null; placements: DesignPlacement[] }>({ rearrange: null, placements: [] });\n // Cross-overlay deselect signals — bump one to deselect the other\n const [designDeselectSignal, setDesignDeselectSignal] = useState(0);\n const [rearrangeDeselectSignal, setRearrangeDeselectSignal] = useState(0);\n const [designClearSignal, setDesignClearSignal] = useState(0);\n const [rearrangeClearSignal, setRearrangeClearSignal] = useState(0);\n // Track selections for cross-overlay drag coordination\n const designSelectedIdsRef = useRef<Set<string>>(new Set());\n const rearrangeSelectedIdsRef = useRef<Set<string>>(new Set());\n // Track start positions for cross-drag (set when drag starts)\n const crossDragStartRef = useRef<Map<string, { x: number; y: number }> | null>(null);\n const designExitTimer = useRef<ReturnType<typeof setTimeout>>();\n\n // Delay blank canvas .visible by one frame when becoming visible so CSS transition fires\n const canvasShouldBeVisible = isDesignMode && isActive && !designOverlayExiting && blankCanvas;\n useEffect(() => {\n if (canvasShouldBeVisible) {\n setCanvasReady(false);\n const raf = requestAnimationFrame(() => {\n setCanvasReady(true);\n });\n return () => cancelAnimationFrame(raf);\n } else {\n setCanvasReady(false);\n }\n }, [canvasShouldBeVisible]);\n\n // Shadow annotation tracking (design → server sync)\n const placementAnnotationMap = useRef(new Map<string, string>()); // placementId → server annotationId\n const rearrangeAnnotationMap = useRef(new Map<string, string>()); // sectionId → server annotationId\n const rearrangeDebounceTimer = useRef<ReturnType<typeof setTimeout>>();\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 const [tooltipSessionActive, setTooltipSessionActive] = useState(false);\n const tooltipSessionTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\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 const handleControlsMouseEnter = () => {\n if (!tooltipSessionActive) {\n tooltipSessionTimerRef.current = setTimeout(\n () => setTooltipSessionActive(true),\n 850,\n );\n }\n };\n\n const handleControlsMouseLeave = () => {\n if (tooltipSessionTimerRef.current) {\n clearTimeout(tooltipSessionTimerRef.current);\n tooltipSessionTimerRef.current = null;\n }\n setTooltipSessionActive(false);\n showTooltipsAgain();\n };\n\n useEffect(() => {\n return () => {\n if (tooltipSessionTimerRef.current)\n clearTimeout(tooltipSessionTimerRef.current);\n };\n }, []);\n\nconst [settings, setSettings] = useState<ToolbarSettings>(() => {\n try {\n const saved = JSON.parse(localStorage.getItem(\"feedback-toolbar-settings\") ?? \"\");\n return {\n ...DEFAULT_SETTINGS,\n ...saved,\n annotationColorId: COLOR_OPTIONS.find(c => c.id === saved.annotationColorId)\n ? saved.annotationColorId\n : DEFAULT_SETTINGS.annotationColorId,\n };\n } catch {\n return DEFAULT_SETTINGS;\n }\n});\n const [isDarkMode, setIsDarkMode] = useState(true);\n const [showEntranceAnimation, setShowEntranceAnimation] = useState(false);\n\n const toggleTheme = () => {\n portalWrapperRef.current?.classList.add(styles.disableTransitions);\n setIsDarkMode((previous) => !previous);\n requestAnimationFrame(() => {\n portalWrapperRef.current?.classList.remove(styles.disableTransitions);\n });\n }\n\n // Check if running in development mode - React detection only works in development mode\n const isDevMode = process.env.NODE_ENV === \"development\";\n\n // Effective React mode - derived from outputDetail when enabled\n const effectiveReactMode: ReactComponentMode =\n isDevMode && 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 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 // Unified marker visibility - depends on toolbar active, showMarkers toggle, and not blank canvas\n // This single effect handles all marker show/hide animations\n const shouldShowMarkers = isActive && showMarkers && !isDesignMode;\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 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 }, 350);\n return () => clearTimeout(timer);\n } else if (markersVisible) {\n // Hide markers - start exit animation, then unmount\n setMarkersExiting(true);\n const timer = originalSetTimeout(() => {\n setMarkersVisible(false);\n setMarkersExiting(false);\n }, 250);\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.filter(isRenderableAnnotation));\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 // 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.filter(isRenderableAnnotation));\n saveAnnotationsWithSyncMarker(\n pathname,\n allAnnotations.filter(isRenderableAnnotation),\n session.id,\n );\n } else {\n setAnnotations(\n session.annotations.filter(isRenderableAnnotation),\n );\n saveAnnotationsWithSyncMarker(\n pathname,\n session.annotations.filter(isRenderableAnnotation),\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 const renderableSyncedAnnotations = syncedAnnotations.filter(\n isRenderableAnnotation,\n );\n\n // Save with sync marker\n saveAnnotationsWithSyncMarker(\n pagePath,\n renderableSyncedAnnotations,\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 [...renderableSyncedAnnotations, ...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 updates (e.g. resolved by agent)\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 handler = (e: MessageEvent) => {\n try {\n const event = JSON.parse(e.data);\n if (removedStatuses.includes(event.payload?.status)) {\n const id = event.payload.id as string;\n const kind = event.payload.kind as string | undefined;\n\n if (kind === \"placement\") {\n // Reverse-lookup: find which placementId maps to this annotation ID\n for (const [placementId, annotationId] of placementAnnotationMap.current) {\n if (annotationId === id) {\n placementAnnotationMap.current.delete(placementId);\n setDesignPlacements((prev) => prev.filter((p) => p.id !== placementId));\n break;\n }\n }\n } else if (kind === \"rearrange\") {\n // Reverse-lookup: find which sectionId maps to this annotation ID\n for (const [sectionId, annotationId] of rearrangeAnnotationMap.current) {\n if (annotationId === id) {\n rearrangeAnnotationMap.current.delete(sectionId);\n setRearrangeState((prev) => {\n if (!prev) return null;\n const remaining = prev.sections.filter((s) => s.id !== sectionId);\n if (remaining.length === 0) return null;\n return { ...prev, sections: remaining };\n });\n break;\n }\n }\n } else {\n // Feedback annotation — 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 }\n }\n } catch {\n // Ignore parse errors\n }\n };\n\n eventSource.addEventListener(\"annotation.updated\", handler);\n\n return () => {\n eventSource.removeEventListener(\"annotation.updated\", handler);\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 const renderableAnnotations = allAnnotations.filter(\n isRenderableAnnotation,\n );\n setAnnotations(renderableAnnotations);\n saveAnnotationsWithSyncMarker(\n pathname,\n renderableAnnotations,\n sessionId!,\n );\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 const hideToolbarTemporarily = useCallback(() => {\n if (isToolbarHiding) return;\n setIsToolbarHiding(true);\n setShowSettings(false);\n setIsActive(false);\n originalSetTimeout(() => {\n saveToolbarHidden(true);\n setIsToolbarHidden(true);\n setIsToolbarHiding(false);\n }, 400);\n }, [isToolbarHiding]);\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 // Load design placements from localStorage on mount\n useEffect(() => {\n if (mounted && !designPlacementsLoaded.current) {\n designPlacementsLoaded.current = true;\n const stored = loadDesignPlacements<DesignPlacement>(pathname);\n if (stored.length > 0) setDesignPlacements(stored);\n }\n }, [mounted, pathname]);\n\n // Save design placements to localStorage (only explore-mode data — wireframe has its own key)\n useEffect(() => {\n if (mounted && designPlacementsLoaded.current && !blankCanvas) {\n if (designPlacements.length > 0) {\n saveDesignPlacements(pathname, designPlacements);\n } else {\n clearDesignPlacements(pathname);\n }\n }\n }, [designPlacements, pathname, mounted, blankCanvas]);\n\n // Load rearrange state from localStorage on mount\n useEffect(() => {\n if (mounted && !rearrangeLoaded.current) {\n rearrangeLoaded.current = true;\n const stored = loadRearrangeState<RearrangeState>(pathname);\n if (stored) {\n // Migrate old state that lacks currentRect\n const migrated = {\n ...stored,\n sections: stored.sections.map(s => ({\n ...s,\n currentRect: s.currentRect ?? { ...s.originalRect },\n })),\n };\n setRearrangeState(migrated);\n }\n }\n }, [mounted, pathname]);\n\n // Save rearrange state to localStorage (only explore-mode data — wireframe has its own key)\n useEffect(() => {\n if (mounted && rearrangeLoaded.current && !blankCanvas) {\n if (rearrangeState) {\n saveRearrangeState(pathname, rearrangeState);\n } else {\n clearRearrangeState(pathname);\n }\n }\n }, [rearrangeState, pathname, mounted, blankCanvas]);\n\n // Load wireframe stash from localStorage on mount\n const wireframeLoaded = useRef(false);\n useEffect(() => {\n if (mounted && !wireframeLoaded.current) {\n wireframeLoaded.current = true;\n const stored = loadWireframeState<RearrangeState>(pathname);\n if (stored) {\n wireframeStashRef.current = {\n rearrange: stored.rearrange,\n placements: (stored.placements || []) as DesignPlacement[],\n };\n if (stored.purpose) setWireframePurpose(stored.purpose);\n }\n }\n }, [mounted, pathname]);\n\n // Save wireframe stash to localStorage when it changes\n useEffect(() => {\n if (!mounted || !wireframeLoaded.current) return;\n const stash = wireframeStashRef.current;\n // Save current wireframe state: either from stash (if in explore mode) or live (if in wireframe mode)\n if (blankCanvas) {\n // Currently in wireframe — save live state\n const hasContent = (rearrangeState?.sections?.length ?? 0) > 0 || designPlacements.length > 0 || wireframePurpose;\n if (hasContent) {\n saveWireframeState(pathname, { rearrange: rearrangeState, placements: designPlacements, purpose: wireframePurpose });\n } else {\n clearWireframeState(pathname);\n }\n } else {\n // In explore mode — save stash\n const hasContent = (stash.rearrange?.sections?.length ?? 0) > 0 || stash.placements.length > 0 || wireframePurpose;\n if (hasContent) {\n saveWireframeState(pathname, { rearrange: stash.rearrange, placements: stash.placements, purpose: wireframePurpose });\n } else {\n clearWireframeState(pathname);\n }\n }\n }, [rearrangeState, designPlacements, wireframePurpose, blankCanvas, pathname, mounted]);\n\n // Initialize empty rearrange state when entering explore mode\n // Sections are captured on click, not auto-detected\n useEffect(() => {\n if (isDesignMode && !rearrangeState) {\n setRearrangeState({\n sections: [],\n originalOrder: [],\n detectedAt: Date.now(),\n });\n }\n }, [isDesignMode, rearrangeState]);\n\n // Sync placement shadow annotations to server\n useEffect(() => {\n if (!endpoint || !currentSessionId) return;\n\n const currentMap = placementAnnotationMap.current;\n const currentIds = new Set(designPlacements.map((p) => p.id));\n\n // Create annotations for new placements\n for (const p of designPlacements) {\n if (currentMap.has(p.id)) continue;\n\n // Mark as in-flight to avoid duplicates\n currentMap.set(p.id, \"\");\n\n const pageUrl =\n typeof window !== \"undefined\"\n ? window.location.pathname + window.location.search + window.location.hash\n : pathname;\n\n syncAnnotation(endpoint, currentSessionId, {\n id: p.id,\n x: (p.x / window.innerWidth) * 100,\n y: p.y,\n comment: `Place ${p.type} at (${Math.round(p.x)}, ${Math.round(p.y)}), ${p.width}×${p.height}px${p.text ? ` — \"${p.text}\"` : \"\"}`,\n element: `[design:${p.type}]`,\n elementPath: \"[placement]\",\n timestamp: p.timestamp,\n url: pageUrl,\n intent: \"change\",\n severity: \"important\",\n kind: \"placement\",\n placement: {\n componentType: p.type,\n width: p.width,\n height: p.height,\n scrollY: p.scrollY,\n text: p.text,\n },\n } as Annotation)\n .then((serverAnnotation) => {\n // Update map with real server ID\n if (currentMap.has(p.id)) {\n currentMap.set(p.id, serverAnnotation.id);\n }\n })\n .catch((err) => {\n console.warn(\"[Agentation] Failed to sync placement annotation:\", err);\n currentMap.delete(p.id);\n });\n }\n\n // Delete annotations for removed placements\n for (const [placementId, annotationId] of currentMap) {\n if (!currentIds.has(placementId)) {\n currentMap.delete(placementId);\n if (annotationId) {\n deleteAnnotationFromServer(endpoint, annotationId).catch(() => {});\n }\n }\n }\n }, [designPlacements, endpoint, currentSessionId, pathname]);\n\n // Sync rearrange shadow annotations to server (debounced)\n useEffect(() => {\n if (!endpoint || !currentSessionId) return;\n\n if (rearrangeDebounceTimer.current) {\n clearTimeout(rearrangeDebounceTimer.current);\n }\n\n rearrangeDebounceTimer.current = originalSetTimeout(() => {\n const currentMap = rearrangeAnnotationMap.current;\n\n if (!rearrangeState || rearrangeState.sections.length === 0) {\n // Rearrange cleared — delete all shadow annotations\n for (const [, annotationId] of currentMap) {\n if (annotationId) {\n deleteAnnotationFromServer(endpoint, annotationId).catch(() => {});\n }\n }\n currentMap.clear();\n return;\n }\n\n const currentIds = new Set(rearrangeState.sections.map((s) => s.id));\n const pageUrl =\n typeof window !== \"undefined\"\n ? window.location.pathname + window.location.search + window.location.hash\n : pathname;\n\n // Check which sections have actually changed from original\n for (const section of rearrangeState.sections) {\n const orig = section.originalRect;\n const curr = section.currentRect;\n const hasMoved =\n Math.abs(orig.x - curr.x) > 1 ||\n Math.abs(orig.y - curr.y) > 1 ||\n Math.abs(orig.width - curr.width) > 1 ||\n Math.abs(orig.height - curr.height) > 1;\n\n if (!hasMoved) {\n // Section returned to original — delete annotation if exists\n const existingId = currentMap.get(section.id);\n if (existingId) {\n currentMap.delete(section.id);\n deleteAnnotationFromServer(endpoint, existingId).catch(() => {});\n }\n continue;\n }\n\n const existingAnnotationId = currentMap.get(section.id);\n if (existingAnnotationId) {\n // Update existing\n updateAnnotationOnServer(endpoint, existingAnnotationId, {\n comment: `Move ${section.label} section (${section.tagName}) — from (${Math.round(orig.x)},${Math.round(orig.y)}) ${Math.round(orig.width)}×${Math.round(orig.height)} to (${Math.round(curr.x)},${Math.round(curr.y)}) ${Math.round(curr.width)}×${Math.round(curr.height)}`,\n }).catch((err) => {\n console.warn(\"[Agentation] Failed to update rearrange annotation:\", err);\n });\n } else {\n // Create new\n currentMap.set(section.id, \"\");\n\n syncAnnotation(endpoint, currentSessionId, {\n id: section.id,\n x: (curr.x / window.innerWidth) * 100,\n y: curr.y,\n comment: `Move ${section.label} section (${section.tagName}) — from (${Math.round(orig.x)},${Math.round(orig.y)}) ${Math.round(orig.width)}×${Math.round(orig.height)} to (${Math.round(curr.x)},${Math.round(curr.y)}) ${Math.round(curr.width)}×${Math.round(curr.height)}`,\n element: section.selector,\n elementPath: \"[rearrange]\",\n timestamp: Date.now(),\n url: pageUrl,\n intent: \"change\",\n severity: \"important\",\n kind: \"rearrange\",\n rearrange: {\n selector: section.selector,\n label: section.label,\n tagName: section.tagName,\n originalRect: orig,\n currentRect: curr,\n },\n } as Annotation)\n .then((serverAnnotation) => {\n if (currentMap.has(section.id)) {\n currentMap.set(section.id, serverAnnotation.id);\n }\n })\n .catch((err) => {\n console.warn(\"[Agentation] Failed to sync rearrange annotation:\", err);\n currentMap.delete(section.id);\n });\n }\n }\n\n // Delete annotations for sections no longer in state\n for (const [sectionId, annotationId] of currentMap) {\n if (!currentIds.has(sectionId)) {\n currentMap.delete(sectionId);\n if (annotationId) {\n deleteAnnotationFromServer(endpoint, annotationId).catch(() => {});\n }\n }\n }\n }, 300);\n\n return () => {\n if (rearrangeDebounceTimer.current) {\n clearTimeout(rearrangeDebounceTimer.current);\n }\n };\n }, [rearrangeState, endpoint, currentSessionId, pathname]);\n\n // Visually move/resize original DOM elements to match rearrange state.\n // Lives here (not in RearrangeOverlay) so transforms persist across sub-mode\n // switches (rearrange ↔ add) and animate back when layout mode exits.\n type MovedEntry = {\n el: HTMLElement;\n origStyles: { transform: string; transformOrigin: string; opacity: string; position: string; zIndex: string; display: string };\n ancestors: { el: HTMLElement; overflow: string }[];\n };\n const rearrangeMovedEls = useRef<Map<string, MovedEntry>>(new Map());\n useLayoutEffect(() => {\n const sections = rearrangeState?.sections ?? [];\n const active = new Set<string>();\n\n if ((isDesignMode || designOverlayExiting) && isActive) {\n for (const s of sections) {\n active.add(s.id);\n try {\n const el = document.querySelector(s.selector) as HTMLElement | null;\n if (!el) continue;\n\n // Elevate on first encounter — prevents clipping during drag/resize\n if (!rearrangeMovedEls.current.has(s.id)) {\n const origStyles = {\n transform: el.style.transform,\n transformOrigin: el.style.transformOrigin,\n opacity: el.style.opacity,\n position: el.style.position,\n zIndex: el.style.zIndex,\n display: el.style.display,\n };\n\n // Find clipping ancestors\n const ancestors: { el: HTMLElement; overflow: string }[] = [];\n let parent = el.parentElement;\n while (parent && parent !== document.body) {\n const cs = getComputedStyle(parent);\n if (cs.overflow !== \"visible\" || cs.overflowX !== \"visible\" || cs.overflowY !== \"visible\") {\n ancestors.push({ el: parent, overflow: parent.style.overflow });\n parent.style.overflow = \"visible\";\n }\n parent = parent.parentElement;\n }\n\n // Inline elements don't support transforms — promote to inline-block\n const computed = getComputedStyle(el);\n if (computed.display === \"inline\") {\n el.style.display = \"inline-block\";\n }\n\n rearrangeMovedEls.current.set(s.id, { el, origStyles, ancestors });\n el.style.transformOrigin = \"top left\";\n el.style.zIndex = \"9999\";\n }\n\n // Ghost mode: don't transform page elements. Outlines show ghosts instead.\n } catch { /* invalid selector */ }\n }\n }\n\n // Restore elements that are no longer captured or layout mode exited\n for (const [id, entry] of rearrangeMovedEls.current) {\n if (!active.has(id)) {\n const { el, origStyles, ancestors } = entry;\n el.style.transition = \"transform 0.4s cubic-bezier(0.22, 1, 0.36, 1), opacity 0.4s cubic-bezier(0.22, 1, 0.36, 1)\";\n el.style.transform = origStyles.transform;\n el.style.transformOrigin = origStyles.transformOrigin;\n el.style.opacity = origStyles.opacity;\n el.style.position = origStyles.position;\n el.style.zIndex = origStyles.zIndex;\n rearrangeMovedEls.current.delete(id);\n originalSetTimeout(() => {\n el.style.transition = \"\";\n el.style.display = origStyles.display;\n for (const a of ancestors) {\n a.el.style.overflow = a.overflow;\n }\n }, 450);\n }\n }\n }, [rearrangeState, isDesignMode, designOverlayExiting, isActive]);\n\n // Clean up all moved elements on unmount — animate back to original positions\n useEffect(() => {\n return () => {\n for (const [, entry] of rearrangeMovedEls.current) {\n const { el, origStyles, ancestors } = entry;\n el.style.transition = \"transform 0.4s cubic-bezier(0.22, 1, 0.36, 1), opacity 0.4s cubic-bezier(0.22, 1, 0.36, 1)\";\n el.style.transform = origStyles.transform;\n el.style.transformOrigin = origStyles.transformOrigin;\n el.style.opacity = origStyles.opacity;\n el.style.position = origStyles.position;\n el.style.zIndex = origStyles.zIndex;\n // Clean up transition + display + ancestors after animation completes\n setTimeout(() => {\n el.style.transition = \"\";\n el.style.display = origStyles.display;\n for (const a of ancestors) {\n a.el.style.overflow = a.overflow;\n }\n }, 450);\n }\n rearrangeMovedEls.current.clear();\n };\n }, []);\n\n // Close layout mode — palette + overlays exit concurrently\n const closeDesignMode = useCallback(() => {\n setDesignOverlayExiting(true);\n setIsDesignMode(false);\n setActiveDesignComponent(null);\n // Don't reset subMode here — it causes a crossfade during exit animation.\n // It stays on the last-used tab for next time.\n clearTimeout(designExitTimer.current);\n designExitTimer.current = setTimeout(() => {\n setDesignOverlayExiting(false);\n }, 300);\n }, []);\n\n // Deactivate toolbar — if in layout mode, animate out overlays independently\n const deactivate = useCallback(() => {\n if (isDesignMode) {\n setDesignOverlayExiting(true);\n setIsDesignMode(false);\n setActiveDesignComponent(null);\n clearTimeout(designExitTimer.current);\n designExitTimer.current = setTimeout(() => {\n setDesignOverlayExiting(false);\n }, 300);\n }\n setIsActive(false);\n }, [isDesignMode]);\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 sourceFile: detectSourceFile(firstEl),\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 sourceFile: detectSourceFile(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 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 textElementsSelector = [\n \"p\", \"span\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\",\n \"li\", \"td\", \"th\", \"label\", \"blockquote\", \"figcaption\",\n \"caption\", \"legend\", \"dt\", \"dd\", \"pre\", \"code\",\n \"em\", \"strong\", \"b\", \"i\", \"u\", \"s\", \"a\",\n \"time\", \"address\", \"cite\", \"q\", \"abbr\", \"dfn\",\n \"mark\", \"small\", \"sub\", \"sup\", \"[contenteditable]\"\n ].join(\", \");\n\n const notAgentationSelector = `:not([data-agentation-root]):not([data-agentation-root] *)`;\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 ${notAgentationSelector} {\n cursor: crosshair !important;\n }\n\n body :is(${textElementsSelector})${notAgentationSelector} {\n cursor: text !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\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 || isDesignMode) 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 return;\n }\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, isDesignMode, 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 || isDesignMode) 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 // 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 sourceFile: detectSourceFile(elementUnder),\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 isDesignMode,\n pendingAnnotation,\n editingAnnotation,\n settings.blockInteractions,\n effectiveReactMode,\n pendingMultiSelectElements,\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 || isDesignMode) 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 e.preventDefault(); // Prevent text selection during drag area annotation\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, isDesignMode]);\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 e.preventDefault(); // Prevent text selection during drag\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 sourceFile: detectSourceFile(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 // 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 sourceFile: pendingAnnotation.sourceFile,\n elementBoundingBoxes: pendingAnnotation.elementBoundingBoxes,\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 setPendingExiting(true);\n originalSetTimeout(() => {\n setPendingAnnotation(null);\n setPendingExiting(false);\n }, 150); // Match exit animation duration\n }, []);\n\n // Delete annotation with exit animation\n const deleteAnnotation = useCallback(\n (id: string) => {\n const deletedIndex = annotations.findIndex((a) => a.id === id);\n const deletedAnnotation = annotations[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 // Wait for exit animation then remove\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 setDeletingMarkerId(null);\n\n // Trigger renumber animation for markers after deleted one\n if (deletedIndex < annotations.length - 1) {\n setRenumberFrom(deletedIndex);\n originalSetTimeout(() => setRenumberFrom(null), 200);\n }\n }, 150);\n },\n [annotations, 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 setHoveredMarkerId(null);\n setHoveredTargetElement(null);\n setHoveredTargetElements([]);\n return;\n }\n\n setHoveredMarkerId(annotation.id);\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 [],\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 const hasDesign = designPlacements.length > 0 || !!rearrangeState;\n if (count === 0 && drawStrokes.length === 0 && !hasDesign) 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 // Delete shadow annotations for placements\n for (const [, annotationId] of placementAnnotationMap.current) {\n if (annotationId) {\n deleteAnnotationFromServer(endpoint, annotationId).catch(() => {});\n }\n }\n placementAnnotationMap.current.clear();\n\n // Delete shadow annotations for rearrange\n for (const [, annotationId] of rearrangeAnnotationMap.current) {\n if (annotationId) {\n deleteAnnotationFromServer(endpoint, annotationId).catch(() => {});\n }\n }\n rearrangeAnnotationMap.current.clear();\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 // Animate out design placements and rearrange sections, then clear\n if (designPlacements.length > 0 || rearrangeState) {\n setDesignClearSignal(n => n + 1);\n setRearrangeClearSignal(n => n + 1);\n originalSetTimeout(() => {\n setDesignPlacements([]);\n setRearrangeState(null);\n }, 200);\n }\n if (blankCanvas) setBlankCanvas(false);\n if (wireframePurpose) setWireframePurpose(\"\");\n wireframeStashRef.current = { rearrange: null, placements: [] };\n clearWireframeState(pathname);\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, designPlacements, rearrangeState, blankCanvas, wireframePurpose, 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 const wireframeOnly = isDesignMode && blankCanvas;\n\n let output: string;\n if (wireframeOnly) {\n // In wireframe mode, skip annotations and draw strokes — only include layout\n if (designPlacements.length === 0 && !rearrangeState && !wireframePurpose) return;\n output = \"\";\n } else {\n output = generateOutput(\n annotations,\n displayUrl,\n settings.outputDetail,\n );\n if (!output && drawStrokes.length === 0 && designPlacements.length === 0 && !rearrangeState) return;\n if (!output) output = `## Page Feedback: ${displayUrl}\\n`;\n }\n\n // Describe draw strokes as text by detecting elements underneath\n if (!wireframeOnly && 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 // Append design layout section if there are placements (or purpose in wireframe mode)\n if (designPlacements.length > 0 || (wireframeOnly && wireframePurpose)) {\n output += \"\\n\" + generateDesignOutput(designPlacements, {\n width: window.innerWidth,\n height: window.innerHeight,\n }, { blankCanvas, wireframePurpose: wireframePurpose || undefined }, settings.outputDetail);\n }\n\n // Append rearrange section if sections were reordered\n if (rearrangeState) {\n const rearrangeOutput = generateRearrangeOutput(rearrangeState, settings.outputDetail, {\n width: window.innerWidth,\n height: window.innerHeight,\n });\n if (rearrangeOutput) {\n output += \"\\n\" + rearrangeOutput;\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 designPlacements,\n rearrangeState,\n blankCanvas,\n isDesignMode,\n canvasPurpose,\n wireframePurpose,\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 let output = generateOutput(\n annotations,\n displayUrl,\n settings.outputDetail,\n );\n if (!output && designPlacements.length === 0 && !rearrangeState) return;\n if (!output) output = `## Page Feedback: ${displayUrl}\\n`;\n\n // Append design layout section if there are placements\n if (designPlacements.length > 0) {\n output += \"\\n\" + generateDesignOutput(designPlacements, {\n width: window.innerWidth,\n height: window.innerHeight,\n }, { blankCanvas, wireframePurpose: wireframePurpose || undefined }, settings.outputDetail);\n }\n\n // Append rearrange section if sections were reordered\n if (rearrangeState) {\n const rearrangeOutput = generateRearrangeOutput(rearrangeState, settings.outputDetail, {\n width: window.innerWidth,\n height: window.innerHeight,\n });\n if (rearrangeOutput) {\n output += \"\\n\" + rearrangeOutput;\n }\n }\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 designPlacements,\n rearrangeState,\n blankCanvas,\n canvasPurpose,\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 ? 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 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('[data-agentation-settings-panel]')\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 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 layout mode first if active\n if (isDesignMode) {\n if (activeDesignComponent) {\n setActiveDesignComponent(null);\n } else {\n closeDesignMode();\n }\n return;\n }\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 if (isActive) {\n deactivate();\n } else {\n setIsActive(true);\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 // \"L\" to toggle layout mode\n if (e.key === \"l\" || e.key === \"L\") {\n e.preventDefault();\n hideTooltipsUntilMouseLeave();\n if (isDrawMode) setIsDrawMode(false);\n if (showSettings) setShowSettings(false);\n if (pendingAnnotation) cancelAnnotation();\n if (isDesignMode) {\n closeDesignMode();\n } else {\n setIsDesignMode(true);\n }\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 }\n }\n\n // \"C\" to copy output\n if (e.key === \"c\" || e.key === \"C\") {\n if (annotations.length > 0 || designPlacements.length > 0 || rearrangeState) {\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 || designPlacements.length > 0 || rearrangeState) {\n e.preventDefault();\n hideTooltipsUntilMouseLeave();\n clearAll();\n if (designPlacements.length > 0) setDesignPlacements([]);\n if (rearrangeState) setRearrangeState(null);\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 isDesignMode,\n activeDesignComponent,\n designPlacements,\n rearrangeState,\n pendingAnnotation,\n annotations.length,\n settings.webhookUrl,\n webhookUrl,\n sendState,\n sendToWebhook,\n toggleFreeze,\n copyOutput,\n clearAll,\n pendingMultiSelectElements,\n ]);\n\n if (!mounted) return null;\n if (isToolbarHidden) 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) && a.kind !== \"placement\" && a.kind !== \"rearrange\",\n );\n const hasVisibleAnnotations = visibleAnnotations.length > 0;\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 <div ref={portalWrapperRef} style={{ display: \"contents\" }} data-agentation-theme={isDarkMode ? \"dark\" : \"light\"} data-agentation-accent={settings.annotationColorId} data-agentation-root=\"\">\n {/* Toolbar */}\n <div\n className={`${styles.toolbar}${userClassName ? ` ${userClassName}` : \"\"}`}\n data-feedback-toolbar\n data-agentation-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} ${isActive ? styles.expanded : styles.collapsed} ${showEntranceAnimation ? styles.entrance : \"\"} ${isToolbarHiding ? styles.hiding : \"\"} ${!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 >\n {/* Toggle content - visible when collapsed */}\n <div\n className={`${styles.toggleContent} ${!isActive ? styles.visible : styles.hidden}`}\n >\n <IconListSparkle size={24} />\n {hasVisibleAnnotations && (\n <span\n className={`${styles.badge} ${isActive ? styles.fadeOut : \"\"} ${showEntranceAnimation ? styles.entrance : \"\"}`}\n >\n {visibleAnnotations.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 : \"\"} ${tooltipSessionActive ? styles.tooltipsInSession : \"\"}`}\n onMouseEnter={handleControlsMouseEnter}\n onMouseLeave={handleControlsMouseLeave}\n >\n <div\n className={`${styles.buttonWrapper} ${\n toolbarPosition && toolbarPosition.x < 120\n ? styles.buttonWrapperAlignLeft\n : \"\"\n }`}\n >\n <button\n className={styles.controlButton}\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 {/* Draw mode disabled for now\n <div className={styles.buttonWrapper}>\n <button\n className={`${styles.controlButton} ${!isDarkMode ? styles.light : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n hideTooltipsUntilMouseLeave();\n if (isDesignMode) closeDesignMode();\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\n <div className={styles.buttonWrapper}>\n <button\n className={`${styles.controlButton} ${!isDarkMode ? styles.light : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n hideTooltipsUntilMouseLeave();\n if (isDrawMode) setIsDrawMode(false);\n if (showSettings) setShowSettings(false);\n if (pendingAnnotation) cancelAnnotation();\n if (isDesignMode) {\n closeDesignMode();\n } else {\n setIsDesignMode(true);\n }\n }}\n data-active={isDesignMode}\n style={isDesignMode && blankCanvas ? { color: '#f97316', background: 'rgba(249, 115, 22, 0.25)' } : undefined}\n >\n <IconLayout size={21} />\n </button>\n <span className={styles.buttonTooltip}>\n {isDesignMode ? \"Exit layout mode\" : \"Layout mode\"}\n <span className={styles.shortcut}>L</span>\n </span>\n </div>\n\n <div className={styles.buttonWrapper}>\n <button\n className={styles.controlButton}\n onClick={(e) => {\n e.stopPropagation();\n hideTooltipsUntilMouseLeave();\n setShowMarkers(!showMarkers);\n }}\n disabled={!hasAnnotations || isDesignMode}\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} ${copied ? styles.statusShowing : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n hideTooltipsUntilMouseLeave();\n copyOutput();\n }}\n disabled={isDesignMode && blankCanvas\n ? designPlacements.length === 0 && !(rearrangeState?.sections?.length)\n : !hasAnnotations && drawStrokes.length === 0 && designPlacements.length === 0 && !(rearrangeState?.sections?.length)}\n data-active={copied}\n >\n <IconCopyAnimated size={24} copied={copied} tint={isDesignMode && blankCanvas && (designPlacements.length > 0 || !!(rearrangeState?.sections?.length)) ? \"#f97316\" : undefined} />\n </button>\n <span className={styles.buttonTooltip}>\n {isDesignMode && blankCanvas ? \"Copy layout\" : \"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} ${isActive && !settings.webhooksEnabled && (isValidUrl(settings.webhookUrl) || isValidUrl(webhookUrl || \"\")) ? styles.sendButtonVisible : \"\"}`}\n >\n <button\n className={`${styles.controlButton} ${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}\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}\n onClick={(e) => {\n e.stopPropagation();\n hideTooltipsUntilMouseLeave();\n clearAll();\n }}\n disabled={!hasAnnotations && drawStrokes.length === 0 && designPlacements.length === 0 && !(rearrangeState?.sections?.length)}\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}\n onClick={(e) => {\n e.stopPropagation();\n hideTooltipsUntilMouseLeave();\n if (isDesignMode) closeDesignMode();\n setShowSettings(!showSettings);\n }}\n >\n <IconGear size={24} />\n </button>\n {endpoint && connectionStatus !== \"disconnected\" && (\n <span\n className={`${styles.mcpIndicator} ${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}\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}\n onClick={(e) => {\n e.stopPropagation();\n hideTooltipsUntilMouseLeave();\n deactivate();\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 {/* Layout Mode Palette */}\n <DesignPalette\n visible={isDesignMode && isActive}\n activeType={activeDesignComponent}\n onSelect={(type) => {\n setActiveDesignComponent(activeDesignComponent === type ? null : type);\n }}\n isDarkMode={isDarkMode}\n sectionCount={rearrangeState?.sections.length ?? 0}\n onDetectSections={() => {\n const sections = detectPageSections();\n const existing = rearrangeState?.sections ?? [];\n const existingSelectors = new Set(existing.map(s => s.selector));\n const newSections = sections.filter(s => !existingSelectors.has(s.selector));\n const merged = [...existing, ...newSections];\n const mergedOrder = [...(rearrangeState?.originalOrder ?? []), ...newSections.map(s => s.id)];\n setRearrangeState({\n sections: merged,\n originalOrder: mergedOrder,\n detectedAt: Date.now(),\n });\n }}\n placementCount={designPlacements.length}\n onClearPlacements={() => {\n // Animate placements and rearrange sections out, then clear\n setDesignClearSignal(n => n + 1);\n setRearrangeClearSignal(n => n + 1);\n originalSetTimeout(() => {\n setRearrangeState({\n sections: [],\n originalOrder: [],\n detectedAt: Date.now(),\n });\n }, 200);\n }}\n blankCanvas={blankCanvas}\n onBlankCanvasChange={(on) => {\n const emptyRearrange = { sections: [], originalOrder: [], detectedAt: Date.now() };\n if (on) {\n // Entering wireframe: stash all explore state, restore wireframe state\n exploreStashRef.current = { rearrange: rearrangeState, placements: designPlacements };\n setRearrangeState(wireframeStashRef.current.rearrange || emptyRearrange);\n setDesignPlacements(wireframeStashRef.current.placements);\n setActiveDesignComponent(null);\n } else {\n // Leaving wireframe: stash all wireframe state, restore explore state\n wireframeStashRef.current = { rearrange: rearrangeState, placements: designPlacements };\n setRearrangeState(exploreStashRef.current.rearrange || emptyRearrange);\n setDesignPlacements(exploreStashRef.current.placements);\n }\n setBlankCanvas(on);\n }}\n wireframePurpose={wireframePurpose}\n onWireframePurposeChange={setWireframePurpose}\n Tooltip={HelpTooltip}\n onDragStart={(type, e) => {\n e.preventDefault();\n const def = DEFAULT_SIZES[type];\n let preview: HTMLDivElement | null = null;\n let didDrag = false;\n const startX = e.clientX;\n const startY = e.clientY;\n\n // Find toolbar bottom for distance-based scaling\n const toolbar = (e.target as HTMLElement).closest(\"[data-feedback-toolbar]\");\n const toolbarTop = toolbar?.getBoundingClientRect().top ?? window.innerHeight;\n\n const onMove = (ev: MouseEvent) => {\n const dx = ev.clientX - startX;\n const dy = ev.clientY - startY;\n\n if (!didDrag && (Math.abs(dx) > 4 || Math.abs(dy) > 4)) {\n didDrag = true;\n preview = document.createElement(\"div\");\n preview.className = `${designStyles.dragPreview}${blankCanvas ? ` ${designStyles.dragPreviewWireframe}` : \"\"}`;\n document.body.appendChild(preview);\n }\n\n if (!preview) return;\n\n // Scale up as cursor moves away from toolbar\n const dist = Math.max(0, toolbarTop - ev.clientY);\n const progress = Math.min(1, dist / 180);\n const eased = 1 - Math.pow(1 - progress, 2); // ease-out\n\n const minW = 28;\n const minH = 20;\n const maxW = Math.min(140, def.width * 0.18);\n const maxH = Math.min(90, def.height * 0.18);\n const w = minW + (maxW - minW) * eased;\n const h = minH + (maxH - minH) * eased;\n\n preview.style.width = `${w}px`;\n preview.style.height = `${h}px`;\n preview.style.left = `${ev.clientX - w / 2}px`;\n preview.style.top = `${ev.clientY - h / 2}px`;\n preview.style.opacity = `${0.5 + 0.5 * eased}`;\n preview.textContent = eased > 0.25 ? type : \"\";\n };\n\n const onUp = (ev: MouseEvent) => {\n window.removeEventListener(\"mousemove\", onMove);\n window.removeEventListener(\"mouseup\", onUp);\n if (preview) document.body.removeChild(preview);\n\n if (didDrag) {\n const w = def.width;\n const h = def.height;\n const scrollY = window.scrollY;\n const x = Math.max(0, ev.clientX - w / 2);\n const y = Math.max(0, ev.clientY + scrollY - h / 2);\n const placement: DesignPlacement = {\n id: `dp-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`,\n type,\n x,\n y,\n width: w,\n height: h,\n scrollY,\n timestamp: Date.now(),\n };\n setDesignPlacements((prev) => [...prev, placement]);\n setActiveDesignComponent(null);\n // Deselect any previously selected placements\n designSelectedIdsRef.current = new Set();\n setDesignDeselectSignal(n => n + 1);\n }\n };\n\n window.addEventListener(\"mousemove\", onMove);\n window.addEventListener(\"mouseup\", onUp);\n }}\n />\n\n <SettingsPanel\n settings={settings}\n onSettingsChange={(patch) => setSettings((s) => ({ ...s, ...patch }))}\n isDarkMode={isDarkMode}\n onToggleTheme={toggleTheme}\n isDevMode={isDevMode}\n connectionStatus={connectionStatus}\n endpoint={endpoint}\n isVisible={showSettingsVisible}\n toolbarNearBottom={!!toolbarPosition && toolbarPosition.y < 230}\n settingsPage={settingsPage}\n onSettingsPageChange={setSettingsPage}\n onHideToolbar={hideToolbarTemporarily}\n />\n </div>\n </div>\n\n {/* Blank canvas backdrop — stays mounted so opacity transition works on open/close */}\n {(isDesignMode || designOverlayExiting) && (\n <div\n className={`${designStyles.blankCanvas} ${canvasReady ? designStyles.visible : \"\"} ${designInteracting ? designStyles.gridActive : \"\"}`}\n style={{ '--canvas-opacity': canvasOpacity } as React.CSSProperties}\n data-feedback-toolbar\n />\n )}\n\n {/* Wireframe hint — bottom-left notice */}\n {isDesignMode && blankCanvas && canvasReady && (\n <div className={designStyles.wireframeNotice} data-feedback-toolbar>\n <div className={designStyles.wireframeOpacityRow}>\n <span className={designStyles.wireframeOpacityLabel}>Toggle Opacity</span>\n <input\n type=\"range\"\n className={designStyles.wireframeOpacitySlider}\n min={0}\n max={1}\n step={0.01}\n value={canvasOpacity}\n onChange={(e) => setCanvasOpacity(Number(e.target.value))}\n />\n </div>\n <div className={designStyles.wireframeNoticeTitleRow}>\n <span className={designStyles.wireframeNoticeTitle}>Wireframe Mode</span>\n <span className={designStyles.wireframeNoticeDivider} />\n <button\n className={designStyles.wireframeStartOver}\n onClick={() => {\n setDesignClearSignal(n => n + 1);\n setRearrangeState({ sections: [], originalOrder: [], detectedAt: Date.now() });\n wireframeStashRef.current = { rearrange: null, placements: [] };\n setWireframePurpose(\"\");\n clearWireframeState(pathname);\n }}\n >\n Start Over\n </button>\n </div>\n Drag components onto the canvas.<br />Copied output will only include the wireframed layout.\n </div>\n )}\n\n {/* Layout mode overlay — passthrough when no component selected */}\n {(isDesignMode || designOverlayExiting) && (\n <DesignMode\n placements={designPlacements}\n onChange={setDesignPlacements}\n activeComponent={designOverlayExiting ? null : activeDesignComponent}\n onActiveComponentChange={setActiveDesignComponent}\n isDarkMode={isDarkMode}\n exiting={designOverlayExiting}\n onInteractionChange={setDesignInteracting}\n passthrough={!activeDesignComponent}\n extraSnapRects={rearrangeState?.sections.map(s => s.currentRect)}\n deselectSignal={designDeselectSignal}\n clearSignal={designClearSignal}\n wireframe={blankCanvas}\n onSelectionChange={(ids, isShift) => {\n designSelectedIdsRef.current = ids;\n if (!isShift) {\n rearrangeSelectedIdsRef.current = new Set();\n setRearrangeDeselectSignal(n => n + 1);\n }\n }}\n onDragMove={(dx, dy) => {\n // Move selected rearrange sections by same delta\n const selIds = rearrangeSelectedIdsRef.current;\n if (!selIds.size || !rearrangeState) return;\n // Cache start positions on first move\n if (!crossDragStartRef.current) {\n crossDragStartRef.current = new Map();\n for (const s of rearrangeState.sections) {\n if (selIds.has(s.id)) {\n crossDragStartRef.current.set(s.id, { x: s.currentRect.x, y: s.currentRect.y });\n }\n }\n }\n for (const s of rearrangeState.sections) {\n if (!selIds.has(s.id)) continue;\n const start = crossDragStartRef.current.get(s.id);\n if (!start) continue;\n const outlineEl = document.querySelector(`[data-rearrange-section=\"${s.id}\"]`) as HTMLElement | null;\n if (outlineEl) outlineEl.style.transform = `translate(${dx}px, ${dy}px)`;\n }\n }}\n onDragEnd={(dx, dy, committed) => {\n const selIds = rearrangeSelectedIdsRef.current;\n const starts = crossDragStartRef.current;\n crossDragStartRef.current = null;\n if (!selIds.size || !rearrangeState || !starts) return;\n // Clear outline transforms\n for (const id of selIds) {\n const el = document.querySelector(`[data-rearrange-section=\"${id}\"]`) as HTMLElement | null;\n if (el) el.style.transform = \"\";\n }\n if (committed) {\n setRearrangeState(prev => {\n if (!prev) return prev;\n return {\n ...prev,\n sections: prev.sections.map(s => {\n const start = starts.get(s.id);\n if (!start) return s;\n return { ...s, currentRect: { ...s.currentRect, x: Math.max(0, start.x + dx), y: Math.max(0, start.y + dy) } };\n }),\n };\n });\n }\n }}\n />\n )}\n\n {/* Rearrange overlay — always active alongside design overlay */}\n {(isDesignMode || designOverlayExiting) && rearrangeState && (\n <RearrangeOverlay\n rearrangeState={rearrangeState}\n onChange={setRearrangeState}\n isDarkMode={isDarkMode}\n exiting={designOverlayExiting}\n blankCanvas={blankCanvas}\n extraSnapRects={designPlacements.map(p => ({ x: p.x, y: p.y, width: p.width, height: p.height }))}\n clearSignal={rearrangeClearSignal}\n deselectSignal={rearrangeDeselectSignal}\n onSelectionChange={(ids, isShift) => {\n rearrangeSelectedIdsRef.current = ids;\n if (!isShift) {\n designSelectedIdsRef.current = new Set();\n setDesignDeselectSignal(n => n + 1);\n }\n }}\n onDragMove={(dx, dy) => {\n // Move selected design placements by same delta\n const selIds = designSelectedIdsRef.current;\n if (!selIds.size) return;\n // Cache start positions on first move\n if (!crossDragStartRef.current) {\n crossDragStartRef.current = new Map();\n for (const p of designPlacements) {\n if (selIds.has(p.id)) {\n crossDragStartRef.current.set(p.id, { x: p.x, y: p.y });\n }\n }\n }\n // Imperatively move placement divs\n for (const id of selIds) {\n const el = document.querySelector(`[data-design-placement=\"${id}\"]`) as HTMLElement | null;\n if (el) el.style.transform = `translate(${dx}px, ${dy}px)`;\n }\n }}\n onDragEnd={(dx, dy, committed) => {\n const selIds = designSelectedIdsRef.current;\n const starts = crossDragStartRef.current;\n crossDragStartRef.current = null;\n if (!selIds.size || !starts) return;\n // Clear transforms\n for (const id of selIds) {\n const el = document.querySelector(`[data-design-placement=\"${id}\"]`) as HTMLElement | null;\n if (el) el.style.transform = \"\";\n }\n if (committed) {\n setDesignPlacements(prev => prev.map(p => {\n const start = starts.get(p.id);\n if (!start) return p;\n return { ...p, x: Math.max(0, start.x + dx), y: Math.max(0, start.y + dy) };\n }));\n }\n }}\n />\n )}\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, layerIndex, arr) => (\n <AnnotationMarker\n key={annotation.id}\n annotation={annotation}\n globalIndex={visibleAnnotations.findIndex((a) => a.id === annotation.id)}\n layerIndex={layerIndex}\n layerSize={arr.length}\n isExiting={markersExiting}\n isClearing={isClearing}\n isAnimated={animatedMarkers.has(annotation.id)}\n isHovered={!markersExiting && hoveredMarkerId === annotation.id}\n isDeleting={deletingMarkerId === annotation.id}\n isEditingAny={!!editingAnnotation}\n renumberFrom={renumberFrom}\n markerClickBehavior={settings.markerClickBehavior}\n tooltipStyle={getTooltipPosition(annotation)}\n onHoverEnter={(a) =>\n !markersExiting &&\n a.id !== recentlyAddedIdRef.current &&\n handleMarkerHover(a)\n }\n onHoverLeave={() => handleMarkerHover(null)}\n onClick={(a) =>\n settings.markerClickBehavior === \"delete\"\n ? deleteAnnotation(a.id)\n : startEditAnnotation(a)\n }\n onContextMenu={startEditAnnotation}\n />\n ))}\n {markersVisible &&\n !markersExiting &&\n exitingAnnotationsList\n .filter((a) => !a.isFixed)\n .map((a) => <ExitingMarker key={a.id} annotation={a} />)}\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, layerIndex, arr) => (\n <AnnotationMarker\n key={annotation.id}\n annotation={annotation}\n globalIndex={visibleAnnotations.findIndex((a) => a.id === annotation.id)}\n layerIndex={layerIndex}\n layerSize={arr.length}\n isExiting={markersExiting}\n isClearing={isClearing}\n isAnimated={animatedMarkers.has(annotation.id)}\n isHovered={!markersExiting && hoveredMarkerId === annotation.id}\n isDeleting={deletingMarkerId === annotation.id}\n isEditingAny={!!editingAnnotation}\n renumberFrom={renumberFrom}\n markerClickBehavior={settings.markerClickBehavior}\n tooltipStyle={getTooltipPosition(annotation)}\n onHoverEnter={(a) =>\n !markersExiting &&\n a.id !== recentlyAddedIdRef.current &&\n handleMarkerHover(a)\n }\n onHoverLeave={() => handleMarkerHover(null)}\n onClick={(a) =>\n settings.markerClickBehavior === \"delete\"\n ? deleteAnnotation(a.id)\n : startEditAnnotation(a)\n }\n onContextMenu={startEditAnnotation}\n />\n ))}\n {markersVisible &&\n !markersExiting &&\n exitingAnnotationsList\n .filter((a) => a.isFixed)\n .map((a) => <ExitingMarker key={a.id} annotation={a} fixed />)}\n </div>\n\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 <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: \"color-mix(in srgb, var(--agentation-color-accent) 50%, transparent)\",\n backgroundColor: \"color-mix(in srgb, var(--agentation-color-accent) 4%, transparent)\",\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: \"color-mix(in srgb, var(--agentation-color-accent) 60%, transparent)\",\n backgroundColor: \"color-mix(in srgb, var(--agentation-color-accent) 5%, transparent)\",\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\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: \"color-mix(in srgb, var(--agentation-color-accent) 60%, transparent)\",\n backgroundColor: \"color-mix(in srgb, var(--agentation-color-accent) 5%, transparent)\",\n }),\n }}\n />\n );\n })()}\n\n {/* Hover tooltip */}\n {hoverInfo && !pendingAnnotation && !isScrolling && !isDragging && (\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 */}\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: \"color-mix(in srgb, var(--agentation-color-accent) 60%, transparent)\",\n backgroundColor: \"color-mix(in srgb, var(--agentation-color-accent) 5%, transparent)\",\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: \"color-mix(in srgb, var(--agentation-color-accent) 60%, transparent)\",\n backgroundColor: \"color-mix(in srgb, var(--agentation-color-accent) 5%, transparent)\",\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 <PendingMarker\n x={markerX}\n y={markerY}\n isMultiSelect={pendingAnnotation.isMultiSelect}\n isExiting={pendingExiting}\n />\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 ? \"var(--agentation-color-green)\"\n : \"var(--agentation-color-accent)\"\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 */}\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: \"color-mix(in srgb, var(--agentation-color-accent) 60%, transparent)\",\n backgroundColor: \"color-mix(in srgb, var(--agentation-color-accent) 5%, transparent)\",\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 ? \"var(--agentation-color-green)\"\n : \"var(--agentation-color-accent)\"\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 </div>,\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// Helpers\n// =============================================================================\n\n/** Focus an element while temporarily blocking focus-trap libraries (e.g. Radix\n * FocusScope) from reclaiming focus via focusin/focusout handlers. */\nfunction focusBypassingTraps(el: HTMLElement | null) {\n if (!el) return;\n const trap = (e: Event) => e.stopImmediatePropagation();\n document.addEventListener(\"focusin\", trap, true);\n document.addEventListener(\"focusout\", trap, true);\n try {\n el.focus();\n } finally {\n document.removeEventListener(\"focusin\", trap, true);\n document.removeEventListener(\"focusout\", trap, true);\n }\n}\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 focusBypassingTraps(textarea);\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 focusBypassingTraps(textareaRef.current);\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 e.stopPropagation();\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(() => focusBypassingTraps(textareaRef.current), 0);\n }\n }}\n type=\"button\"\n >\n <svg\n className={`${styles.chevron} ${isStylesExpanded ? styles.expanded : \"\"}`}\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5.5 10.25L9 7.25L5.75 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span className={styles.element}>{element}</span>\n </button>\n ) : (\n <span className={styles.element}>{element}</span>\n )}\n {timestamp && <span className={styles.timestamp}>{timestamp}</span>}\n </div>\n\n {/* Collapsible computed styles section - uses grid-template-rows for smooth animation */}\n {computedStyles && Object.keys(computedStyles).length > 0 && (\n <div className={`${styles.stylesWrapper} ${isStylesExpanded ? styles.expanded : \"\"}`}>\n <div className={styles.stylesInner}>\n <div className={styles.stylesBlock}>\n {Object.entries(computedStyles).map(([key, value]) => (\n <div key={key} className={styles.styleLine}>\n <span className={styles.styleProperty}>\n {key.replace(/([A-Z])/g, \"-$1\").toLowerCase()}\n </span>\n : <span className={styles.styleValue}>{value}</span>;\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {selectedText && (\n <div className={styles.quote}>\n “{selectedText.slice(0, 80)}\n {selectedText.length > 80 ? \"...\" : \"\"}”\n </div>\n )}\n\n <textarea\n ref={textareaRef}\n className={styles.textarea}\n style={{ borderColor: isFocused ? accentColor : undefined }}\n placeholder={placeholder}\n value={text}\n onChange={(e) => setText(e.target.value)}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n rows={2}\n onKeyDown={handleKeyDown}\n />\n\n <div className={styles.actions}>\n {onDelete && (\n <div className={styles.deleteWrapper}>\n <button className={styles.deleteButton} onClick={onDelete} type=\"button\">\n <IconTrash size={22} />\n </button>\n </div>\n )}\n <button className={styles.cancel} onClick={handleCancel}>\n Cancel\n </button>\n <button\n className={styles.submit}\n style={{\n backgroundColor: accentColor,\n opacity: text.trim() ? 1 : 0.4,\n }}\n onClick={handleSubmit}\n disabled={!text.trim()}\n >\n {submitLabel}\n </button>\n </div>\n </div>\n );\n }\n);\n\nexport default AnnotationPopupCSS;\n","\nconst css = \".styles-module__popup___IhzrD svg[fill=none] {\\n fill: none !important;\\n}\\n.styles-module__popup___IhzrD svg[fill=none] :not([fill]) {\\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 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: var(--agentation-color-blue);\\n}\\n.styles-module__textarea___jrSae.styles-module__green___99l3h:focus {\\n border-color: var(--agentation-color-green);\\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-color: color-mix(in srgb, var(--agentation-color-red) 25%, transparent);\\n color: var(--agentation-color-red);\\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-color: color-mix(in srgb, var(--agentation-color-red) 25%, transparent);\\n color: var(--agentation-color-red);\\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 (always update for HMR)\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 document.head.appendChild(style);\n }\n style.textContent = css;\n}\n\nexport default classNames;\n","\nconst css = \".icon-transitions-module__iconState___uqK9J {\\n transition: opacity 0.2s ease, transform 0.2s ease;\\n transform-origin: center;\\n}\\n\\n.icon-transitions-module__iconStateFast___HxlMm {\\n transition: opacity 0.15s ease, transform 0.15s ease;\\n transform-origin: center;\\n}\\n\\n.icon-transitions-module__iconFade___nPwXg {\\n transition: opacity 0.2s ease;\\n}\\n\\n.icon-transitions-module__iconFadeFast___Ofb2t {\\n transition: opacity 0.15s ease;\\n}\\n\\n.icon-transitions-module__visible___PlHsU {\\n opacity: 1 !important;\\n}\\n\\n.icon-transitions-module__visibleScaled___8Qog- {\\n opacity: 1 !important;\\n transform: scale(1);\\n}\\n\\n.icon-transitions-module__hidden___ETykt {\\n opacity: 0 !important;\\n}\\n\\n.icon-transitions-module__hiddenScaled___JXn-m {\\n opacity: 0 !important;\\n transform: scale(0.8);\\n}\\n\\n.icon-transitions-module__sending___uaLN- {\\n opacity: 0.5 !important;\\n transform: scale(0.8);\\n}\";\nconst classNames = {\"iconState\":\"icon-transitions-module__iconState___uqK9J\",\"iconStateFast\":\"icon-transitions-module__iconStateFast___HxlMm\",\"iconFade\":\"icon-transitions-module__iconFade___nPwXg\",\"iconFadeFast\":\"icon-transitions-module__iconFadeFast___Ofb2t\",\"visible\":\"icon-transitions-module__visible___PlHsU\",\"visibleScaled\":\"icon-transitions-module__visibleScaled___8Qog-\",\"hidden\":\"icon-transitions-module__hidden___ETykt\",\"hiddenScaled\":\"icon-transitions-module__hiddenScaled___JXn-m\",\"sending\":\"icon-transitions-module__sending___uaLN-\"};\n\n// SSR-safe style injection (always update for HMR)\nif (typeof document !== 'undefined') {\n let style = document.getElementById('feedback-tool-styles-components-icon-transitions');\n if (!style) {\n style = document.createElement('style');\n style.id = 'feedback-tool-styles-components-icon-transitions';\n document.head.appendChild(style);\n }\n style.textContent = css;\n}\n\nexport default classNames;\n","\"use client\";\n\nimport s from \"./icon-transitions.module.scss\";\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 = ({\n size = 20,\n ...props\n}: { size?: number } & React.SVGProps<SVGSVGElement>) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"5.375\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n />\n <path\n d=\"M8.5 8.5C8.73 7.85 9.31 7.49 10 7.5C10.86 7.51 11.5 8.13 11.5 9C11.5 10.08 10 10.5 10 10.5V10.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"10\" cy=\"12.625\" r=\"0.625\" 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 = ({\n size = 24,\n copied = false,\n tint,\n}: {\n size?: number;\n copied?: boolean;\n tint?: string;\n}) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" style={tint ? { color: tint, transition: 'color 0.3s ease' } : undefined}>\n {/* Copy icon */}\n <g\n className={`${s.iconState} ${copied ? s.hiddenScaled : s.visibleScaled}`}\n >\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\n className={`${s.iconState} ${copied ? s.visibleScaled : s.hiddenScaled}`}\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=\"var(--agentation-color-green)\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M15 10L11 14.25L9.25 12.25\"\n stroke=\"var(--agentation-color-green)\"\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 {/* Send arrow */}\n <g\n className={`${s.iconStateFast} ${showArrow ? s.visibleScaled : isSending ? s.sending : s.hiddenScaled}`}\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\n className={`${s.iconStateFast} ${showCheck ? s.visibleScaled : s.hiddenScaled}`}\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=\"var(--agentation-color-green)\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M15 10L11 14.25L9.25 12.25\"\n stroke=\"var(--agentation-color-green)\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n {/* Red error circle with exclamation */}\n <g\n className={`${s.iconStateFast} ${showError ? s.visibleScaled : s.hiddenScaled}`}\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=\"var(--agentation-color-red)\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 8V12\"\n stroke=\"var(--agentation-color-red)\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <circle\n cx=\"12\"\n cy=\"15\"\n r=\"0.5\"\n fill=\"var(--agentation-color-red)\"\n stroke=\"var(--agentation-color-red)\"\n strokeWidth=\"1\"\n />\n </g>\n </svg>\n );\n};\n\n// Animated send/checkmark icon (for \"Send to Agent\" button)\nexport const IconSendAnimated = ({\n size = 24,\n sent = false,\n}: {\n size?: number;\n sent?: boolean;\n}) => (\n <svg width={size} height={size} viewBox=\"0 0 22 21\" fill=\"none\">\n {/* Send icon (document with arrow) */}\n <g className={`${s.iconState} ${sent ? s.hiddenScaled : s.visibleScaled}`}>\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={`${s.iconState} ${sent ? s.visibleScaled : s.hiddenScaled}`}>\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 = ({\n size = 24,\n isOpen = true,\n}: {\n size?: number;\n isOpen?: boolean;\n}) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n {/* Open state - full outline + pupil */}\n <g className={`${s.iconFade} ${isOpen ? s.visible : s.hidden}`}>\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={`${s.iconFade} ${isOpen ? s.hidden : s.visible}`}>\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 = ({\n size = 24,\n isPaused = false,\n}: {\n size?: number;\n isPaused?: boolean;\n}) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n {/* Pause bars - visible when not paused */}\n <g className={`${s.iconFadeFast} ${isPaused ? s.hidden : s.visible}`}>\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 </g>\n {/* Play triangle - visible when paused */}\n <path\n className={`${s.iconFadeFast} ${isPaused ? s.visible : s.hidden}`}\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// 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\n 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\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M10 3.9585V5.05698\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M10 14.9429V16.0414\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M5.7269 5.72656L6.50682 6.50649\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M13.4932 13.4932L14.2731 14.2731\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3.95834 10H5.05683\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M14.9432 10H16.0417\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M5.7269 14.2731L6.50682 13.4932\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M13.4932 6.50649L14.2731 5.72656\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\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\n 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\"\n stroke=\"currentColor\"\n strokeWidth=\"1.13793\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Edit/pencil icon for marker hover\nexport const IconEdit = ({ 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=\"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\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\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// 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// Layout / grid icon for layout mode\nexport const IconLayout = ({ size = 24 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <rect\n x=\"3\"\n y=\"3\"\n width=\"18\"\n height=\"18\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <line\n x1=\"3\"\n y1=\"9\"\n x2=\"21\"\n y2=\"9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <line\n x1=\"9\"\n y1=\"9\"\n x2=\"9\"\n y2=\"21\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\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","import { useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { originalSetTimeout } from \"../../utils/freeze-animations\";\n\nexport const Tooltip = ({\n content,\n children,\n ...props\n}: {\n content: string;\n children: React.ReactNode;\n} & React.HTMLAttributes<HTMLSpanElement>) => {\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 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);\n };\n\n const handleMouseLeave = () => {\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 {...props}\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 ? 1 : 0,\n transition: \"opacity 0.15s ease\",\n }}\n >\n {content}\n </div>,\n document.body\n )}\n </>\n );\n};\n","\nconst css = \".styles-module__tooltip___mcXL2 {\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n cursor: help;\\n}\\n\\n.styles-module__tooltipIcon___Nq2nD {\\n transform: translateY(0.5px);\\n color: #fff;\\n opacity: 0.2;\\n transition: opacity 0.15s ease;\\n will-change: transform;\\n}\\n.styles-module__tooltip___mcXL2:hover .styles-module__tooltipIcon___Nq2nD {\\n opacity: 0.5;\\n}\\n[data-agentation-theme=light] .styles-module__tooltipIcon___Nq2nD {\\n color: #000;\\n}\";\nconst classNames = {\"tooltip\":\"styles-module__tooltip___mcXL2\",\"tooltipIcon\":\"styles-module__tooltipIcon___Nq2nD\"};\n\n// SSR-safe style injection (always update for HMR)\nif (typeof document !== 'undefined') {\n let style = document.getElementById('feedback-tool-styles-help-tooltip-styles');\n if (!style) {\n style = document.createElement('style');\n style.id = 'feedback-tool-styles-help-tooltip-styles';\n document.head.appendChild(style);\n }\n style.textContent = css;\n}\n\nexport default classNames;\n","import { Tooltip } from \"../tooltip\";\nimport { IconHelp } from \"../icons\";\nimport styles from \"./styles.module.scss\";\n\ninterface HelpTooltipProps {\n content: string;\n}\n\nexport const HelpTooltip = ({ content }: HelpTooltipProps) => {\n return (\n <Tooltip className={styles.tooltip} content={content}>\n <IconHelp className={styles.tooltipIcon} />\n </Tooltip>\n );\n};\n","\"use client\";\r\n\r\nimport { useState, useCallback, useEffect, useRef } from \"react\";\r\nimport { COMPONENT_MAP, DEFAULT_SIZES, type ComponentType, type DesignPlacement } from \"./types\";\r\nimport { Skeleton } from \"./skeletons\";\r\nimport { AnnotationPopupCSS } from \"../annotation-popup-css\";\r\nimport styles from \"./styles.module.scss\";\r\n\r\n// =============================================================================\r\n// Layout Mode Overlay\r\n// =============================================================================\r\n\r\ntype DesignModeProps = {\r\n placements: DesignPlacement[];\r\n onChange: (placements: DesignPlacement[]) => void;\r\n activeComponent: ComponentType | null;\r\n onActiveComponentChange: (type: ComponentType | null) => void;\r\n isDarkMode: boolean;\r\n exiting?: boolean;\r\n onInteractionChange?: (active: boolean) => void;\r\n className?: string;\r\n passthrough?: boolean;\r\n extraSnapRects?: SnapRect[];\r\n onSelectionChange?: (selectedIds: Set<string>, isShift: boolean) => void;\r\n deselectSignal?: number;\r\n onDragMove?: (dx: number, dy: number) => void;\r\n onDragEnd?: (dx: number, dy: number, committed: boolean) => void;\r\n clearSignal?: number;\r\n wireframe?: boolean;\r\n};\r\n\r\ntype HandleDir = \"nw\" | \"n\" | \"ne\" | \"e\" | \"se\" | \"s\" | \"sw\" | \"w\";\r\ntype Guide = { axis: \"x\" | \"y\"; pos: number };\r\n\r\nconst MIN_SIZE = 24;\r\nconst SNAP_THRESHOLD = 5;\r\n\r\ntype SnapRect = { x: number; y: number; width: number; height: number };\r\n\r\nfunction computeSnap(\r\n rect: SnapRect,\r\n others: DesignPlacement[],\r\n excludeIds: Set<string>,\r\n activeEdges?: { left?: boolean; right?: boolean; top?: boolean; bottom?: boolean },\r\n extraRects?: SnapRect[],\r\n): { dx: number; dy: number; guides: Guide[] } {\r\n let bestDx = Infinity;\r\n let bestDy = Infinity;\r\n\r\n const mL = rect.x, mR = rect.x + rect.width, mCx = rect.x + rect.width / 2;\r\n const mT = rect.y, mB = rect.y + rect.height, mCy = rect.y + rect.height / 2;\r\n\r\n const checkAll = !activeEdges;\r\n const xFroms = checkAll ? [mL, mR, mCx] : [\r\n ...(activeEdges.left ? [mL] : []),\r\n ...(activeEdges.right ? [mR] : []),\r\n ];\r\n const yFroms = checkAll ? [mT, mB, mCy] : [\r\n ...(activeEdges.top ? [mT] : []),\r\n ...(activeEdges.bottom ? [mB] : []),\r\n ];\r\n\r\n // Build unified list of snap target rects\r\n const allTargets: SnapRect[] = [];\r\n for (const o of others) {\r\n if (!excludeIds.has(o.id)) allTargets.push(o);\r\n }\r\n if (extraRects) allTargets.push(...extraRects);\r\n\r\n for (const o of allTargets) {\r\n const oL = o.x, oR = o.x + o.width, oCx = o.x + o.width / 2;\r\n const oT = o.y, oB = o.y + o.height, oCy = o.y + o.height / 2;\r\n\r\n for (const from of xFroms) {\r\n for (const to of [oL, oR, oCx]) {\r\n const d = to - from;\r\n if (Math.abs(d) < SNAP_THRESHOLD && Math.abs(d) < Math.abs(bestDx)) bestDx = d;\r\n }\r\n }\r\n for (const from of yFroms) {\r\n for (const to of [oT, oB, oCy]) {\r\n const d = to - from;\r\n if (Math.abs(d) < SNAP_THRESHOLD && Math.abs(d) < Math.abs(bestDy)) bestDy = d;\r\n }\r\n }\r\n }\r\n\r\n const dx = Math.abs(bestDx) < SNAP_THRESHOLD ? bestDx : 0;\r\n const dy = Math.abs(bestDy) < SNAP_THRESHOLD ? bestDy : 0;\r\n\r\n // Collect guide lines at snapped positions\r\n const guides: Guide[] = [];\r\n const seen = new Set<string>();\r\n const sL = mL + dx, sR = mR + dx, sCx = mCx + dx;\r\n const sT = mT + dy, sB = mB + dy, sCy = mCy + dy;\r\n\r\n for (const o of allTargets) {\r\n const oL = o.x, oR = o.x + o.width, oCx = o.x + o.width / 2;\r\n const oT = o.y, oB = o.y + o.height, oCy = o.y + o.height / 2;\r\n\r\n for (const xPos of [oL, oCx, oR]) {\r\n for (const sx of [sL, sCx, sR]) {\r\n if (Math.abs(sx - xPos) < 0.5) {\r\n const key = `x:${Math.round(xPos)}`;\r\n if (!seen.has(key)) { seen.add(key); guides.push({ axis: \"x\", pos: xPos }); }\r\n }\r\n }\r\n }\r\n for (const yPos of [oT, oCy, oB]) {\r\n for (const sy of [sT, sCy, sB]) {\r\n if (Math.abs(sy - yPos) < 0.5) {\r\n const key = `y:${Math.round(yPos)}`;\r\n if (!seen.has(key)) { seen.add(key); guides.push({ axis: \"y\", pos: yPos }); }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return { dx, dy, guides };\r\n}\r\n\r\nfunction generateId() {\r\n return `dp-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\r\n}\r\n\r\nexport function DesignMode({\r\n placements,\r\n onChange,\r\n activeComponent,\r\n onActiveComponentChange,\r\n isDarkMode,\r\n exiting,\r\n onInteractionChange,\r\n className: extraClassName,\r\n passthrough,\r\n extraSnapRects,\r\n onSelectionChange,\r\n deselectSignal,\r\n onDragMove,\r\n onDragEnd,\r\n clearSignal,\r\n wireframe,\r\n}: DesignModeProps) {\r\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\r\n const [drawBox, setDrawBox] = useState<{ x: number; y: number; w: number; h: number } | null>(null);\r\n const [selectBox, setSelectBox] = useState<{ x: number; y: number; w: number; h: number } | null>(null);\r\n const [sizeIndicator, setSizeIndicator] = useState<{ x: number; y: number; text: string } | null>(null);\r\n const [guides, setGuides] = useState<Guide[]>([]);\r\n const [editingId, setEditingId] = useState<string | null>(null);\r\n const [editExiting, setEditExiting] = useState(false);\r\n const editHadTextRef = useRef(false);\r\n const [exitingIds, setExitingIds] = useState<Set<string>>(new Set());\r\n const lastAnnotationTextRef = useRef<Map<string, string>>(new Map());\r\n const overlayRef = useRef<HTMLDivElement>(null);\r\n const interactionRef = useRef<string | null>(null); // \"place\" | \"move\" | \"resize\" | \"select\"\r\n // Stable refs for callbacks (avoids stale closures in event handlers)\r\n const placementsRef = useRef(placements);\r\n placementsRef.current = placements;\r\n const onSelectionChangeRef = useRef(onSelectionChange);\r\n onSelectionChangeRef.current = onSelectionChange;\r\n const onDragMoveRef = useRef(onDragMove);\r\n onDragMoveRef.current = onDragMove;\r\n const onDragEndRef = useRef(onDragEnd);\r\n onDragEndRef.current = onDragEnd;\r\n\r\n // Clear selection when the other overlay signals deselect\r\n const deselectRef = useRef(deselectSignal);\r\n useEffect(() => {\r\n if (deselectSignal !== deselectRef.current) {\r\n deselectRef.current = deselectSignal;\r\n setSelectedIds(new Set());\r\n }\r\n }, [deselectSignal]);\r\n\r\n // Animate all out when clearSignal fires\r\n const clearRef = useRef(clearSignal);\r\n useEffect(() => {\r\n if (clearSignal !== undefined && clearSignal !== clearRef.current) {\r\n clearRef.current = clearSignal;\r\n const allIds = new Set(placementsRef.current.map(p => p.id));\r\n if (allIds.size > 0) {\r\n setExitingIds(allIds);\r\n setSelectedIds(new Set());\r\n interactionRef.current = null;\r\n setTimeout(() => {\r\n onChange([]);\r\n setExitingIds(new Set());\r\n }, 180);\r\n }\r\n }\r\n }, [clearSignal, onChange]);\r\n\r\n // --- Keyboard: arrow nudge, delete, escape ---\r\n useEffect(() => {\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n const target = e.target as HTMLElement;\r\n const isTyping =\r\n target.tagName === \"INPUT\" ||\r\n target.tagName === \"TEXTAREA\" ||\r\n target.isContentEditable;\r\n if (isTyping) return;\r\n\r\n // Delete selected (animate out, then remove)\r\n if ((e.key === \"Backspace\" || e.key === \"Delete\") && selectedIds.size > 0) {\r\n e.preventDefault();\r\n const toDelete = new Set(selectedIds);\r\n setExitingIds(toDelete);\r\n setSelectedIds(new Set());\r\n setTimeout(() => {\r\n onChange(placementsRef.current.filter((p) => !toDelete.has(p.id)));\r\n setExitingIds(new Set());\r\n }, 180);\r\n return;\r\n }\r\n\r\n // Arrow nudge\r\n if ([\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"].includes(e.key) && selectedIds.size > 0) {\r\n e.preventDefault();\r\n const step = e.shiftKey ? 20 : 1;\r\n const dx = e.key === \"ArrowLeft\" ? -step : e.key === \"ArrowRight\" ? step : 0;\r\n const dy = e.key === \"ArrowUp\" ? -step : e.key === \"ArrowDown\" ? step : 0;\r\n onChange(\r\n placements.map((p) =>\r\n selectedIds.has(p.id)\r\n ? { ...p, x: Math.max(0, p.x + dx), y: Math.max(0, p.y + dy) }\r\n : p,\r\n ),\r\n );\r\n return;\r\n }\r\n\r\n // Escape: deselect palette → deselect all\r\n if (e.key === \"Escape\") {\r\n if (activeComponent) {\r\n onActiveComponentChange(null);\r\n } else if (selectedIds.size > 0) {\r\n setSelectedIds(new Set());\r\n }\r\n return;\r\n }\r\n };\r\n\r\n document.addEventListener(\"keydown\", handleKeyDown);\r\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\r\n }, [selectedIds, activeComponent, placements, onChange, onActiveComponentChange]);\r\n\r\n // --- Click on empty space: place or start select box ---\r\n const handleOverlayMouseDown = useCallback(\r\n (e: React.MouseEvent) => {\r\n // Only handle left click on the overlay itself\r\n if (e.button !== 0) return;\r\n if (passthrough) return; // Let clicks fall through to rearrange\r\n const target = e.target as HTMLElement;\r\n if (target.closest(`.${styles.placement}`)) return;\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const scrollY = window.scrollY;\r\n const startX = e.clientX;\r\n const startY = e.clientY;\r\n\r\n if (activeComponent) {\r\n // --- Place by click or drag ---\r\n interactionRef.current = \"place\";\r\n onInteractionChange?.(true);\r\n let isDrag = false;\r\n let endX = startX;\r\n let endY = startY;\r\n\r\n const onMove = (ev: MouseEvent) => {\r\n endX = ev.clientX;\r\n endY = ev.clientY;\r\n const dx = Math.abs(endX - startX);\r\n const dy = Math.abs(endY - startY);\r\n if (dx > 5 || dy > 5) isDrag = true;\r\n\r\n if (isDrag) {\r\n const x = Math.min(startX, endX);\r\n const y = Math.min(startY, endY);\r\n const w = Math.abs(endX - startX);\r\n const h = Math.abs(endY - startY);\r\n setDrawBox({ x, y, w, h });\r\n setSizeIndicator({ x: ev.clientX + 12, y: ev.clientY + 12, text: `${Math.round(w)} × ${Math.round(h)}` });\r\n }\r\n };\r\n\r\n const onUp = (ev: MouseEvent) => {\r\n window.removeEventListener(\"mousemove\", onMove);\r\n window.removeEventListener(\"mouseup\", onUp);\r\n setDrawBox(null);\r\n setSizeIndicator(null);\r\n interactionRef.current = null;\r\n onInteractionChange?.(false);\r\n\r\n const def = DEFAULT_SIZES[activeComponent];\r\n let x: number, y: number, w: number, h: number;\r\n\r\n if (isDrag) {\r\n x = Math.min(startX, endX);\r\n y = Math.min(startY, endY) + scrollY;\r\n w = Math.max(MIN_SIZE, Math.abs(endX - startX));\r\n h = Math.max(MIN_SIZE, Math.abs(endY - startY));\r\n } else {\r\n w = def.width;\r\n h = def.height;\r\n x = startX - w / 2;\r\n y = startY + scrollY - h / 2;\r\n }\r\n\r\n x = Math.max(0, x);\r\n y = Math.max(0, y);\r\n\r\n const placement: DesignPlacement = {\r\n id: generateId(),\r\n type: activeComponent,\r\n x,\r\n y,\r\n width: w,\r\n height: h,\r\n scrollY,\r\n timestamp: Date.now(),\r\n };\r\n\r\n const next = [...placements, placement];\r\n onChange(next);\r\n setSelectedIds(new Set([placement.id]));\r\n\r\n // Clear active component so overlay goes passthrough (allows rearrange clicks)\r\n onActiveComponentChange(null);\r\n };\r\n\r\n window.addEventListener(\"mousemove\", onMove);\r\n window.addEventListener(\"mouseup\", onUp);\r\n } else {\r\n // --- Deselect and start select box ---\r\n if (!e.shiftKey) {\r\n setSelectedIds(new Set());\r\n }\r\n\r\n interactionRef.current = \"select\";\r\n let isDrag = false;\r\n\r\n const onMove = (ev: MouseEvent) => {\r\n const dx = Math.abs(ev.clientX - startX);\r\n const dy = Math.abs(ev.clientY - startY);\r\n if (dx > 4 || dy > 4) isDrag = true;\r\n\r\n if (isDrag) {\r\n const x = Math.min(startX, ev.clientX);\r\n const y = Math.min(startY, ev.clientY);\r\n setSelectBox({ x, y, w: Math.abs(ev.clientX - startX), h: Math.abs(ev.clientY - startY) });\r\n }\r\n };\r\n\r\n const onUp = (ev: MouseEvent) => {\r\n window.removeEventListener(\"mousemove\", onMove);\r\n window.removeEventListener(\"mouseup\", onUp);\r\n interactionRef.current = null;\r\n\r\n if (isDrag) {\r\n const boxX = Math.min(startX, ev.clientX);\r\n const boxY = Math.min(startY, ev.clientY) + scrollY;\r\n const boxW = Math.abs(ev.clientX - startX);\r\n const boxH = Math.abs(ev.clientY - startY);\r\n\r\n const newSelected = new Set(e.shiftKey ? selectedIds : new Set<string>());\r\n for (const p of placements) {\r\n const pScreenY = p.y - scrollY;\r\n if (\r\n p.x + p.width > boxX &&\r\n p.x < boxX + boxW &&\r\n p.y + p.height > boxY &&\r\n p.y < boxY + boxH\r\n ) {\r\n newSelected.add(p.id);\r\n }\r\n }\r\n setSelectedIds(newSelected);\r\n }\r\n\r\n setSelectBox(null);\r\n };\r\n\r\n window.addEventListener(\"mousemove\", onMove);\r\n window.addEventListener(\"mouseup\", onUp);\r\n }\r\n },\r\n [activeComponent, passthrough, placements, onChange, selectedIds],\r\n );\r\n\r\n // --- Click on a placement: select ---\r\n const handlePlacementMouseDown = useCallback(\r\n (e: React.MouseEvent, id: string) => {\r\n if (e.button !== 0) return;\r\n const target = e.target as HTMLElement;\r\n if (target.closest(`.${styles.handle}`) || target.closest(`.${styles.deleteButton}`)) return;\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n // Select\r\n let newSelected: Set<string>;\r\n if (e.shiftKey) {\r\n newSelected = new Set(selectedIds);\r\n if (newSelected.has(id)) newSelected.delete(id);\r\n else newSelected.add(id);\r\n } else if (!selectedIds.has(id)) {\r\n newSelected = new Set([id]);\r\n } else {\r\n newSelected = new Set(selectedIds);\r\n }\r\n setSelectedIds(newSelected);\r\n // Only notify if selection actually changed (avoids deselecting other overlay when clicking an already-selected item to drag)\r\n const changed = newSelected.size !== selectedIds.size || [...newSelected].some(x => !selectedIds.has(x));\r\n if (changed) onSelectionChangeRef.current?.(newSelected, e.shiftKey);\r\n\r\n // Start drag-to-move\r\n const scrollY = window.scrollY;\r\n const startX = e.clientX;\r\n const startY = e.clientY;\r\n\r\n const startPositions = new Map<string, { x: number; y: number }>();\r\n for (const p of placements) {\r\n if (newSelected.has(p.id)) {\r\n startPositions.set(p.id, { x: p.x, y: p.y });\r\n }\r\n }\r\n\r\n interactionRef.current = \"move\";\r\n onInteractionChange?.(true);\r\n let moved = false;\r\n let duplicated = false;\r\n let basePlacements = placements;\r\n let lastSnappedDx = 0, lastSnappedDy = 0;\r\n\r\n // Build bounding sizes for selection (constant during drag)\r\n const selSizes = new Map<string, { w: number; h: number }>();\r\n for (const p of placements) {\r\n if (startPositions.has(p.id)) selSizes.set(p.id, { w: p.width, h: p.height });\r\n }\r\n\r\n const onMove = (ev: MouseEvent) => {\r\n const dx = ev.clientX - startX;\r\n const dy = ev.clientY - startY;\r\n if (Math.abs(dx) > 2 || Math.abs(dy) > 2) moved = true;\r\n if (!moved) return;\r\n\r\n // Option+drag: duplicate selected placements (once per drag)\r\n if (ev.altKey && !duplicated) {\r\n duplicated = true;\r\n const clones: typeof placements = [];\r\n for (const p of placements) {\r\n if (startPositions.has(p.id)) {\r\n clones.push({ ...p, id: generateId(), timestamp: Date.now() });\r\n }\r\n }\r\n basePlacements = [...placements, ...clones];\r\n }\r\n\r\n // Compute bounding box of selection at prospective position\r\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\r\n for (const [id, start] of startPositions) {\r\n const sz = selSizes.get(id);\r\n if (!sz) continue;\r\n minX = Math.min(minX, start.x + dx);\r\n minY = Math.min(minY, start.y + dy);\r\n maxX = Math.max(maxX, start.x + dx + sz.w);\r\n maxY = Math.max(maxY, start.y + dy + sz.h);\r\n }\r\n const selRect = { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\r\n const { dx: snapDx, dy: snapDy, guides: newGuides } = computeSnap(selRect, basePlacements, new Set(startPositions.keys()), undefined, extraSnapRects);\r\n setGuides(newGuides);\r\n\r\n const snappedDx = dx + snapDx;\r\n const snappedDy = dy + snapDy;\r\n lastSnappedDx = snappedDx;\r\n lastSnappedDy = snappedDy;\r\n onChange(\r\n basePlacements.map((p) => {\r\n const start = startPositions.get(p.id);\r\n if (!start) return p;\r\n return { ...p, x: Math.max(0, start.x + snappedDx), y: Math.max(0, start.y + snappedDy) };\r\n }),\r\n );\r\n onDragMoveRef.current?.(snappedDx, snappedDy);\r\n };\r\n\r\n const onUp = () => {\r\n window.removeEventListener(\"mousemove\", onMove);\r\n window.removeEventListener(\"mouseup\", onUp);\r\n interactionRef.current = null;\r\n onInteractionChange?.(false);\r\n setGuides([]);\r\n onDragEndRef.current?.(lastSnappedDx, lastSnappedDy, moved);\r\n };\r\n\r\n window.addEventListener(\"mousemove\", onMove);\r\n window.addEventListener(\"mouseup\", onUp);\r\n },\r\n [selectedIds, placements, onChange, onInteractionChange],\r\n );\r\n\r\n // --- Resize handle ---\r\n const handleResizeMouseDown = useCallback(\r\n (e: React.MouseEvent, id: string, dir: HandleDir) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const comp = placements.find((p) => p.id === id);\r\n if (!comp) return;\r\n\r\n setSelectedIds(new Set([id]));\r\n interactionRef.current = \"resize\";\r\n onInteractionChange?.(true);\r\n\r\n const startX = e.clientX;\r\n const startY = e.clientY;\r\n const startW = comp.width;\r\n const startH = comp.height;\r\n const startLeft = comp.x;\r\n const startTop = comp.y;\r\n\r\n // Determine which edges are active for this resize direction\r\n const activeEdges = {\r\n left: dir.includes(\"w\"),\r\n right: dir.includes(\"e\"),\r\n top: dir.includes(\"n\"),\r\n bottom: dir.includes(\"s\"),\r\n };\r\n\r\n const onMove = (ev: MouseEvent) => {\r\n const dx = ev.clientX - startX;\r\n const dy = ev.clientY - startY;\r\n\r\n let nw = startW,\r\n nh = startH,\r\n nx = startLeft,\r\n ny = startTop;\r\n\r\n if (dir.includes(\"e\")) nw = Math.max(MIN_SIZE, startW + dx);\r\n if (dir.includes(\"w\")) {\r\n nw = Math.max(MIN_SIZE, startW - dx);\r\n nx = startLeft + startW - nw;\r\n }\r\n if (dir.includes(\"s\")) nh = Math.max(MIN_SIZE, startH + dy);\r\n if (dir.includes(\"n\")) {\r\n nh = Math.max(MIN_SIZE, startH - dy);\r\n ny = startTop + startH - nh;\r\n }\r\n\r\n // Smart-snap active edges to nearby elements\r\n const rect = { x: nx, y: ny, width: nw, height: nh };\r\n const { dx: snapDx, dy: snapDy, guides: newGuides } = computeSnap(rect, placementsRef.current, new Set([id]), activeEdges, extraSnapRects);\r\n setGuides(newGuides);\r\n\r\n // Apply snap by adjusting the active edge\r\n if (snapDx !== 0) {\r\n if (activeEdges.right) nw += snapDx;\r\n else if (activeEdges.left) { nx += snapDx; nw -= snapDx; }\r\n }\r\n if (snapDy !== 0) {\r\n if (activeEdges.bottom) nh += snapDy;\r\n else if (activeEdges.top) { ny += snapDy; nh -= snapDy; }\r\n }\r\n\r\n onChange(\r\n placementsRef.current.map((p) =>\r\n p.id === id ? { ...p, x: nx, y: ny, width: nw, height: nh } : p,\r\n ),\r\n );\r\n\r\n setSizeIndicator({\r\n x: ev.clientX + 12,\r\n y: ev.clientY + 12,\r\n text: `${Math.round(nw)} × ${Math.round(nh)}`,\r\n });\r\n };\r\n\r\n const onUp = () => {\r\n window.removeEventListener(\"mousemove\", onMove);\r\n window.removeEventListener(\"mouseup\", onUp);\r\n setSizeIndicator(null);\r\n interactionRef.current = null;\r\n onInteractionChange?.(false);\r\n setGuides([]);\r\n };\r\n\r\n window.addEventListener(\"mousemove\", onMove);\r\n window.addEventListener(\"mouseup\", onUp);\r\n },\r\n [placements, onChange, onInteractionChange],\r\n );\r\n\r\n // --- Delete a single placement (animate out, then remove) ---\r\n const handleDelete = useCallback(\r\n (id: string) => {\r\n interactionRef.current = null;\r\n setExitingIds((prev) => { const next = new Set(prev); next.add(id); return next; });\r\n setSelectedIds((prev) => {\r\n const next = new Set(prev);\r\n next.delete(id);\r\n return next;\r\n });\r\n setTimeout(() => {\r\n onChange(placementsRef.current.filter((p) => p.id !== id));\r\n setExitingIds((prev) => {\r\n const next = new Set(prev);\r\n next.delete(id);\r\n return next;\r\n });\r\n }, 180);\r\n },\r\n [onChange],\r\n );\r\n\r\n // --- Double-click: edit text ---\r\n const TEXT_TYPES = new Set<ComponentType>([\"text\", \"hero\", \"button\", \"badge\", \"cta\", \"toast\", \"modal\", \"card\", \"navigation\", \"tabs\", \"input\", \"search\", \"breadcrumb\", \"pricing\", \"testimonial\", \"alert\", \"banner\", \"tag\", \"notification\", \"stat\", \"productCard\"] as ComponentType[]);\r\n const TEXT_PLACEHOLDERS: Partial<Record<ComponentType, string>> = {\r\n hero: \"Headline text\",\r\n button: \"Button label\",\r\n badge: \"Badge label\",\r\n cta: \"Call to action text\",\r\n toast: \"Notification message\",\r\n modal: \"Dialog title\",\r\n card: \"Card title\",\r\n navigation: \"Brand / nav items\",\r\n tabs: \"Tab labels\",\r\n input: \"Placeholder text\",\r\n search: \"Search placeholder\",\r\n pricing: \"Plan name or price\",\r\n testimonial: \"Quote text\",\r\n alert: \"Alert message\",\r\n banner: \"Banner text\",\r\n tag: \"Tag label\",\r\n notification: \"Notification message\",\r\n stat: \"Metric value\",\r\n productCard: \"Product name\",\r\n };\r\n\r\n const handleDoubleClick = useCallback((id: string) => {\r\n const p = placements.find(pl => pl.id === id);\r\n if (!p) return;\r\n editHadTextRef.current = !!p.text;\r\n setEditingId(id);\r\n setEditExiting(false);\r\n }, [placements]);\r\n\r\n const dismissEdit = useCallback(() => {\r\n if (!editingId) return;\r\n setEditExiting(true);\r\n setTimeout(() => { setEditingId(null); setEditExiting(false); }, 150);\r\n }, [editingId]);\r\n\r\n // Dismiss popup when overlay starts exiting\r\n useEffect(() => {\r\n if (exiting && editingId) dismissEdit();\r\n }, [exiting]);\r\n\r\n const submitEdit = useCallback((text: string) => {\r\n if (!editingId) return;\r\n onChange(placements.map(p => p.id === editingId ? { ...p, text: text.trim() || undefined } : p));\r\n dismissEdit();\r\n }, [editingId, placements, onChange, dismissEdit]);\r\n\r\n const scrollY = typeof window !== \"undefined\" ? window.scrollY : 0;\r\n const cornerHandles: HandleDir[] = [\"nw\", \"ne\", \"se\", \"sw\"];\r\n const arrowColor = wireframe ? \"#f97316\" : \"#3c82f7\";\r\n const edgeHandles: { dir: HandleDir; cls: string; arrow: JSX.Element }[] = [\r\n { dir: \"n\", cls: styles.edgeN, arrow: <svg width=\"8\" height=\"6\" viewBox=\"0 0 8 6\" fill=\"none\"><path d=\"M4 0.5L1 4.5h6z\" fill={arrowColor}/></svg> },\r\n { dir: \"e\", cls: styles.edgeE, arrow: <svg width=\"6\" height=\"8\" viewBox=\"0 0 6 8\" fill=\"none\"><path d=\"M5.5 4L1.5 1v6z\" fill={arrowColor}/></svg> },\r\n { dir: \"s\", cls: styles.edgeS, arrow: <svg width=\"8\" height=\"6\" viewBox=\"0 0 8 6\" fill=\"none\"><path d=\"M4 5.5L1 1.5h6z\" fill={arrowColor}/></svg> },\r\n { dir: \"w\", cls: styles.edgeW, arrow: <svg width=\"6\" height=\"8\" viewBox=\"0 0 6 8\" fill=\"none\"><path d=\"M0.5 4L4.5 1v6z\" fill={arrowColor}/></svg> },\r\n ];\r\n\r\n return (\r\n <>\r\n <div\r\n ref={overlayRef}\r\n className={`${styles.overlay} ${!isDarkMode ? styles.light : \"\"} ${activeComponent ? styles.placing : \"\"} ${passthrough ? styles.passthrough : \"\"} ${exiting ? styles.overlayExiting : \"\"} ${wireframe ? styles.wireframe : \"\"}${extraClassName ? ` ${extraClassName}` : \"\"}`}\r\n data-feedback-toolbar\r\n onMouseDown={handleOverlayMouseDown}\r\n >\r\n {/* Placed components */}\r\n {placements.map((p) => {\r\n const isSelected = selectedIds.has(p.id);\r\n const label = COMPONENT_MAP[p.type]?.label || p.type;\r\n const screenY = p.y - scrollY;\r\n\r\n return (\r\n <div\r\n key={p.id}\r\n data-design-placement={p.id}\r\n className={`${styles.placement} ${isSelected ? styles.selected : \"\"} ${exitingIds.has(p.id) ? styles.exiting : \"\"}`}\r\n style={{\r\n left: p.x,\r\n top: screenY,\r\n width: p.width,\r\n height: p.height,\r\n position: \"fixed\",\r\n }}\r\n onMouseDown={(e) => handlePlacementMouseDown(e, p.id)}\r\n onDoubleClick={() => handleDoubleClick(p.id)}\r\n >\r\n <span className={styles.placementLabel}>{label}</span>\r\n <span className={`${styles.placementAnnotation} ${p.text ? styles.annotationVisible : \"\"}`}>{(() => { if (p.text) lastAnnotationTextRef.current.set(p.id, p.text); return p.text || lastAnnotationTextRef.current.get(p.id) || \"\"; })()}</span>\r\n <div className={styles.placementContent}>\r\n <Skeleton type={p.type} width={p.width} height={p.height} text={p.text} />\r\n </div>\r\n\r\n {/* Delete button */}\r\n <div\r\n className={styles.deleteButton}\r\n onMouseDown={(e) => e.stopPropagation()}\r\n onClick={() => handleDelete(p.id)}\r\n >\r\n ✕\r\n </div>\r\n\r\n {/* Corner resize handles */}\r\n {cornerHandles.map((dir) => (\r\n <div\r\n key={dir}\r\n className={`${styles.handle} ${styles[`handle${dir.charAt(0).toUpperCase()}${dir.slice(1)}` as keyof typeof styles]}`}\r\n onMouseDown={(e) => handleResizeMouseDown(e, p.id, dir)}\r\n />\r\n ))}\r\n {/* Edge resize bars */}\r\n {edgeHandles.map(({ dir, cls, arrow }) => (\r\n <div\r\n key={dir}\r\n className={`${styles.edgeHandle} ${cls}`}\r\n onMouseDown={(e) => handleResizeMouseDown(e, p.id, dir)}\r\n >\r\n {arrow}\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n {/* Text editing popup (uses annotation popup) */}\r\n {editingId && (() => {\r\n const ep = placements.find(p => p.id === editingId);\r\n if (!ep) return null;\r\n const ey = ep.y - scrollY;\r\n const centerX = ep.x + ep.width / 2;\r\n const aboveY = ey - 8;\r\n const belowY = ey + ep.height + 8;\r\n const fitsAbove = aboveY > 200;\r\n const fitsBelow = belowY < window.innerHeight - 100;\r\n const popupLeft = Math.max(160, Math.min(window.innerWidth - 160, centerX));\r\n let popupStyle: React.CSSProperties;\r\n if (fitsAbove) {\r\n popupStyle = { left: popupLeft, bottom: window.innerHeight - aboveY };\r\n } else if (fitsBelow) {\r\n popupStyle = { left: popupLeft, top: belowY };\r\n } else {\r\n // Tall component: place popup at vertical center of viewport\r\n popupStyle = { left: popupLeft, top: Math.max(80, window.innerHeight / 2 - 80) };\r\n }\r\n return (\r\n <AnnotationPopupCSS\r\n element={COMPONENT_MAP[ep.type]?.label || ep.type}\r\n placeholder={TEXT_PLACEHOLDERS[ep.type] || \"Label or content text\"}\r\n initialValue={ep.text ?? \"\"}\r\n submitLabel={editHadTextRef.current ? \"Save\" : \"Set\"}\r\n onSubmit={submitEdit}\r\n onCancel={dismissEdit}\r\n onDelete={editHadTextRef.current ? () => { submitEdit(\"\"); } : undefined}\r\n isExiting={editExiting}\r\n lightMode={!isDarkMode}\r\n style={popupStyle}\r\n />\r\n );\r\n })()}\r\n\r\n {/* Draw box (drag-to-place preview) */}\r\n {drawBox && (\r\n <div\r\n className={styles.drawBox}\r\n style={{ left: drawBox.x, top: drawBox.y, width: drawBox.w, height: drawBox.h }}\r\n data-feedback-toolbar\r\n />\r\n )}\r\n\r\n {/* Select box */}\r\n {selectBox && (\r\n <div\r\n className={styles.selectBox}\r\n style={{ left: selectBox.x, top: selectBox.y, width: selectBox.w, height: selectBox.h }}\r\n data-feedback-toolbar\r\n />\r\n )}\r\n\r\n {/* Size indicator */}\r\n {sizeIndicator && (\r\n <div\r\n className={styles.sizeIndicator}\r\n style={{ left: sizeIndicator.x, top: sizeIndicator.y }}\r\n data-feedback-toolbar\r\n >\r\n {sizeIndicator.text}\r\n </div>\r\n )}\r\n\r\n {/* Smart guides */}\r\n {guides.map((g, i) => (\r\n <div\r\n key={`${g.axis}-${g.pos}-${i}`}\r\n className={styles.guideLine}\r\n style={g.axis === \"x\"\r\n ? { position: \"fixed\", left: g.pos, top: 0, width: 1, bottom: 0 }\r\n : { position: \"fixed\", left: 0, top: g.pos - scrollY, right: 0, height: 1 }\r\n }\r\n data-feedback-toolbar\r\n />\r\n ))}\r\n </>\r\n );\r\n}\r\n","// =============================================================================\r\n// Layout Mode Types\r\n// =============================================================================\r\n\r\nexport type ComponentType =\r\n | \"navigation\"\r\n | \"hero\"\r\n | \"card\"\r\n | \"button\"\r\n | \"sidebar\"\r\n | \"table\"\r\n | \"form\"\r\n | \"input\"\r\n | \"modal\"\r\n | \"footer\"\r\n | \"avatar\"\r\n | \"badge\"\r\n | \"text\"\r\n | \"image\"\r\n | \"list\"\r\n | \"tabs\"\r\n | \"header\"\r\n | \"section\"\r\n | \"grid\"\r\n | \"dropdown\"\r\n | \"toggle\"\r\n | \"breadcrumb\"\r\n | \"pagination\"\r\n | \"progress\"\r\n | \"divider\"\r\n | \"accordion\"\r\n | \"carousel\"\r\n | \"chart\"\r\n | \"video\"\r\n | \"search\"\r\n | \"toast\"\r\n | \"tooltip\"\r\n | \"pricing\"\r\n | \"testimonial\"\r\n | \"cta\"\r\n | \"alert\"\r\n | \"banner\"\r\n | \"stat\"\r\n | \"stepper\"\r\n | \"tag\"\r\n | \"rating\"\r\n | \"map\"\r\n | \"timeline\"\r\n | \"fileUpload\"\r\n | \"codeBlock\"\r\n | \"calendar\"\r\n | \"notification\"\r\n | \"productCard\"\r\n | \"profile\"\r\n | \"drawer\"\r\n | \"popover\"\r\n | \"logo\"\r\n | \"faq\"\r\n | \"gallery\"\r\n | \"checkbox\"\r\n | \"radio\"\r\n | \"slider\"\r\n | \"datePicker\"\r\n | \"skeleton\"\r\n | \"chip\"\r\n | \"icon\"\r\n | \"spinner\"\r\n | \"feature\"\r\n | \"team\"\r\n | \"login\"\r\n | \"contact\";\r\n\r\nexport type DesignPlacement = {\r\n id: string;\r\n type: ComponentType;\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n scrollY: number;\r\n timestamp: number;\r\n text?: string;\r\n};\r\n\r\nexport type ComponentDefinition = {\r\n type: ComponentType;\r\n label: string;\r\n width: number;\r\n height: number;\r\n};\r\n\r\nexport type ComponentSection = {\r\n section: string;\r\n items: ComponentDefinition[];\r\n};\r\n\r\n// Default sizes for each component type\r\nexport const DEFAULT_SIZES: Record<ComponentType, { width: number; height: number }> = {\r\n navigation: { width: 800, height: 56 },\r\n hero: { width: 800, height: 320 },\r\n header: { width: 800, height: 80 },\r\n section: { width: 800, height: 400 },\r\n sidebar: { width: 240, height: 400 },\r\n footer: { width: 800, height: 160 },\r\n modal: { width: 480, height: 300 },\r\n card: { width: 280, height: 240 },\r\n text: { width: 400, height: 120 },\r\n image: { width: 320, height: 200 },\r\n video: { width: 480, height: 270 },\r\n table: { width: 560, height: 220 },\r\n grid: { width: 600, height: 300 },\r\n list: { width: 300, height: 180 },\r\n chart: { width: 400, height: 240 },\r\n button: { width: 140, height: 40 },\r\n input: { width: 280, height: 56 },\r\n form: { width: 360, height: 320 },\r\n tabs: { width: 480, height: 240 },\r\n dropdown: { width: 200, height: 200 },\r\n toggle: { width: 44, height: 24 },\r\n search: { width: 320, height: 44 },\r\n avatar: { width: 48, height: 48 },\r\n badge: { width: 80, height: 28 },\r\n breadcrumb: { width: 300, height: 24 },\r\n pagination: { width: 300, height: 36 },\r\n progress: { width: 240, height: 8 },\r\n divider: { width: 600, height: 1 },\r\n accordion: { width: 400, height: 200 },\r\n carousel: { width: 600, height: 300 },\r\n toast: { width: 320, height: 64 },\r\n tooltip: { width: 180, height: 40 },\r\n pricing: { width: 300, height: 360 },\r\n testimonial: { width: 360, height: 200 },\r\n cta: { width: 600, height: 160 },\r\n alert: { width: 400, height: 56 },\r\n banner: { width: 800, height: 48 },\r\n stat: { width: 200, height: 120 },\r\n stepper: { width: 480, height: 48 },\r\n tag: { width: 72, height: 28 },\r\n rating: { width: 160, height: 28 },\r\n map: { width: 480, height: 300 },\r\n timeline: { width: 360, height: 320 },\r\n fileUpload: { width: 360, height: 180 },\r\n codeBlock: { width: 480, height: 200 },\r\n calendar: { width: 300, height: 300 },\r\n notification: { width: 360, height: 72 },\r\n productCard: { width: 280, height: 360 },\r\n profile: { width: 280, height: 200 },\r\n drawer: { width: 320, height: 400 },\r\n popover: { width: 240, height: 160 },\r\n logo: { width: 120, height: 40 },\r\n faq: { width: 560, height: 320 },\r\n gallery: { width: 560, height: 360 },\r\n checkbox: { width: 20, height: 20 },\r\n radio: { width: 20, height: 20 },\r\n slider: { width: 240, height: 32 },\r\n datePicker: { width: 300, height: 320 },\r\n skeleton: { width: 320, height: 120 },\r\n chip: { width: 96, height: 32 },\r\n icon: { width: 24, height: 24 },\r\n spinner: { width: 32, height: 32 },\r\n feature: { width: 360, height: 200 },\r\n team: { width: 560, height: 280 },\r\n login: { width: 360, height: 360 },\r\n contact: { width: 400, height: 320 },\r\n};\r\n\r\n// Component registry with sections and labels\r\nexport const COMPONENT_REGISTRY: ComponentSection[] = [\r\n {\r\n section: \"Layout\",\r\n items: [\r\n { type: \"navigation\", label: \"Navigation\", ...DEFAULT_SIZES.navigation },\r\n { type: \"header\", label: \"Header\", ...DEFAULT_SIZES.header },\r\n { type: \"hero\", label: \"Hero\", ...DEFAULT_SIZES.hero },\r\n { type: \"section\", label: \"Section\", ...DEFAULT_SIZES.section },\r\n { type: \"sidebar\", label: \"Sidebar\", ...DEFAULT_SIZES.sidebar },\r\n { type: \"footer\", label: \"Footer\", ...DEFAULT_SIZES.footer },\r\n { type: \"modal\", label: \"Modal\", ...DEFAULT_SIZES.modal },\r\n { type: \"banner\", label: \"Banner\", ...DEFAULT_SIZES.banner },\r\n { type: \"drawer\", label: \"Drawer\", ...DEFAULT_SIZES.drawer },\r\n { type: \"popover\", label: \"Popover\", ...DEFAULT_SIZES.popover },\r\n { type: \"divider\", label: \"Divider\", ...DEFAULT_SIZES.divider },\r\n ],\r\n },\r\n {\r\n section: \"Content\",\r\n items: [\r\n { type: \"card\", label: \"Card\", ...DEFAULT_SIZES.card },\r\n { type: \"text\", label: \"Text\", ...DEFAULT_SIZES.text },\r\n { type: \"image\", label: \"Image\", ...DEFAULT_SIZES.image },\r\n { type: \"video\", label: \"Video\", ...DEFAULT_SIZES.video },\r\n { type: \"table\", label: \"Table\", ...DEFAULT_SIZES.table },\r\n { type: \"grid\", label: \"Grid\", ...DEFAULT_SIZES.grid },\r\n { type: \"list\", label: \"List\", ...DEFAULT_SIZES.list },\r\n { type: \"chart\", label: \"Chart\", ...DEFAULT_SIZES.chart },\r\n { type: \"codeBlock\", label: \"Code Block\", ...DEFAULT_SIZES.codeBlock },\r\n { type: \"map\", label: \"Map\", ...DEFAULT_SIZES.map },\r\n { type: \"timeline\", label: \"Timeline\", ...DEFAULT_SIZES.timeline },\r\n { type: \"calendar\", label: \"Calendar\", ...DEFAULT_SIZES.calendar },\r\n { type: \"accordion\", label: \"Accordion\", ...DEFAULT_SIZES.accordion },\r\n { type: \"carousel\", label: \"Carousel\", ...DEFAULT_SIZES.carousel },\r\n { type: \"logo\", label: \"Logo\", ...DEFAULT_SIZES.logo },\r\n { type: \"faq\", label: \"FAQ\", ...DEFAULT_SIZES.faq },\r\n { type: \"gallery\", label: \"Gallery\", ...DEFAULT_SIZES.gallery },\r\n ],\r\n },\r\n {\r\n section: \"Controls\",\r\n items: [\r\n { type: \"button\", label: \"Button\", ...DEFAULT_SIZES.button },\r\n { type: \"input\", label: \"Input\", ...DEFAULT_SIZES.input },\r\n { type: \"search\", label: \"Search\", ...DEFAULT_SIZES.search },\r\n { type: \"form\", label: \"Form\", ...DEFAULT_SIZES.form },\r\n { type: \"tabs\", label: \"Tabs\", ...DEFAULT_SIZES.tabs },\r\n { type: \"dropdown\", label: \"Dropdown\", ...DEFAULT_SIZES.dropdown },\r\n { type: \"toggle\", label: \"Toggle\", ...DEFAULT_SIZES.toggle },\r\n { type: \"stepper\", label: \"Stepper\", ...DEFAULT_SIZES.stepper },\r\n { type: \"rating\", label: \"Rating\", ...DEFAULT_SIZES.rating },\r\n { type: \"fileUpload\", label: \"File Upload\", ...DEFAULT_SIZES.fileUpload },\r\n { type: \"checkbox\", label: \"Checkbox\", ...DEFAULT_SIZES.checkbox },\r\n { type: \"radio\", label: \"Radio\", ...DEFAULT_SIZES.radio },\r\n { type: \"slider\", label: \"Slider\", ...DEFAULT_SIZES.slider },\r\n { type: \"datePicker\", label: \"Date Picker\", ...DEFAULT_SIZES.datePicker },\r\n ],\r\n },\r\n {\r\n section: \"Elements\",\r\n items: [\r\n { type: \"avatar\", label: \"Avatar\", ...DEFAULT_SIZES.avatar },\r\n { type: \"badge\", label: \"Badge\", ...DEFAULT_SIZES.badge },\r\n { type: \"tag\", label: \"Tag\", ...DEFAULT_SIZES.tag },\r\n { type: \"breadcrumb\", label: \"Breadcrumb\", ...DEFAULT_SIZES.breadcrumb },\r\n { type: \"pagination\", label: \"Pagination\", ...DEFAULT_SIZES.pagination },\r\n { type: \"progress\", label: \"Progress\", ...DEFAULT_SIZES.progress },\r\n { type: \"alert\", label: \"Alert\", ...DEFAULT_SIZES.alert },\r\n { type: \"toast\", label: \"Toast\", ...DEFAULT_SIZES.toast },\r\n { type: \"notification\", label: \"Notification\", ...DEFAULT_SIZES.notification },\r\n { type: \"tooltip\", label: \"Tooltip\", ...DEFAULT_SIZES.tooltip },\r\n { type: \"stat\", label: \"Stat\", ...DEFAULT_SIZES.stat },\r\n { type: \"skeleton\", label: \"Skeleton\", ...DEFAULT_SIZES.skeleton },\r\n { type: \"chip\", label: \"Chip\", ...DEFAULT_SIZES.chip },\r\n { type: \"icon\", label: \"Icon\", ...DEFAULT_SIZES.icon },\r\n { type: \"spinner\", label: \"Spinner\", ...DEFAULT_SIZES.spinner },\r\n ],\r\n },\r\n {\r\n section: \"Blocks\",\r\n items: [\r\n { type: \"pricing\", label: \"Pricing\", ...DEFAULT_SIZES.pricing },\r\n { type: \"testimonial\", label: \"Testimonial\", ...DEFAULT_SIZES.testimonial },\r\n { type: \"cta\", label: \"CTA\", ...DEFAULT_SIZES.cta },\r\n { type: \"productCard\", label: \"Product Card\", ...DEFAULT_SIZES.productCard },\r\n { type: \"profile\", label: \"Profile\", ...DEFAULT_SIZES.profile },\r\n { type: \"feature\", label: \"Feature\", ...DEFAULT_SIZES.feature },\r\n { type: \"team\", label: \"Team\", ...DEFAULT_SIZES.team },\r\n { type: \"login\", label: \"Login\", ...DEFAULT_SIZES.login },\r\n { type: \"contact\", label: \"Contact\", ...DEFAULT_SIZES.contact },\r\n ],\r\n },\r\n];\r\n\r\n// Flat lookup map\r\nexport const COMPONENT_MAP: Record<string, ComponentDefinition> = {};\r\nfor (const section of COMPONENT_REGISTRY) {\r\n for (const item of section.items) {\r\n COMPONENT_MAP[item.type] = item;\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// Blank Canvas Types\r\n// =============================================================================\r\n\r\nexport type CanvasPurpose = \"new-page\" | \"replace-current\";\r\n\r\nexport type WireframeOptions = {\r\n wireframePurpose?: string;\r\n};\r\n\r\n// =============================================================================\r\n// Rearrange Mode Types\r\n// =============================================================================\r\n\r\nexport type SectionRect = { x: number; y: number; width: number; height: number };\r\n\r\nexport type DetectedSection = {\r\n id: string;\r\n label: string;\r\n tagName: string;\r\n selector: string;\r\n role: string | null;\r\n className: string | null;\r\n textSnippet: string | null;\r\n originalRect: SectionRect;\r\n currentRect: SectionRect;\r\n originalIndex: number;\r\n isFixed?: boolean;\r\n note?: string;\r\n};\r\n\r\nexport type RearrangeState = {\r\n sections: DetectedSection[];\r\n originalOrder: string[];\r\n detectedAt: number;\r\n};\r\n\r\n","\"use client\";\r\n\r\nimport type { ComponentType } from \"./types\";\r\n\r\n// =============================================================================\r\n// Wireframe Skeleton Renderers\r\n// =============================================================================\r\n//\r\n// Each component type gets a skeleton wireframe that scales to the given dimensions.\r\n// Uses inline styles referencing CSS custom properties from the layout mode overlay.\r\n\r\ntype SkeletonProps = { width: number; height: number; text?: string };\r\n\r\nfunction Bar({ w, h = 3, strong }: { w: number | string; h?: number; strong?: boolean }) {\r\n return (\r\n <div\r\n style={{\r\n width: typeof w === \"number\" ? `${w}px` : w,\r\n height: h,\r\n borderRadius: 2,\r\n background: strong ? \"var(--agd-bar-strong)\" : \"var(--agd-bar)\",\r\n flexShrink: 0,\r\n }}\r\n />\r\n );\r\n}\r\n\r\nfunction Block({\r\n w,\r\n h,\r\n radius = 3,\r\n style,\r\n}: {\r\n w: number | string;\r\n h: number | string;\r\n radius?: number;\r\n style?: React.CSSProperties;\r\n}) {\r\n return (\r\n <div\r\n style={{\r\n width: typeof w === \"number\" ? `${w}px` : w,\r\n height: typeof h === \"number\" ? `${h}px` : h,\r\n borderRadius: radius,\r\n border: \"1px dashed var(--agd-stroke)\",\r\n background: \"var(--agd-fill)\",\r\n flexShrink: 0,\r\n ...style,\r\n }}\r\n />\r\n );\r\n}\r\n\r\nfunction Circle({ size }: { size: number }) {\r\n return (\r\n <div\r\n style={{\r\n width: size,\r\n height: size,\r\n borderRadius: \"50%\",\r\n border: \"1px dashed var(--agd-stroke)\",\r\n background: \"var(--agd-fill)\",\r\n flexShrink: 0,\r\n }}\r\n />\r\n );\r\n}\r\n\r\n// --- Skeleton renderers per type ---\r\n\r\nfunction NavigationSkeleton({ width, height }: SkeletonProps) {\r\n const pad = Math.max(8, height * 0.2);\r\n return (\r\n <div style={{ display: \"flex\", alignItems: \"center\", height: \"100%\", padding: `0 ${pad}px`, gap: width * 0.02 }}>\r\n <Block w={Math.max(20, height * 0.5)} h={Math.max(12, height * 0.4)} radius={2} />\r\n <div style={{ flex: 1, display: \"flex\", gap: width * 0.03, marginLeft: width * 0.04 }}>\r\n <Bar w={width * 0.06} />\r\n <Bar w={width * 0.07} />\r\n <Bar w={width * 0.05} />\r\n <Bar w={width * 0.06} />\r\n </div>\r\n <Block w={width * 0.1} h={Math.min(28, height * 0.5)} radius={4} />\r\n </div>\r\n );\r\n}\r\n\r\nfunction HeroSkeleton({ width, height, text }: SkeletonProps) {\r\n return (\r\n <div style={{ display: \"flex\", flexDirection: \"column\", alignItems: \"center\", justifyContent: \"center\", height: \"100%\", gap: height * 0.05 }}>\r\n {text ? (\r\n <span style={{ fontSize: Math.min(20, height * 0.08), fontWeight: 600, color: \"var(--agd-text-3)\", textAlign: \"center\", maxWidth: \"80%\" }}>{text}</span>\r\n ) : (\r\n <Bar w={width * 0.5} h={Math.max(6, height * 0.04)} strong />\r\n )}\r\n <Bar w={width * 0.6} />\r\n <Bar w={width * 0.4} />\r\n <Block w={Math.min(140, width * 0.2)} h={Math.min(36, height * 0.12)} radius={6} style={{ marginTop: height * 0.06 }} />\r\n </div>\r\n );\r\n}\r\n\r\nfunction SidebarSkeleton({ width, height }: SkeletonProps) {\r\n const items = Math.max(3, Math.floor(height / 36));\r\n return (\r\n <div style={{ padding: width * 0.08, display: \"flex\", flexDirection: \"column\", gap: height * 0.03 }}>\r\n <Bar w={width * 0.6} h={4} strong />\r\n {Array.from({ length: items }, (_, i) => (\r\n <div key={i} style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\r\n <Block w={10} h={10} radius={2} />\r\n <Bar w={width * (0.4 + ((i * 17) % 30) / 100)} />\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction FooterSkeleton({ width, height }: SkeletonProps) {\r\n const cols = Math.max(2, Math.min(4, Math.floor(width / 160)));\r\n return (\r\n <div style={{ display: \"flex\", padding: `${height * 0.12}px ${width * 0.03}px`, gap: width * 0.05 }}>\r\n {Array.from({ length: cols }, (_, i) => (\r\n <div key={i} style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: 4 }}>\r\n <Bar w=\"60%\" h={3} strong />\r\n <Bar w=\"80%\" h={2} />\r\n <Bar w=\"70%\" h={2} />\r\n <Bar w=\"60%\" h={2} />\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction ModalSkeleton({ width, height }: SkeletonProps) {\r\n return (\r\n <div style={{ height: \"100%\", display: \"flex\", flexDirection: \"column\" }}>\r\n <div style={{ padding: \"10px 12px\", borderBottom: \"1px solid var(--agd-stroke)\", display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" }}>\r\n <Bar w={width * 0.3} h={4} strong />\r\n <div style={{ width: 14, height: 14, border: \"1px solid var(--agd-stroke)\", borderRadius: 3 }} />\r\n </div>\r\n <div style={{ flex: 1, padding: 12, display: \"flex\", flexDirection: \"column\", gap: 6 }}>\r\n <Bar w=\"90%\" />\r\n <Bar w=\"70%\" />\r\n <Bar w=\"80%\" />\r\n </div>\r\n <div style={{ padding: \"10px 12px\", borderTop: \"1px solid var(--agd-stroke)\", display: \"flex\", justifyContent: \"flex-end\", gap: 8 }}>\r\n <Block w={70} h={26} radius={4} />\r\n <Block w={70} h={26} radius={4} style={{ background: \"var(--agd-bar)\" }} />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction CardSkeleton({ width, height }: SkeletonProps) {\r\n return (\r\n <div style={{ height: \"100%\", display: \"flex\", flexDirection: \"column\" }}>\r\n <div style={{ height: \"40%\", background: \"var(--agd-fill)\", borderBottom: \"1px dashed var(--agd-stroke)\" }} />\r\n <div style={{ flex: 1, padding: 10, display: \"flex\", flexDirection: \"column\", gap: 5 }}>\r\n <Bar w=\"70%\" h={4} strong />\r\n <Bar w=\"95%\" h={2} />\r\n <Bar w=\"85%\" h={2} />\r\n <Bar w=\"50%\" h={2} />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction TextSkeleton({ width, height, text }: SkeletonProps) {\r\n if (text) {\r\n return (\r\n <div style={{ padding: 4, fontSize: Math.min(14, height * 0.3), lineHeight: 1.5, color: \"var(--agd-text-3)\", wordBreak: \"break-word\", overflow: \"hidden\" }}>\r\n {text}\r\n </div>\r\n );\r\n }\r\n const lines = Math.max(2, Math.floor(height / 18));\r\n return (\r\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6, padding: 4 }}>\r\n <Bar w={width * 0.6} h={5} strong />\r\n {Array.from({ length: lines }, (_, i) => (\r\n <Bar key={i} w={`${70 + ((i * 13) % 25)}%`} h={2} />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction ImageSkeleton({ width, height }: SkeletonProps) {\r\n return (\r\n <div style={{ height: \"100%\", position: \"relative\" }}>\r\n <svg width=\"100%\" height=\"100%\" viewBox={`0 0 ${width} ${height}`} preserveAspectRatio=\"none\" fill=\"none\">\r\n <line x1=\"0\" y1=\"0\" x2={width} y2={height} stroke=\"var(--agd-stroke)\" strokeWidth=\"1\" />\r\n <line x1={width} y1=\"0\" x2=\"0\" y2={height} stroke=\"var(--agd-stroke)\" strokeWidth=\"1\" />\r\n <circle cx={width * 0.3} cy={height * 0.3} r={Math.min(width, height) * 0.08} fill=\"var(--agd-fill)\" stroke=\"var(--agd-stroke)\" strokeWidth=\"0.8\" />\r\n </svg>\r\n </div>\r\n );\r\n}\r\n\r\nfunction TableSkeleton({ width, height }: SkeletonProps) {\r\n const cols = Math.max(2, Math.min(5, Math.floor(width / 100)));\r\n const rows = Math.max(2, Math.min(6, Math.floor(height / 32)));\r\n return (\r\n <div style={{ height: \"100%\", display: \"flex\", flexDirection: \"column\" }}>\r\n <div style={{ display: \"flex\", borderBottom: \"1px solid var(--agd-stroke)\", padding: \"6px 0\" }}>\r\n {Array.from({ length: cols }, (_, i) => (\r\n <div key={i} style={{ flex: 1, padding: \"0 8px\" }}><Bar w=\"70%\" h={3} strong /></div>\r\n ))}\r\n </div>\r\n {Array.from({ length: rows }, (_, r) => (\r\n <div key={r} style={{ display: \"flex\", borderBottom: \"1px solid rgba(255,255,255,0.03)\", padding: \"6px 0\" }}>\r\n {Array.from({ length: cols }, (_, c) => (\r\n <div key={c} style={{ flex: 1, padding: \"0 8px\" }}><Bar w={`${50 + ((r * 7 + c * 13) % 40)}%`} h={2} /></div>\r\n ))}\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction ListSkeleton({ width, height }: SkeletonProps) {\r\n const items = Math.max(2, Math.floor(height / 28));\r\n return (\r\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4, padding: 4 }}>\r\n {Array.from({ length: items }, (_, i) => (\r\n <div key={i} style={{ display: \"flex\", alignItems: \"center\", gap: 8, padding: \"4px 0\" }}>\r\n <Circle size={8} />\r\n <Bar w={`${55 + ((i * 17) % 35)}%`} h={2} />\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction ButtonSkeleton({ width, height, text }: SkeletonProps) {\r\n return (\r\n <div style={{\r\n height: \"100%\",\r\n borderRadius: Math.min(8, height / 3),\r\n border: \"1px solid var(--agd-stroke)\",\r\n background: \"var(--agd-fill)\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n }}>\r\n {text ? (\r\n <span style={{ fontSize: Math.min(13, height * 0.4), fontWeight: 500, color: \"var(--agd-text-3)\", letterSpacing: \"-0.01em\" }}>{text}</span>\r\n ) : (\r\n <Bar w={Math.max(20, width * 0.5)} h={3} strong />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction InputSkeleton({ width, height }: SkeletonProps) {\r\n return (\r\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4, height: \"100%\", justifyContent: \"center\" }}>\r\n <Bar w={Math.min(80, width * 0.3)} h={2} />\r\n <div style={{\r\n height: Math.min(36, height * 0.6),\r\n borderRadius: 4,\r\n border: \"1px dashed var(--agd-stroke)\",\r\n background: \"var(--agd-fill)\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n paddingLeft: 8,\r\n }}>\r\n <Bar w=\"40%\" h={2} />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction FormSkeleton({ width, height }: SkeletonProps) {\r\n const fields = Math.max(2, Math.min(5, Math.floor(height / 56)));\r\n return (\r\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: height * 0.04, padding: 8 }}>\r\n {Array.from({ length: fields }, (_, i) => (\r\n <div key={i} style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\r\n <Bar w={60 + ((i * 17) % 30)} h={2} />\r\n <Block w=\"100%\" h={28} radius={4} />\r\n </div>\r\n ))}\r\n <Block w={Math.min(120, width * 0.35)} h={30} radius={6} style={{ marginTop: 8, alignSelf: \"flex-end\", background: \"var(--agd-bar)\" }} />\r\n </div>\r\n );\r\n}\r\n\r\nfunction TabsSkeleton({ width, height }: SkeletonProps) {\r\n const tabCount = Math.max(2, Math.min(4, Math.floor(width / 120)));\r\n return (\r\n <div style={{ height: \"100%\", display: \"flex\", flexDirection: \"column\" }}>\r\n <div style={{ display: \"flex\", gap: 2, borderBottom: \"1px solid var(--agd-stroke)\" }}>\r\n {Array.from({ length: tabCount }, (_, i) => (\r\n <div key={i} style={{ padding: \"8px 12px\", borderBottom: i === 0 ? \"2px solid var(--agd-bar-strong)\" : \"none\" }}>\r\n <Bar w={60} h={3} strong={i === 0} />\r\n </div>\r\n ))}\r\n </div>\r\n <div style={{ flex: 1, padding: 12, display: \"flex\", flexDirection: \"column\", gap: 6 }}>\r\n <Bar w=\"80%\" h={2} />\r\n <Bar w=\"65%\" h={2} />\r\n <Bar w=\"75%\" h={2} />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction AvatarSkeleton({ width, height }: SkeletonProps) {\r\n const r = Math.min(width, height) / 2;\r\n return (\r\n <svg width=\"100%\" height=\"100%\" viewBox={`0 0 ${width} ${height}`} fill=\"none\">\r\n <circle cx={width / 2} cy={height / 2} r={r - 1} stroke=\"var(--agd-stroke)\" fill=\"var(--agd-fill)\" strokeWidth=\"1.5\" strokeDasharray=\"3 2\" />\r\n <circle cx={width / 2} cy={height * 0.38} r={r * 0.28} stroke=\"var(--agd-stroke)\" fill=\"var(--agd-fill)\" strokeWidth=\"0.8\" />\r\n <path\r\n d={`M${width / 2 - r * 0.55} ${height * 0.78} C${width / 2 - r * 0.55} ${height * 0.55} ${width / 2 + r * 0.55} ${height * 0.55} ${width / 2 + r * 0.55} ${height * 0.78}`}\r\n stroke=\"var(--agd-stroke)\"\r\n fill=\"var(--agd-fill)\"\r\n strokeWidth=\"0.8\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction BadgeSkeleton({ width, height }: SkeletonProps) {\r\n return (\r\n <div style={{\r\n height: \"100%\",\r\n borderRadius: height / 2,\r\n border: \"1px solid var(--agd-stroke)\",\r\n background: \"var(--agd-fill)\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n }}>\r\n <Bar w={Math.max(16, width * 0.5)} h={2} strong />\r\n </div>\r\n );\r\n}\r\n\r\nfunction HeaderSkeleton({ width, height }: SkeletonProps) {\r\n return (\r\n <div style={{ display: \"flex\", flexDirection: \"column\", alignItems: \"center\", justifyContent: \"center\", height: \"100%\", gap: height * 0.08 }}>\r\n <Bar w={width * 0.5} h={Math.max(5, height * 0.06)} strong />\r\n <Bar w={width * 0.35} />\r\n </div>\r\n );\r\n}\r\n\r\nfunction SectionSkeleton({ width, height }: SkeletonProps) {\r\n return (\r\n <div style={{ display: \"flex\", flexDirection: \"column\", height: \"100%\", gap: height * 0.04, padding: width * 0.04 }}>\r\n <Bar w={width * 0.3} h={4} strong />\r\n <Bar w={width * 0.7} />\r\n <Bar w={width * 0.5} />\r\n <div style={{ flex: 1, display: \"flex\", gap: width * 0.03, marginTop: height * 0.06 }}>\r\n <Block w=\"33%\" h=\"100%\" radius={4} />\r\n <Block w=\"33%\" h=\"100%\" radius={4} />\r\n <Block w=\"33%\" h=\"100%\" radius={4} />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction GridSkeleton({ width, height }: SkeletonProps) {\r\n const cols = Math.max(2, Math.min(4, Math.floor(width / 140)));\r\n const rows = Math.max(1, Math.min(3, Math.floor(height / 120)));\r\n return (\r\n <div style={{ display: \"grid\", gridTemplateColumns: `repeat(${cols}, 1fr)`, gridTemplateRows: `repeat(${rows}, 1fr)`, gap: 6, height: \"100%\" }}>\r\n {Array.from({ length: cols * rows }, (_, i) => (\r\n <Block key={i} w=\"100%\" h=\"100%\" radius={4} />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction DropdownSkeleton({ width, height }: SkeletonProps) {\r\n const items = Math.max(2, Math.floor((height - 32) / 28));\r\n return (\r\n <div style={{ height: \"100%\", display: \"flex\", flexDirection: \"column\" }}>\r\n <div style={{ padding: \"6px 8px\", borderBottom: \"1px solid var(--agd-stroke)\" }}>\r\n <Bar w={width * 0.5} h={3} strong />\r\n </div>\r\n <div style={{ flex: 1, padding: 4, display: \"flex\", flexDirection: \"column\", gap: 2 }}>\r\n {Array.from({ length: items }, (_, i) => (\r\n <div key={i} style={{ padding: \"4px 6px\", borderRadius: 3, background: i === 0 ? \"var(--agd-fill)\" : \"transparent\" }}>\r\n <Bar w={`${50 + ((i * 17) % 35)}%`} h={2} strong={i === 0} />\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction ToggleSkeleton({ width, height }: SkeletonProps) {\r\n const r = Math.min(width, height) / 2;\r\n return (\r\n <svg width=\"100%\" height=\"100%\" viewBox={`0 0 ${width} ${height}`} fill=\"none\">\r\n <rect x=\"1\" y=\"1\" width={width - 2} height={height - 2} rx={r} stroke=\"var(--agd-stroke)\" strokeWidth=\"1\" />\r\n <circle cx={width - r} cy={height / 2} r={r * 0.7} fill=\"var(--agd-bar)\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction SearchSkeleton({ width, height }: SkeletonProps) {\r\n const r = Math.min(height / 2, 20);\r\n return (\r\n <div style={{ height: \"100%\", borderRadius: r, border: \"1px dashed var(--agd-stroke)\", background: \"var(--agd-fill)\", display: \"flex\", alignItems: \"center\", padding: `0 ${r * 0.6}px`, gap: 6 }}>\r\n <Circle size={Math.min(14, height * 0.4)} />\r\n <Bar w=\"50%\" h={2} />\r\n </div>\r\n );\r\n}\r\n\r\nfunction ToastSkeleton({ width, height }: SkeletonProps) {\r\n return (\r\n <div style={{ height: \"100%\", borderRadius: 8, border: \"1px dashed var(--agd-stroke)\", background: \"var(--agd-fill)\", display: \"flex\", alignItems: \"center\", padding: \"0 10px\", gap: 8 }}>\r\n <Circle size={Math.min(20, height * 0.5)} />\r\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: 3 }}>\r\n <Bar w=\"60%\" h={3} strong />\r\n <Bar w=\"80%\" h={2} />\r\n </div>\r\n <div style={{ width: 14, height: 14, border: \"1px solid var(--agd-stroke)\", borderRadius: 3, flexShrink: 0 }} />\r\n </div>\r\n );\r\n}\r\n\r\nfunction ProgressSkeleton({ width, height }: SkeletonProps) {\r\n return (\r\n <svg width=\"100%\" height=\"100%\" viewBox={`0 0 ${width} ${height}`} fill=\"none\">\r\n <rect x=\"0\" y=\"0\" width={width} height={height} rx={height / 2} stroke=\"var(--agd-stroke)\" strokeWidth=\"0.8\" />\r\n <rect x=\"1\" y=\"1\" width={width * 0.65} height={height - 2} rx={(height - 2) / 2} fill=\"var(--agd-bar)\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ChartSkeleton({ width, height }: SkeletonProps) {\r\n const bars = Math.max(3, Math.min(7, Math.floor(width / 50)));\r\n const barW = width / (bars * 2);\r\n return (\r\n <div style={{ height: \"100%\", display: \"flex\", alignItems: \"flex-end\", justifyContent: \"space-around\", padding: \"0 4px\", borderBottom: \"1px solid var(--agd-stroke)\" }}>\r\n {Array.from({ length: bars }, (_, i) => {\r\n const h = 30 + ((i * 37 + 17) % 55);\r\n return <Block key={i} w={barW} h={`${h}%`} radius={2} />;\r\n })}\r\n </div>\r\n );\r\n}\r\n\r\nfunction VideoSkeleton({ width, height }: SkeletonProps) {\r\n const btnR = Math.min(width, height) * 0.12;\r\n return (\r\n <div style={{ height: \"100%\", position: \"relative\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}>\r\n <Block w=\"100%\" h=\"100%\" radius={4} />\r\n <div style={{ position: \"absolute\", width: btnR * 2, height: btnR * 2, borderRadius: \"50%\", border: \"1.5px solid var(--agd-stroke)\", background: \"var(--agd-fill)\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}>\r\n <div style={{ width: 0, height: 0, borderLeft: `${btnR * 0.6}px solid var(--agd-bar-strong)`, borderTop: `${btnR * 0.4}px solid transparent`, borderBottom: `${btnR * 0.4}px solid transparent`, marginLeft: btnR * 0.15 }} />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction TooltipSkeleton({ width, height }: SkeletonProps) {\r\n return (\r\n <div style={{ height: \"100%\", display: \"flex\", flexDirection: \"column\", alignItems: \"center\" }}>\r\n <div style={{ flex: 1, width: \"100%\", borderRadius: 6, border: \"1px dashed var(--agd-stroke)\", background: \"var(--agd-fill)\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}>\r\n <Bar w=\"60%\" h={2} />\r\n </div>\r\n <div style={{ width: 8, height: 8, background: \"var(--agd-fill)\", border: \"1px dashed var(--agd-stroke)\", borderTop: \"none\", borderLeft: \"none\", transform: \"rotate(45deg)\", marginTop: -5 }} />\r\n </div>\r\n );\r\n}\r\n\r\nfunction BreadcrumbSkeleton({ width, height }: SkeletonProps) {\r\n const items = Math.max(2, Math.min(4, Math.floor(width / 80)));\r\n return (\r\n <div style={{ display: \"flex\", alignItems: \"center\", height: \"100%\", gap: 4 }}>\r\n {Array.from({ length: items }, (_, i) => (\r\n <div key={i} style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\r\n {i > 0 && <span style={{ color: \"var(--agd-stroke)\", fontSize: 10 }}>/</span>}\r\n <Bar w={40 + ((i * 13) % 20)} h={2} strong={i === items - 1} />\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction PaginationSkeleton({ width, height }: SkeletonProps) {\r\n const count = Math.max(3, Math.min(5, Math.floor(width / 40)));\r\n const sz = Math.min(28, height * 0.8);\r\n return (\r\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"center\", height: \"100%\", gap: 4 }}>\r\n {Array.from({ length: count }, (_, i) => (\r\n <Block key={i} w={sz} h={sz} radius={4} style={i === 1 ? { background: \"var(--agd-bar)\" } : undefined} />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction DividerSkeleton({ width }: SkeletonProps) {\r\n return (\r\n <div style={{ display: \"flex\", alignItems: \"center\", height: \"100%\" }}>\r\n <div style={{ width: \"100%\", height: 1, background: \"var(--agd-stroke)\" }} />\r\n </div>\r\n );\r\n}\r\n\r\nfunction AccordionSkeleton({ width, height }: SkeletonProps) {\r\n const items = Math.max(2, Math.min(4, Math.floor(height / 40)));\r\n return (\r\n <div style={{ display: \"flex\", flexDirection: \"column\", height: \"100%\" }}>\r\n {Array.from({ length: items }, (_, i) => (\r\n <div key={i} style={{ borderBottom: \"1px solid var(--agd-stroke)\", padding: \"8px 6px\", display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", flex: i === 0 ? 2 : 1 }}>\r\n <Bar w={`${40 + ((i * 17) % 25)}%`} h={3} strong />\r\n <span style={{ fontSize: 8, color: \"var(--agd-stroke)\" }}>{i === 0 ? \"▼\" : \"▶\"}</span>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction CarouselSkeleton({ width, height }: SkeletonProps) {\r\n return (\r\n <div style={{ height: \"100%\", display: \"flex\", flexDirection: \"column\", gap: 6 }}>\r\n <div style={{ flex: 1, display: \"flex\", gap: 6, alignItems: \"center\" }}>\r\n <span style={{ fontSize: 12, color: \"var(--agd-stroke)\" }}>‹</span>\r\n <Block w=\"100%\" h=\"100%\" radius={4} />\r\n <span style={{ fontSize: 12, color: \"var(--agd-stroke)\" }}>›</span>\r\n </div>\r\n <div style={{ display: \"flex\", justifyContent: \"center\", gap: 4 }}>\r\n <Circle size={5} />\r\n <Circle size={5} />\r\n <Circle size={5} />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction PricingSkeleton({ width, height }: SkeletonProps) {\r\n return (\r\n <div style={{ height: \"100%\", display: \"flex\", flexDirection: \"column\", alignItems: \"center\", padding: 10, gap: height * 0.04 }}>\r\n <Bar w={width * 0.4} h={3} strong />\r\n <Bar w={width * 0.3} h={6} strong />\r\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: 4, width: \"100%\", padding: \"8px 0\" }}>\r\n {Array.from({ length: 4 }, (_, i) => (\r\n <div key={i} style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\r\n <Circle size={5} />\r\n <Bar w={`${50 + ((i * 17) % 35)}%`} h={2} />\r\n </div>\r\n ))}\r\n </div>\r\n <Block w={width * 0.7} h={Math.min(32, height * 0.1)} radius={6} style={{ background: \"var(--agd-bar)\" }} />\r\n </div>\r\n );\r\n}\r\n\r\nfunction TestimonialSkeleton({ width, height }: SkeletonProps) {\r\n return (\r\n <div style={{ height: \"100%\", display: \"flex\", flexDirection: \"column\", padding: 10, gap: 8 }}>\r\n <span style={{ fontSize: 18, lineHeight: 1, color: \"var(--agd-stroke)\", fontFamily: \"serif\" }}>“</span>\r\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: 4 }}>\r\n <Bar w=\"90%\" h={2} />\r\n <Bar w=\"75%\" h={2} />\r\n <Bar w=\"60%\" h={2} />\r\n </div>\r\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\r\n <Circle size={20} />\r\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\r\n <Bar w={60} h={3} strong />\r\n <Bar w={40} h={2} />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction CtaSkeleton({ width, height }: SkeletonProps) {\r\n return (\r\n <div style={{ display: \"flex\", flexDirection: \"column\", alignItems: \"center\", justifyContent: \"center\", height: \"100%\", gap: height * 0.08 }}>\r\n <Bar w={width * 0.5} h={Math.max(4, height * 0.05)} strong />\r\n <Bar w={width * 0.35} />\r\n <Block w={Math.min(140, width * 0.25)} h={Math.min(32, height * 0.15)} radius={6} style={{ marginTop: height * 0.04, background: \"var(--agd-bar)\" }} />\r\n </div>\r\n );\r\n}\r\n\r\nfunction AlertSkeleton({ width, height }: SkeletonProps) {\r\n return (\r\n <div style={{ height: \"100%\", borderRadius: 6, border: \"1px dashed var(--agd-stroke)\", background: \"var(--agd-fill)\", display: \"flex\", alignItems: \"center\", padding: \"0 10px\", gap: 8 }}>\r\n <div style={{ width: 16, height: 16, borderRadius: \"50%\", border: \"1.5px solid var(--agd-bar-strong)\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\", flexShrink: 0 }}>\r\n <div style={{ width: 2, height: 6, background: \"var(--agd-bar-strong)\", borderRadius: 1 }} />\r\n </div>\r\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: 3 }}>\r\n <Bar w=\"40%\" h={3} strong />\r\n <Bar w=\"70%\" h={2} />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction BannerSkeleton({ width, height }: SkeletonProps) {\r\n return (\r\n <div style={{ height: \"100%\", background: \"var(--agd-fill)\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\", gap: 8, padding: \"0 12px\" }}>\r\n <Bar w={width * 0.4} h={3} strong />\r\n <Block w={60} h={Math.min(24, height * 0.6)} radius={4} />\r\n </div>\r\n );\r\n}\r\n\r\nfunction StatSkeleton({ width, height }: SkeletonProps) {\r\n return (\r\n <div style={{ height: \"100%\", display: \"flex\", flexDirection: \"column\", alignItems: \"center\", justifyContent: \"center\", gap: height * 0.06 }}>\r\n <Bar w={width * 0.5} h={2} />\r\n <Bar w={width * 0.4} h={Math.max(8, height * 0.18)} strong />\r\n <Bar w={width * 0.3} h={2} />\r\n </div>\r\n );\r\n}\r\n\r\nfunction StepperSkeleton({ width, height }: SkeletonProps) {\r\n const steps = Math.max(3, Math.min(5, Math.floor(width / 100)));\r\n const dotR = Math.min(12, height * 0.35);\r\n return (\r\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", height: \"100%\", padding: \"0 8px\" }}>\r\n {Array.from({ length: steps }, (_, i) => (\r\n <div key={i} style={{ display: \"flex\", alignItems: \"center\", gap: 0, flex: 1 }}>\r\n <div style={{ width: dotR, height: dotR, borderRadius: \"50%\", border: \"1.5px solid var(--agd-stroke)\", background: i === 0 ? \"var(--agd-bar)\" : \"transparent\", flexShrink: 0 }} />\r\n {i < steps - 1 && <div style={{ flex: 1, height: 1, background: \"var(--agd-stroke)\", margin: \"0 4px\" }} />}\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction TagSkeleton({ width, height }: SkeletonProps) {\r\n return (\r\n <div style={{ height: \"100%\", borderRadius: 4, border: \"1px solid var(--agd-stroke)\", background: \"var(--agd-fill)\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\", gap: 4, padding: \"0 6px\" }}>\r\n <Bar w={Math.max(16, width * 0.5)} h={2} strong />\r\n <div style={{ width: 8, height: 8, borderRadius: \"50%\", border: \"1px solid var(--agd-stroke)\", flexShrink: 0 }} />\r\n </div>\r\n );\r\n}\r\n\r\nfunction RatingSkeleton({ width, height }: SkeletonProps) {\r\n const stars = 5;\r\n const sz = Math.min(height * 0.7, width / (stars * 1.5));\r\n return (\r\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"center\", height: \"100%\", gap: sz * 0.2 }}>\r\n {Array.from({ length: stars }, (_, i) => (\r\n <svg key={i} width={sz} height={sz} viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 1.5l2 4 4.5.7-3.25 3.1.75 4.5L8 11.4l-4 2.4.75-4.5L1.5 6.2 6 5.5z\" stroke=\"var(--agd-stroke)\" strokeWidth=\"0.8\" fill={i < 3 ? \"var(--agd-bar)\" : \"none\"} />\r\n </svg>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction MapSkeleton({ width, height }: SkeletonProps) {\r\n return (\r\n <div style={{ height: \"100%\", position: \"relative\", borderRadius: 4, border: \"1px dashed var(--agd-stroke)\", background: \"var(--agd-fill)\", overflow: \"hidden\" }}>\r\n <svg width=\"100%\" height=\"100%\" viewBox={`0 0 ${width} ${height}`} fill=\"none\" style={{ position: \"absolute\", inset: 0 }}>\r\n <line x1={0} y1={height * 0.3} x2={width} y2={height * 0.7} stroke=\"var(--agd-stroke)\" strokeWidth=\"0.5\" opacity=\".2\" />\r\n <line x1={0} y1={height * 0.6} x2={width} y2={height * 0.2} stroke=\"var(--agd-stroke)\" strokeWidth=\"0.5\" opacity=\".15\" />\r\n <line x1={width * 0.4} y1={0} x2={width * 0.6} y2={height} stroke=\"var(--agd-stroke)\" strokeWidth=\"0.5\" opacity=\".15\" />\r\n </svg>\r\n <div style={{ position: \"absolute\", left: \"50%\", top: \"40%\", transform: \"translate(-50%, -100%)\" }}>\r\n <svg width=\"16\" height=\"22\" viewBox=\"0 0 16 22\" fill=\"none\">\r\n <path d=\"M8 0C3.6 0 0 3.6 0 8c0 6 8 14 8 14s8-8 8-14c0-4.4-3.6-8-8-8z\" fill=\"var(--agd-bar)\" opacity=\".4\" />\r\n <circle cx=\"8\" cy=\"8\" r=\"3\" fill=\"var(--agd-fill)\" />\r\n </svg>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction TimelineSkeleton({ width, height }: SkeletonProps) {\r\n const items = Math.max(3, Math.min(5, Math.floor(height / 60)));\r\n return (\r\n <div style={{ display: \"flex\", height: \"100%\", padding: \"8px 0\" }}>\r\n <div style={{ width: 16, display: \"flex\", flexDirection: \"column\", alignItems: \"center\" }}>\r\n {Array.from({ length: items }, (_, i) => (\r\n <div key={i} style={{ display: \"flex\", flexDirection: \"column\", alignItems: \"center\", flex: 1 }}>\r\n <Circle size={8} />\r\n {i < items - 1 && <div style={{ flex: 1, width: 1, background: \"var(--agd-stroke)\" }} />}\r\n </div>\r\n ))}\r\n </div>\r\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", justifyContent: \"space-around\", paddingLeft: 8 }}>\r\n {Array.from({ length: items }, (_, i) => (\r\n <div key={i} style={{ display: \"flex\", flexDirection: \"column\", gap: 3 }}>\r\n <Bar w={`${35 + ((i * 13) % 25)}%`} h={3} strong />\r\n <Bar w={`${50 + ((i * 17) % 30)}%`} h={2} />\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction FileUploadSkeleton({ width, height }: SkeletonProps) {\r\n return (\r\n <div style={{ height: \"100%\", borderRadius: 8, border: \"2px dashed var(--agd-stroke)\", display: \"flex\", flexDirection: \"column\", alignItems: \"center\", justifyContent: \"center\", gap: height * 0.06 }}>\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M12 16V4m0 0l-4 4m4-4l4 4\" stroke=\"var(--agd-stroke)\" strokeWidth=\"1.5\" />\r\n <path d=\"M4 17v2a1 1 0 001 1h14a1 1 0 001-1v-2\" stroke=\"var(--agd-stroke)\" strokeWidth=\"1.5\" />\r\n </svg>\r\n <Bar w={width * 0.4} h={2} />\r\n <Bar w={width * 0.25} h={2} />\r\n </div>\r\n );\r\n}\r\n\r\nfunction CodeBlockSkeleton({ width, height }: SkeletonProps) {\r\n const lines = Math.max(3, Math.min(8, Math.floor(height / 20)));\r\n return (\r\n <div style={{ height: \"100%\", borderRadius: 6, background: \"var(--agd-fill)\", border: \"1px solid var(--agd-stroke)\", padding: 8, display: \"flex\", flexDirection: \"column\", gap: 4 }}>\r\n <div style={{ display: \"flex\", gap: 3, marginBottom: 4 }}>\r\n <Circle size={6} />\r\n <Circle size={6} />\r\n <Circle size={6} />\r\n </div>\r\n {Array.from({ length: lines }, (_, i) => (\r\n <div key={i} style={{ display: \"flex\", gap: 6, paddingLeft: ((i > 0 && i < lines - 1) ? 12 : 0) }}>\r\n <Bar w={`${25 + ((i * 23) % 50)}%`} h={2} strong={i === 0} />\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction CalendarSkeleton({ width, height }: SkeletonProps) {\r\n const cols = 7;\r\n const rows = 5;\r\n const cellSz = Math.min((width - 16) / cols, (height - 40) / (rows + 1));\r\n return (\r\n <div style={{ height: \"100%\", display: \"flex\", flexDirection: \"column\" }}>\r\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", padding: \"6px 8px\" }}>\r\n <span style={{ fontSize: 8, color: \"var(--agd-stroke)\" }}>‹</span>\r\n <Bar w={width * 0.3} h={3} strong />\r\n <span style={{ fontSize: 8, color: \"var(--agd-stroke)\" }}>›</span>\r\n </div>\r\n <div style={{ display: \"grid\", gridTemplateColumns: `repeat(${cols}, 1fr)`, gap: 2, padding: \"0 4px\", flex: 1 }}>\r\n {Array.from({ length: cols }, (_, i) => (\r\n <div key={`h${i}`} style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"center\", height: cellSz * 0.6 }}>\r\n <Bar w={cellSz * 0.5} h={2} />\r\n </div>\r\n ))}\r\n {Array.from({ length: cols * rows }, (_, i) => (\r\n <div key={i} style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"center\", height: cellSz }}>\r\n <div style={{ width: cellSz * 0.6, height: cellSz * 0.6, borderRadius: \"50%\", background: i === 12 ? \"var(--agd-bar)\" : \"transparent\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}>\r\n <div style={{ width: 2, height: 2, borderRadius: 1, background: \"var(--agd-bar-strong)\", opacity: i === 12 ? 1 : 0.3 }} />\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction NotificationSkeleton({ width, height }: SkeletonProps) {\r\n return (\r\n <div style={{ height: \"100%\", borderRadius: 8, border: \"1px dashed var(--agd-stroke)\", background: \"var(--agd-fill)\", display: \"flex\", alignItems: \"center\", padding: \"0 10px\", gap: 8 }}>\r\n <Circle size={Math.min(32, height * 0.55)} />\r\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: 3 }}>\r\n <Bar w=\"50%\" h={3} strong />\r\n <Bar w=\"75%\" h={2} />\r\n </div>\r\n <Bar w={30} h={2} />\r\n </div>\r\n );\r\n}\r\n\r\nfunction ProductCardSkeleton({ width, height }: SkeletonProps) {\r\n return (\r\n <div style={{ height: \"100%\", display: \"flex\", flexDirection: \"column\" }}>\r\n <div style={{ height: \"50%\", background: \"var(--agd-fill)\", borderBottom: \"1px dashed var(--agd-stroke)\" }} />\r\n <div style={{ flex: 1, padding: 10, display: \"flex\", flexDirection: \"column\", gap: 5 }}>\r\n <Bar w=\"65%\" h={4} strong />\r\n <Bar w=\"40%\" h={3} />\r\n <div style={{ flex: 1 }} />\r\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" }}>\r\n <Bar w=\"30%\" h={5} strong />\r\n <Block w={Math.min(70, width * 0.3)} h={26} radius={4} style={{ background: \"var(--agd-bar)\" }} />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction ProfileSkeleton({ width, height }: SkeletonProps) {\r\n const avatarSz = Math.min(48, height * 0.3);\r\n return (\r\n <div style={{ height: \"100%\", display: \"flex\", flexDirection: \"column\", alignItems: \"center\", justifyContent: \"center\", gap: height * 0.06 }}>\r\n <Circle size={avatarSz} />\r\n <Bar w={width * 0.45} h={4} strong />\r\n <Bar w={width * 0.3} h={2} />\r\n <div style={{ display: \"flex\", gap: width * 0.08, marginTop: height * 0.04 }}>\r\n <div style={{ display: \"flex\", flexDirection: \"column\", alignItems: \"center\", gap: 2 }}>\r\n <Bar w={20} h={3} strong />\r\n <Bar w={28} h={2} />\r\n </div>\r\n <div style={{ display: \"flex\", flexDirection: \"column\", alignItems: \"center\", gap: 2 }}>\r\n <Bar w={20} h={3} strong />\r\n <Bar w={28} h={2} />\r\n </div>\r\n <div style={{ display: \"flex\", flexDirection: \"column\", alignItems: \"center\", gap: 2 }}>\r\n <Bar w={20} h={3} strong />\r\n <Bar w={28} h={2} />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction DrawerSkeleton({ width, height }: SkeletonProps) {\r\n const panelW = Math.max(width * 0.6, 80);\r\n const items = Math.max(3, Math.floor(height / 40));\r\n return (\r\n <div style={{ height: \"100%\", display: \"flex\" }}>\r\n <div style={{ width: width - panelW, background: \"var(--agd-fill)\", opacity: 0.3 }} />\r\n <div style={{ flex: 1, borderLeft: \"1px solid var(--agd-stroke)\", display: \"flex\", flexDirection: \"column\", padding: width * 0.04 }}>\r\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginBottom: height * 0.06 }}>\r\n <Bar w={panelW * 0.4} h={4} strong />\r\n <div style={{ width: 12, height: 12, border: \"1px solid var(--agd-stroke)\", borderRadius: 3 }} />\r\n </div>\r\n {Array.from({ length: items }, (_, i) => (\r\n <div key={i} style={{ padding: \"6px 0\" }}>\r\n <Bar w={`${50 + ((i * 17) % 35)}%`} h={2} strong={i === 0} />\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction PopoverSkeleton({ width, height }: SkeletonProps) {\r\n return (\r\n <div style={{ height: \"100%\", display: \"flex\", flexDirection: \"column\", alignItems: \"center\" }}>\r\n <div style={{ flex: 1, width: \"100%\", borderRadius: 8, border: \"1px dashed var(--agd-stroke)\", background: \"var(--agd-fill)\", padding: 10, display: \"flex\", flexDirection: \"column\", gap: 5 }}>\r\n <Bar w=\"70%\" h={3} strong />\r\n <Bar w=\"90%\" h={2} />\r\n <Bar w=\"60%\" h={2} />\r\n </div>\r\n <div style={{ width: 10, height: 10, background: \"var(--agd-fill)\", border: \"1px dashed var(--agd-stroke)\", borderTop: \"none\", borderLeft: \"none\", transform: \"rotate(45deg)\", marginTop: -6 }} />\r\n </div>\r\n );\r\n}\r\n\r\nfunction LogoSkeleton({ width, height }: SkeletonProps) {\r\n const iconSz = Math.min(height * 0.7, width * 0.3);\r\n return (\r\n <div style={{ height: \"100%\", display: \"flex\", alignItems: \"center\", gap: width * 0.08 }}>\r\n <Block w={iconSz} h={iconSz} radius={iconSz * 0.25} />\r\n <Bar w={width * 0.45} h={Math.max(4, height * 0.2)} strong />\r\n </div>\r\n );\r\n}\r\n\r\nfunction FaqSkeleton({ width, height }: SkeletonProps) {\r\n const items = Math.max(2, Math.min(5, Math.floor(height / 56)));\r\n return (\r\n <div style={{ display: \"flex\", flexDirection: \"column\", height: \"100%\" }}>\r\n {Array.from({ length: items }, (_, i) => (\r\n <div key={i} style={{ borderBottom: \"1px solid var(--agd-stroke)\", padding: \"8px 6px\", display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", flex: i === 0 ? 2 : 1 }}>\r\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\r\n <span style={{ fontSize: 9, fontWeight: 700, color: \"var(--agd-stroke)\" }}>Q</span>\r\n <Bar w={width * (0.3 + ((i * 13) % 25) / 100)} h={3} strong />\r\n </div>\r\n <span style={{ fontSize: 8, color: \"var(--agd-stroke)\" }}>{i === 0 ? \"▼\" : \"▶\"}</span>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction GallerySkeleton({ width, height }: SkeletonProps) {\r\n const cols = Math.max(2, Math.min(4, Math.floor(width / 120)));\r\n const rows = Math.max(1, Math.min(3, Math.floor(height / 120)));\r\n return (\r\n <div style={{ display: \"grid\", gridTemplateColumns: `repeat(${cols}, 1fr)`, gridTemplateRows: `repeat(${rows}, 1fr)`, gap: 4, height: \"100%\" }}>\r\n {Array.from({ length: cols * rows }, (_, i) => (\r\n <div key={i} style={{ borderRadius: 4, border: \"1px dashed var(--agd-stroke)\", background: \"var(--agd-fill)\", position: \"relative\", overflow: \"hidden\" }}>\r\n <svg width=\"100%\" height=\"100%\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\" fill=\"none\">\r\n <line x1=\"0\" y1=\"0\" x2=\"100\" y2=\"100\" stroke=\"var(--agd-stroke)\" strokeWidth=\"0.5\" />\r\n <line x1=\"100\" y1=\"0\" x2=\"0\" y2=\"100\" stroke=\"var(--agd-stroke)\" strokeWidth=\"0.5\" />\r\n </svg>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction CheckboxSkeleton({ width, height }: SkeletonProps) {\r\n const sz = Math.min(width, height);\r\n return (\r\n <svg width=\"100%\" height=\"100%\" viewBox={`0 0 ${width} ${height}`} fill=\"none\">\r\n <rect x=\"1\" y={(height - sz + 2) / 2} width={sz - 2} height={sz - 2} rx={sz * 0.15} stroke=\"var(--agd-stroke)\" strokeWidth=\"1.5\" />\r\n <path d={`M${sz * 0.25} ${height / 2}l${sz * 0.2} ${sz * 0.2} ${sz * 0.3}-${sz * 0.35}`} stroke=\"var(--agd-bar)\" strokeWidth=\"1.5\" fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction RadioSkeleton({ width, height }: SkeletonProps) {\r\n const r = Math.min(width, height) / 2 - 1;\r\n return (\r\n <svg width=\"100%\" height=\"100%\" viewBox={`0 0 ${width} ${height}`} fill=\"none\">\r\n <circle cx={width / 2} cy={height / 2} r={r} stroke=\"var(--agd-stroke)\" strokeWidth=\"1.5\" />\r\n <circle cx={width / 2} cy={height / 2} r={r * 0.45} fill=\"var(--agd-bar)\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction SliderSkeleton({ width, height }: SkeletonProps) {\r\n const trackH = Math.max(2, height * 0.12);\r\n const thumbR = Math.min(height * 0.35, 10);\r\n const fillW = width * 0.55;\r\n return (\r\n <div style={{ height: \"100%\", display: \"flex\", alignItems: \"center\", position: \"relative\" }}>\r\n <div style={{ width: \"100%\", height: trackH, borderRadius: trackH / 2, background: \"var(--agd-fill)\", border: \"1px solid var(--agd-stroke)\", position: \"relative\" }}>\r\n <div style={{ width: fillW, height: \"100%\", borderRadius: trackH / 2, background: \"var(--agd-bar)\" }} />\r\n </div>\r\n <div style={{ position: \"absolute\", left: fillW - thumbR, width: thumbR * 2, height: thumbR * 2, borderRadius: \"50%\", border: \"1.5px solid var(--agd-stroke)\", background: \"var(--agd-fill)\" }} />\r\n </div>\r\n );\r\n}\r\n\r\nfunction DatePickerSkeleton({ width, height }: SkeletonProps) {\r\n const inputH = Math.min(36, height * 0.15);\r\n const cols = 7;\r\n const rows = 4;\r\n const cellSz = Math.min((width - 16) / cols, (height - inputH - 40) / (rows + 1));\r\n return (\r\n <div style={{ height: \"100%\", display: \"flex\", flexDirection: \"column\", gap: 4 }}>\r\n <div style={{ height: inputH, borderRadius: 4, border: \"1px dashed var(--agd-stroke)\", background: \"var(--agd-fill)\", display: \"flex\", alignItems: \"center\", padding: \"0 8px\", justifyContent: \"space-between\" }}>\r\n <Bar w=\"40%\" h={2} />\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill=\"none\"><rect x=\"2\" y=\"3\" width=\"12\" height=\"11\" rx=\"1\" stroke=\"var(--agd-stroke)\" strokeWidth=\"1\" /><line x1=\"2\" y1=\"6\" x2=\"14\" y2=\"6\" stroke=\"var(--agd-stroke)\" strokeWidth=\"0.5\" /></svg>\r\n </div>\r\n <div style={{ flex: 1, borderRadius: 6, border: \"1px dashed var(--agd-stroke)\", background: \"var(--agd-fill)\", display: \"flex\", flexDirection: \"column\" }}>\r\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", padding: \"4px 6px\" }}>\r\n <span style={{ fontSize: 7, color: \"var(--agd-stroke)\" }}>‹</span>\r\n <Bar w={width * 0.25} h={2} strong />\r\n <span style={{ fontSize: 7, color: \"var(--agd-stroke)\" }}>›</span>\r\n </div>\r\n <div style={{ display: \"grid\", gridTemplateColumns: `repeat(${cols}, 1fr)`, gap: 1, padding: \"0 4px\", flex: 1 }}>\r\n {Array.from({ length: cols * rows }, (_, i) => (\r\n <div key={i} style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"center\", height: cellSz }}>\r\n <div style={{ width: cellSz * 0.5, height: cellSz * 0.5, borderRadius: \"50%\", background: i === 10 ? \"var(--agd-bar)\" : \"transparent\" }}>\r\n <div style={{ width: \"100%\", height: \"100%\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}>\r\n <div style={{ width: 1.5, height: 1.5, borderRadius: 1, background: \"var(--agd-bar-strong)\", opacity: i === 10 ? 1 : 0.25 }} />\r\n </div>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction SkeletonSkeletonRenderer({ width, height }: SkeletonProps) {\r\n return (\r\n <div style={{ height: \"100%\", display: \"flex\", flexDirection: \"column\", gap: height * 0.08, padding: 4 }}>\r\n <div style={{ width: \"100%\", height: height * 0.2, borderRadius: 4, background: \"var(--agd-fill)\" }} />\r\n <div style={{ width: \"70%\", height: Math.max(6, height * 0.1), borderRadius: 3, background: \"var(--agd-fill)\" }} />\r\n <div style={{ width: \"90%\", height: Math.max(4, height * 0.06), borderRadius: 3, background: \"var(--agd-fill)\" }} />\r\n <div style={{ width: \"50%\", height: Math.max(4, height * 0.06), borderRadius: 3, background: \"var(--agd-fill)\" }} />\r\n </div>\r\n );\r\n}\r\n\r\nfunction ChipSkeleton({ width, height }: SkeletonProps) {\r\n return (\r\n <div style={{ height: \"100%\", display: \"flex\", alignItems: \"center\", gap: 6 }}>\r\n <div style={{ height: \"100%\", flex: 1, borderRadius: height / 2, border: \"1px solid var(--agd-stroke)\", background: \"var(--agd-fill)\", display: \"flex\", alignItems: \"center\", padding: `0 ${height * 0.3}px`, gap: 4 }}>\r\n <Bar w=\"60%\" h={2} strong />\r\n <div style={{ width: Math.max(6, height * 0.3), height: Math.max(6, height * 0.3), borderRadius: \"50%\", border: \"1px solid var(--agd-stroke)\", flexShrink: 0, marginLeft: \"auto\" }} />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction IconSkeleton({ width, height }: SkeletonProps) {\r\n const sz = Math.min(width, height);\r\n return (\r\n <svg width=\"100%\" height=\"100%\" viewBox={`0 0 ${width} ${height}`} fill=\"none\">\r\n <path\r\n d={`M${width / 2} ${(height - sz) / 2 + sz * 0.1}l${sz * 0.12} ${sz * 0.25} ${sz * 0.28} ${sz * 0.04}-${sz * 0.2} ${sz * 0.2} ${sz * 0.05} ${sz * 0.28}-${sz * 0.25}-${sz * 0.12}-${sz * 0.25} ${sz * 0.12} ${sz * 0.05}-${sz * 0.28}-${sz * 0.2}-${sz * 0.2} ${sz * 0.28}-${sz * 0.04}z`}\r\n stroke=\"var(--agd-stroke)\"\r\n strokeWidth=\"1\"\r\n fill=\"var(--agd-fill)\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction SpinnerSkeleton({ width, height }: SkeletonProps) {\r\n const r = Math.min(width, height) / 2 - 2;\r\n return (\r\n <svg width=\"100%\" height=\"100%\" viewBox={`0 0 ${width} ${height}`} fill=\"none\">\r\n <circle cx={width / 2} cy={height / 2} r={r} stroke=\"var(--agd-stroke)\" strokeWidth=\"1.5\" opacity=\".2\" />\r\n <path d={`M${width / 2} ${height / 2 - r}a${r} ${r} 0 0 1 ${r} ${r}`} stroke=\"var(--agd-bar-strong)\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction FeatureSkeleton({ width, height }: SkeletonProps) {\r\n const iconSz = Math.min(36, height * 0.25, width * 0.12);\r\n const items = Math.max(1, Math.min(3, Math.floor(height / 80)));\r\n return (\r\n <div style={{ display: \"flex\", flexDirection: \"column\", height: \"100%\", justifyContent: \"space-around\", padding: 8 }}>\r\n {Array.from({ length: items }, (_, i) => (\r\n <div key={i} style={{ display: \"flex\", gap: width * 0.04, alignItems: \"flex-start\" }}>\r\n <Block w={iconSz} h={iconSz} radius={iconSz * 0.25} />\r\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: 4 }}>\r\n <Bar w={`${40 + ((i * 13) % 20)}%`} h={3} strong />\r\n <Bar w={`${60 + ((i * 17) % 25)}%`} h={2} />\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction TeamSkeleton({ width, height }: SkeletonProps) {\r\n const cols = Math.max(2, Math.min(4, Math.floor(width / 120)));\r\n const avatarSz = Math.min(36, height * 0.25);\r\n return (\r\n <div style={{ height: \"100%\", display: \"flex\", flexDirection: \"column\", alignItems: \"center\", gap: height * 0.06, padding: height * 0.06 }}>\r\n <Bar w={width * 0.3} h={4} strong />\r\n <div style={{ display: \"flex\", gap: width * 0.06, justifyContent: \"center\", flex: 1, alignItems: \"center\" }}>\r\n {Array.from({ length: cols }, (_, i) => (\r\n <div key={i} style={{ display: \"flex\", flexDirection: \"column\", alignItems: \"center\", gap: 6 }}>\r\n <Circle size={avatarSz} />\r\n <Bar w={width * 0.12} h={3} strong />\r\n <Bar w={width * 0.08} h={2} />\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction LoginSkeleton({ width, height }: SkeletonProps) {\r\n const fields = Math.max(2, Math.min(3, Math.floor(height / 80)));\r\n return (\r\n <div style={{ height: \"100%\", display: \"flex\", flexDirection: \"column\", alignItems: \"center\", padding: width * 0.06, gap: height * 0.04 }}>\r\n <Bar w={width * 0.5} h={Math.max(5, height * 0.04)} strong />\r\n <Bar w={width * 0.35} h={2} />\r\n <div style={{ width: \"100%\", display: \"flex\", flexDirection: \"column\", gap: height * 0.03, marginTop: height * 0.04 }}>\r\n {Array.from({ length: fields }, (_, i) => (\r\n <div key={i} style={{ display: \"flex\", flexDirection: \"column\", gap: 3 }}>\r\n <Bar w={Math.min(60, width * 0.2)} h={2} />\r\n <Block w=\"100%\" h={Math.min(32, height * 0.1)} radius={4} />\r\n </div>\r\n ))}\r\n </div>\r\n <Block w=\"100%\" h={Math.min(36, height * 0.12)} radius={6} style={{ marginTop: height * 0.03, background: \"var(--agd-bar)\" }} />\r\n <Bar w={width * 0.4} h={2} />\r\n </div>\r\n );\r\n}\r\n\r\nfunction ContactSkeleton({ width, height }: SkeletonProps) {\r\n return (\r\n <div style={{ height: \"100%\", display: \"flex\", flexDirection: \"column\", padding: width * 0.04, gap: height * 0.03 }}>\r\n <Bar w={width * 0.4} h={4} strong />\r\n <Bar w={width * 0.6} h={2} />\r\n <div style={{ display: \"flex\", gap: 6, marginTop: height * 0.03 }}>\r\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: 3 }}>\r\n <Bar w={50} h={2} />\r\n <Block w=\"100%\" h={Math.min(28, height * 0.1)} radius={4} />\r\n </div>\r\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: 3 }}>\r\n <Bar w={40} h={2} />\r\n <Block w=\"100%\" h={Math.min(28, height * 0.1)} radius={4} />\r\n </div>\r\n </div>\r\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 3 }}>\r\n <Bar w={50} h={2} />\r\n <Block w=\"100%\" h={Math.min(28, height * 0.1)} radius={4} />\r\n </div>\r\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 3, flex: 1 }}>\r\n <Bar w={60} h={2} />\r\n <Block w=\"100%\" h=\"100%\" radius={4} />\r\n </div>\r\n <Block w={Math.min(120, width * 0.3)} h={Math.min(30, height * 0.1)} radius={6} style={{ alignSelf: \"flex-end\", background: \"var(--agd-bar)\" }} />\r\n </div>\r\n );\r\n}\r\n\r\n// --- Skeleton registry ---\r\n\r\nconst SKELETON_RENDERERS: Partial<Record<ComponentType, (props: SkeletonProps) => JSX.Element>> = {\r\n navigation: NavigationSkeleton,\r\n hero: HeroSkeleton,\r\n sidebar: SidebarSkeleton,\r\n footer: FooterSkeleton,\r\n modal: ModalSkeleton,\r\n card: CardSkeleton,\r\n text: TextSkeleton,\r\n image: ImageSkeleton,\r\n table: TableSkeleton,\r\n list: ListSkeleton,\r\n button: ButtonSkeleton,\r\n input: InputSkeleton,\r\n form: FormSkeleton,\r\n tabs: TabsSkeleton,\r\n avatar: AvatarSkeleton,\r\n badge: BadgeSkeleton,\r\n header: HeaderSkeleton,\r\n section: SectionSkeleton,\r\n grid: GridSkeleton,\r\n dropdown: DropdownSkeleton,\r\n toggle: ToggleSkeleton,\r\n search: SearchSkeleton,\r\n toast: ToastSkeleton,\r\n progress: ProgressSkeleton,\r\n chart: ChartSkeleton,\r\n video: VideoSkeleton,\r\n tooltip: TooltipSkeleton,\r\n breadcrumb: BreadcrumbSkeleton,\r\n pagination: PaginationSkeleton,\r\n divider: DividerSkeleton,\r\n accordion: AccordionSkeleton,\r\n carousel: CarouselSkeleton,\r\n pricing: PricingSkeleton,\r\n testimonial: TestimonialSkeleton,\r\n cta: CtaSkeleton,\r\n alert: AlertSkeleton,\r\n banner: BannerSkeleton,\r\n stat: StatSkeleton,\r\n stepper: StepperSkeleton,\r\n tag: TagSkeleton,\r\n rating: RatingSkeleton,\r\n map: MapSkeleton,\r\n timeline: TimelineSkeleton,\r\n fileUpload: FileUploadSkeleton,\r\n codeBlock: CodeBlockSkeleton,\r\n calendar: CalendarSkeleton,\r\n notification: NotificationSkeleton,\r\n productCard: ProductCardSkeleton,\r\n profile: ProfileSkeleton,\r\n drawer: DrawerSkeleton,\r\n popover: PopoverSkeleton,\r\n logo: LogoSkeleton,\r\n faq: FaqSkeleton,\r\n gallery: GallerySkeleton,\r\n checkbox: CheckboxSkeleton,\r\n radio: RadioSkeleton,\r\n slider: SliderSkeleton,\r\n datePicker: DatePickerSkeleton,\r\n skeleton: SkeletonSkeletonRenderer,\r\n chip: ChipSkeleton,\r\n icon: IconSkeleton,\r\n spinner: SpinnerSkeleton,\r\n feature: FeatureSkeleton,\r\n team: TeamSkeleton,\r\n login: LoginSkeleton,\r\n contact: ContactSkeleton,\r\n};\r\n\r\nexport function Skeleton({ type, width, height, text }: { type: ComponentType; width: number; height: number; text?: string }) {\r\n const Renderer = SKELETON_RENDERERS[type];\r\n if (!Renderer) {\r\n return (\r\n <div style={{ width: \"100%\", height: \"100%\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}>\r\n <span style={{ fontSize: 10, fontWeight: 600, color: \"var(--agd-text-3)\", textTransform: \"uppercase\", letterSpacing: \"0.06em\", opacity: 0.5 }}>{type}</span>\r\n </div>\r\n );\r\n }\r\n return (\r\n <div style={{ width: \"100%\", height: \"100%\", padding: 8, position: \"relative\", pointerEvents: \"none\" }}>\r\n <Renderer width={width} height={height} text={text} />\r\n </div>\r\n );\r\n}\r\n","\nconst css = \"svg[fill=none] {\\n fill: none !important;\\n}\\n\\n.styles-module__overlayExiting___iEmYr {\\n opacity: 0 !important;\\n transition: opacity 0.25s ease !important;\\n pointer-events: none !important;\\n}\\n\\n.styles-module__overlay___aWh-q {\\n position: fixed;\\n inset: 0;\\n z-index: 99995;\\n pointer-events: auto;\\n cursor: default;\\n animation: styles-module__overlayFadeIn___aECVy 0.15s ease;\\n --agd-stroke: rgba(59, 130, 246, 0.35);\\n --agd-fill: rgba(59, 130, 246, 0.06);\\n --agd-bar: rgba(59, 130, 246, 0.18);\\n --agd-bar-strong: rgba(59, 130, 246, 0.28);\\n --agd-text-3: rgba(255, 255, 255, 0.6);\\n --agd-surface: #fff;\\n}\\n.styles-module__overlay___aWh-q.styles-module__light___ORIft {\\n --agd-surface: #fff;\\n}\\n.styles-module__overlay___aWh-q:not(.styles-module__light___ORIft) {\\n --agd-surface: #141414;\\n}\\n.styles-module__overlay___aWh-q.styles-module__wireframe___itvQU {\\n --agd-stroke: rgba(249, 115, 22, 0.35);\\n --agd-fill: rgba(249, 115, 22, 0.06);\\n --agd-bar: rgba(249, 115, 22, 0.18);\\n --agd-bar-strong: rgba(249, 115, 22, 0.28);\\n}\\n.styles-module__overlay___aWh-q.styles-module__placing___45yD8 {\\n cursor: crosshair;\\n}\\n.styles-module__overlay___aWh-q.styles-module__passthrough___xaFeE {\\n pointer-events: none;\\n}\\n\\n.styles-module__blankCanvas___t2Eue {\\n position: fixed;\\n inset: 0;\\n z-index: 99994;\\n background: #fff;\\n opacity: 0;\\n pointer-events: none;\\n transition: opacity 0.25s ease;\\n}\\n.styles-module__blankCanvas___t2Eue.styles-module__visible___OKKqX {\\n opacity: var(--canvas-opacity, 1);\\n pointer-events: auto;\\n}\\n.styles-module__blankCanvas___t2Eue::after {\\n content: \\\"\\\";\\n position: absolute;\\n inset: 0;\\n background-image: radial-gradient(circle, rgba(0, 0, 0, 0.08) 1px, transparent 1px);\\n background-size: 24px 24px;\\n background-position: 12px 12px;\\n pointer-events: none;\\n transition: opacity 0.2s ease;\\n}\\n.styles-module__blankCanvas___t2Eue.styles-module__gridActive___OZ-cf::after {\\n opacity: 1;\\n background-image: radial-gradient(circle, rgba(0, 0, 0, 0.22) 1px, transparent 1px);\\n}\\n\\n.styles-module__paletteHeader___-Q5gQ {\\n padding: 0 1rem 0.375rem;\\n}\\n\\n.styles-module__paletteHeaderTitle___oHqZC {\\n font-size: 0.8125rem;\\n font-weight: 500;\\n color: #fff;\\n letter-spacing: -0.0094em;\\n}\\n.styles-module__light___ORIft .styles-module__paletteHeaderTitle___oHqZC {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n\\n.styles-module__paletteHeaderDesc___6i74T {\\n font-size: 0.6875rem;\\n font-weight: 300;\\n color: rgba(255, 255, 255, 0.45);\\n margin-top: 2px;\\n line-height: 14px;\\n}\\n.styles-module__light___ORIft .styles-module__paletteHeaderDesc___6i74T {\\n color: rgba(0, 0, 0, 0.45);\\n}\\n.styles-module__paletteHeaderDesc___6i74T a {\\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__paletteHeaderDesc___6i74T a:hover {\\n color: #fff;\\n}\\n.styles-module__light___ORIft .styles-module__paletteHeaderDesc___6i74T a {\\n color: rgba(0, 0, 0, 0.6);\\n text-decoration-color: rgba(0, 0, 0, 0.2);\\n}\\n.styles-module__light___ORIft .styles-module__paletteHeaderDesc___6i74T a:hover {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n\\n.styles-module__wireframePurposeWrap___To-tS {\\n display: grid;\\n grid-template-rows: 1fr;\\n transition: grid-template-rows 0.2s ease, opacity 0.15s ease;\\n opacity: 1;\\n}\\n.styles-module__wireframePurposeWrap___To-tS.styles-module__collapsed___Ms9vS {\\n grid-template-rows: 0fr;\\n opacity: 0;\\n}\\n\\n.styles-module__wireframePurposeInner___Lrahs {\\n overflow: hidden;\\n}\\n\\n.styles-module__wireframePurposeInput___7EtBN {\\n display: block;\\n width: calc(100% - 2rem);\\n margin: 0.25rem 1rem 0.375rem;\\n padding: 0.375rem 0.5rem;\\n font-size: 0.8125rem;\\n font-family: inherit;\\n color: rgba(255, 255, 255, 0.85);\\n background: rgba(255, 255, 255, 0.03);\\n border: 1px solid rgba(255, 255, 255, 0.1);\\n border-radius: 0.375rem;\\n resize: none;\\n outline: none;\\n transition: border-color 0.15s ease;\\n letter-spacing: -0.0094em;\\n}\\n.styles-module__wireframePurposeInput___7EtBN::placeholder {\\n color: rgba(255, 255, 255, 0.3);\\n}\\n.styles-module__wireframePurposeInput___7EtBN:focus {\\n border-color: rgba(255, 255, 255, 0.3);\\n background: rgba(255, 255, 255, 0.05);\\n}\\n.styles-module__light___ORIft .styles-module__wireframePurposeInput___7EtBN {\\n color: rgba(0, 0, 0, 0.7);\\n background: rgba(0, 0, 0, 0.03);\\n border-color: rgba(0, 0, 0, 0.1);\\n}\\n.styles-module__light___ORIft .styles-module__wireframePurposeInput___7EtBN::placeholder {\\n color: rgba(0, 0, 0, 0.3);\\n}\\n.styles-module__light___ORIft .styles-module__wireframePurposeInput___7EtBN:focus {\\n border-color: rgba(0, 0, 0, 0.25);\\n background: rgba(0, 0, 0, 0.05);\\n}\\n\\n.styles-module__canvasToggle___-QqSy {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n gap: 0.375rem;\\n margin: 0.25rem 1rem 0.25rem;\\n padding: 0.375rem 0.5rem;\\n border-radius: 0.5rem;\\n cursor: pointer;\\n border: 1px dashed rgba(255, 255, 255, 0.1);\\n background: transparent;\\n transition: background 0.15s ease, border-color 0.15s ease;\\n}\\n.styles-module__canvasToggle___-QqSy:hover {\\n background: rgba(255, 255, 255, 0.04);\\n border-color: rgba(255, 255, 255, 0.15);\\n}\\n.styles-module__canvasToggle___-QqSy.styles-module__active___hosp7 {\\n background: #f97316;\\n border-color: transparent;\\n border-style: solid;\\n box-shadow: none;\\n}\\n.styles-module__light___ORIft .styles-module__canvasToggle___-QqSy {\\n border-color: rgba(0, 0, 0, 0.08);\\n}\\n.styles-module__light___ORIft .styles-module__canvasToggle___-QqSy:hover {\\n background: rgba(0, 0, 0, 0.02);\\n border-color: rgba(0, 0, 0, 0.12);\\n}\\n.styles-module__light___ORIft .styles-module__canvasToggle___-QqSy.styles-module__active___hosp7 {\\n background: #f97316;\\n border-color: transparent;\\n border-style: solid;\\n box-shadow: none;\\n}\\n\\n.styles-module__canvasToggleIcon___7pJ82 {\\n width: 14px;\\n height: 14px;\\n flex-shrink: 0;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n color: rgba(255, 255, 255, 0.35);\\n}\\n.styles-module__active___hosp7 .styles-module__canvasToggleIcon___7pJ82 {\\n color: rgba(255, 255, 255, 0.85);\\n}\\n.styles-module__light___ORIft .styles-module__canvasToggleIcon___7pJ82 {\\n color: rgba(0, 0, 0, 0.25);\\n}\\n.styles-module__light___ORIft .styles-module__active___hosp7 .styles-module__canvasToggleIcon___7pJ82 {\\n color: rgba(255, 255, 255, 0.85);\\n}\\n\\n.styles-module__canvasToggleLabel___OanpY {\\n font-size: 0.8125rem;\\n font-weight: 400;\\n color: rgba(255, 255, 255, 0.6);\\n letter-spacing: -0.0094em;\\n}\\n.styles-module__active___hosp7 .styles-module__canvasToggleLabel___OanpY {\\n color: #fff;\\n}\\n.styles-module__light___ORIft .styles-module__canvasToggleLabel___OanpY {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n.styles-module__light___ORIft .styles-module__active___hosp7 .styles-module__canvasToggleLabel___OanpY {\\n color: #fff;\\n}\\n\\n.styles-module__canvasPurposeWrap___hj6zk {\\n display: grid;\\n grid-template-rows: 1fr;\\n transition: grid-template-rows 0.2s ease, opacity 0.15s ease;\\n opacity: 1;\\n}\\n.styles-module__canvasPurposeWrap___hj6zk.styles-module__collapsed___Ms9vS {\\n grid-template-rows: 0fr;\\n opacity: 0;\\n}\\n\\n.styles-module__canvasPurposeInner___VWiyu {\\n overflow: hidden;\\n}\\n\\n.styles-module__canvasPurposeToggle___byDH2 {\\n display: flex;\\n align-items: center;\\n gap: 0.5rem;\\n cursor: pointer;\\n margin: 0.375rem 1rem 0.375rem 1.1875rem;\\n}\\n.styles-module__canvasPurposeToggle___byDH2 input[type=checkbox] {\\n position: absolute;\\n opacity: 0;\\n width: 0;\\n height: 0;\\n}\\n\\n.styles-module__canvasPurposeCheck___xqd7l {\\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__canvasPurposeCheck___xqd7l svg {\\n color: #1a1a1a;\\n opacity: 1;\\n transition: opacity 0.15s ease;\\n}\\n.styles-module__canvasPurposeCheck___xqd7l.styles-module__checked___-1JGH {\\n border-color: rgba(255, 255, 255, 0.3);\\n background: rgb(255, 255, 255);\\n}\\n.styles-module__light___ORIft .styles-module__canvasPurposeCheck___xqd7l {\\n border: 1px solid rgba(0, 0, 0, 0.15);\\n background: #fff;\\n}\\n.styles-module__light___ORIft .styles-module__canvasPurposeCheck___xqd7l.styles-module__checked___-1JGH {\\n border-color: #1a1a1a;\\n background: #1a1a1a;\\n}\\n.styles-module__light___ORIft .styles-module__canvasPurposeCheck___xqd7l.styles-module__checked___-1JGH svg {\\n color: #fff;\\n}\\n\\n.styles-module__canvasPurposeLabel___Zu-tD {\\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__light___ORIft .styles-module__canvasPurposeLabel___Zu-tD {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n\\n.styles-module__canvasPurposeHelp___jijwR {\\n position: relative;\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n cursor: help;\\n}\\n.styles-module__canvasPurposeHelp___jijwR svg {\\n color: rgba(255, 255, 255, 0.2);\\n transform: translateY(2px);\\n transition: color 0.15s ease;\\n}\\n.styles-module__canvasPurposeHelp___jijwR:hover svg {\\n color: rgba(255, 255, 255, 0.5);\\n}\\n.styles-module__light___ORIft .styles-module__canvasPurposeHelp___jijwR svg {\\n color: rgba(0, 0, 0, 0.2);\\n}\\n.styles-module__light___ORIft .styles-module__canvasPurposeHelp___jijwR:hover svg {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n\\n.styles-module__placement___zcxv8 {\\n position: absolute;\\n border: 1.5px dashed rgba(59, 130, 246, 0.4);\\n border-radius: 6px;\\n background: rgba(59, 130, 246, 0.08);\\n cursor: grab;\\n transition: box-shadow 0.15s, border-color 0.15s, opacity 0.15s ease, transform 0.15s ease;\\n user-select: none;\\n pointer-events: auto;\\n box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08);\\n animation: styles-module__placementEnter___TdRhf 0.25s cubic-bezier(0.34, 1.2, 0.64, 1);\\n}\\n.styles-module__placement___zcxv8:active {\\n cursor: grabbing;\\n}\\n.styles-module__placement___zcxv8:hover {\\n border-color: rgba(59, 130, 246, 0.5);\\n background: rgba(59, 130, 246, 0.1);\\n box-shadow: 0 2px 8px rgba(59, 130, 246, 0.12);\\n}\\n.styles-module__placement___zcxv8.styles-module__selected___6yrp6 {\\n border-color: #3c82f7;\\n border-style: solid;\\n background: rgba(59, 130, 246, 0.1);\\n box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.15), 0 2px 8px rgba(59, 130, 246, 0.15);\\n}\\n.styles-module__placement___zcxv8.styles-module__selected___6yrp6:hover {\\n box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.15), 0 2px 8px rgba(59, 130, 246, 0.15);\\n}\\n.styles-module__wireframe___itvQU .styles-module__placement___zcxv8 {\\n border-color: rgba(249, 115, 22, 0.4);\\n background: rgba(249, 115, 22, 0.08);\\n}\\n.styles-module__wireframe___itvQU .styles-module__placement___zcxv8:hover {\\n border-color: rgba(249, 115, 22, 0.5);\\n background: rgba(249, 115, 22, 0.1);\\n box-shadow: 0 2px 8px rgba(249, 115, 22, 0.12);\\n}\\n.styles-module__wireframe___itvQU .styles-module__placement___zcxv8.styles-module__selected___6yrp6 {\\n border-color: #f97316;\\n background: rgba(249, 115, 22, 0.1);\\n box-shadow: 0 0 0 2px rgba(249, 115, 22, 0.15), 0 2px 8px rgba(249, 115, 22, 0.15);\\n}\\n.styles-module__wireframe___itvQU .styles-module__placement___zcxv8.styles-module__selected___6yrp6:hover {\\n box-shadow: 0 0 0 2px rgba(249, 115, 22, 0.15), 0 2px 8px rgba(249, 115, 22, 0.15);\\n}\\n.styles-module__placement___zcxv8.styles-module__dragging___le6KZ {\\n opacity: 0.85;\\n z-index: 50;\\n}\\n.styles-module__placement___zcxv8.styles-module__exiting___YrM8F {\\n opacity: 0;\\n transform: scale(0.97);\\n pointer-events: none;\\n animation: none;\\n transition: opacity 0.2s ease, transform 0.2s cubic-bezier(0.32, 0.72, 0, 1);\\n}\\n\\n.styles-module__placementContent___f64A4 {\\n width: 100%;\\n height: 100%;\\n overflow: hidden;\\n pointer-events: none;\\n}\\n\\n.styles-module__placementLabel___0KvWl {\\n position: absolute;\\n top: -18px;\\n left: 0;\\n font-size: 10px;\\n font-weight: 600;\\n color: rgba(59, 130, 246, 0.7);\\n white-space: nowrap;\\n pointer-events: none;\\n font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, sans-serif;\\n text-shadow: 0 0 4px rgba(255, 255, 255, 0.8), 0 0 8px rgba(255, 255, 255, 0.5);\\n}\\n.styles-module__selected___6yrp6 .styles-module__placementLabel___0KvWl {\\n color: #3c82f7;\\n}\\n.styles-module__wireframe___itvQU .styles-module__placementLabel___0KvWl {\\n color: rgba(249, 115, 22, 0.7);\\n}\\n.styles-module__wireframe___itvQU .styles-module__selected___6yrp6 .styles-module__placementLabel___0KvWl {\\n color: #f97316;\\n}\\n\\n.styles-module__placementAnnotation___78pTr {\\n position: absolute;\\n bottom: -18px;\\n left: 0;\\n right: 0;\\n font-weight: 450;\\n color: rgba(0, 0, 0, 0.5);\\n font-size: 10px;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n pointer-events: none;\\n font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, sans-serif;\\n text-shadow: 0 0 4px rgba(255, 255, 255, 0.9), 0 0 8px rgba(255, 255, 255, 0.6);\\n opacity: 0;\\n transform: translateY(-2px);\\n transition: opacity 0.2s ease, transform 0.2s ease;\\n}\\n.styles-module__placementAnnotation___78pTr.styles-module__annotationVisible___mrUyA {\\n opacity: 1;\\n transform: translateY(0);\\n}\\n\\n.styles-module__sectionAnnotation___aUIs0 {\\n position: absolute;\\n bottom: -18px;\\n left: 0;\\n right: 0;\\n font-weight: 450;\\n color: rgba(59, 130, 246, 0.6);\\n font-size: 10px;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n pointer-events: none;\\n font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, sans-serif;\\n text-shadow: 0 0 4px rgba(255, 255, 255, 0.9), 0 0 8px rgba(255, 255, 255, 0.6);\\n opacity: 0;\\n transform: translateY(-2px);\\n transition: opacity 0.2s ease, transform 0.2s ease;\\n}\\n.styles-module__sectionAnnotation___aUIs0.styles-module__annotationVisible___mrUyA {\\n opacity: 1;\\n transform: translateY(0);\\n}\\n\\n.styles-module__handle___Ikbxm {\\n position: absolute;\\n width: 8px;\\n height: 8px;\\n background: #fff;\\n border: 1.5px solid #3c82f7;\\n border-radius: 2px;\\n z-index: 12;\\n box-shadow: 0 0 0 0.5px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.12);\\n opacity: 0;\\n transform: scale(0.3);\\n pointer-events: none;\\n will-change: opacity, transform;\\n transition: opacity 0.2s ease-out, transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);\\n}\\n.styles-module__placement___zcxv8:hover .styles-module__handle___Ikbxm, .styles-module__sectionOutline___s0hy-:hover .styles-module__handle___Ikbxm, .styles-module__ghostOutline___po-kO:hover .styles-module__handle___Ikbxm, .styles-module__placement___zcxv8:active .styles-module__handle___Ikbxm, .styles-module__sectionOutline___s0hy-:active .styles-module__handle___Ikbxm, .styles-module__ghostOutline___po-kO:active .styles-module__handle___Ikbxm, .styles-module__selected___6yrp6 .styles-module__handle___Ikbxm {\\n opacity: 1;\\n transform: scale(1);\\n pointer-events: auto;\\n}\\n.styles-module__sectionOutline___s0hy- .styles-module__handle___Ikbxm {\\n border-color: inherit;\\n}\\n.styles-module__wireframe___itvQU .styles-module__handle___Ikbxm {\\n border-color: #f97316;\\n}\\n\\n.styles-module__handleNw___4TMIj {\\n top: -4px;\\n left: -4px;\\n cursor: nw-resize;\\n}\\n\\n.styles-module__handleNe___mnsTh {\\n top: -4px;\\n right: -4px;\\n cursor: ne-resize;\\n}\\n\\n.styles-module__handleSe___oSFnk {\\n bottom: -4px;\\n right: -4px;\\n cursor: se-resize;\\n}\\n\\n.styles-module__handleSw___pi--Z {\\n bottom: -4px;\\n left: -4px;\\n cursor: sw-resize;\\n}\\n\\n.styles-module__handleN___aBA-Q, .styles-module__handleE___0hM5u, .styles-module__handleS___JjDRv, .styles-module__handleW___ERWGQ {\\n opacity: 0 !important;\\n pointer-events: none !important;\\n}\\n\\n.styles-module__edgeHandle___XxXdT {\\n position: absolute;\\n z-index: 11;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n}\\n.styles-module__edgeHandle___XxXdT::after {\\n content: \\\"\\\";\\n position: absolute;\\n border-radius: 4px;\\n background: #3c82f7;\\n}\\n.styles-module__wireframe___itvQU .styles-module__edgeHandle___XxXdT::after {\\n background: #f97316;\\n}\\n.styles-module__edgeHandle___XxXdT::after {\\n opacity: 0;\\n transition: opacity 0.1s ease, transform 0.1s ease;\\n transform: scale(0.8);\\n}\\n.styles-module__edgeHandle___XxXdT:hover::after {\\n opacity: 0.85;\\n transform: scale(1);\\n}\\n.styles-module__edgeHandle___XxXdT svg {\\n position: relative;\\n z-index: 1;\\n opacity: 0;\\n transition: opacity 0.1s ease;\\n filter: drop-shadow(0 0 2px var(--agd-surface));\\n}\\n.styles-module__edgeHandle___XxXdT:hover svg {\\n opacity: 1;\\n}\\n\\n.styles-module__edgeN___-JJDj, .styles-module__edgeS___66lMX {\\n left: 12px;\\n right: 12px;\\n height: 12px;\\n cursor: n-resize;\\n}\\n.styles-module__edgeN___-JJDj::after, .styles-module__edgeS___66lMX::after {\\n width: 24px;\\n height: 4px;\\n}\\n\\n.styles-module__edgeN___-JJDj {\\n top: -6px;\\n}\\n\\n.styles-module__edgeS___66lMX {\\n bottom: -6px;\\n cursor: s-resize;\\n}\\n\\n.styles-module__edgeE___1bGDa, .styles-module__edgeW___lHQNo {\\n top: 12px;\\n bottom: 12px;\\n width: 12px;\\n cursor: e-resize;\\n}\\n.styles-module__edgeE___1bGDa::after, .styles-module__edgeW___lHQNo::after {\\n width: 4px;\\n height: 24px;\\n}\\n\\n.styles-module__edgeE___1bGDa {\\n right: -6px;\\n}\\n\\n.styles-module__edgeW___lHQNo {\\n left: -6px;\\n cursor: w-resize;\\n}\\n\\n.styles-module__deleteButton___LkGCb {\\n position: absolute;\\n top: -8px;\\n right: -8px;\\n width: 18px;\\n height: 18px;\\n border-radius: 50%;\\n background: rgba(255, 255, 255, 0.9);\\n backdrop-filter: blur(8px);\\n border: 1px solid rgba(0, 0, 0, 0.08);\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\\n color: rgba(0, 0, 0, 0.35);\\n cursor: pointer;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n font-size: 10px;\\n line-height: 1;\\n z-index: 15;\\n pointer-events: none;\\n opacity: 0;\\n transform: scale(0.8);\\n will-change: opacity, transform;\\n transition: opacity 0.2s ease-out, transform 0.2s cubic-bezier(0.34, 1.56, 0.64, 1), background 0.12s ease, color 0.12s ease, border-color 0.12s ease, box-shadow 0.12s ease;\\n}\\n.styles-module__placement___zcxv8:hover .styles-module__deleteButton___LkGCb, .styles-module__selected___6yrp6 .styles-module__deleteButton___LkGCb, .styles-module__sectionOutline___s0hy-:hover .styles-module__deleteButton___LkGCb, .styles-module__sectionOutline___s0hy-.styles-module__selected___6yrp6 .styles-module__deleteButton___LkGCb, .styles-module__ghostOutline___po-kO:hover .styles-module__deleteButton___LkGCb, .styles-module__ghostOutline___po-kO.styles-module__selected___6yrp6 .styles-module__deleteButton___LkGCb {\\n opacity: 1;\\n transform: scale(1);\\n pointer-events: auto;\\n}\\n.styles-module__deleteButton___LkGCb:hover {\\n background: #ef4444;\\n color: #fff;\\n border-color: #ef4444;\\n box-shadow: 0 1px 4px rgba(239, 68, 68, 0.3);\\n transform: scale(1.1);\\n}\\n.styles-module__overlay___aWh-q:not(.styles-module__light___ORIft) .styles-module__deleteButton___LkGCb, .styles-module__rearrangeOverlay___-3R3t:not(.styles-module__light___ORIft) .styles-module__deleteButton___LkGCb {\\n background: rgba(40, 40, 40, 0.9);\\n border-color: rgba(255, 255, 255, 0.1);\\n color: rgba(255, 255, 255, 0.5);\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);\\n}\\n.styles-module__overlay___aWh-q:not(.styles-module__light___ORIft) .styles-module__deleteButton___LkGCb:hover, .styles-module__rearrangeOverlay___-3R3t:not(.styles-module__light___ORIft) .styles-module__deleteButton___LkGCb:hover {\\n background: #ef4444;\\n color: #fff;\\n border-color: #ef4444;\\n}\\n\\n.styles-module__drawBox___BrVAa {\\n position: fixed;\\n pointer-events: none;\\n z-index: 99996;\\n border: 2px solid #3c82f7;\\n border-radius: 6px;\\n background: rgba(59, 130, 246, 0.15);\\n}\\n\\n.styles-module__selectBox___Iu8kB {\\n position: fixed;\\n pointer-events: none;\\n z-index: 99996;\\n border: 1px dashed #3c82f7;\\n background: rgba(59, 130, 246, 0.08);\\n border-radius: 2px;\\n}\\n\\n.styles-module__sizeIndicator___7zJ4y {\\n position: fixed;\\n pointer-events: none;\\n z-index: 100001;\\n font-size: 10px;\\n color: #fff;\\n background: #3c82f7;\\n padding: 2px 6px;\\n border-radius: 4px;\\n white-space: nowrap;\\n font-weight: 500;\\n font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, sans-serif;\\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);\\n}\\n\\n.styles-module__guideLine___DUQY2 {\\n pointer-events: none;\\n z-index: 100001;\\n background: #f0f;\\n opacity: 0.5;\\n}\\n\\n.styles-module__dragPreview___onPbU {\\n position: fixed;\\n z-index: 100002;\\n pointer-events: none;\\n border: 1.5px dashed #3c82f7;\\n border-radius: 6px;\\n background: rgba(59, 130, 246, 0.1);\\n backdrop-filter: blur(8px);\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n font-size: 9px;\\n font-weight: 600;\\n color: #3c82f7;\\n font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, sans-serif;\\n text-transform: uppercase;\\n letter-spacing: 0.04em;\\n box-shadow: 0 4px 16px rgba(59, 130, 246, 0.15);\\n transition: width 0.08s ease, height 0.08s ease, opacity 0.08s ease;\\n}\\n\\n.styles-module__dragPreviewWireframe___jsg0G {\\n border-color: #f97316;\\n background: rgba(249, 115, 22, 0.1);\\n color: #f97316;\\n box-shadow: 0 4px 16px rgba(249, 115, 22, 0.15);\\n}\\n\\n.styles-module__palette___C7iSH {\\n position: absolute;\\n right: 5px;\\n bottom: calc(100% + 0.5rem);\\n width: 256px;\\n overflow: hidden;\\n background: #1c1c1c;\\n border: none;\\n border-radius: 1rem;\\n padding: 13px 0 16px;\\n box-shadow: 0 1px 8px rgba(0, 0, 0, 0.25), 0 0 0 1px rgba(0, 0, 0, 0.04);\\n z-index: 100001;\\n font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, sans-serif;\\n cursor: default;\\n opacity: 0;\\n filter: blur(5px);\\n}\\n.styles-module__palette___C7iSH .styles-module__paletteItem___6TlnA,\\n.styles-module__palette___C7iSH .styles-module__paletteItemLabel___6ncO4,\\n.styles-module__palette___C7iSH .styles-module__paletteSectionTitle___PqnjX,\\n.styles-module__palette___C7iSH .styles-module__paletteFooter___QYnAG {\\n transition: background 0.25s ease, color 0.25s ease, border-color 0.25s ease;\\n}\\n.styles-module__palette___C7iSH.styles-module__enter___6LYk5 {\\n opacity: 1;\\n transform: translateY(0);\\n filter: blur(0px);\\n transition: opacity 0.2s ease, transform 0.2s ease, filter 0.2s ease;\\n}\\n.styles-module__palette___C7iSH.styles-module__exit___iSGRw {\\n opacity: 0;\\n transform: translateY(6px);\\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__palette___C7iSH.styles-module__light___ORIft {\\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\\n.styles-module__paletteSection___V8DEA {\\n padding: 0 1rem;\\n}\\n.styles-module__paletteSection___V8DEA + .styles-module__paletteSection___V8DEA {\\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__light___ORIft .styles-module__paletteSection___V8DEA + .styles-module__paletteSection___V8DEA {\\n border-top-color: rgba(0, 0, 0, 0.07);\\n}\\n\\n.styles-module__paletteSectionTitle___PqnjX {\\n font-size: 0.6875rem;\\n font-weight: 500;\\n color: rgba(255, 255, 255, 0.5);\\n letter-spacing: -0.0094em;\\n padding: 0 0 3px 3px;\\n}\\n.styles-module__light___ORIft .styles-module__paletteSectionTitle___PqnjX {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n\\n.styles-module__paletteItem___6TlnA {\\n display: flex;\\n align-items: center;\\n gap: 0.375rem;\\n padding: 0.25rem 0.25rem;\\n margin-bottom: 1px;\\n border-radius: 0.375rem;\\n cursor: pointer;\\n transition: background-color 0.15s ease, border-color 0.15s ease;\\n border: 1px solid transparent;\\n user-select: none;\\n min-height: 24px;\\n}\\n.styles-module__paletteItem___6TlnA:hover {\\n background: rgba(255, 255, 255, 0.1);\\n}\\n.styles-module__paletteItem___6TlnA.styles-module__active___hosp7 {\\n background: #3c82f7;\\n border-color: transparent;\\n}\\n.styles-module__paletteItem___6TlnA.styles-module__wireframe___itvQU.styles-module__active___hosp7 {\\n background: #f97316;\\n}\\n.styles-module__light___ORIft .styles-module__paletteItem___6TlnA:hover {\\n background: rgba(0, 0, 0, 0.05);\\n}\\n.styles-module__light___ORIft .styles-module__paletteItem___6TlnA.styles-module__active___hosp7 {\\n background: #3c82f7;\\n border-color: transparent;\\n}\\n.styles-module__light___ORIft .styles-module__paletteItem___6TlnA.styles-module__wireframe___itvQU.styles-module__active___hosp7 {\\n background: #f97316;\\n}\\n\\n.styles-module__paletteItemIcon___0NPQK {\\n width: 20px;\\n height: 16px;\\n border-radius: 2px;\\n border: 1px dashed rgba(255, 255, 255, 0.15);\\n background: rgba(255, 255, 255, 0.04);\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n flex-shrink: 0;\\n overflow: hidden;\\n color: rgba(255, 255, 255, 0.45);\\n}\\n.styles-module__paletteItemIcon___0NPQK svg {\\n display: block;\\n width: 20px;\\n height: 16px;\\n}\\n.styles-module__active___hosp7 .styles-module__paletteItemIcon___0NPQK {\\n border-color: rgba(255, 255, 255, 0.3);\\n background: rgba(255, 255, 255, 0.15);\\n color: #fff;\\n}\\n.styles-module__light___ORIft .styles-module__paletteItemIcon___0NPQK {\\n border-color: rgba(0, 0, 0, 0.12);\\n background: rgba(0, 0, 0, 0.02);\\n color: rgba(0, 0, 0, 0.4);\\n}\\n.styles-module__light___ORIft .styles-module__active___hosp7 .styles-module__paletteItemIcon___0NPQK {\\n border-color: rgba(255, 255, 255, 0.3);\\n background: rgba(255, 255, 255, 0.15);\\n color: #fff;\\n}\\n\\n.styles-module__paletteItemLabel___6ncO4 {\\n font-size: 0.8125rem;\\n font-weight: 500;\\n color: rgba(255, 255, 255, 0.85);\\n letter-spacing: -0.0094em;\\n line-height: 1;\\n min-width: 0;\\n}\\n.styles-module__active___hosp7 .styles-module__paletteItemLabel___6ncO4 {\\n color: #fff;\\n font-weight: 600;\\n}\\n.styles-module__light___ORIft .styles-module__paletteItemLabel___6ncO4 {\\n color: rgba(0, 0, 0, 0.7);\\n}\\n.styles-module__light___ORIft .styles-module__active___hosp7 .styles-module__paletteItemLabel___6ncO4 {\\n color: #fff;\\n font-weight: 600;\\n}\\n\\n.styles-module__placeScroll___7sClM {\\n max-height: 240px;\\n overflow-y: auto;\\n overflow-x: hidden;\\n padding-top: 0.25rem;\\n}\\n.styles-module__placeScroll___7sClM.styles-module__fadeTop___KT9tF {\\n -webkit-mask-image: linear-gradient(to bottom, transparent 0, black 32px);\\n mask-image: linear-gradient(to bottom, transparent 0, black 32px);\\n}\\n.styles-module__placeScroll___7sClM.styles-module__fadeBottom___x3ShT {\\n -webkit-mask-image: linear-gradient(to bottom, black calc(100% - 32px), transparent 100%);\\n mask-image: linear-gradient(to bottom, black calc(100% - 32px), transparent 100%);\\n}\\n.styles-module__placeScroll___7sClM.styles-module__fadeTop___KT9tF.styles-module__fadeBottom___x3ShT {\\n -webkit-mask-image: linear-gradient(to bottom, transparent 0, black 32px, black calc(100% - 32px), transparent 100%);\\n mask-image: linear-gradient(to bottom, transparent 0, black 32px, black calc(100% - 32px), transparent 100%);\\n}\\n.styles-module__placeScroll___7sClM::-webkit-scrollbar {\\n width: 3px;\\n}\\n.styles-module__placeScroll___7sClM::-webkit-scrollbar-thumb {\\n background: rgba(255, 255, 255, 0.12);\\n border-radius: 2px;\\n}\\n.styles-module__light___ORIft .styles-module__placeScroll___7sClM::-webkit-scrollbar-thumb {\\n background: rgba(0, 0, 0, 0.1);\\n}\\n\\n.styles-module__paletteFooterWrap___71-fI {\\n display: grid;\\n grid-template-rows: 1fr;\\n transition: grid-template-rows 0.25s cubic-bezier(0.32, 0.72, 0, 1);\\n}\\n.styles-module__paletteFooterWrap___71-fI.styles-module__footerHidden___fJUik {\\n grid-template-rows: 0fr;\\n}\\n\\n.styles-module__paletteFooterInnerContent___VC26h {\\n opacity: 1;\\n transform: translateY(0);\\n transition: opacity 0.15s ease, transform 0.15s ease;\\n}\\n.styles-module__footerHidden___fJUik .styles-module__paletteFooterInnerContent___VC26h {\\n opacity: 0;\\n transform: translateY(4px);\\n}\\n\\n.styles-module__paletteFooterInner___dfylY {\\n overflow: hidden;\\n}\\n\\n.styles-module__paletteFooter___QYnAG {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n min-height: 24px;\\n padding: 0 1rem;\\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__light___ORIft .styles-module__paletteFooter___QYnAG {\\n border-top-color: rgba(0, 0, 0, 0.07);\\n}\\n\\n.styles-module__paletteFooterCount___D3Fia {\\n font-size: 0.8125rem;\\n font-weight: 400;\\n letter-spacing: -0.0094em;\\n color: rgba(255, 255, 255, 0.5);\\n}\\n.styles-module__light___ORIft .styles-module__paletteFooterCount___D3Fia {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n\\n.styles-module__paletteFooterClear___ybBoa {\\n font-size: 0.8125rem;\\n font-weight: 400;\\n letter-spacing: -0.0094em;\\n color: rgba(255, 255, 255, 0.5);\\n background: none;\\n border: none;\\n cursor: pointer;\\n padding: 0;\\n font-family: inherit;\\n transition: color 0.15s ease;\\n}\\n.styles-module__paletteFooterClear___ybBoa:hover {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.styles-module__light___ORIft .styles-module__paletteFooterClear___ybBoa {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n.styles-module__light___ORIft .styles-module__paletteFooterClear___ybBoa:hover {\\n color: rgba(0, 0, 0, 0.6);\\n}\\n\\n.styles-module__paletteFooterActions___fLzv8 {\\n display: flex;\\n align-items: center;\\n gap: 0.75rem;\\n}\\n\\n.styles-module__rollingWrap___S75jM {\\n display: inline-block;\\n overflow: hidden;\\n height: 1.15em;\\n position: relative;\\n vertical-align: bottom;\\n}\\n\\n.styles-module__rollingNum___1RKDx {\\n position: absolute;\\n left: 0;\\n top: 0;\\n}\\n\\n.styles-module__exitUp___AFDRW {\\n animation: styles-module__numExitUp___FRQqx 0.25s cubic-bezier(0.32, 0.72, 0, 1) forwards;\\n}\\n\\n.styles-module__enterUp___CPlXb {\\n animation: styles-module__numEnterUp___2Yd-w 0.25s cubic-bezier(0.32, 0.72, 0, 1) forwards;\\n}\\n\\n.styles-module__exitDown___-1yAy {\\n animation: styles-module__numExitDown___xm5by 0.25s cubic-bezier(0.32, 0.72, 0, 1) forwards;\\n}\\n\\n.styles-module__enterDown___DDuFR {\\n animation: styles-module__numEnterDown___hpxBk 0.25s cubic-bezier(0.32, 0.72, 0, 1) forwards;\\n}\\n\\n@keyframes styles-module__numExitUp___FRQqx {\\n from {\\n transform: translateY(0);\\n opacity: 1;\\n }\\n to {\\n transform: translateY(-110%);\\n opacity: 0;\\n }\\n}\\n@keyframes styles-module__numEnterUp___2Yd-w {\\n from {\\n transform: translateY(110%);\\n opacity: 0;\\n }\\n to {\\n transform: translateY(0);\\n opacity: 1;\\n }\\n}\\n@keyframes styles-module__numExitDown___xm5by {\\n from {\\n transform: translateY(0);\\n opacity: 1;\\n }\\n to {\\n transform: translateY(110%);\\n opacity: 0;\\n }\\n}\\n@keyframes styles-module__numEnterDown___hpxBk {\\n from {\\n transform: translateY(-110%);\\n opacity: 0;\\n }\\n to {\\n transform: translateY(0);\\n opacity: 1;\\n }\\n}\\n.styles-module__rearrangeOverlay___-3R3t {\\n position: fixed;\\n inset: 0;\\n z-index: 99995;\\n pointer-events: none;\\n cursor: default;\\n user-select: none;\\n animation: styles-module__overlayFadeIn___aECVy 0.15s ease;\\n}\\n\\n.styles-module__hoverHighlight___8eT-v {\\n position: fixed;\\n pointer-events: none;\\n z-index: 99994;\\n border: 2px dashed rgba(59, 130, 246, 0.5);\\n border-radius: 4px;\\n background: rgba(59, 130, 246, 0.06);\\n animation: styles-module__highlightFadeIn___Lg7KY 0.12s ease;\\n}\\n\\n.styles-module__sectionOutline___s0hy- {\\n position: fixed;\\n border: 2px solid;\\n border-radius: 4px;\\n cursor: grab;\\n}\\n.styles-module__sectionOutline___s0hy-:active {\\n cursor: grabbing;\\n}\\n.styles-module__sectionOutline___s0hy- {\\n transition: box-shadow 0.15s, border-color 0.3s, background-color 0.3s, border-style 0s;\\n user-select: none;\\n pointer-events: auto;\\n animation: styles-module__sectionEnter___-8BXT 0.2s ease;\\n}\\n.styles-module__sectionOutline___s0hy-:hover {\\n box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.1), 0 4px 12px rgba(0, 0, 0, 0.15);\\n}\\n.styles-module__sectionOutline___s0hy-.styles-module__selected___6yrp6 {\\n border-style: solid;\\n box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.15), 0 2px 8px rgba(59, 130, 246, 0.15);\\n}\\n.styles-module__sectionOutline___s0hy-.styles-module__selected___6yrp6:hover {\\n box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.15), 0 2px 8px rgba(59, 130, 246, 0.15);\\n}\\n.styles-module__sectionOutline___s0hy-.styles-module__settled___b5U5o:not(.styles-module__selected___6yrp6) {\\n border: 1.5px dashed rgba(150, 150, 150, 0.35);\\n background-color: transparent !important;\\n box-shadow: none;\\n}\\n.styles-module__sectionOutline___s0hy-.styles-module__settled___b5U5o:not(.styles-module__selected___6yrp6):hover {\\n border-color: rgba(150, 150, 150, 0.6);\\n box-shadow: none;\\n}\\n.styles-module__sectionOutline___s0hy-.styles-module__settled___b5U5o:not(.styles-module__selected___6yrp6) .styles-module__sectionLabel___F80HQ {\\n opacity: 0;\\n transition: opacity 0.15s ease;\\n}\\n.styles-module__sectionOutline___s0hy-.styles-module__settled___b5U5o:not(.styles-module__selected___6yrp6):hover .styles-module__sectionLabel___F80HQ {\\n opacity: 1;\\n}\\n.styles-module__sectionOutline___s0hy-.styles-module__settled___b5U5o:not(.styles-module__selected___6yrp6) .styles-module__movedBadge___s8z-q,\\n.styles-module__sectionOutline___s0hy-.styles-module__settled___b5U5o:not(.styles-module__selected___6yrp6) .styles-module__sectionDimensions___RcJSL {\\n opacity: 0;\\n transition: opacity 0.15s ease;\\n}\\n.styles-module__sectionOutline___s0hy-.styles-module__settled___b5U5o:not(.styles-module__selected___6yrp6):hover .styles-module__sectionDimensions___RcJSL {\\n opacity: 1;\\n}\\n.styles-module__sectionOutline___s0hy-.styles-module__exiting___YrM8F {\\n opacity: 0;\\n transform: scale(0.97);\\n pointer-events: none;\\n animation: none;\\n transition: opacity 0.2s ease, transform 0.2s cubic-bezier(0.32, 0.72, 0, 1);\\n}\\n\\n.styles-module__sectionLabel___F80HQ {\\n position: absolute;\\n top: 4px;\\n left: 4px;\\n font-size: 10px;\\n font-weight: 600;\\n color: #fff;\\n padding: 2px 8px;\\n border-radius: 4px;\\n white-space: nowrap;\\n pointer-events: none;\\n font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, sans-serif;\\n box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2);\\n max-width: calc(100% - 8px);\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n\\n.styles-module__movedBadge___s8z-q {\\n position: absolute;\\n bottom: 22px;\\n right: 4px;\\n font-size: 9px;\\n font-weight: 700;\\n color: #fff;\\n background: #22c55e;\\n padding: 2px 6px;\\n border-radius: 4px;\\n white-space: nowrap;\\n pointer-events: none;\\n font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, sans-serif;\\n text-transform: uppercase;\\n letter-spacing: 0.04em;\\n box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2);\\n opacity: 0;\\n transform: scale(0.8);\\n transition: opacity 0.15s ease, transform 0.15s ease;\\n}\\n.styles-module__movedBadge___s8z-q.styles-module__badgeVisible___npbdS {\\n opacity: 1;\\n transform: scale(1);\\n transition: opacity 0.2s cubic-bezier(0.34, 1.2, 0.64, 1), transform 0.2s cubic-bezier(0.34, 1.2, 0.64, 1);\\n}\\n\\n.styles-module__resizedBadge___u51V8 {\\n background: #3c82f7;\\n bottom: 40px;\\n}\\n\\n.styles-module__sectionDimensions___RcJSL {\\n position: absolute;\\n bottom: 4px;\\n right: 4px;\\n font-size: 9px;\\n font-weight: 500;\\n color: rgba(255, 255, 255, 0.7);\\n background: rgba(0, 0, 0, 0.5);\\n padding: 1px 5px;\\n border-radius: 3px;\\n white-space: nowrap;\\n pointer-events: none;\\n font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, sans-serif;\\n}\\n.styles-module__light___ORIft .styles-module__sectionDimensions___RcJSL {\\n color: rgba(0, 0, 0, 0.5);\\n background: rgba(255, 255, 255, 0.7);\\n}\\n\\n.styles-module__wireframeNotice___4GJyB {\\n position: fixed;\\n bottom: 16px;\\n left: 24px;\\n z-index: 99995;\\n font-size: 9.5px;\\n font-weight: 400;\\n color: rgba(0, 0, 0, 0.4);\\n font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, sans-serif;\\n pointer-events: auto;\\n animation: styles-module__overlayFadeIn___aECVy 0.3s ease;\\n line-height: 1.5;\\n max-width: 280px;\\n}\\n\\n.styles-module__wireframeOpacityRow___CJXzi {\\n display: flex;\\n align-items: center;\\n gap: 8px;\\n margin-bottom: 8px;\\n}\\n\\n.styles-module__wireframeOpacityLabel___afkfT {\\n font-size: 9px;\\n font-weight: 500;\\n color: rgba(0, 0, 0, 0.32);\\n letter-spacing: 0.02em;\\n white-space: nowrap;\\n user-select: none;\\n}\\n\\n.styles-module__wireframeOpacitySlider___YcoEs {\\n -webkit-appearance: none;\\n appearance: none;\\n width: 56px;\\n height: 4px;\\n background: rgba(0, 0, 0, 0.08);\\n border-radius: 2px;\\n outline: none;\\n cursor: pointer;\\n flex-shrink: 0;\\n transition: background 0.15s ease;\\n}\\n.styles-module__wireframeOpacitySlider___YcoEs:hover {\\n background: rgba(0, 0, 0, 0.13);\\n}\\n.styles-module__wireframeOpacitySlider___YcoEs::-webkit-slider-thumb {\\n -webkit-appearance: none;\\n appearance: none;\\n width: 10px;\\n height: 10px;\\n border-radius: 50%;\\n background: #f97316;\\n cursor: pointer;\\n transition: background 0.15s ease;\\n}\\n.styles-module__wireframeOpacitySlider___YcoEs::-webkit-slider-thumb:hover {\\n background: rgb(224.4209205021, 95.3548117155, 5.7790794979);\\n}\\n.styles-module__wireframeOpacitySlider___YcoEs::-moz-range-thumb {\\n width: 10px;\\n height: 10px;\\n border-radius: 50%;\\n background: #f97316;\\n border: none;\\n cursor: pointer;\\n}\\n.styles-module__wireframeOpacitySlider___YcoEs::-moz-range-track {\\n background: rgba(0, 0, 0, 0.08);\\n height: 4px;\\n border-radius: 2px;\\n}\\n\\n.styles-module__wireframeNoticeTitleRow___PJqyG {\\n display: flex;\\n align-items: center;\\n gap: 0;\\n margin-bottom: 2px;\\n}\\n\\n.styles-module__wireframeNoticeTitle___okr08 {\\n font-weight: 600;\\n color: rgba(0, 0, 0, 0.55);\\n}\\n\\n.styles-module__wireframeNoticeDivider___PNKQ6 {\\n width: 1px;\\n height: 8px;\\n background: rgba(0, 0, 0, 0.12);\\n margin: 0 8px;\\n flex-shrink: 0;\\n}\\n\\n.styles-module__wireframeStartOver___YFk-I {\\n font-size: 9.5px;\\n font-weight: 500;\\n color: rgba(0, 0, 0, 0.35);\\n cursor: pointer;\\n background: none;\\n border: none;\\n padding: 0;\\n font-family: inherit;\\n text-decoration: none;\\n transition: color 0.12s ease;\\n white-space: nowrap;\\n}\\n.styles-module__wireframeStartOver___YFk-I:hover {\\n color: rgba(0, 0, 0, 0.6);\\n}\\n\\n.styles-module__ghostOutline___po-kO {\\n position: fixed;\\n border: 1.5px dashed rgba(59, 130, 246, 0.4);\\n border-radius: 4px;\\n background: rgba(59, 130, 246, 0.04);\\n cursor: grab;\\n opacity: 0.5;\\n user-select: none;\\n pointer-events: auto;\\n animation: styles-module__ghostEnter___EC3Mb 0.25s ease;\\n transition: box-shadow 0.15s, border-color 0.3s, opacity 0.25s;\\n}\\n.styles-module__ghostOutline___po-kO:active {\\n cursor: grabbing;\\n}\\n.styles-module__ghostOutline___po-kO:hover {\\n opacity: 0.7;\\n box-shadow: 0 0 0 1px rgba(59, 130, 246, 0.1), 0 4px 12px rgba(0, 0, 0, 0.08);\\n}\\n.styles-module__ghostOutline___po-kO.styles-module__selected___6yrp6 {\\n opacity: 1;\\n border-style: solid;\\n border-width: 2px;\\n border-color: #3c82f7;\\n background: rgba(59, 130, 246, 0.08);\\n box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.15), 0 2px 8px rgba(59, 130, 246, 0.15);\\n}\\n.styles-module__ghostOutline___po-kO.styles-module__exiting___YrM8F {\\n opacity: 0;\\n transform: scale(0.97);\\n pointer-events: none;\\n animation: none;\\n transition: opacity 0.2s ease, transform 0.2s cubic-bezier(0.32, 0.72, 0, 1);\\n}\\n\\n.styles-module__ghostBadge___tsQUK {\\n position: absolute;\\n bottom: calc(100% + 4px);\\n left: -1px;\\n font-size: 9px;\\n font-weight: 600;\\n color: rgba(59, 130, 246, 0.9);\\n background: rgba(59, 130, 246, 0.08);\\n border: 1px solid rgba(59, 130, 246, 0.2);\\n padding: 1px 5px;\\n border-radius: 3px;\\n white-space: nowrap;\\n pointer-events: none;\\n font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, sans-serif;\\n letter-spacing: 0.02em;\\n line-height: 1.2;\\n animation: styles-module__badgeSlideIn___typJ7 0.2s ease both;\\n}\\n\\n@keyframes styles-module__badgeSlideIn___typJ7 {\\n from {\\n opacity: 0;\\n transform: translateY(4px);\\n }\\n to {\\n opacity: 1;\\n transform: translateY(0);\\n }\\n}\\n.styles-module__ghostBadgeExtra___6CVoD {\\n display: inline;\\n animation: styles-module__badgeExtraIn___i4W8F 0.2s ease both;\\n}\\n\\n@keyframes styles-module__badgeExtraIn___i4W8F {\\n from {\\n opacity: 0;\\n }\\n to {\\n opacity: 1;\\n }\\n}\\n.styles-module__originalOutline___Y6DD1 {\\n position: fixed;\\n border: 1.5px dashed rgba(150, 150, 150, 0.3);\\n border-radius: 4px;\\n background: transparent;\\n pointer-events: none;\\n user-select: none;\\n animation: styles-module__sectionEnter___-8BXT 0.2s ease;\\n}\\n\\n.styles-module__originalLabel___HqI9g {\\n position: absolute;\\n top: 4px;\\n left: 4px;\\n font-size: 9px;\\n font-weight: 500;\\n color: rgba(150, 150, 150, 0.5);\\n padding: 1px 6px;\\n border-radius: 3px;\\n white-space: nowrap;\\n pointer-events: none;\\n font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, sans-serif;\\n background: rgba(150, 150, 150, 0.08);\\n}\\n\\n.styles-module__connectorSvg___Lovld {\\n position: fixed;\\n inset: 0;\\n width: 100vw;\\n height: 100vh;\\n pointer-events: none;\\n z-index: 99996;\\n}\\n\\n.styles-module__connectorLine___XeWh- {\\n transition: opacity 0.2s ease;\\n animation: styles-module__connectorDraw___8sK5I 0.3s ease both;\\n}\\n\\n.styles-module__connectorDot___yvf7C {\\n transform-box: fill-box;\\n transform-origin: center;\\n animation: styles-module__connectorDotIn___NwTUq 0.25s cubic-bezier(0.34, 1.56, 0.64, 1) 0.15s both;\\n}\\n\\n@keyframes styles-module__connectorDraw___8sK5I {\\n from {\\n opacity: 0;\\n }\\n to {\\n opacity: 1;\\n }\\n}\\n@keyframes styles-module__connectorDotIn___NwTUq {\\n from {\\n transform: scale(0);\\n opacity: 0;\\n }\\n to {\\n transform: scale(1);\\n opacity: 1;\\n }\\n}\\n.styles-module__connectorExiting___2lLOs {\\n animation: styles-module__connectorOut___5QoPl 0.2s ease forwards;\\n}\\n.styles-module__connectorExiting___2lLOs .styles-module__connectorDot___yvf7C {\\n animation: styles-module__connectorDotOut___FEq7e 0.2s ease forwards;\\n}\\n\\n@keyframes styles-module__connectorOut___5QoPl {\\n from {\\n opacity: 1;\\n }\\n to {\\n opacity: 0;\\n }\\n}\\n@keyframes styles-module__connectorDotOut___FEq7e {\\n from {\\n transform: scale(1);\\n opacity: 1;\\n }\\n to {\\n transform: scale(0);\\n opacity: 0;\\n }\\n}\\n@keyframes styles-module__placementEnter___TdRhf {\\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__sectionEnter___-8BXT {\\n from {\\n opacity: 0;\\n transform: scale(0.96);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1);\\n }\\n}\\n@keyframes styles-module__highlightFadeIn___Lg7KY {\\n from {\\n opacity: 0;\\n }\\n to {\\n opacity: 1;\\n }\\n}\\n@keyframes styles-module__overlayFadeIn___aECVy {\\n from {\\n opacity: 0;\\n }\\n to {\\n opacity: 1;\\n }\\n}\\n@keyframes styles-module__ghostEnter___EC3Mb {\\n from {\\n opacity: 0;\\n transform: scale(0.96);\\n }\\n to {\\n opacity: 0.6;\\n transform: scale(1);\\n }\\n}\";\nconst classNames = {\"overlayExiting\":\"styles-module__overlayExiting___iEmYr\",\"overlay\":\"styles-module__overlay___aWh-q\",\"overlayFadeIn\":\"styles-module__overlayFadeIn___aECVy\",\"light\":\"styles-module__light___ORIft\",\"wireframe\":\"styles-module__wireframe___itvQU\",\"placing\":\"styles-module__placing___45yD8\",\"passthrough\":\"styles-module__passthrough___xaFeE\",\"blankCanvas\":\"styles-module__blankCanvas___t2Eue\",\"visible\":\"styles-module__visible___OKKqX\",\"gridActive\":\"styles-module__gridActive___OZ-cf\",\"paletteHeader\":\"styles-module__paletteHeader___-Q5gQ\",\"paletteHeaderTitle\":\"styles-module__paletteHeaderTitle___oHqZC\",\"paletteHeaderDesc\":\"styles-module__paletteHeaderDesc___6i74T\",\"wireframePurposeWrap\":\"styles-module__wireframePurposeWrap___To-tS\",\"collapsed\":\"styles-module__collapsed___Ms9vS\",\"wireframePurposeInner\":\"styles-module__wireframePurposeInner___Lrahs\",\"wireframePurposeInput\":\"styles-module__wireframePurposeInput___7EtBN\",\"canvasToggle\":\"styles-module__canvasToggle___-QqSy\",\"active\":\"styles-module__active___hosp7\",\"canvasToggleIcon\":\"styles-module__canvasToggleIcon___7pJ82\",\"canvasToggleLabel\":\"styles-module__canvasToggleLabel___OanpY\",\"canvasPurposeWrap\":\"styles-module__canvasPurposeWrap___hj6zk\",\"canvasPurposeInner\":\"styles-module__canvasPurposeInner___VWiyu\",\"canvasPurposeToggle\":\"styles-module__canvasPurposeToggle___byDH2\",\"canvasPurposeCheck\":\"styles-module__canvasPurposeCheck___xqd7l\",\"checked\":\"styles-module__checked___-1JGH\",\"canvasPurposeLabel\":\"styles-module__canvasPurposeLabel___Zu-tD\",\"canvasPurposeHelp\":\"styles-module__canvasPurposeHelp___jijwR\",\"placement\":\"styles-module__placement___zcxv8\",\"placementEnter\":\"styles-module__placementEnter___TdRhf\",\"selected\":\"styles-module__selected___6yrp6\",\"dragging\":\"styles-module__dragging___le6KZ\",\"exiting\":\"styles-module__exiting___YrM8F\",\"placementContent\":\"styles-module__placementContent___f64A4\",\"placementLabel\":\"styles-module__placementLabel___0KvWl\",\"placementAnnotation\":\"styles-module__placementAnnotation___78pTr\",\"annotationVisible\":\"styles-module__annotationVisible___mrUyA\",\"sectionAnnotation\":\"styles-module__sectionAnnotation___aUIs0\",\"handle\":\"styles-module__handle___Ikbxm\",\"sectionOutline\":\"styles-module__sectionOutline___s0hy-\",\"ghostOutline\":\"styles-module__ghostOutline___po-kO\",\"handleNw\":\"styles-module__handleNw___4TMIj\",\"handleNe\":\"styles-module__handleNe___mnsTh\",\"handleSe\":\"styles-module__handleSe___oSFnk\",\"handleSw\":\"styles-module__handleSw___pi--Z\",\"handleN\":\"styles-module__handleN___aBA-Q\",\"handleE\":\"styles-module__handleE___0hM5u\",\"handleS\":\"styles-module__handleS___JjDRv\",\"handleW\":\"styles-module__handleW___ERWGQ\",\"edgeHandle\":\"styles-module__edgeHandle___XxXdT\",\"edgeN\":\"styles-module__edgeN___-JJDj\",\"edgeS\":\"styles-module__edgeS___66lMX\",\"edgeE\":\"styles-module__edgeE___1bGDa\",\"edgeW\":\"styles-module__edgeW___lHQNo\",\"deleteButton\":\"styles-module__deleteButton___LkGCb\",\"rearrangeOverlay\":\"styles-module__rearrangeOverlay___-3R3t\",\"drawBox\":\"styles-module__drawBox___BrVAa\",\"selectBox\":\"styles-module__selectBox___Iu8kB\",\"sizeIndicator\":\"styles-module__sizeIndicator___7zJ4y\",\"guideLine\":\"styles-module__guideLine___DUQY2\",\"dragPreview\":\"styles-module__dragPreview___onPbU\",\"dragPreviewWireframe\":\"styles-module__dragPreviewWireframe___jsg0G\",\"palette\":\"styles-module__palette___C7iSH\",\"paletteItem\":\"styles-module__paletteItem___6TlnA\",\"paletteItemLabel\":\"styles-module__paletteItemLabel___6ncO4\",\"paletteSectionTitle\":\"styles-module__paletteSectionTitle___PqnjX\",\"paletteFooter\":\"styles-module__paletteFooter___QYnAG\",\"enter\":\"styles-module__enter___6LYk5\",\"exit\":\"styles-module__exit___iSGRw\",\"paletteSection\":\"styles-module__paletteSection___V8DEA\",\"paletteItemIcon\":\"styles-module__paletteItemIcon___0NPQK\",\"placeScroll\":\"styles-module__placeScroll___7sClM\",\"fadeTop\":\"styles-module__fadeTop___KT9tF\",\"fadeBottom\":\"styles-module__fadeBottom___x3ShT\",\"paletteFooterWrap\":\"styles-module__paletteFooterWrap___71-fI\",\"footerHidden\":\"styles-module__footerHidden___fJUik\",\"paletteFooterInnerContent\":\"styles-module__paletteFooterInnerContent___VC26h\",\"paletteFooterInner\":\"styles-module__paletteFooterInner___dfylY\",\"paletteFooterCount\":\"styles-module__paletteFooterCount___D3Fia\",\"paletteFooterClear\":\"styles-module__paletteFooterClear___ybBoa\",\"paletteFooterActions\":\"styles-module__paletteFooterActions___fLzv8\",\"rollingWrap\":\"styles-module__rollingWrap___S75jM\",\"rollingNum\":\"styles-module__rollingNum___1RKDx\",\"exitUp\":\"styles-module__exitUp___AFDRW\",\"numExitUp\":\"styles-module__numExitUp___FRQqx\",\"enterUp\":\"styles-module__enterUp___CPlXb\",\"numEnterUp\":\"styles-module__numEnterUp___2Yd-w\",\"exitDown\":\"styles-module__exitDown___-1yAy\",\"numExitDown\":\"styles-module__numExitDown___xm5by\",\"enterDown\":\"styles-module__enterDown___DDuFR\",\"numEnterDown\":\"styles-module__numEnterDown___hpxBk\",\"hoverHighlight\":\"styles-module__hoverHighlight___8eT-v\",\"highlightFadeIn\":\"styles-module__highlightFadeIn___Lg7KY\",\"sectionEnter\":\"styles-module__sectionEnter___-8BXT\",\"settled\":\"styles-module__settled___b5U5o\",\"sectionLabel\":\"styles-module__sectionLabel___F80HQ\",\"movedBadge\":\"styles-module__movedBadge___s8z-q\",\"sectionDimensions\":\"styles-module__sectionDimensions___RcJSL\",\"badgeVisible\":\"styles-module__badgeVisible___npbdS\",\"resizedBadge\":\"styles-module__resizedBadge___u51V8\",\"wireframeNotice\":\"styles-module__wireframeNotice___4GJyB\",\"wireframeOpacityRow\":\"styles-module__wireframeOpacityRow___CJXzi\",\"wireframeOpacityLabel\":\"styles-module__wireframeOpacityLabel___afkfT\",\"wireframeOpacitySlider\":\"styles-module__wireframeOpacitySlider___YcoEs\",\"wireframeNoticeTitleRow\":\"styles-module__wireframeNoticeTitleRow___PJqyG\",\"wireframeNoticeTitle\":\"styles-module__wireframeNoticeTitle___okr08\",\"wireframeNoticeDivider\":\"styles-module__wireframeNoticeDivider___PNKQ6\",\"wireframeStartOver\":\"styles-module__wireframeStartOver___YFk-I\",\"ghostEnter\":\"styles-module__ghostEnter___EC3Mb\",\"ghostBadge\":\"styles-module__ghostBadge___tsQUK\",\"badgeSlideIn\":\"styles-module__badgeSlideIn___typJ7\",\"ghostBadgeExtra\":\"styles-module__ghostBadgeExtra___6CVoD\",\"badgeExtraIn\":\"styles-module__badgeExtraIn___i4W8F\",\"originalOutline\":\"styles-module__originalOutline___Y6DD1\",\"originalLabel\":\"styles-module__originalLabel___HqI9g\",\"connectorSvg\":\"styles-module__connectorSvg___Lovld\",\"connectorLine\":\"styles-module__connectorLine___XeWh-\",\"connectorDraw\":\"styles-module__connectorDraw___8sK5I\",\"connectorDot\":\"styles-module__connectorDot___yvf7C\",\"connectorDotIn\":\"styles-module__connectorDotIn___NwTUq\",\"connectorExiting\":\"styles-module__connectorExiting___2lLOs\",\"connectorOut\":\"styles-module__connectorOut___5QoPl\",\"connectorDotOut\":\"styles-module__connectorDotOut___FEq7e\"};\n\n// SSR-safe style injection (always update for HMR)\nif (typeof document !== 'undefined') {\n let style = document.getElementById('feedback-tool-styles-design-mode-styles');\n if (!style) {\n style = document.createElement('style');\n style.id = 'feedback-tool-styles-design-mode-styles';\n document.head.appendChild(style);\n }\n style.textContent = css;\n}\n\nexport default classNames;\n","\"use client\";\r\n\r\nimport { useCallback, useEffect, useRef, useState } from \"react\";\r\nimport { COMPONENT_REGISTRY, DEFAULT_SIZES, type ComponentType } from \"./types\";\r\nimport styles from \"./styles.module.scss\";\r\n\r\nfunction scrollFadeClass(el: HTMLDivElement | null) {\r\n if (!el) return \"\";\r\n const top = el.scrollTop > 2;\r\n const bottom = el.scrollTop + el.clientHeight < el.scrollHeight - 2;\r\n return `${top ? styles.fadeTop : \"\"} ${bottom ? styles.fadeBottom : \"\"}`;\r\n}\r\n\r\n// =============================================================================\r\n// Mini SVG Icons for Palette (compact 20x16)\r\n// =============================================================================\r\n\r\nconst s = \"currentColor\";\r\nconst sw = \"0.5\";\r\n\r\nexport function PaletteIconSvg({ type }: { type: ComponentType }) {\r\n switch (type) {\r\n case \"navigation\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"1\" y=\"4\" width=\"18\" height=\"8\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"2.5\" y=\"7\" width=\"3\" height=\"1.5\" rx=\".5\" fill={s} opacity=\".4\" />\r\n <rect x=\"7\" y=\"7\" width=\"2.5\" height=\"1.5\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <rect x=\"11\" y=\"7\" width=\"2.5\" height=\"1.5\" rx=\".5\" fill={s} opacity=\".25\" />\r\n </svg>\r\n );\r\n case \"header\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"1\" y=\"2\" width=\"18\" height=\"12\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"3\" y=\"5.5\" width=\"8\" height=\"2\" rx=\".5\" fill={s} opacity=\".35\" />\r\n <rect x=\"3\" y=\"9\" width=\"12\" height=\"1\" rx=\".5\" fill={s} opacity=\".15\" />\r\n </svg>\r\n );\r\n case \"hero\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"1\" y=\"1\" width=\"18\" height=\"14\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"5\" y=\"5\" width=\"10\" height=\"1.5\" rx=\".5\" fill={s} opacity=\".35\" />\r\n <rect x=\"7\" y=\"8\" width=\"6\" height=\"1\" rx=\".5\" fill={s} opacity=\".15\" />\r\n <rect x=\"7.5\" y=\"10.5\" width=\"5\" height=\"2.5\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n </svg>\r\n );\r\n case \"section\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"1\" y=\"1\" width=\"18\" height=\"14\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"3\" y=\"4\" width=\"6\" height=\"1\" rx=\".5\" fill={s} opacity=\".3\" />\r\n <rect x=\"3\" y=\"6.5\" width=\"14\" height=\"1\" rx=\".5\" fill={s} opacity=\".15\" />\r\n <rect x=\"3\" y=\"9\" width=\"10\" height=\"1\" rx=\".5\" fill={s} opacity=\".15\" />\r\n </svg>\r\n );\r\n case \"sidebar\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"1\" y=\"1\" width=\"7\" height=\"14\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"2.5\" y=\"4\" width=\"4\" height=\"1\" rx=\".5\" fill={s} opacity=\".3\" />\r\n <rect x=\"2.5\" y=\"6.5\" width=\"3.5\" height=\"1\" rx=\".5\" fill={s} opacity=\".15\" />\r\n <rect x=\"2.5\" y=\"9\" width=\"4\" height=\"1\" rx=\".5\" fill={s} opacity=\".15\" />\r\n </svg>\r\n );\r\n case \"footer\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"1\" y=\"7\" width=\"18\" height=\"8\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"3\" y=\"9.5\" width=\"4\" height=\"1\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <rect x=\"9\" y=\"9.5\" width=\"4\" height=\"1\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <rect x=\"15\" y=\"9.5\" width=\"3\" height=\"1\" rx=\".5\" fill={s} opacity=\".2\" />\r\n </svg>\r\n );\r\n case \"modal\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"3\" y=\"2\" width=\"14\" height=\"12\" rx=\"1.5\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"5\" y=\"4.5\" width=\"7\" height=\"1\" rx=\".5\" fill={s} opacity=\".3\" />\r\n <rect x=\"5\" y=\"7\" width=\"10\" height=\"1\" rx=\".5\" fill={s} opacity=\".15\" />\r\n <rect x=\"11\" y=\"11\" width=\"5\" height=\"2\" rx=\".75\" stroke={s} strokeWidth={sw} />\r\n </svg>\r\n );\r\n case \"divider\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <line x1=\"2\" y1=\"8\" x2=\"18\" y2=\"8\" stroke={s} strokeWidth=\"0.5\" opacity=\".3\" />\r\n </svg>\r\n );\r\n case \"card\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"2\" y=\"1\" width=\"16\" height=\"14\" rx=\"1.5\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"2\" y=\"1\" width=\"16\" height=\"5.5\" rx=\"1\" fill={s} opacity=\".04\" />\r\n <rect x=\"4\" y=\"8.5\" width=\"8\" height=\"1\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <rect x=\"4\" y=\"11\" width=\"11\" height=\"1\" rx=\".5\" fill={s} opacity=\".12\" />\r\n </svg>\r\n );\r\n case \"text\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"2\" y=\"4\" width=\"14\" height=\"1.5\" rx=\".5\" fill={s} opacity=\".3\" />\r\n <rect x=\"2\" y=\"7\" width=\"11\" height=\"1\" rx=\".5\" fill={s} opacity=\".15\" />\r\n <rect x=\"2\" y=\"9.5\" width=\"13\" height=\"1\" rx=\".5\" fill={s} opacity=\".15\" />\r\n <rect x=\"2\" y=\"12\" width=\"8\" height=\"1\" rx=\".5\" fill={s} opacity=\".12\" />\r\n </svg>\r\n );\r\n case \"image\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"2\" y=\"2\" width=\"16\" height=\"12\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <line x1=\"2\" y1=\"2\" x2=\"18\" y2=\"14\" stroke={s} strokeWidth=\".3\" opacity=\".25\" />\r\n <line x1=\"18\" y1=\"2\" x2=\"2\" y2=\"14\" stroke={s} strokeWidth=\".3\" opacity=\".25\" />\r\n </svg>\r\n );\r\n case \"video\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"2\" y=\"2\" width=\"16\" height=\"12\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <path d=\"M8.5 5.5v5l4.5-2.5z\" stroke={s} strokeWidth={sw} fill={s} opacity=\".15\" />\r\n </svg>\r\n );\r\n case \"table\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"1\" y=\"2\" width=\"18\" height=\"12\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <line x1=\"1\" y1=\"5.5\" x2=\"19\" y2=\"5.5\" stroke={s} strokeWidth=\".3\" opacity=\".25\" />\r\n <line x1=\"1\" y1=\"9\" x2=\"19\" y2=\"9\" stroke={s} strokeWidth=\".3\" opacity=\".25\" />\r\n <line x1=\"7\" y1=\"2\" x2=\"7\" y2=\"14\" stroke={s} strokeWidth=\".3\" opacity=\".25\" />\r\n <line x1=\"13\" y1=\"2\" x2=\"13\" y2=\"14\" stroke={s} strokeWidth=\".3\" opacity=\".25\" />\r\n </svg>\r\n );\r\n case \"grid\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"1.5\" y=\"2\" width=\"7\" height=\"5.5\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"11.5\" y=\"2\" width=\"7\" height=\"5.5\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"1.5\" y=\"9.5\" width=\"7\" height=\"5.5\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"11.5\" y=\"9.5\" width=\"7\" height=\"5.5\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n </svg>\r\n );\r\n case \"list\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <circle cx=\"3.5\" cy=\"4.5\" r=\"1\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"6.5\" y=\"4\" width=\"10\" height=\"1\" rx=\".5\" fill={s} opacity=\".2\" />\r\n <circle cx=\"3.5\" cy=\"8\" r=\"1\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"6.5\" y=\"7.5\" width=\"8\" height=\"1\" rx=\".5\" fill={s} opacity=\".2\" />\r\n <circle cx=\"3.5\" cy=\"11.5\" r=\"1\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"6.5\" y=\"11\" width=\"11\" height=\"1\" rx=\".5\" fill={s} opacity=\".2\" />\r\n </svg>\r\n );\r\n case \"chart\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"3\" y=\"9\" width=\"2.5\" height=\"4\" rx=\".5\" fill={s} opacity=\".2\" />\r\n <rect x=\"7\" y=\"6\" width=\"2.5\" height=\"7\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <rect x=\"11\" y=\"3\" width=\"2.5\" height=\"10\" rx=\".5\" fill={s} opacity=\".3\" />\r\n <rect x=\"15\" y=\"5\" width=\"2.5\" height=\"8\" rx=\".5\" fill={s} opacity=\".2\" />\r\n </svg>\r\n );\r\n case \"accordion\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"1.5\" y=\"2\" width=\"17\" height=\"4\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"3\" y=\"3.5\" width=\"6\" height=\"1\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <rect x=\"1.5\" y=\"7.5\" width=\"17\" height=\"3\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"1.5\" y=\"12\" width=\"17\" height=\"3\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n </svg>\r\n );\r\n case \"carousel\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"3\" y=\"2\" width=\"14\" height=\"10\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <path d=\"M1.5 7L3 8.5 1.5 10\" stroke={s} strokeWidth={sw} opacity=\".35\" />\r\n <path d=\"M18.5 7L17 8.5 18.5 10\" stroke={s} strokeWidth={sw} opacity=\".35\" />\r\n <circle cx=\"8.5\" cy=\"14\" r=\".6\" fill={s} opacity=\".35\" />\r\n <circle cx=\"10\" cy=\"14\" r=\".6\" fill={s} opacity=\".15\" />\r\n <circle cx=\"11.5\" cy=\"14\" r=\".6\" fill={s} opacity=\".15\" />\r\n </svg>\r\n );\r\n case \"button\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"3\" y=\"5\" width=\"14\" height=\"6\" rx=\"2\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"6.5\" y=\"7.5\" width=\"7\" height=\"1\" rx=\".5\" fill={s} opacity=\".25\" />\r\n </svg>\r\n );\r\n case \"input\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"2\" y=\"4\" width=\"5.5\" height=\"1\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <rect x=\"2\" y=\"6.5\" width=\"16\" height=\"5.5\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"3.5\" y=\"8.5\" width=\"7\" height=\"1\" rx=\".5\" fill={s} opacity=\".12\" />\r\n </svg>\r\n );\r\n case \"search\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"2\" y=\"4.5\" width=\"16\" height=\"7\" rx=\"3.5\" stroke={s} strokeWidth={sw} />\r\n <circle cx=\"6\" cy=\"8\" r=\"2\" stroke={s} strokeWidth={sw} opacity=\".3\" />\r\n <line x1=\"7.5\" y1=\"9.5\" x2=\"9\" y2=\"11\" stroke={s} strokeWidth={sw} opacity=\".3\" />\r\n <rect x=\"9.5\" y=\"7.5\" width=\"6\" height=\"1\" rx=\".5\" fill={s} opacity=\".12\" />\r\n </svg>\r\n );\r\n case \"form\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"2\" y=\"1.5\" width=\"5.5\" height=\"1\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <rect x=\"2\" y=\"3.5\" width=\"16\" height=\"3\" rx=\".75\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"2\" y=\"8\" width=\"7\" height=\"1\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <rect x=\"2\" y=\"10\" width=\"16\" height=\"3\" rx=\".75\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"12\" y=\"14\" width=\"6\" height=\"2\" rx=\".75\" stroke={s} strokeWidth={sw} />\r\n </svg>\r\n );\r\n case \"tabs\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"1\" y=\"5\" width=\"18\" height=\"10\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"1\" y=\"2\" width=\"6\" height=\"3.5\" rx=\".75\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"2.5\" y=\"3.25\" width=\"3\" height=\"1\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <rect x=\"7\" y=\"2\" width=\"6\" height=\"3.5\" rx=\".75\" stroke={s} strokeWidth={sw} />\r\n </svg>\r\n );\r\n case \"dropdown\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"2\" y=\"2\" width=\"16\" height=\"4\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"3.5\" y=\"3.5\" width=\"7\" height=\"1\" rx=\".5\" fill={s} opacity=\".2\" />\r\n <path d=\"M15 3.5l1.5 1.5L18 3.5\" stroke={s} strokeWidth={sw} opacity=\".3\" />\r\n <rect x=\"2\" y=\"7\" width=\"16\" height=\"7\" rx=\"1\" stroke={s} strokeWidth={sw} strokeDasharray=\"2 1\" opacity=\".3\" />\r\n </svg>\r\n );\r\n case \"toggle\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"4\" y=\"5\" width=\"12\" height=\"6\" rx=\"3\" stroke={s} strokeWidth={sw} />\r\n <circle cx=\"13\" cy=\"8\" r=\"2\" fill={s} opacity=\".3\" />\r\n </svg>\r\n );\r\n case \"avatar\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <circle cx=\"10\" cy=\"8\" r=\"6\" stroke={s} strokeWidth={sw} />\r\n <circle cx=\"10\" cy=\"6.5\" r=\"2\" stroke={s} strokeWidth={sw} />\r\n <path d=\"M6.5 13c0-2 1.5-3.5 3.5-3.5s3.5 1.5 3.5 3.5\" stroke={s} strokeWidth={sw} />\r\n </svg>\r\n );\r\n case \"badge\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"3\" y=\"5\" width=\"14\" height=\"6\" rx=\"3\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"6\" y=\"7.5\" width=\"8\" height=\"1\" rx=\".5\" fill={s} opacity=\".25\" />\r\n </svg>\r\n );\r\n case \"breadcrumb\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"1.5\" y=\"7\" width=\"3.5\" height=\"1\" rx=\".5\" fill={s} opacity=\".3\" />\r\n <path d=\"M6.5 7l1 1-1 1\" stroke={s} strokeWidth={sw} opacity=\".2\" />\r\n <rect x=\"9\" y=\"7\" width=\"3.5\" height=\"1\" rx=\".5\" fill={s} opacity=\".2\" />\r\n <path d=\"M14 7l1 1-1 1\" stroke={s} strokeWidth={sw} opacity=\".2\" />\r\n <rect x=\"16.5\" y=\"7\" width=\"2\" height=\"1\" rx=\".5\" fill={s} opacity=\".15\" />\r\n </svg>\r\n );\r\n case \"pagination\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"2\" y=\"5.5\" width=\"3.5\" height=\"5\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"6.5\" y=\"5.5\" width=\"3.5\" height=\"5\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"11\" y=\"5.5\" width=\"3.5\" height=\"5\" rx=\"1\" fill={s} opacity=\".15\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"15.5\" y=\"5.5\" width=\"3.5\" height=\"5\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n </svg>\r\n );\r\n case \"progress\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"2\" y=\"7\" width=\"16\" height=\"2\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"2\" y=\"7\" width=\"10\" height=\"2\" rx=\"1\" fill={s} opacity=\".2\" />\r\n </svg>\r\n );\r\n case \"toast\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"2\" y=\"4\" width=\"16\" height=\"8\" rx=\"1.5\" stroke={s} strokeWidth={sw} />\r\n <circle cx=\"5\" cy=\"8\" r=\"1.5\" stroke={s} strokeWidth={sw} opacity=\".3\" />\r\n <rect x=\"8\" y=\"6.5\" width=\"7\" height=\"1\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <rect x=\"8\" y=\"9\" width=\"5\" height=\"1\" rx=\".5\" fill={s} opacity=\".12\" />\r\n </svg>\r\n );\r\n case \"tooltip\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"3\" y=\"3\" width=\"14\" height=\"7\" rx=\"1.5\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"5.5\" y=\"5.5\" width=\"9\" height=\"1\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <path d=\"M9 10l1 2.5 1-2.5\" stroke={s} strokeWidth={sw} />\r\n </svg>\r\n );\r\n case \"pricing\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"2\" y=\"1\" width=\"16\" height=\"14\" rx=\"1.5\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"6\" y=\"3\" width=\"8\" height=\"1.5\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <rect x=\"7\" y=\"5.5\" width=\"6\" height=\"2\" rx=\".5\" fill={s} opacity=\".15\" />\r\n <rect x=\"5\" y=\"9\" width=\"10\" height=\"1\" rx=\".5\" fill={s} opacity=\".1\" />\r\n <rect x=\"5\" y=\"11\" width=\"10\" height=\"1\" rx=\".5\" fill={s} opacity=\".1\" />\r\n <rect x=\"6\" y=\"13\" width=\"8\" height=\"1.5\" rx=\".5\" fill={s} opacity=\".2\" />\r\n </svg>\r\n );\r\n case \"testimonial\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"2\" y=\"1\" width=\"16\" height=\"14\" rx=\"1.5\" stroke={s} strokeWidth={sw} />\r\n <text x=\"4\" y=\"5.5\" fontSize=\"4\" fill={s} opacity=\".2\" fontFamily=\"serif\">“</text>\r\n <rect x=\"4\" y=\"7\" width=\"12\" height=\"1\" rx=\".5\" fill={s} opacity=\".15\" />\r\n <rect x=\"4\" y=\"9\" width=\"9\" height=\"1\" rx=\".5\" fill={s} opacity=\".12\" />\r\n <circle cx=\"5.5\" cy=\"12.5\" r=\"1.5\" stroke={s} strokeWidth={sw} opacity=\".25\" />\r\n <rect x=\"8\" y=\"12\" width=\"5\" height=\"1\" rx=\".5\" fill={s} opacity=\".15\" />\r\n </svg>\r\n );\r\n case \"cta\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"1\" y=\"2\" width=\"18\" height=\"12\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"5\" y=\"4.5\" width=\"10\" height=\"1.5\" rx=\".5\" fill={s} opacity=\".3\" />\r\n <rect x=\"6\" y=\"7.5\" width=\"8\" height=\"1\" rx=\".5\" fill={s} opacity=\".15\" />\r\n <rect x=\"7\" y=\"10\" width=\"6\" height=\"2.5\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n </svg>\r\n );\r\n case \"alert\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"2\" y=\"4\" width=\"16\" height=\"8\" rx=\"1.5\" stroke={s} strokeWidth={sw} />\r\n <circle cx=\"6\" cy=\"8\" r=\"2\" stroke={s} strokeWidth={sw} opacity=\".3\" />\r\n <line x1=\"6\" y1=\"7\" x2=\"6\" y2=\"8.5\" stroke={s} strokeWidth=\"0.6\" opacity=\".5\" />\r\n <circle cx=\"6\" cy=\"9.3\" r=\".3\" fill={s} opacity=\".5\" />\r\n <rect x=\"9.5\" y=\"7\" width=\"6\" height=\"1\" rx=\".5\" fill={s} opacity=\".2\" />\r\n </svg>\r\n );\r\n case \"banner\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"1\" y=\"5\" width=\"18\" height=\"6\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"4\" y=\"7.5\" width=\"8\" height=\"1\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <rect x=\"14\" y=\"7\" width=\"3.5\" height=\"2\" rx=\".75\" stroke={s} strokeWidth={sw} />\r\n </svg>\r\n );\r\n case \"stat\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"3\" y=\"2\" width=\"14\" height=\"12\" rx=\"1.5\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"6\" y=\"4.5\" width=\"8\" height=\"1\" rx=\".5\" fill={s} opacity=\".15\" />\r\n <rect x=\"5\" y=\"7\" width=\"10\" height=\"2.5\" rx=\".5\" fill={s} opacity=\".3\" />\r\n <rect x=\"7\" y=\"11\" width=\"6\" height=\"1\" rx=\".5\" fill={s} opacity=\".12\" />\r\n </svg>\r\n );\r\n case \"stepper\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <circle cx=\"4\" cy=\"8\" r=\"2\" fill={s} opacity=\".2\" stroke={s} strokeWidth={sw} />\r\n <line x1=\"6\" y1=\"8\" x2=\"8\" y2=\"8\" stroke={s} strokeWidth=\".4\" opacity=\".3\" />\r\n <circle cx=\"10\" cy=\"8\" r=\"2\" stroke={s} strokeWidth={sw} />\r\n <line x1=\"12\" y1=\"8\" x2=\"14\" y2=\"8\" stroke={s} strokeWidth=\".4\" opacity=\".3\" />\r\n <circle cx=\"16\" cy=\"8\" r=\"2\" stroke={s} strokeWidth={sw} />\r\n </svg>\r\n );\r\n case \"tag\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"3\" y=\"5\" width=\"14\" height=\"6\" rx=\"1.5\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"5.5\" y=\"7.5\" width=\"6\" height=\"1\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <line x1=\"14\" y1=\"6.5\" x2=\"15.5\" y2=\"9.5\" stroke={s} strokeWidth={sw} opacity=\".2\" />\r\n <line x1=\"15.5\" y1=\"6.5\" x2=\"14\" y2=\"9.5\" stroke={s} strokeWidth={sw} opacity=\".2\" />\r\n </svg>\r\n );\r\n case \"rating\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <path d=\"M4 5.5l1 2 2.2.3-1.6 1.5.4 2.2L4 10.3l-2 1.2.4-2.2L.8 7.8 3 7.5z\" fill={s} opacity=\".25\" />\r\n <path d=\"M10 5.5l1 2 2.2.3-1.6 1.5.4 2.2L10 10.3l-2 1.2.4-2.2L6.8 7.8 9 7.5z\" fill={s} opacity=\".25\" />\r\n <path d=\"M16 5.5l1 2 2.2.3-1.6 1.5.4 2.2L16 10.3l-2 1.2.4-2.2-1.6-1.5 2.2-.3z\" stroke={s} strokeWidth={sw} opacity=\".25\" />\r\n </svg>\r\n );\r\n case \"map\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"2\" y=\"2\" width=\"16\" height=\"12\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <line x1=\"2\" y1=\"6\" x2=\"18\" y2=\"10\" stroke={s} strokeWidth=\".3\" opacity=\".15\" />\r\n <line x1=\"7\" y1=\"2\" x2=\"11\" y2=\"14\" stroke={s} strokeWidth=\".3\" opacity=\".15\" />\r\n <path d=\"M10 5c-1.7 0-3 1.3-3 3 0 2.5 3 5 3 5s3-2.5 3-5c0-1.7-1.3-3-3-3z\" fill={s} opacity=\".15\" stroke={s} strokeWidth={sw} />\r\n </svg>\r\n );\r\n case \"timeline\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <line x1=\"5\" y1=\"2\" x2=\"5\" y2=\"14\" stroke={s} strokeWidth=\".4\" opacity=\".25\" />\r\n <circle cx=\"5\" cy=\"4\" r=\"1.5\" fill={s} opacity=\".2\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"8\" y=\"3\" width=\"8\" height=\"1\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <circle cx=\"5\" cy=\"8.5\" r=\"1.5\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"8\" y=\"7.5\" width=\"6\" height=\"1\" rx=\".5\" fill={s} opacity=\".15\" />\r\n <circle cx=\"5\" cy=\"13\" r=\"1.5\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"8\" y=\"12\" width=\"7\" height=\"1\" rx=\".5\" fill={s} opacity=\".15\" />\r\n </svg>\r\n );\r\n case \"fileUpload\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"3\" y=\"2\" width=\"14\" height=\"12\" rx=\"1.5\" stroke={s} strokeWidth={sw} strokeDasharray=\"2 1\" />\r\n <path d=\"M10 10V5.5m0 0L7.5 8m2.5-2.5L12.5 8\" stroke={s} strokeWidth={sw} opacity=\".3\" />\r\n <rect x=\"7\" y=\"11.5\" width=\"6\" height=\"1\" rx=\".5\" fill={s} opacity=\".15\" />\r\n </svg>\r\n );\r\n case \"codeBlock\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"2\" y=\"2\" width=\"16\" height=\"12\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <circle cx=\"4\" cy=\"4\" r=\".6\" fill={s} opacity=\".3\" />\r\n <circle cx=\"5.5\" cy=\"4\" r=\".6\" fill={s} opacity=\".3\" />\r\n <circle cx=\"7\" cy=\"4\" r=\".6\" fill={s} opacity=\".3\" />\r\n <rect x=\"4\" y=\"7\" width=\"7\" height=\"1\" rx=\".5\" fill={s} opacity=\".2\" />\r\n <rect x=\"6\" y=\"9\" width=\"5\" height=\"1\" rx=\".5\" fill={s} opacity=\".15\" />\r\n <rect x=\"4\" y=\"11\" width=\"8\" height=\"1\" rx=\".5\" fill={s} opacity=\".12\" />\r\n </svg>\r\n );\r\n case \"calendar\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"2\" y=\"3\" width=\"16\" height=\"12\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <line x1=\"2\" y1=\"6.5\" x2=\"18\" y2=\"6.5\" stroke={s} strokeWidth=\".4\" opacity=\".25\" />\r\n <rect x=\"5\" y=\"4\" width=\"1\" height=\"1.5\" rx=\".3\" fill={s} opacity=\".2\" />\r\n <rect x=\"14\" y=\"4\" width=\"1\" height=\"1.5\" rx=\".3\" fill={s} opacity=\".2\" />\r\n <circle cx=\"7\" cy=\"9\" r=\".6\" fill={s} opacity=\".2\" />\r\n <circle cx=\"10\" cy=\"9\" r=\".6\" fill={s} opacity=\".2\" />\r\n <circle cx=\"13\" cy=\"9\" r=\".6\" fill={s} opacity=\".3\" />\r\n <circle cx=\"7\" cy=\"12\" r=\".6\" fill={s} opacity=\".2\" />\r\n <circle cx=\"10\" cy=\"12\" r=\".6\" fill={s} opacity=\".2\" />\r\n </svg>\r\n );\r\n case \"notification\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"2\" y=\"3\" width=\"16\" height=\"10\" rx=\"1.5\" stroke={s} strokeWidth={sw} />\r\n <circle cx=\"5.5\" cy=\"8\" r=\"2\" stroke={s} strokeWidth={sw} opacity=\".25\" />\r\n <rect x=\"9\" y=\"6\" width=\"6\" height=\"1\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <rect x=\"9\" y=\"8.5\" width=\"4.5\" height=\"1\" rx=\".5\" fill={s} opacity=\".12\" />\r\n <circle cx=\"16.5\" cy=\"4.5\" r=\"1.5\" fill={s} opacity=\".25\" />\r\n </svg>\r\n );\r\n case \"productCard\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"3\" y=\"1\" width=\"14\" height=\"14\" rx=\"1.5\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"3\" y=\"1\" width=\"14\" height=\"6\" rx=\"1\" fill={s} opacity=\".04\" />\r\n <rect x=\"5\" y=\"8.5\" width=\"7\" height=\"1\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <rect x=\"5\" y=\"10.5\" width=\"4\" height=\"1.5\" rx=\".5\" fill={s} opacity=\".15\" />\r\n <rect x=\"12\" y=\"12\" width=\"4\" height=\"2\" rx=\".75\" stroke={s} strokeWidth={sw} />\r\n </svg>\r\n );\r\n case \"profile\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <circle cx=\"10\" cy=\"5\" r=\"3\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"5\" y=\"10\" width=\"10\" height=\"1.5\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <rect x=\"7\" y=\"12.5\" width=\"6\" height=\"1\" rx=\".5\" fill={s} opacity=\".12\" />\r\n </svg>\r\n );\r\n case \"drawer\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"9\" y=\"1\" width=\"10\" height=\"14\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"10.5\" y=\"4\" width=\"5\" height=\"1\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <rect x=\"10.5\" y=\"6.5\" width=\"7\" height=\"1\" rx=\".5\" fill={s} opacity=\".15\" />\r\n <rect x=\"10.5\" y=\"9\" width=\"6\" height=\"1\" rx=\".5\" fill={s} opacity=\".15\" />\r\n <rect x=\"1\" y=\"1\" width=\"7\" height=\"14\" rx=\"1\" stroke={s} strokeWidth={sw} opacity=\".15\" />\r\n </svg>\r\n );\r\n case \"popover\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"3\" y=\"2\" width=\"14\" height=\"9\" rx=\"1.5\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"5\" y=\"4.5\" width=\"8\" height=\"1\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <rect x=\"5\" y=\"7\" width=\"6\" height=\"1\" rx=\".5\" fill={s} opacity=\".15\" />\r\n <path d=\"M9 11l1 2.5 1-2.5\" stroke={s} strokeWidth={sw} />\r\n </svg>\r\n );\r\n case \"logo\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"2\" y=\"3\" width=\"10\" height=\"10\" rx=\"2\" stroke={s} strokeWidth={sw} />\r\n <path d=\"M5 9.5l2-4 2 4\" stroke={s} strokeWidth={sw} opacity=\".3\" />\r\n <rect x=\"14\" y=\"6\" width=\"4\" height=\"1\" rx=\".5\" fill={s} opacity=\".2\" />\r\n <rect x=\"14\" y=\"8.5\" width=\"3\" height=\"1\" rx=\".5\" fill={s} opacity=\".12\" />\r\n </svg>\r\n );\r\n case \"faq\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <text x=\"2.5\" y=\"5.5\" fontSize=\"4\" fill={s} opacity=\".3\" fontWeight=\"bold\">?</text>\r\n <rect x=\"7\" y=\"3\" width=\"10\" height=\"1\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <rect x=\"7\" y=\"5.5\" width=\"8\" height=\"1\" rx=\".5\" fill={s} opacity=\".12\" />\r\n <text x=\"2.5\" y=\"11.5\" fontSize=\"4\" fill={s} opacity=\".3\" fontWeight=\"bold\">?</text>\r\n <rect x=\"7\" y=\"9\" width=\"9\" height=\"1\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <rect x=\"7\" y=\"11.5\" width=\"7\" height=\"1\" rx=\".5\" fill={s} opacity=\".12\" />\r\n </svg>\r\n );\r\n case \"gallery\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"1.5\" y=\"1.5\" width=\"5\" height=\"5\" rx=\".75\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"7.5\" y=\"1.5\" width=\"5\" height=\"5\" rx=\".75\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"13.5\" y=\"1.5\" width=\"5\" height=\"5\" rx=\".75\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"1.5\" y=\"9.5\" width=\"5\" height=\"5\" rx=\".75\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"7.5\" y=\"9.5\" width=\"5\" height=\"5\" rx=\".75\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"13.5\" y=\"9.5\" width=\"5\" height=\"5\" rx=\".75\" stroke={s} strokeWidth={sw} />\r\n </svg>\r\n );\r\n case \"checkbox\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"5\" y=\"4\" width=\"8\" height=\"8\" rx=\"1.5\" stroke={s} strokeWidth={sw} />\r\n <path d=\"M7.5 8l1.5 1.5 3-3\" stroke={s} strokeWidth={sw} opacity=\".35\" />\r\n </svg>\r\n );\r\n case \"radio\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <circle cx=\"10\" cy=\"8\" r=\"4\" stroke={s} strokeWidth={sw} />\r\n <circle cx=\"10\" cy=\"8\" r=\"2\" fill={s} opacity=\".3\" />\r\n </svg>\r\n );\r\n case \"slider\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"2\" y=\"7.5\" width=\"16\" height=\"1\" rx=\".5\" fill={s} opacity=\".15\" />\r\n <rect x=\"2\" y=\"7.5\" width=\"10\" height=\"1\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <circle cx=\"12\" cy=\"8\" r=\"2.5\" stroke={s} strokeWidth={sw} />\r\n </svg>\r\n );\r\n case \"datePicker\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"2\" y=\"1\" width=\"16\" height=\"5\" rx=\"1\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"3.5\" y=\"3\" width=\"5\" height=\"1\" rx=\".5\" fill={s} opacity=\".2\" />\r\n <rect x=\"14\" y=\"2.5\" width=\"2.5\" height=\"2\" rx=\".5\" fill={s} opacity=\".12\" />\r\n <rect x=\"2\" y=\"7\" width=\"16\" height=\"8\" rx=\"1\" stroke={s} strokeWidth={sw} strokeDasharray=\"2 1\" opacity=\".3\" />\r\n <circle cx=\"6\" cy=\"10\" r=\".6\" fill={s} opacity=\".2\" />\r\n <circle cx=\"10\" cy=\"10\" r=\".6\" fill={s} opacity=\".3\" />\r\n <circle cx=\"14\" cy=\"10\" r=\".6\" fill={s} opacity=\".2\" />\r\n <circle cx=\"6\" cy=\"13\" r=\".6\" fill={s} opacity=\".2\" />\r\n <circle cx=\"10\" cy=\"13\" r=\".6\" fill={s} opacity=\".2\" />\r\n </svg>\r\n );\r\n case \"skeleton\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"2\" y=\"2\" width=\"16\" height=\"3\" rx=\"1\" fill={s} opacity=\".08\" />\r\n <rect x=\"2\" y=\"7\" width=\"10\" height=\"2\" rx=\".75\" fill={s} opacity=\".08\" />\r\n <rect x=\"2\" y=\"11\" width=\"13\" height=\"2\" rx=\".75\" fill={s} opacity=\".08\" />\r\n </svg>\r\n );\r\n case \"chip\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"1.5\" y=\"5\" width=\"10\" height=\"6\" rx=\"3\" fill={s} opacity=\".08\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"4\" y=\"7.5\" width=\"4\" height=\"1\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <line x1=\"9.5\" y1=\"6.5\" x2=\"10.5\" y2=\"9.5\" stroke={s} strokeWidth={sw} opacity=\".2\" />\r\n <line x1=\"10.5\" y1=\"6.5\" x2=\"9.5\" y2=\"9.5\" stroke={s} strokeWidth={sw} opacity=\".2\" />\r\n <rect x=\"13\" y=\"5\" width=\"5.5\" height=\"6\" rx=\"3\" stroke={s} strokeWidth={sw} opacity=\".25\" />\r\n </svg>\r\n );\r\n case \"icon\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <path d=\"M10 3l1.5 3 3.5.5-2.5 2.5.5 3.5L10 11l-3 1.5.5-3.5L5 6.5l3.5-.5z\" stroke={s} strokeWidth={sw} opacity=\".3\" />\r\n </svg>\r\n );\r\n case \"spinner\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <circle cx=\"10\" cy=\"8\" r=\"5\" stroke={s} strokeWidth={sw} opacity=\".12\" />\r\n <path d=\"M10 3a5 5 0 0 1 5 5\" stroke={s} strokeWidth={sw} opacity=\".35\" strokeLinecap=\"round\" />\r\n </svg>\r\n );\r\n case \"feature\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"2\" y=\"2\" width=\"5\" height=\"5\" rx=\"1.5\" stroke={s} strokeWidth={sw} />\r\n <path d=\"M4.5 3.5v3m-1.5-1.5h3\" stroke={s} strokeWidth={sw} opacity=\".25\" />\r\n <rect x=\"9\" y=\"2.5\" width=\"8\" height=\"1.5\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <rect x=\"9\" y=\"5.5\" width=\"6\" height=\"1\" rx=\".5\" fill={s} opacity=\".12\" />\r\n <rect x=\"2\" y=\"10\" width=\"5\" height=\"5\" rx=\"1.5\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"9\" y=\"10.5\" width=\"7\" height=\"1.5\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <rect x=\"9\" y=\"13.5\" width=\"5\" height=\"1\" rx=\".5\" fill={s} opacity=\".12\" />\r\n </svg>\r\n );\r\n case \"team\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <circle cx=\"5\" cy=\"5\" r=\"2.5\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"2.5\" y=\"9\" width=\"5\" height=\"1\" rx=\".5\" fill={s} opacity=\".2\" />\r\n <circle cx=\"15\" cy=\"5\" r=\"2.5\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"12.5\" y=\"9\" width=\"5\" height=\"1\" rx=\".5\" fill={s} opacity=\".2\" />\r\n <circle cx=\"10\" cy=\"5\" r=\"2.5\" stroke={s} strokeWidth={sw} opacity=\".5\" />\r\n <rect x=\"7.5\" y=\"9\" width=\"5\" height=\"1\" rx=\".5\" fill={s} opacity=\".15\" />\r\n <rect x=\"4\" y=\"12\" width=\"12\" height=\"1\" rx=\".5\" fill={s} opacity=\".1\" />\r\n </svg>\r\n );\r\n case \"login\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"3\" y=\"1\" width=\"14\" height=\"14\" rx=\"1.5\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"6\" y=\"3\" width=\"8\" height=\"1.5\" rx=\".5\" fill={s} opacity=\".25\" />\r\n <rect x=\"5\" y=\"5.5\" width=\"10\" height=\"3\" rx=\".75\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"5\" y=\"9.5\" width=\"10\" height=\"3\" rx=\".75\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"6.5\" y=\"13.5\" width=\"7\" height=\"2\" rx=\".75\" fill={s} opacity=\".2\" />\r\n </svg>\r\n );\r\n case \"contact\":\r\n return (\r\n <svg viewBox=\"0 0 20 16\" width=\"20\" height=\"16\" fill=\"none\">\r\n <rect x=\"2\" y=\"1\" width=\"16\" height=\"14\" rx=\"1.5\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"4\" y=\"3\" width=\"5\" height=\"1\" rx=\".5\" fill={s} opacity=\".2\" />\r\n <rect x=\"4\" y=\"5\" width=\"12\" height=\"2.5\" rx=\".75\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"4\" y=\"8.5\" width=\"12\" height=\"4\" rx=\".75\" stroke={s} strokeWidth={sw} />\r\n <rect x=\"11\" y=\"13.5\" width=\"5\" height=\"1.5\" rx=\".5\" fill={s} opacity=\".2\" />\r\n </svg>\r\n );\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// Shared Component Grid (reusable)\r\n// =============================================================================\r\n\r\ntype ComponentGridProps = {\r\n activeType: ComponentType | null;\r\n onSelect: (type: ComponentType) => void;\r\n onDragStart: (type: ComponentType, e: React.MouseEvent) => void;\r\n scrollRef?: React.Ref<HTMLDivElement>;\r\n fadeClass?: string;\r\n blankCanvas?: boolean;\r\n};\r\n\r\nexport function ComponentGrid({ activeType, onSelect, onDragStart, scrollRef, fadeClass, blankCanvas }: ComponentGridProps) {\r\n return (\r\n <div ref={scrollRef} className={`${styles.placeScroll} ${fadeClass || \"\"}`}>\r\n {COMPONENT_REGISTRY.map((section) => (\r\n <div key={section.section} className={styles.paletteSection}>\r\n <div className={styles.paletteSectionTitle}>{section.section}</div>\r\n {section.items.map((item) => (\r\n <div\r\n key={item.type}\r\n className={`${styles.paletteItem} ${activeType === item.type ? styles.active : \"\"} ${blankCanvas ? styles.wireframe : \"\"}`}\r\n onClick={() => onSelect(item.type)}\r\n onMouseDown={(e) => {\r\n if (e.button === 0) onDragStart(item.type, e);\r\n }}\r\n >\r\n <div className={styles.paletteItemIcon}>\r\n <PaletteIconSvg type={item.type} />\r\n </div>\r\n <span className={styles.paletteItemLabel}>{item.label}</span>\r\n </div>\r\n ))}\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n// =============================================================================\r\n// Palette Component\r\n// =============================================================================\r\n\r\n// Rolling number animation (old exits, new enters from opposite direction)\r\n// When suffix changes (e.g. \"Change\" → \"Changes\"), the whole label rolls.\r\n// When only the number changes, just the number rolls.\r\nfunction RollingCount({ value, suffix }: { value: number; suffix?: string }) {\r\n const [prev, setPrev] = useState<number | null>(null);\r\n const [prevSuffix, setPrevSuffix] = useState(suffix);\r\n const [dir, setDir] = useState<\"up\" | \"down\">(\"up\");\r\n const cur = useRef(value);\r\n const curSuffix = useRef(suffix);\r\n const timer = useRef<ReturnType<typeof setTimeout>>();\r\n\r\n const suffixChanged = prev !== null && prevSuffix !== suffix;\r\n\r\n useEffect(() => {\r\n if (value !== cur.current) {\r\n // Skip animation when hitting 0 — footer is about to collapse anyway\r\n if (value === 0) {\r\n cur.current = value;\r\n curSuffix.current = suffix;\r\n setPrev(null);\r\n return;\r\n }\r\n setDir(value > cur.current ? \"up\" : \"down\");\r\n setPrev(cur.current);\r\n setPrevSuffix(curSuffix.current);\r\n cur.current = value;\r\n curSuffix.current = suffix;\r\n clearTimeout(timer.current);\r\n timer.current = setTimeout(() => setPrev(null), 250);\r\n } else {\r\n curSuffix.current = suffix;\r\n }\r\n }, [value, suffix]);\r\n\r\n if (prev === null) return <>{value}{suffix ? ` ${suffix}` : \"\"}</>;\r\n\r\n if (suffixChanged) {\r\n // Suffix changed — roll the whole label\r\n return (\r\n <span className={styles.rollingWrap}>\r\n <span style={{ visibility: \"hidden\" }}>{value} {suffix}</span>\r\n <span key={`o${prev}-${value}`} className={`${styles.rollingNum} ${dir === \"up\" ? styles.exitUp : styles.exitDown}`}>{prev} {prevSuffix}</span>\r\n <span key={`n${value}`} className={`${styles.rollingNum} ${dir === \"up\" ? styles.enterUp : styles.enterDown}`}>{value} {suffix}</span>\r\n </span>\r\n );\r\n }\r\n\r\n // Only number changed — roll just the number\r\n return (\r\n <>\r\n <span className={styles.rollingWrap}>\r\n <span style={{ visibility: \"hidden\" }}>{value}</span>\r\n <span key={`o${prev}-${value}`} className={`${styles.rollingNum} ${dir === \"up\" ? styles.exitUp : styles.exitDown}`}>{prev}</span>\r\n <span key={`n${value}`} className={`${styles.rollingNum} ${dir === \"up\" ? styles.enterUp : styles.enterDown}`}>{value}</span>\r\n </span>\r\n {suffix ? ` ${suffix}` : \"\"}\r\n </>\r\n );\r\n}\r\n\r\ntype DesignPaletteProps = {\r\n activeType: ComponentType | null;\r\n onSelect: (type: ComponentType) => void;\r\n isDarkMode: boolean;\r\n //\r\n sectionCount: number;\r\n onDetectSections: () => void;\r\n visible: boolean;\r\n onExited?: () => void;\r\n placementCount: number;\r\n onClearPlacements: () => void;\r\n onDragStart: (type: ComponentType, e: React.MouseEvent) => void;\r\n blankCanvas: boolean;\r\n onBlankCanvasChange: (on: boolean) => void;\r\n wireframePurpose: string;\r\n onWireframePurposeChange: (purpose: string) => void;\r\n Tooltip?: React.ComponentType<{ content: string; children: React.ReactNode }>;\r\n};\r\n\r\nexport function DesignPalette({\r\n activeType,\r\n onSelect,\r\n isDarkMode,\r\n sectionCount,\r\n onDetectSections,\r\n visible,\r\n onExited,\r\n placementCount,\r\n onClearPlacements,\r\n onDragStart,\r\n blankCanvas,\r\n onBlankCanvasChange,\r\n wireframePurpose,\r\n onWireframePurposeChange,\r\n Tooltip,\r\n}: DesignPaletteProps) {\r\n const [mounted, setMounted] = useState(false);\r\n const [animClass, setAnimClass] = useState<\"enter\" | \"exit\">(\"exit\");\r\n const [footerVisible, setFooterVisible] = useState(false);\r\n const [footerCollapsed, setFooterCollapsed] = useState(true);\r\n const lastFooterCount = useRef(0);\r\n const lastFooterSuffix = useRef(\"\");\r\n const rafRef = useRef(0);\r\n const exitTimerRef = useRef<ReturnType<typeof setTimeout>>();\r\n const placeScrollRef = useRef<HTMLDivElement>(null);\r\n const [placeFade, setPlaceFade] = useState(\"\");\r\n\r\n useEffect(() => {\r\n if (visible) {\r\n setMounted(true);\r\n clearTimeout(exitTimerRef.current);\r\n cancelAnimationFrame(rafRef.current);\r\n rafRef.current = requestAnimationFrame(() => {\r\n rafRef.current = requestAnimationFrame(() => {\r\n setAnimClass(\"enter\");\r\n });\r\n });\r\n } else {\r\n cancelAnimationFrame(rafRef.current);\r\n setAnimClass(\"exit\");\r\n clearTimeout(exitTimerRef.current);\r\n exitTimerRef.current = setTimeout(() => {\r\n setMounted(false);\r\n onExited?.();\r\n }, 200);\r\n }\r\n return () => cancelAnimationFrame(rafRef.current);\r\n }, [visible]);\r\n\r\n // Animate footer in/out based on whether there's anything to show\r\n const hasFooterContent = placementCount > 0 || sectionCount > 0;\r\n const totalCount = placementCount + sectionCount;\r\n if (totalCount > 0) {\r\n lastFooterCount.current = totalCount;\r\n lastFooterSuffix.current = blankCanvas ? (totalCount === 1 ? \"Component\" : \"Components\") : (totalCount === 1 ? \"Change\" : \"Changes\");\r\n }\r\n useEffect(() => {\r\n if (hasFooterContent) {\r\n if (!footerVisible) {\r\n setFooterCollapsed(true);\r\n setFooterVisible(true);\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n setFooterCollapsed(false);\r\n });\r\n });\r\n } else {\r\n setFooterCollapsed(false);\r\n }\r\n } else {\r\n setFooterCollapsed(true);\r\n const t = setTimeout(() => setFooterVisible(false), 300);\r\n return () => clearTimeout(t);\r\n }\r\n }, [hasFooterContent]);\r\n\r\n // Scroll fade\r\n useEffect(() => {\r\n if (!mounted) return;\r\n const el = placeScrollRef.current;\r\n if (!el) return;\r\n const update = () => setPlaceFade(scrollFadeClass(el));\r\n update();\r\n el.addEventListener(\"scroll\", update, { passive: true });\r\n const ro = new ResizeObserver(update);\r\n ro.observe(el);\r\n return () => { el.removeEventListener(\"scroll\", update); ro.disconnect(); };\r\n }, [mounted]);\r\n\r\n if (!mounted) return null;\r\n\r\n // Build footer status text\r\n const footerParts: string[] = [];\r\n if (placementCount > 0) footerParts.push(\"placed\");\r\n if (sectionCount > 0) footerParts.push(\"captured\");\r\n\r\n return (\r\n <div\r\n className={`${styles.palette} ${styles[animClass]} ${!isDarkMode ? styles.light : \"\"}`}\r\n data-feedback-toolbar\r\n data-agentation-palette\r\n onClick={(e) => e.stopPropagation()}\r\n onMouseDown={(e) => e.stopPropagation()}\r\n onTransitionEnd={(e) => {\r\n if (e.target !== e.currentTarget) return;\r\n if (!visible) {\r\n clearTimeout(exitTimerRef.current);\r\n setMounted(false);\r\n setAnimClass(\"exit\");\r\n onExited?.();\r\n }\r\n }}\r\n >\r\n {/* Panel header — fixed title with description */}\r\n <div className={styles.paletteHeader}>\r\n <div className={styles.paletteHeaderTitle}>Layout Mode</div>\r\n <div className={styles.paletteHeaderDesc}>\r\n Rearrange and resize existing elements, add new components, and explore layout ideas. Agent results may vary.{\" \"}\r\n <a href=\"https://agentation.dev/features#layout-mode\" target=\"_blank\" rel=\"noopener noreferrer\">Learn more.</a>\r\n </div>\r\n </div>\r\n\r\n {/* Wireframe toggle */}\r\n <div\r\n className={`${styles.canvasToggle} ${blankCanvas ? styles.active : \"\"}`}\r\n onClick={() => onBlankCanvasChange(!blankCanvas)}\r\n >\r\n <span className={styles.canvasToggleIcon}>\r\n <svg viewBox=\"0 0 14 14\" width=\"14\" height=\"14\" fill=\"none\">\r\n <rect x=\"1\" y=\"1\" width=\"12\" height=\"12\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1\" />\r\n <circle cx=\"4.5\" cy=\"4.5\" r=\"0.8\" fill=\"currentColor\" opacity=\".6\" />\r\n <circle cx=\"7\" cy=\"4.5\" r=\"0.8\" fill=\"currentColor\" opacity=\".6\" />\r\n <circle cx=\"9.5\" cy=\"4.5\" r=\"0.8\" fill=\"currentColor\" opacity=\".6\" />\r\n <circle cx=\"4.5\" cy=\"7\" r=\"0.8\" fill=\"currentColor\" opacity=\".6\" />\r\n <circle cx=\"7\" cy=\"7\" r=\"0.8\" fill=\"currentColor\" opacity=\".6\" />\r\n <circle cx=\"9.5\" cy=\"7\" r=\"0.8\" fill=\"currentColor\" opacity=\".6\" />\r\n <circle cx=\"4.5\" cy=\"9.5\" r=\"0.8\" fill=\"currentColor\" opacity=\".6\" />\r\n <circle cx=\"7\" cy=\"9.5\" r=\"0.8\" fill=\"currentColor\" opacity=\".6\" />\r\n <circle cx=\"9.5\" cy=\"9.5\" r=\"0.8\" fill=\"currentColor\" opacity=\".6\" />\r\n </svg>\r\n </span>\r\n <span className={styles.canvasToggleLabel}>Wireframe New Page</span>\r\n </div>\r\n {/* Wireframe purpose textarea — only when wireframe active */}\r\n <div className={`${styles.wireframePurposeWrap} ${!blankCanvas ? styles.collapsed : \"\"}`}>\r\n <div className={styles.wireframePurposeInner}>\r\n <textarea\r\n className={styles.wireframePurposeInput}\r\n placeholder=\"Describe this page to provide additional context for your agent.\"\r\n value={wireframePurpose}\r\n onChange={(e) => onWireframePurposeChange(e.target.value)}\r\n rows={2}\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Component grid — always visible */}\r\n <ComponentGrid\r\n activeType={activeType}\r\n onSelect={onSelect}\r\n onDragStart={onDragStart}\r\n scrollRef={placeScrollRef}\r\n fadeClass={placeFade}\r\n blankCanvas={blankCanvas}\r\n />\r\n\r\n {/* Footer: change count + clear */}\r\n {footerVisible && (\r\n <div className={`${styles.paletteFooterWrap} ${footerCollapsed ? styles.footerHidden : \"\"}`}>\r\n <div className={styles.paletteFooterInner}>\r\n <div className={styles.paletteFooterInnerContent}>\r\n <div className={styles.paletteFooter}>\r\n <span className={styles.paletteFooterCount}>\r\n <RollingCount value={lastFooterCount.current} suffix={lastFooterSuffix.current} />\r\n </span>\r\n <button className={styles.paletteFooterClear} onClick={onClearPlacements}>\r\n Clear\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { useState, useCallback, useEffect, useRef } from \"react\";\r\nimport { captureElement } from \"./section-detection\";\r\nimport { AnnotationPopupCSS } from \"../annotation-popup-css\";\r\nimport type { DetectedSection, RearrangeState } from \"./types\";\r\nimport styles from \"./styles.module.scss\";\r\n\r\n// =============================================================================\r\n// Rearrange Overlay — Click-to-capture, free drag, resize\r\n// =============================================================================\r\n\r\nconst SECTION_COLOR = { bg: \"rgba(59, 130, 246, 0.08)\", border: \"rgba(59, 130, 246, 0.5)\", pill: \"#3b82f6\" };\r\n\r\ntype HandleDir = \"nw\" | \"n\" | \"ne\" | \"e\" | \"se\" | \"s\" | \"sw\" | \"w\";\r\nconst HANDLES: HandleDir[] = [\"nw\", \"n\", \"ne\", \"e\", \"se\", \"s\", \"sw\", \"w\"];\r\nconst MIN_SIZE = 24;\r\nconst MIN_CAPTURE_SIZE = 16;\r\nconst SNAP_THRESHOLD = 5;\r\n\r\ntype Guide = { axis: \"x\" | \"y\"; pos: number };\r\n\r\ntype SnapRect = { x: number; y: number; width: number; height: number };\r\n\r\nfunction computeSectionSnap(\r\n rect: SnapRect,\r\n sections: DetectedSection[],\r\n excludeIds: Set<string>,\r\n extraRects?: SnapRect[],\r\n): { dx: number; dy: number; guides: Guide[] } {\r\n let bestDx = Infinity;\r\n let bestDy = Infinity;\r\n\r\n const mL = rect.x, mR = rect.x + rect.width, mCx = rect.x + rect.width / 2;\r\n const mT = rect.y, mB = rect.y + rect.height, mCy = rect.y + rect.height / 2;\r\n\r\n // Build unified list of target rects (sections + extra rects from placements)\r\n const allTargets: SnapRect[] = [];\r\n for (const s of sections) {\r\n if (!excludeIds.has(s.id)) allTargets.push(s.currentRect);\r\n }\r\n if (extraRects) allTargets.push(...extraRects);\r\n\r\n for (const o of allTargets) {\r\n const oL = o.x, oR = o.x + o.width, oCx = o.x + o.width / 2;\r\n const oT = o.y, oB = o.y + o.height, oCy = o.y + o.height / 2;\r\n\r\n for (const from of [mL, mR, mCx]) {\r\n for (const to of [oL, oR, oCx]) {\r\n const d = to - from;\r\n if (Math.abs(d) < SNAP_THRESHOLD && Math.abs(d) < Math.abs(bestDx)) bestDx = d;\r\n }\r\n }\r\n for (const from of [mT, mB, mCy]) {\r\n for (const to of [oT, oB, oCy]) {\r\n const d = to - from;\r\n if (Math.abs(d) < SNAP_THRESHOLD && Math.abs(d) < Math.abs(bestDy)) bestDy = d;\r\n }\r\n }\r\n }\r\n\r\n const dx = Math.abs(bestDx) < SNAP_THRESHOLD ? bestDx : 0;\r\n const dy = Math.abs(bestDy) < SNAP_THRESHOLD ? bestDy : 0;\r\n\r\n const guides: Guide[] = [];\r\n const seen = new Set<string>();\r\n const sL = mL + dx, sR = mR + dx, sCx = mCx + dx;\r\n const sT = mT + dy, sB = mB + dy, sCy = mCy + dy;\r\n\r\n for (const o of allTargets) {\r\n const oL = o.x, oR = o.x + o.width, oCx = o.x + o.width / 2;\r\n const oT = o.y, oB = o.y + o.height, oCy = o.y + o.height / 2;\r\n\r\n for (const xPos of [oL, oCx, oR]) {\r\n for (const sx of [sL, sCx, sR]) {\r\n if (Math.abs(sx - xPos) < 0.5) {\r\n const key = `x:${Math.round(xPos)}`;\r\n if (!seen.has(key)) { seen.add(key); guides.push({ axis: \"x\", pos: xPos }); }\r\n }\r\n }\r\n }\r\n for (const yPos of [oT, oCy, oB]) {\r\n for (const sy of [sT, sCy, sB]) {\r\n if (Math.abs(sy - yPos) < 0.5) {\r\n const key = `y:${Math.round(yPos)}`;\r\n if (!seen.has(key)) { seen.add(key); guides.push({ axis: \"y\", pos: yPos }); }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return { dx, dy, guides };\r\n}\r\n\r\nconst SKIP_TAGS = new Set([\"script\", \"style\", \"noscript\", \"link\", \"meta\", \"br\", \"hr\"]);\r\n\r\n/**\r\n * Pick a reasonable capture target from any element. Walk up only to skip\r\n * tiny inline elements (span, em, strong, etc.) — otherwise take whatever\r\n * was clicked, same as normal agentation annotations.\r\n */\r\nfunction pickTarget(el: HTMLElement): HTMLElement | null {\r\n let current: HTMLElement | null = el;\r\n while (current && current !== document.body && current !== document.documentElement) {\r\n if (current.closest(\"[data-feedback-toolbar]\")) return null;\r\n if (SKIP_TAGS.has(current.tagName.toLowerCase())) {\r\n current = current.parentElement;\r\n continue;\r\n }\r\n const rect = current.getBoundingClientRect();\r\n if (rect.width >= MIN_CAPTURE_SIZE && rect.height >= MIN_CAPTURE_SIZE) {\r\n return current;\r\n }\r\n current = current.parentElement;\r\n }\r\n return null;\r\n}\r\n\r\ntype RearrangeOverlayProps = {\r\n rearrangeState: RearrangeState;\r\n onChange: (state: RearrangeState) => void;\r\n isDarkMode: boolean;\r\n exiting?: boolean;\r\n className?: string;\r\n blankCanvas?: boolean;\r\n extraSnapRects?: SnapRect[];\r\n onSelectionChange?: (selectedIds: Set<string>, isShift: boolean) => void;\r\n deselectSignal?: number;\r\n onDragMove?: (dx: number, dy: number) => void;\r\n onDragEnd?: (dx: number, dy: number, committed: boolean) => void;\r\n clearSignal?: number;\r\n};\r\n\r\nexport function RearrangeOverlay({ rearrangeState, onChange, isDarkMode, exiting, className: extraClassName, blankCanvas, extraSnapRects, onSelectionChange, deselectSignal, onDragMove, onDragEnd, clearSignal }: RearrangeOverlayProps) {\r\n const { sections } = rearrangeState;\r\n const rearrangeStateRef = useRef(rearrangeState);\r\n rearrangeStateRef.current = rearrangeState;\r\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\r\n\r\n // Animate all out when clearSignal fires\r\n const [exitingAll, setExitingAll] = useState(false);\r\n const clearRef = useRef(clearSignal);\r\n useEffect(() => {\r\n if (clearSignal !== undefined && clearSignal !== clearRef.current) {\r\n clearRef.current = clearSignal;\r\n if (sections.length > 0) {\r\n setExitingAll(true);\r\n }\r\n }\r\n }, [clearSignal, sections.length]);\r\n\r\n // Clear selection when the other overlay signals deselect\r\n const deselectRef = useRef(deselectSignal);\r\n useEffect(() => {\r\n if (deselectSignal !== deselectRef.current) {\r\n deselectRef.current = deselectSignal;\r\n setSelectedIds(new Set());\r\n }\r\n }, [deselectSignal]);\r\n // --- Double-click annotation editing ---\r\n const [editingId, setEditingId] = useState<string | null>(null);\r\n const [editExiting, setEditExiting] = useState(false);\r\n const editHadNoteRef = useRef(false);\r\n\r\n const handleDoubleClick = useCallback((id: string) => {\r\n const s = sections.find(sec => sec.id === id);\r\n if (!s) return;\r\n editHadNoteRef.current = !!s.note;\r\n setEditingId(id);\r\n setEditExiting(false);\r\n }, [sections]);\r\n\r\n const dismissEdit = useCallback(() => {\r\n if (!editingId) return;\r\n setEditExiting(true);\r\n setTimeout(() => { setEditingId(null); setEditExiting(false); }, 150);\r\n }, [editingId]);\r\n\r\n const submitEdit = useCallback((text: string) => {\r\n if (!editingId) return;\r\n onChange({\r\n ...rearrangeState,\r\n sections: sections.map(s => s.id === editingId ? { ...s, note: text.trim() || undefined } : s),\r\n });\r\n dismissEdit();\r\n }, [editingId, sections, rearrangeState, onChange, dismissEdit]);\r\n\r\n // Dismiss popup when overlay exits\r\n useEffect(() => {\r\n if (exiting && editingId) dismissEdit();\r\n }, [exiting]);\r\n\r\n const [exitingIds, setExitingIds] = useState<Set<string>>(new Set());\r\n const lastNoteTextRef = useRef<Map<string, string>>(new Map());\r\n const [hoverHighlight, setHoverHighlight] = useState<{ x: number; y: number; w: number; h: number } | null>(null);\r\n const [sizeIndicator, setSizeIndicator] = useState<{ x: number; y: number; text: string } | null>(null);\r\n const [snapGuides, setSnapGuides] = useState<Guide[]>([]);\r\n const [scrollY, setScrollY] = useState(0);\r\n const interactionRef = useRef<string | null>(null);\r\n // Track which sections have already appeared as ghosts (skip ghostEnter replay)\r\n const seenGhostIdsRef = useRef<Set<string>>(new Set());\r\n // Track which action (move/resize) happened first per section, for badge ordering\r\n const firstActionRef = useRef<Map<string, \"move\" | \"resize\">>(new Map());\r\n // Live drag/resize positions for connector lines during interaction\r\n const [dragPositions, setDragPositions] = useState<Map<string, { x: number; y: number; width: number; height: number }>>(new Map());\r\n // Exiting connectors: sections that returned to original position, animating out\r\n const [exitingConnectors, setExitingConnectors] = useState<Map<string, { orig: { x: number; y: number; width: number; height: number }; target: { x: number; y: number; width: number; height: number }; isFixed?: boolean }>>(new Map());\r\n const prevChangedIdsRef = useRef<Set<string>>(new Set());\r\n // Track last known currentRect for each changed section (for exit animation)\r\n const lastChangedRectsRef = useRef<Map<string, { currentRect: { x: number; y: number; width: number; height: number }; originalRect: { x: number; y: number; width: number; height: number }; isFixed?: boolean }>>(new Map());\r\n\r\n // Stable refs for callbacks (avoids stale closures in event handlers)\r\n const onSelectionChangeRef = useRef(onSelectionChange);\r\n onSelectionChangeRef.current = onSelectionChange;\r\n const onDragMoveRef = useRef(onDragMove);\r\n onDragMoveRef.current = onDragMove;\r\n const onDragEndRef = useRef(onDragEnd);\r\n onDragEndRef.current = onDragEnd;\r\n\r\n // Clear selection when blank canvas is toggled on\r\n useEffect(() => {\r\n if (blankCanvas) setSelectedIds(new Set());\r\n }, [blankCanvas]);\r\n\r\n // Delay showing outlines on mount if sections are already moved (elements animate first)\r\n const [outlinesReady, setOutlinesReady] = useState(() =>\r\n !rearrangeState.sections.some(s => {\r\n const o = s.originalRect, c = s.currentRect;\r\n return Math.abs(o.x - c.x) > 1 || Math.abs(o.y - c.y) > 1 || Math.abs(o.width - c.width) > 1 || Math.abs(o.height - c.height) > 1;\r\n })\r\n );\r\n useEffect(() => {\r\n if (!outlinesReady) {\r\n const timer = setTimeout(() => setOutlinesReady(true), 380);\r\n return () => clearTimeout(timer);\r\n }\r\n }, []); // only on mount\r\n\r\n // Track captured selectors for dedup\r\n const capturedSelectors = useRef(new Set<string>());\r\n useEffect(() => {\r\n capturedSelectors.current = new Set(sections.map(s => s.selector));\r\n }, [sections]);\r\n\r\n // --- Keep scrollY in sync so outlines track the page ---\r\n useEffect(() => {\r\n const onScroll = () => setScrollY(window.scrollY);\r\n onScroll();\r\n window.addEventListener(\"scroll\", onScroll, { passive: true });\r\n window.addEventListener(\"resize\", onScroll, { passive: true });\r\n return () => {\r\n window.removeEventListener(\"scroll\", onScroll);\r\n window.removeEventListener(\"resize\", onScroll);\r\n };\r\n }, []);\r\n\r\n // --- Hover: highlight whatever element is under cursor ---\r\n useEffect(() => {\r\n const handleMouseMove = (e: MouseEvent) => {\r\n if (interactionRef.current) { setHoverHighlight(null); return; }\r\n\r\n const el = document.elementFromPoint(e.clientX, e.clientY) as HTMLElement | null;\r\n if (!el) { setHoverHighlight(null); return; }\r\n if (el.closest(\"[data-feedback-toolbar]\")) { setHoverHighlight(null); return; }\r\n if (el.closest(\"[data-design-placement]\")) { setHoverHighlight(null); return; }\r\n if (el.closest(\"[data-annotation-popup]\")) { setHoverHighlight(null); return; }\r\n\r\n const target = pickTarget(el);\r\n if (!target) { setHoverHighlight(null); return; }\r\n\r\n // Skip already-captured elements (exact match or target is parent of captured)\r\n for (const sel of capturedSelectors.current) {\r\n try {\r\n const captured = document.querySelector(sel);\r\n if (captured && (captured === target || target.contains(captured))) {\r\n setHoverHighlight(null);\r\n return;\r\n }\r\n } catch { /* invalid selector */ }\r\n }\r\n\r\n const rect = target.getBoundingClientRect();\r\n setHoverHighlight({ x: rect.x, y: rect.y, w: rect.width, h: rect.height });\r\n };\r\n\r\n document.addEventListener(\"mousemove\", handleMouseMove, { passive: true });\r\n return () => document.removeEventListener(\"mousemove\", handleMouseMove);\r\n }, [sections]);\r\n\r\n // --- Prevent text selection while rearrange mode is active ---\r\n useEffect(() => {\r\n const prev = document.body.style.userSelect;\r\n document.body.style.userSelect = \"none\";\r\n return () => { document.body.style.userSelect = prev; };\r\n }, []);\r\n\r\n // --- Mousedown to capture new elements (+ immediate drag) ---\r\n useEffect(() => {\r\n const handleMouseDown = (e: MouseEvent) => {\r\n if (interactionRef.current) return;\r\n if (e.button !== 0) return;\r\n const el = e.target as HTMLElement;\r\n if (!el || el.closest(\"[data-feedback-toolbar]\")) return;\r\n if (el.closest(\"[data-design-placement]\")) return;\r\n if (el.closest(\"[data-annotation-popup]\")) return;\r\n\r\n const target = pickTarget(el);\r\n let alreadyCaptured = false;\r\n if (target) {\r\n for (const sel of capturedSelectors.current) {\r\n try {\r\n const captured = document.querySelector(sel);\r\n if (captured && (captured === target || target.contains(captured))) {\r\n alreadyCaptured = true;\r\n break;\r\n }\r\n } catch { /* invalid selector */ }\r\n }\r\n }\r\n\r\n const isShift = !!(e.shiftKey || e.metaKey || e.ctrlKey);\r\n if (target && !alreadyCaptured) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const section = captureElement(target);\r\n const newSections = [...sections, section];\r\n const newOrder = [...rearrangeState.originalOrder, section.id];\r\n onChange({\r\n ...rearrangeState,\r\n sections: newSections,\r\n originalOrder: newOrder,\r\n });\r\n const newIds = new Set([section.id]);\r\n setSelectedIds(newIds);\r\n onSelectionChangeRef.current?.(newIds, isShift);\r\n setHoverHighlight(null);\r\n\r\n // Start drag tracking immediately\r\n const startX = e.clientX;\r\n const startY = e.clientY;\r\n const startPos = { x: section.currentRect.x, y: section.currentRect.y };\r\n const origRect = section.originalRect;\r\n let moved = false;\r\n let lastDx = 0, lastDy = 0;\r\n interactionRef.current = \"move\";\r\n\r\n const onMove = (ev: MouseEvent) => {\r\n const dx = ev.clientX - startX;\r\n const dy = ev.clientY - startY;\r\n if (!moved && (Math.abs(dx) > 2 || Math.abs(dy) > 2)) moved = true;\r\n if (!moved) return;\r\n\r\n const rect = { x: startPos.x + dx, y: startPos.y + dy, width: section.currentRect.width, height: section.currentRect.height };\r\n const snap = computeSectionSnap(rect, newSections, new Set([section.id]), extraSnapRects);\r\n setSnapGuides(snap.guides);\r\n const snappedDx = dx + snap.dx;\r\n const snappedDy = dy + snap.dy;\r\n lastDx = snappedDx;\r\n lastDy = snappedDy;\r\n\r\n // Ghost mode: only move outline (ghost preview), not the page element\r\n const outlineEl = document.querySelector(`[data-rearrange-section=\"${section.id}\"]`) as HTMLElement | null;\r\n if (outlineEl) outlineEl.style.transform = `translate(${snappedDx}px, ${snappedDy}px)`;\r\n // Update live drag position for connector lines\r\n setDragPositions(new Map([[section.id, { x: startPos.x + snappedDx, y: startPos.y + snappedDy, width: section.currentRect.width, height: section.currentRect.height }]]));\r\n onDragMoveRef.current?.(snappedDx, snappedDy);\r\n };\r\n\r\n const onUp = () => {\r\n window.removeEventListener(\"mousemove\", onMove);\r\n window.removeEventListener(\"mouseup\", onUp);\r\n interactionRef.current = null;\r\n setSnapGuides([]);\r\n setDragPositions(new Map());\r\n const outlineEl = document.querySelector(`[data-rearrange-section=\"${section.id}\"]`) as HTMLElement | null;\r\n if (outlineEl) outlineEl.style.transform = \"\";\r\n if (moved) {\r\n\r\n onChange({\r\n ...rearrangeState,\r\n sections: newSections.map(s =>\r\n s.id === section.id\r\n ? { ...s, currentRect: { ...s.currentRect, x: Math.max(0, startPos.x + lastDx), y: Math.max(0, startPos.y + lastDy) } }\r\n : s,\r\n ),\r\n originalOrder: newOrder,\r\n });\r\n }\r\n onDragEndRef.current?.(lastDx, lastDy, moved);\r\n };\r\n\r\n window.addEventListener(\"mousemove\", onMove);\r\n window.addEventListener(\"mouseup\", onUp);\r\n } else if (alreadyCaptured && target) {\r\n e.preventDefault();\r\n // Clicked directly on a captured element's page node — select that section\r\n for (const s of sections) {\r\n try {\r\n const captured = document.querySelector(s.selector);\r\n if (captured && captured === target) {\r\n const newIds = new Set([s.id]);\r\n setSelectedIds(newIds);\r\n onSelectionChangeRef.current?.(newIds, isShift);\r\n return;\r\n }\r\n } catch { /* invalid selector */ }\r\n }\r\n if (!isShift) {\r\n setSelectedIds(new Set());\r\n onSelectionChangeRef.current?.(new Set(), false);\r\n }\r\n } else {\r\n if (!isShift) {\r\n setSelectedIds(new Set());\r\n onSelectionChangeRef.current?.(new Set(), false);\r\n }\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleMouseDown, true);\r\n return () => document.removeEventListener(\"mousedown\", handleMouseDown, true);\r\n }, [sections, rearrangeState, onChange]);\r\n\r\n // --- Keyboard: delete, nudge, escape ---\r\n useEffect(() => {\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n const t = e.target as HTMLElement;\r\n if (t.tagName === \"INPUT\" || t.tagName === \"TEXTAREA\" || t.isContentEditable) return;\r\n\r\n if ((e.key === \"Backspace\" || e.key === \"Delete\") && selectedIds.size > 0) {\r\n e.preventDefault();\r\n const idsToDelete = new Set(selectedIds);\r\n setExitingIds(prev => { const next = new Set(prev); for (const id of idsToDelete) next.add(id); return next; });\r\n setSelectedIds(new Set());\r\n setTimeout(() => {\r\n const rs = rearrangeStateRef.current;\r\n onChange({\r\n ...rs,\r\n sections: rs.sections.filter(s => !idsToDelete.has(s.id)),\r\n originalOrder: rs.originalOrder.filter(id => !idsToDelete.has(id)),\r\n });\r\n setExitingIds(prev => { const next = new Set(prev); for (const id of idsToDelete) next.delete(id); return next; });\r\n }, 180);\r\n return;\r\n }\r\n\r\n if ([\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"].includes(e.key) && selectedIds.size > 0) {\r\n e.preventDefault();\r\n const step = e.shiftKey ? 20 : 1;\r\n const dx = e.key === \"ArrowLeft\" ? -step : e.key === \"ArrowRight\" ? step : 0;\r\n const dy = e.key === \"ArrowUp\" ? -step : e.key === \"ArrowDown\" ? step : 0;\r\n onChange({\r\n ...rearrangeState,\r\n sections: sections.map(s =>\r\n selectedIds.has(s.id)\r\n ? { ...s, currentRect: { ...s.currentRect, x: Math.max(0, s.currentRect.x + dx), y: Math.max(0, s.currentRect.y + dy) } }\r\n : s,\r\n ),\r\n });\r\n return;\r\n }\r\n\r\n if (e.key === \"Escape\" && selectedIds.size > 0) {\r\n setSelectedIds(new Set());\r\n }\r\n };\r\n\r\n document.addEventListener(\"keydown\", handleKeyDown);\r\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\r\n }, [selectedIds, sections, rearrangeState, onChange]);\r\n\r\n // --- Click outline: select + drag ---\r\n const handleOutlineMouseDown = useCallback(\r\n (e: React.MouseEvent, id: string) => {\r\n if (e.button !== 0) return;\r\n const target = e.target as HTMLElement;\r\n if (target.closest(`.${styles.handle}`) || target.closest(`.${styles.deleteButton}`)) return;\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n let newSelected: Set<string>;\r\n if (e.shiftKey || e.metaKey || e.ctrlKey) {\r\n newSelected = new Set(selectedIds);\r\n if (newSelected.has(id)) newSelected.delete(id);\r\n else newSelected.add(id);\r\n } else if (!selectedIds.has(id)) {\r\n newSelected = new Set([id]);\r\n } else {\r\n newSelected = new Set(selectedIds);\r\n }\r\n setSelectedIds(newSelected);\r\n // Only notify if selection actually changed (avoids deselecting other overlay when clicking an already-selected item to drag)\r\n const changed = newSelected.size !== selectedIds.size || [...newSelected].some(x => !selectedIds.has(x));\r\n if (changed) onSelectionChangeRef.current?.(newSelected, !!(e.shiftKey || e.metaKey || e.ctrlKey));\r\n\r\n const startX = e.clientX;\r\n const startY = e.clientY;\r\n const startPositions = new Map<string, { x: number; y: number }>();\r\n for (const s of sections) {\r\n if (newSelected.has(s.id)) {\r\n startPositions.set(s.id, { x: s.currentRect.x, y: s.currentRect.y });\r\n }\r\n }\r\n\r\n interactionRef.current = \"move\";\r\n let moved = false;\r\n let lastDx = 0, lastDy = 0;\r\n\r\n // Cache outline divs for direct updates during drag (zero React re-renders)\r\n // Ghost mode: only outlines move, page elements stay put\r\n const dragEls = new Map<string, {\r\n outlineEl: HTMLElement | null;\r\n curW: number; curH: number;\r\n }>();\r\n for (const s of sections) {\r\n if (newSelected.has(s.id)) {\r\n const outlineEl = document.querySelector(`[data-rearrange-section=\"${s.id}\"]`) as HTMLElement | null;\r\n dragEls.set(s.id, {\r\n outlineEl,\r\n curW: s.currentRect.width, curH: s.currentRect.height,\r\n });\r\n }\r\n }\r\n\r\n const onMove = (ev: MouseEvent) => {\r\n const rawDx = ev.clientX - startX;\r\n const rawDy = ev.clientY - startY;\r\n if (rawDx === 0 && rawDy === 0) return;\r\n moved = true;\r\n\r\n // Compute bounding box of all selected sections at current drag position\r\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\r\n for (const [id, { curW, curH }] of dragEls) {\r\n const start = startPositions.get(id);\r\n if (!start) continue;\r\n const cx = start.x + rawDx, cy = start.y + rawDy;\r\n minX = Math.min(minX, cx); minY = Math.min(minY, cy);\r\n maxX = Math.max(maxX, cx + curW); maxY = Math.max(maxY, cy + curH);\r\n }\r\n const snap = computeSectionSnap(\r\n { x: minX, y: minY, width: maxX - minX, height: maxY - minY },\r\n sections,\r\n newSelected,\r\n extraSnapRects,\r\n );\r\n const dx = rawDx + snap.dx;\r\n const dy = rawDy + snap.dy;\r\n lastDx = dx;\r\n lastDy = dy;\r\n setSnapGuides(snap.guides);\r\n\r\n // Ghost mode: only move outline divs, page elements stay put\r\n for (const [, { outlineEl }] of dragEls) {\r\n if (outlineEl) {\r\n outlineEl.style.transform = `translate(${dx}px, ${dy}px)`;\r\n }\r\n }\r\n // Update live drag positions for connector lines + ghost clones\r\n const livePos = new Map<string, { x: number; y: number; width: number; height: number }>();\r\n for (const [id, { curW, curH }] of dragEls) {\r\n const start = startPositions.get(id);\r\n if (start) {\r\n const pos = { x: Math.max(0, start.x + dx), y: Math.max(0, start.y + dy), width: curW, height: curH };\r\n livePos.set(id, pos);\r\n }\r\n }\r\n setDragPositions(livePos);\r\n onDragMoveRef.current?.(dx, dy);\r\n };\r\n\r\n const onUp = (ev: MouseEvent) => {\r\n window.removeEventListener(\"mousemove\", onMove);\r\n window.removeEventListener(\"mouseup\", onUp);\r\n interactionRef.current = null;\r\n setSnapGuides([]);\r\n setDragPositions(new Map());\r\n\r\n // Clear outline transforms — React state update will set correct left/top\r\n for (const [, { outlineEl }] of dragEls) {\r\n if (outlineEl) outlineEl.style.transform = \"\";\r\n }\r\n\r\n if (moved) {\r\n const totalDx = ev.clientX - startX;\r\n const totalDy = ev.clientY - startY;\r\n if (Math.abs(totalDx) < 5 && Math.abs(totalDy) < 5) {\r\n // Snap back — revert to pre-drag position\r\n onChange({\r\n ...rearrangeState,\r\n sections: sections.map(s => {\r\n const start = startPositions.get(s.id);\r\n if (!start) return s;\r\n return { ...s, currentRect: { ...s.currentRect, x: start.x, y: start.y } };\r\n }),\r\n });\r\n } else {\r\n // Suppress ghostEnter animation for sections transitioning to changed\r\n // Commit final ghost position\r\n onChange({\r\n ...rearrangeState,\r\n sections: sections.map(s => {\r\n const start = startPositions.get(s.id);\r\n if (!start) return s;\r\n return { ...s, currentRect: { ...s.currentRect, x: Math.max(0, start.x + lastDx), y: Math.max(0, start.y + lastDy) } };\r\n }),\r\n });\r\n onDragEndRef.current?.(lastDx, lastDy, true);\r\n return;\r\n }\r\n }\r\n onDragEndRef.current?.(0, 0, false);\r\n };\r\n\r\n window.addEventListener(\"mousemove\", onMove);\r\n window.addEventListener(\"mouseup\", onUp);\r\n },\r\n [selectedIds, sections, rearrangeState, onChange],\r\n );\r\n\r\n // --- Resize ---\r\n const handleResizeMouseDown = useCallback(\r\n (e: React.MouseEvent, id: string, dir: HandleDir) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const section = sections.find(s => s.id === id);\r\n if (!section) return;\r\n\r\n setSelectedIds(new Set([id]));\r\n interactionRef.current = \"resize\";\r\n\r\n const startX = e.clientX;\r\n const startY = e.clientY;\r\n const startRect = { ...section.currentRect };\r\n const origRect = section.originalRect;\r\n const aspectRatio = startRect.width / startRect.height;\r\n let lastRect = { ...startRect };\r\n\r\n // Cache outline for direct updates — ghost mode, no page element transforms\r\n const resizeOutlineEl = document.querySelector(`[data-rearrange-section=\"${id}\"]`) as HTMLElement | null;\r\n\r\n const onMove = (ev: MouseEvent) => {\r\n const dx = ev.clientX - startX;\r\n const dy = ev.clientY - startY;\r\n let nx = startRect.x, ny = startRect.y, nw = startRect.width, nh = startRect.height;\r\n\r\n if (dir.includes(\"e\")) nw = Math.max(MIN_SIZE, startRect.width + dx);\r\n if (dir.includes(\"w\")) { nw = Math.max(MIN_SIZE, startRect.width - dx); nx = startRect.x + startRect.width - nw; }\r\n if (dir.includes(\"s\")) nh = Math.max(MIN_SIZE, startRect.height + dy);\r\n if (dir.includes(\"n\")) { nh = Math.max(MIN_SIZE, startRect.height - dy); ny = startRect.y + startRect.height - nh; }\r\n\r\n // Shift = constrain aspect ratio\r\n if (ev.shiftKey) {\r\n const isCorner = dir.length === 2;\r\n if (isCorner) {\r\n const wDelta = Math.abs(nw - startRect.width);\r\n const hDelta = Math.abs(nh - startRect.height);\r\n if (wDelta > hDelta) {\r\n nh = nw / aspectRatio;\r\n } else {\r\n nw = nh * aspectRatio;\r\n }\r\n if (dir.includes(\"w\")) nx = startRect.x + startRect.width - nw;\r\n if (dir.includes(\"n\")) ny = startRect.y + startRect.height - nh;\r\n } else {\r\n if (dir === \"e\" || dir === \"w\") {\r\n nh = nw / aspectRatio;\r\n } else {\r\n nw = nh * aspectRatio;\r\n }\r\n if (dir === \"w\") nx = startRect.x + startRect.width - nw;\r\n if (dir === \"n\") ny = startRect.y + startRect.height - nh;\r\n }\r\n }\r\n\r\n lastRect = { x: nx, y: ny, width: nw, height: nh };\r\n\r\n // Ghost mode: only update outline, not page element\r\n if (resizeOutlineEl) {\r\n resizeOutlineEl.style.left = `${nx}px`;\r\n resizeOutlineEl.style.top = `${ny - scrollY}px`;\r\n resizeOutlineEl.style.width = `${nw}px`;\r\n resizeOutlineEl.style.height = `${nh}px`;\r\n }\r\n setSizeIndicator({ x: ev.clientX + 12, y: ev.clientY + 12, text: `${Math.round(nw)} × ${Math.round(nh)}` });\r\n setDragPositions(new Map([[id, lastRect]]));\r\n };\r\n\r\n const onUp = () => {\r\n window.removeEventListener(\"mousemove\", onMove);\r\n window.removeEventListener(\"mouseup\", onUp);\r\n setSizeIndicator(null);\r\n interactionRef.current = null;\r\n setDragPositions(new Map());\r\n // Suppress ghostEnter animation for resized section\r\n // Commit final size — element already at right spot from direct DOM\r\n onChange({\r\n ...rearrangeState,\r\n sections: sections.map(s => s.id === id ? { ...s, currentRect: lastRect } : s),\r\n });\r\n };\r\n\r\n window.addEventListener(\"mousemove\", onMove);\r\n window.addEventListener(\"mouseup\", onUp);\r\n },\r\n [sections, rearrangeState, onChange, scrollY],\r\n );\r\n\r\n const handleDelete = useCallback(\r\n (id: string) => {\r\n setExitingIds(prev => { const next = new Set(prev); next.add(id); return next; });\r\n setSelectedIds(prev => { const next = new Set(prev); next.delete(id); return next; });\r\n setTimeout(() => {\r\n const rs = rearrangeStateRef.current;\r\n onChange({\r\n ...rs,\r\n sections: rs.sections.filter(s => s.id !== id),\r\n originalOrder: rs.originalOrder.filter(oid => oid !== id),\r\n });\r\n setExitingIds(prev => { const next = new Set(prev); next.delete(id); return next; });\r\n }, 180);\r\n },\r\n [onChange],\r\n );\r\n\r\n const hasChanged = (s: DetectedSection): boolean => {\r\n const o = s.originalRect, c = s.currentRect;\r\n return Math.abs(o.x - c.x) > 1 || Math.abs(o.y - c.y) > 1 || Math.abs(o.width - c.width) > 1 || Math.abs(o.height - c.height) > 1;\r\n };\r\n\r\n const isMoved = (s: DetectedSection): boolean => {\r\n const o = s.originalRect, c = s.currentRect;\r\n return Math.abs(o.x - c.x) > 1 || Math.abs(o.y - c.y) > 1;\r\n };\r\n\r\n const isResized = (s: DetectedSection): boolean => {\r\n const o = s.originalRect, c = s.currentRect;\r\n return Math.abs(o.width - c.width) > 1 || Math.abs(o.height - c.height) > 1;\r\n };\r\n\r\n // Track first action per section for badge ordering\r\n for (const s of sections) {\r\n if (!firstActionRef.current.has(s.id)) {\r\n if (isMoved(s)) firstActionRef.current.set(s.id, \"move\");\r\n else if (isResized(s)) firstActionRef.current.set(s.id, \"resize\");\r\n }\r\n }\r\n // Clean up deleted sections\r\n for (const id of firstActionRef.current.keys()) {\r\n if (!sections.some(s => s.id === id)) firstActionRef.current.delete(id);\r\n }\r\n\r\n // Filter to visible sections (DOM element still exists on page)\r\n const visibleSections = sections.filter(s => { try {\r\n if (exitingIds.has(s.id)) return true; // keep visible during exit animation\r\n if (selectedIds.has(s.id)) return true;\r\n const el = document.querySelector(s.selector);\r\n if (!el) return false;\r\n const rect = el.getBoundingClientRect();\r\n const expected = s.originalRect;\r\n const sizeDiff = Math.abs(rect.width - expected.width) + Math.abs(rect.height - expected.height);\r\n return sizeDiff < 200;\r\n } catch { return false; } });\r\n\r\n // Separate changed vs unchanged sections\r\n const changedSections = visibleSections.filter(s => hasChanged(s));\r\n const unchangedSections = visibleSections.filter(s => !hasChanged(s));\r\n\r\n // Clean up seenGhostIds for sections no longer changed (so animation replays if they become ghosts again)\r\n const currentChangedIds = new Set(changedSections.map(s => s.id));\r\n for (const id of seenGhostIdsRef.current) {\r\n if (!currentChangedIds.has(id)) seenGhostIdsRef.current.delete(id);\r\n }\r\n\r\n // Detect sections that just returned to original (connector exit animation)\r\n const changedKey = [...currentChangedIds].sort().join(\",\");\r\n // Keep last known positions of changed sections up to date\r\n for (const s of changedSections) {\r\n lastChangedRectsRef.current.set(s.id, { currentRect: s.currentRect, originalRect: s.originalRect, isFixed: s.isFixed });\r\n }\r\n useEffect(() => {\r\n const prev = prevChangedIdsRef.current;\r\n prevChangedIdsRef.current = currentChangedIds;\r\n const exiting = new Map<string, { orig: { x: number; y: number; width: number; height: number }; target: { x: number; y: number; width: number; height: number }; isFixed?: boolean }>();\r\n for (const id of prev) {\r\n if (!currentChangedIds.has(id)) {\r\n // Skip if section was deleted — exitingIds connector fade handles that\r\n if (!sections.some(s => s.id === id)) continue;\r\n // Use the last known position before it snapped back\r\n const last = lastChangedRectsRef.current.get(id);\r\n if (last) {\r\n exiting.set(id, { orig: last.originalRect, target: last.currentRect, isFixed: last.isFixed });\r\n lastChangedRectsRef.current.delete(id);\r\n }\r\n }\r\n }\r\n if (exiting.size > 0) {\r\n setExitingConnectors(prev => {\r\n const next = new Map(prev);\r\n for (const [id, data] of exiting) next.set(id, data);\r\n return next;\r\n });\r\n const timer = setTimeout(() => {\r\n setExitingConnectors(prev => {\r\n const next = new Map(prev);\r\n for (const id of exiting.keys()) next.delete(id);\r\n return next;\r\n });\r\n }, 250);\r\n return () => clearTimeout(timer);\r\n }\r\n }, [changedKey, sections]);\r\n\r\n return (\r\n <>\r\n <div\r\n className={`${styles.rearrangeOverlay} ${!isDarkMode ? styles.light : \"\"} ${exiting ? styles.overlayExiting : \"\"}${extraClassName ? ` ${extraClassName}` : \"\"}`}\r\n data-feedback-toolbar\r\n >\r\n {/* Hover highlight */}\r\n {hoverHighlight && (\r\n <div\r\n className={styles.hoverHighlight}\r\n style={{ left: hoverHighlight.x, top: hoverHighlight.y, width: hoverHighlight.w, height: hoverHighlight.h }}\r\n />\r\n )}\r\n\r\n {/* Unchanged sections — render at currentRect (same as originalRect) */}\r\n {unchangedSections.map((section) => {\r\n const rect = section.currentRect;\r\n const screenY = section.isFixed ? rect.y : rect.y - scrollY;\r\n const color = SECTION_COLOR;\r\n const isSelected = selectedIds.has(section.id);\r\n\r\n return (\r\n <div\r\n key={section.id}\r\n data-rearrange-section={section.id}\r\n className={`${styles.sectionOutline} ${isSelected ? styles.selected : \"\"} ${exitingAll || exiting || exitingIds.has(section.id) ? styles.exiting : \"\"}`}\r\n style={{ left: rect.x, top: screenY, width: rect.width, height: rect.height, borderColor: color.border, backgroundColor: color.bg, ...(outlinesReady ? {} : { opacity: 0, animation: \"none\", transition: \"none\" }) }}\r\n onMouseDown={(e) => handleOutlineMouseDown(e, section.id)}\r\n onDoubleClick={() => handleDoubleClick(section.id)}\r\n >\r\n <span className={styles.sectionLabel} style={{ backgroundColor: color.pill }}>\r\n {section.label}\r\n </span>\r\n <span className={`${styles.sectionAnnotation} ${section.note ? styles.annotationVisible : \"\"}`}>{(() => { if (section.note) lastNoteTextRef.current.set(section.id, section.note); return section.note || lastNoteTextRef.current.get(section.id) || \"\"; })()}</span>\r\n <span className={styles.sectionDimensions}>\r\n {Math.round(rect.width)} × {Math.round(rect.height)}\r\n </span>\r\n <div\r\n className={styles.deleteButton}\r\n onMouseDown={(e) => e.stopPropagation()}\r\n onClick={() => handleDelete(section.id)}\r\n >\r\n ✕\r\n </div>\r\n {HANDLES.map((dir) => (\r\n <div\r\n key={dir}\r\n className={`${styles.handle} ${styles[`handle${dir.charAt(0).toUpperCase()}${dir.slice(1)}` as keyof typeof styles]}`}\r\n onMouseDown={(e) => handleResizeMouseDown(e, section.id, dir)}\r\n />\r\n ))}\r\n </div>\r\n );\r\n })}\r\n\r\n {/* No original outlines — connector line is sufficient */}\r\n\r\n {/* Changed sections — ghost outlines at currentRect (interactive) */}\r\n {changedSections.map((section) => {\r\n const rect = section.currentRect;\r\n const screenY = section.isFixed ? rect.y : rect.y - scrollY;\r\n const isSelected = selectedIds.has(section.id);\r\n const moved = isMoved(section);\r\n const resized = isResized(section);\r\n const settled = !isSelected;\r\n\r\n if (blankCanvas && settled) return null;\r\n\r\n // Only animate ghostEnter the first time a section appears as a ghost\r\n const isNewGhost = !seenGhostIdsRef.current.has(section.id);\r\n if (isNewGhost) seenGhostIdsRef.current.add(section.id);\r\n\r\n return (\r\n <div\r\n key={section.id}\r\n data-rearrange-section={section.id}\r\n className={`${styles.ghostOutline} ${isSelected ? styles.selected : \"\"} ${exitingAll || exiting || exitingIds.has(section.id) ? styles.exiting : \"\"}`}\r\n style={{ left: rect.x, top: screenY, width: rect.width, height: rect.height, ...(outlinesReady ? {} : { opacity: 0, animation: \"none\", transition: \"none\" }), ...(!isNewGhost ? { animation: \"none\" } : {}) }}\r\n onMouseDown={(e) => handleOutlineMouseDown(e, section.id)}\r\n onDoubleClick={() => handleDoubleClick(section.id)}\r\n >\r\n <span className={styles.sectionLabel} style={{ backgroundColor: SECTION_COLOR.pill }}>\r\n {section.label}\r\n </span>\r\n <span className={`${styles.sectionAnnotation} ${section.note ? styles.annotationVisible : \"\"}`}>{(() => { if (section.note) lastNoteTextRef.current.set(section.id, section.note); return section.note || lastNoteTextRef.current.get(section.id) || \"\"; })()}</span>\r\n <span className={styles.sectionDimensions}>\r\n {Math.round(rect.width)} × {Math.round(rect.height)}\r\n </span>\r\n <div\r\n className={styles.deleteButton}\r\n onMouseDown={(e) => e.stopPropagation()}\r\n onClick={() => handleDelete(section.id)}\r\n >\r\n ✕\r\n </div>\r\n {HANDLES.map((dir) => (\r\n <div\r\n key={dir}\r\n className={`${styles.handle} ${styles[`handle${dir.charAt(0).toUpperCase()}${dir.slice(1)}` as keyof typeof styles]}`}\r\n onMouseDown={(e) => handleResizeMouseDown(e, section.id, dir)}\r\n />\r\n ))}\r\n <span className={styles.ghostBadge}>\r\n {(() => {\r\n const first = firstActionRef.current.get(section.id);\r\n if (moved && resized) {\r\n const [a, b] = first === \"resize\" ? [\"Resize\", \"Move\"] : [\"Move\", \"Resize\"];\r\n return <>Suggested {a} <span className={styles.ghostBadgeExtra}>& {b}</span></>;\r\n }\r\n return `Suggested ${resized ? \"Resize\" : \"Move\"}`;\r\n })()}\r\n </span>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n {/* Annotation connector lines — SVG from original to ghost/drag position */}\r\n {!blankCanvas && (() => {\r\n // Build list of sections that need connectors: committed changes + live drags\r\n const connectorSections: { id: string; orig: typeof sections[0][\"originalRect\"]; target: { x: number; y: number; width: number; height: number }; isFixed?: boolean; isSelected: boolean; isExiting?: boolean }[] = [];\r\n for (const s of changedSections) {\r\n const livePos = dragPositions.get(s.id);\r\n connectorSections.push({ id: s.id, orig: s.originalRect, target: livePos || s.currentRect, isFixed: s.isFixed, isSelected: selectedIds.has(s.id), isExiting: exitingIds.has(s.id) });\r\n }\r\n // Also add sections being dragged that haven't changed yet (first drag)\r\n for (const [id, pos] of dragPositions) {\r\n if (!connectorSections.some(c => c.id === id)) {\r\n const s = sections.find(sec => sec.id === id);\r\n if (s) connectorSections.push({ id, orig: s.originalRect, target: pos, isFixed: s.isFixed, isSelected: selectedIds.has(id) });\r\n }\r\n }\r\n // Add exiting connectors (sections that returned to original)\r\n for (const [id, data] of exitingConnectors) {\r\n if (!connectorSections.some(c => c.id === id)) {\r\n connectorSections.push({ id, orig: data.orig, target: data.target, isFixed: data.isFixed, isSelected: false, isExiting: true });\r\n }\r\n }\r\n\r\n if (connectorSections.length === 0) return null;\r\n\r\n return (\r\n <svg className={`${styles.connectorSvg} ${exitingAll || exiting ? styles.connectorExiting : \"\"}`}>\r\n {connectorSections.map(({ id, orig, target, isFixed, isSelected, isExiting }) => {\r\n const ox = orig.x + orig.width / 2;\r\n const oy = (isFixed ? orig.y : orig.y - scrollY) + orig.height / 2;\r\n const cx = target.x + target.width / 2;\r\n const cy = (isFixed ? target.y : target.y - scrollY) + target.height / 2;\r\n\r\n const ddx = cx - ox;\r\n const ddy = cy - oy;\r\n const dist = Math.sqrt(ddx * ddx + ddy * ddy);\r\n if (dist < 2) return null;\r\n\r\n // Scale dots down as they approach each other\r\n const proximityScale = Math.min(1, dist / 40);\r\n const perpOffset = Math.min(dist * 0.3, 60);\r\n const nx = dist > 0 ? -ddy / dist : 0;\r\n const ny = dist > 0 ? ddx / dist : 0;\r\n const cpx = (ox + cx) / 2 + nx * perpOffset;\r\n const cpy = (oy + cy) / 2 + ny * perpOffset;\r\n const isDragging = dragPositions.has(id);\r\n const baseOpacity = isDragging || isSelected ? 1 : 0.4;\r\n const dotBaseOpacity = isDragging || isSelected ? 1 : 0.5;\r\n\r\n return (\r\n <g key={`conn-${id}`} className={isExiting ? styles.connectorExiting : \"\"}>\r\n <path\r\n className={styles.connectorLine}\r\n d={`M ${ox} ${oy} Q ${cpx} ${cpy} ${cx} ${cy}`}\r\n fill=\"none\"\r\n stroke=\"rgba(59, 130, 246, 0.45)\"\r\n strokeWidth=\"1.5\"\r\n opacity={baseOpacity * proximityScale}\r\n />\r\n {/* Endpoint circles */}\r\n <circle className={styles.connectorDot} cx={ox} cy={oy} r={4 * proximityScale} fill=\"rgba(59, 130, 246, 0.8)\" stroke=\"#fff\" strokeWidth=\"1.5\" opacity={dotBaseOpacity * proximityScale} filter=\"url(#connDotShadow)\" />\r\n <circle className={styles.connectorDot} cx={cx} cy={cy} r={4 * proximityScale} fill=\"rgba(59, 130, 246, 0.8)\" stroke=\"#fff\" strokeWidth=\"1.5\" opacity={dotBaseOpacity * proximityScale} filter=\"url(#connDotShadow)\" />\r\n </g>\r\n );\r\n })}\r\n <defs>\r\n <filter id=\"connDotShadow\" x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\">\r\n <feDropShadow dx=\"0\" dy=\"0.5\" stdDeviation=\"1\" floodOpacity=\"0.15\" />\r\n </filter>\r\n </defs>\r\n </svg>\r\n );\r\n })()}\r\n\r\n {/* Note editing popup */}\r\n {editingId && (() => {\r\n const es = sections.find(s => s.id === editingId);\r\n if (!es) return null;\r\n const rect = es.currentRect;\r\n const screenY = es.isFixed ? rect.y : rect.y - scrollY;\r\n const centerX = rect.x + rect.width / 2;\r\n const aboveY = screenY - 8;\r\n const belowY = screenY + rect.height + 8;\r\n const fitsAbove = aboveY > 200;\r\n const fitsBelow = belowY < window.innerHeight - 100;\r\n const popupLeft = Math.max(160, Math.min(window.innerWidth - 160, centerX));\r\n let popupStyle: React.CSSProperties;\r\n if (fitsAbove) {\r\n popupStyle = { left: popupLeft, bottom: window.innerHeight - aboveY };\r\n } else if (fitsBelow) {\r\n popupStyle = { left: popupLeft, top: belowY };\r\n } else {\r\n popupStyle = { left: popupLeft, top: Math.max(80, window.innerHeight / 2 - 80) };\r\n }\r\n return (\r\n <AnnotationPopupCSS\r\n element={es.label}\r\n placeholder=\"Add a note about this section\"\r\n initialValue={es.note ?? \"\"}\r\n submitLabel={editHadNoteRef.current ? \"Save\" : \"Set\"}\r\n onSubmit={submitEdit}\r\n onCancel={dismissEdit}\r\n onDelete={editHadNoteRef.current ? () => { submitEdit(\"\"); } : undefined}\r\n isExiting={editExiting}\r\n lightMode={!isDarkMode}\r\n style={popupStyle}\r\n />\r\n );\r\n })()}\r\n\r\n {sizeIndicator && (\r\n <div className={styles.sizeIndicator} style={{ left: sizeIndicator.x, top: sizeIndicator.y }} data-feedback-toolbar>\r\n {sizeIndicator.text}\r\n </div>\r\n )}\r\n\r\n {/* Snap alignment guides */}\r\n {snapGuides.map((g, i) => (\r\n <div\r\n key={`${g.axis}-${g.pos}-${i}`}\r\n className={styles.guideLine}\r\n style={\r\n g.axis === \"x\"\r\n ? { position: \"fixed\", left: g.pos, top: 0, width: 1, height: \"100vh\" }\r\n : { position: \"fixed\", left: 0, top: g.pos - scrollY, width: \"100vw\", height: 1 }\r\n }\r\n />\r\n ))}\r\n </>\r\n );\r\n}\r\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","// =============================================================================\r\n// Section Detection for Rearrange Mode\r\n// =============================================================================\r\n\r\nimport type { DetectedSection } from \"./types\";\r\nimport { identifyElement } from \"../../utils/element-identification\";\r\n\r\n// Tags that represent meaningful page sections\r\nconst SECTION_TAGS = new Set([\r\n \"nav\", \"header\", \"main\", \"section\", \"article\", \"footer\", \"aside\",\r\n]);\r\n\r\n// ARIA roles that map to section semantics\r\nconst SECTION_ROLES: Record<string, string> = {\r\n banner: \"Header\",\r\n navigation: \"Navigation\",\r\n main: \"Main Content\",\r\n contentinfo: \"Footer\",\r\n complementary: \"Sidebar\",\r\n region: \"Section\",\r\n};\r\n\r\n// Tag name to human-readable label\r\nconst TAG_LABELS: Record<string, string> = {\r\n nav: \"Navigation\",\r\n header: \"Header\",\r\n main: \"Main Content\",\r\n section: \"Section\",\r\n article: \"Article\",\r\n footer: \"Footer\",\r\n aside: \"Sidebar\",\r\n};\r\n\r\n// Elements to always skip\r\nconst SKIP_TAGS = new Set([\"script\", \"style\", \"noscript\", \"link\", \"meta\"]);\r\n\r\nconst MIN_SECTION_HEIGHT = 40;\r\n\r\n/**\r\n * Check if an element is effectively fixed to the viewport.\r\n * Walks up the DOM tree — if any ancestor is fixed or sticky,\r\n * the element doesn't scroll with the page.\r\n */\r\nfunction isEffectivelyFixed(el: HTMLElement): boolean {\r\n let current: HTMLElement | null = el;\r\n while (current && current !== document.body && current !== document.documentElement) {\r\n const pos = window.getComputedStyle(current).position;\r\n if (pos === \"fixed\" || pos === \"sticky\") return true;\r\n current = current.parentElement;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Generate a CSS selector that can re-find this element after re-renders.\r\n */\r\nexport function generateSelector(el: HTMLElement): string {\r\n const tag = el.tagName.toLowerCase();\r\n\r\n // Unique semantic tags (usually only one nav, one footer, etc.)\r\n if ([\"nav\", \"header\", \"footer\", \"main\"].includes(tag)) {\r\n // Check if it's unique\r\n if (document.querySelectorAll(tag).length === 1) {\r\n return tag;\r\n }\r\n }\r\n\r\n // ID selector\r\n if (el.id) {\r\n return `#${CSS.escape(el.id)}`;\r\n }\r\n\r\n // Tag + first meaningful class\r\n if (el.className && typeof el.className === \"string\") {\r\n const classes = el.className.split(/\\s+/).filter(c => c.length > 0);\r\n // Find a class that isn't just a hash\r\n const meaningful = classes.find(c =>\r\n c.length > 2 && !/^[a-zA-Z0-9]{6,}$/.test(c) && !/^[a-z]{1,2}$/.test(c)\r\n );\r\n if (meaningful) {\r\n const selector = `${tag}.${CSS.escape(meaningful)}`;\r\n if (document.querySelectorAll(selector).length === 1) {\r\n return selector;\r\n }\r\n }\r\n }\r\n\r\n // Fallback: nth-child\r\n const parent = el.parentElement;\r\n if (parent) {\r\n const children = Array.from(parent.children);\r\n const index = children.indexOf(el) + 1;\r\n const parentSelector = parent === document.body ? \"body\" : generateSelector(parent as HTMLElement);\r\n return `${parentSelector} > ${tag}:nth-child(${index})`;\r\n }\r\n\r\n return tag;\r\n}\r\n\r\n/**\r\n * Determine a human-readable label for a detected section.\r\n */\r\nexport function labelSection(el: HTMLElement): string {\r\n const tag = el.tagName.toLowerCase();\r\n\r\n // 1. aria-label\r\n const ariaLabel = el.getAttribute(\"aria-label\");\r\n if (ariaLabel) return ariaLabel;\r\n\r\n // 2. ARIA role mapping\r\n const role = el.getAttribute(\"role\");\r\n if (role && SECTION_ROLES[role]) return SECTION_ROLES[role];\r\n\r\n // 3. Semantic tag name\r\n if (TAG_LABELS[tag]) return TAG_LABELS[tag];\r\n\r\n // 4. First heading child\r\n const heading = el.querySelector(\"h1, h2, h3, h4, h5, h6\");\r\n if (heading) {\r\n const text = heading.textContent?.trim();\r\n if (text && text.length <= 50) return text;\r\n if (text) return text.slice(0, 47) + \"...\";\r\n }\r\n\r\n // 5. Fallback to identifyElement\r\n const { name } = identifyElement(el);\r\n return name.charAt(0).toUpperCase() + name.slice(1);\r\n}\r\n\r\n/**\r\n * Get the first meaningful class name (strip CSS module hashes).\r\n */\r\nfunction getCleanClassName(el: HTMLElement): string | null {\r\n const className = el.className;\r\n if (typeof className !== \"string\" || !className) return null;\r\n\r\n const meaningful = className\r\n .split(/\\s+/)\r\n .map(c => c.replace(/[_][a-zA-Z0-9]{5,}.*$/, \"\"))\r\n .find(c => c.length > 2 && !/^[a-z]{1,2}$/.test(c));\r\n\r\n return meaningful || null;\r\n}\r\n\r\n/**\r\n * Get first ~30 chars of visible text content (for forensic output).\r\n */\r\nfunction getTextSnippet(el: HTMLElement): string | null {\r\n const text = el.textContent?.trim();\r\n if (!text) return null;\r\n // Collapse whitespace\r\n const clean = text.replace(/\\s+/g, \" \");\r\n if (clean.length <= 30) return clean;\r\n return clean.slice(0, 30) + \"…\";\r\n}\r\n\r\n/**\r\n * Detect significant page sections for rearrange mode.\r\n */\r\nexport function detectPageSections(): DetectedSection[] {\r\n // Find the main content container — prefer <main>, fall back to <body>\r\n const main = document.querySelector(\"main\") || document.body;\r\n const candidates = Array.from(main.children) as HTMLElement[];\r\n\r\n // If <main> has few children, also check <body> direct children\r\n let allCandidates = candidates;\r\n if (main !== document.body && candidates.length < 3) {\r\n allCandidates = Array.from(document.body.children) as HTMLElement[];\r\n }\r\n\r\n const sections: DetectedSection[] = [];\r\n\r\n allCandidates.forEach((el, index) => {\r\n if (!(el instanceof HTMLElement)) return;\r\n\r\n const tag = el.tagName.toLowerCase();\r\n\r\n // Skip non-content elements\r\n if (SKIP_TAGS.has(tag)) return;\r\n\r\n // Skip agentation's own elements\r\n if (el.hasAttribute(\"data-feedback-toolbar\")) return;\r\n if (el.closest(\"[data-feedback-toolbar]\")) return;\r\n\r\n // Skip invisible elements\r\n const style = window.getComputedStyle(el);\r\n if (style.display === \"none\" || style.visibility === \"hidden\") return;\r\n\r\n const rect = el.getBoundingClientRect();\r\n\r\n // Skip tiny elements\r\n if (rect.height < MIN_SECTION_HEIGHT) return;\r\n\r\n // Accept: semantic section tags, elements with ARIA roles, or divs with significant height\r\n const isSemantic = SECTION_TAGS.has(tag);\r\n const hasRole = el.getAttribute(\"role\") && SECTION_ROLES[el.getAttribute(\"role\")!];\r\n const isSignificantDiv = tag === \"div\" && rect.height >= 60;\r\n\r\n if (!isSemantic && !hasRole && !isSignificantDiv) return;\r\n\r\n const scrollY = window.scrollY;\r\n const isFixed = isEffectivelyFixed(el);\r\n\r\n const sectionRect = {\r\n x: rect.x,\r\n y: isFixed ? rect.y : rect.y + scrollY,\r\n width: rect.width,\r\n height: rect.height,\r\n };\r\n\r\n sections.push({\r\n id: `rs-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`,\r\n label: labelSection(el),\r\n tagName: tag,\r\n selector: generateSelector(el),\r\n role: el.getAttribute(\"role\"),\r\n className: getCleanClassName(el),\r\n textSnippet: getTextSnippet(el),\r\n originalRect: sectionRect,\r\n currentRect: { ...sectionRect },\r\n originalIndex: index,\r\n isFixed,\r\n });\r\n });\r\n\r\n return sections;\r\n}\r\n\r\n/**\r\n * Create a DetectedSection from a single element (for click-to-capture).\r\n */\r\nexport function captureElement(el: HTMLElement): DetectedSection {\r\n const scrollY = window.scrollY;\r\n const rect = el.getBoundingClientRect();\r\n const isFixed = isEffectivelyFixed(el);\r\n\r\n // Fixed elements: store viewport-relative Y (no scroll offset)\r\n // Normal elements: store page-absolute Y (add scroll offset)\r\n const sectionRect = {\r\n x: rect.x,\r\n y: isFixed ? rect.y : rect.y + scrollY,\r\n width: rect.width,\r\n height: rect.height,\r\n };\r\n\r\n const parent = el.parentElement;\r\n let originalIndex = 0;\r\n if (parent) {\r\n originalIndex = Array.from(parent.children).indexOf(el);\r\n }\r\n\r\n return {\r\n id: `rs-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`,\r\n label: labelSection(el),\r\n tagName: el.tagName.toLowerCase(),\r\n selector: generateSelector(el),\r\n role: el.getAttribute(\"role\"),\r\n className: getCleanClassName(el),\r\n textSnippet: getTextSnippet(el),\r\n originalRect: sectionRect,\r\n currentRect: { ...sectionRect },\r\n originalIndex,\r\n isFixed,\r\n };\r\n}\r\n\r\n","// =============================================================================\r\n// Spatial Context Utility for Layout Mode Output\r\n// =============================================================================\r\n\r\nimport { labelSection, generateSelector } from \"./section-detection\";\r\n\r\ntype SectionRect = { x: number; y: number; width: number; height: number };\r\n\r\nexport type NearbyElement = {\r\n label: string; // human-readable (\"Navigation\", \"h1 'Layout mode test page'\")\r\n selector: string; // CSS selector\r\n gap: number; // pixel gap between edges\r\n};\r\n\r\nexport type BoundsOverflow = {\r\n viewport?: (\"left\" | \"right\" | \"top\" | \"bottom\")[]; // edges that extend past viewport\r\n container?: { label: string; edges: (\"left\" | \"right\" | \"top\" | \"bottom\")[] }; // edges outside nearest container\r\n};\r\n\r\nexport type SpatialContext = {\r\n above: NearbyElement | null;\r\n below: NearbyElement | null;\r\n left: NearbyElement | null;\r\n right: NearbyElement | null;\r\n alignment: \"left\" | \"center\" | \"right\" | \"full-width\";\r\n containedIn: { label: string; selector: string } | null;\r\n outOfBounds: BoundsOverflow | null;\r\n};\r\n\r\n// Tags/elements to skip when collecting candidates\r\nconst SKIP_TAGS = new Set([\"script\", \"style\", \"noscript\", \"link\", \"meta\", \"br\", \"hr\"]);\r\n\r\n/** A spatial candidate with pre-computed viewport-relative rect. */\r\ntype Candidate = { label: string; selector: string; top: number; bottom: number; left: number; right: number; area: number };\r\n\r\n/**\r\n * Collect visible page elements (2 levels deep from main/body) as spatial candidates.\r\n */\r\nfunction collectDOMCandidates(): Candidate[] {\r\n const main = document.querySelector(\"main\") || document.body;\r\n const results: Candidate[] = [];\r\n\r\n const topLevel = Array.from(main.children) as HTMLElement[];\r\n const roots = main !== document.body && topLevel.length < 3\r\n ? Array.from(document.body.children) as HTMLElement[]\r\n : topLevel;\r\n\r\n for (const el of roots) {\r\n if (!(el instanceof HTMLElement)) continue;\r\n if (SKIP_TAGS.has(el.tagName.toLowerCase())) continue;\r\n if (el.hasAttribute(\"data-feedback-toolbar\")) continue;\r\n\r\n const style = window.getComputedStyle(el);\r\n if (style.display === \"none\" || style.visibility === \"hidden\") continue;\r\n\r\n const rect = el.getBoundingClientRect();\r\n if (rect.height < 10 || rect.width < 10) continue;\r\n\r\n results.push({\r\n label: labelSection(el),\r\n selector: generateSelector(el),\r\n top: rect.top, bottom: rect.bottom,\r\n left: rect.left, right: rect.right,\r\n area: rect.width * rect.height,\r\n });\r\n\r\n // Second level: direct children\r\n for (const child of Array.from(el.children) as HTMLElement[]) {\r\n if (!(child instanceof HTMLElement)) continue;\r\n if (SKIP_TAGS.has(child.tagName.toLowerCase())) continue;\r\n if (child.hasAttribute(\"data-feedback-toolbar\")) continue;\r\n\r\n const childStyle = window.getComputedStyle(child);\r\n if (childStyle.display === \"none\" || childStyle.visibility === \"hidden\") continue;\r\n\r\n const cr = child.getBoundingClientRect();\r\n if (cr.height < 10 || cr.width < 10) continue;\r\n\r\n results.push({\r\n label: labelSection(child),\r\n selector: generateSelector(child),\r\n top: cr.top, bottom: cr.bottom,\r\n left: cr.left, right: cr.right,\r\n area: cr.width * cr.height,\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n\r\n/**\r\n * Convert explicit rect candidates (from rearrange sections) to Candidate format.\r\n * Rects are page-absolute, so subtract scrollY to get viewport-relative.\r\n */\r\nexport type ExplicitCandidate = { label: string; selector: string; rect: SectionRect };\r\n\r\nfunction explicitToCandidates(items: ExplicitCandidate[]): Candidate[] {\r\n const scrollY = window.scrollY;\r\n return items.map(({ label, selector, rect }) => {\r\n const top = rect.y - scrollY;\r\n return {\r\n label, selector,\r\n top,\r\n bottom: top + rect.height,\r\n left: rect.x,\r\n right: rect.x + rect.width,\r\n area: rect.width * rect.height,\r\n };\r\n });\r\n}\r\n\r\n/**\r\n * Convert a SectionRect (page-absolute) to viewport-relative edges.\r\n */\r\nfunction toViewportEdges(r: SectionRect) {\r\n const scrollY = window.scrollY;\r\n const top = r.y - scrollY;\r\n const left = r.x;\r\n return {\r\n top,\r\n bottom: top + r.height,\r\n left,\r\n right: left + r.width,\r\n area: r.width * r.height,\r\n };\r\n}\r\n\r\n/**\r\n * Get spatial context for a given rect (page-absolute coordinates).\r\n *\r\n * By default, queries the live DOM for candidates (2 levels deep).\r\n * Pass `siblings` to use explicit candidates instead — useful for rearrange mode\r\n * where the moved sections themselves are the best spatial reference.\r\n */\r\nexport function getSpatialContext(\r\n targetRect: SectionRect,\r\n siblings?: ExplicitCandidate[],\r\n): SpatialContext {\r\n const candidates = siblings ? explicitToCandidates(siblings) : collectDOMCandidates();\r\n const target = toViewportEdges(targetRect);\r\n\r\n let above: (NearbyElement & { _dist: number }) | null = null;\r\n let below: (NearbyElement & { _dist: number }) | null = null;\r\n let left: (NearbyElement & { _dist: number }) | null = null;\r\n let right: (NearbyElement & { _dist: number }) | null = null;\r\n let containedIn: { label: string; selector: string; _area: number } | null = null;\r\n\r\n for (const c of candidates) {\r\n // Skip if the candidate IS the target (rects match closely)\r\n if (\r\n Math.abs(c.left - target.left) < 2 &&\r\n Math.abs(c.top - target.top) < 2 &&\r\n Math.abs((c.right - c.left) - targetRect.width) < 2 &&\r\n Math.abs((c.bottom - c.top) - targetRect.height) < 2\r\n ) {\r\n continue;\r\n }\r\n\r\n // Check containment: candidate fully contains target\r\n if (\r\n c.left <= target.left + 2 &&\r\n c.right >= target.right - 2 &&\r\n c.top <= target.top + 2 &&\r\n c.bottom >= target.bottom - 2 &&\r\n c.area > target.area * 1.5\r\n ) {\r\n if (!containedIn || c.area < containedIn._area) {\r\n containedIn = { label: c.label, selector: c.selector, _area: c.area };\r\n }\r\n }\r\n\r\n // Horizontal overlap — elements share some x-range\r\n const hOverlap = target.right > c.left + 5 && target.left < c.right - 5;\r\n // Vertical overlap — elements share some y-range (same row)\r\n const vOverlap = target.bottom > c.top + 5 && target.top < c.bottom - 5;\r\n\r\n // Above: candidate bottom is at or above target top\r\n if (hOverlap && c.bottom <= target.top + 5) {\r\n const gap = Math.round(target.top - c.bottom);\r\n if (!above || gap < above._dist) {\r\n above = { label: c.label, selector: c.selector, gap: Math.max(0, gap), _dist: gap };\r\n }\r\n }\r\n\r\n // Below: candidate top is at or below target bottom\r\n if (hOverlap && c.top >= target.bottom - 5) {\r\n const gap = Math.round(c.top - target.bottom);\r\n if (!below || gap < below._dist) {\r\n below = { label: c.label, selector: c.selector, gap: Math.max(0, gap), _dist: gap };\r\n }\r\n }\r\n\r\n // Left: candidate is to the left, same row\r\n if (vOverlap && c.right <= target.left + 5) {\r\n const gap = Math.round(target.left - c.right);\r\n if (!left || gap < left._dist) {\r\n left = { label: c.label, selector: c.selector, gap: Math.max(0, gap), _dist: gap };\r\n }\r\n }\r\n\r\n // Right: candidate is to the right, same row\r\n if (vOverlap && c.left >= target.right - 5) {\r\n const gap = Math.round(c.left - target.right);\r\n if (!right || gap < right._dist) {\r\n right = { label: c.label, selector: c.selector, gap: Math.max(0, gap), _dist: gap };\r\n }\r\n }\r\n }\r\n\r\n const viewportWidth = window.innerWidth;\r\n const viewportHeight = window.innerHeight;\r\n const alignment = getAlignment(targetRect, viewportWidth);\r\n\r\n const clean = (n: (NearbyElement & { _dist: number }) | null): NearbyElement | null => {\r\n if (!n) return null;\r\n return { label: n.label, selector: n.selector, gap: n.gap };\r\n };\r\n\r\n // Bounds detection\r\n const outOfBounds = detectBoundsOverflow(\r\n target,\r\n targetRect,\r\n viewportWidth,\r\n viewportHeight,\r\n containedIn ? { label: containedIn.label, selector: containedIn.selector, _area: containedIn._area } : null,\r\n candidates,\r\n );\r\n\r\n return {\r\n above: clean(above),\r\n below: clean(below),\r\n left: clean(left),\r\n right: clean(right),\r\n alignment,\r\n containedIn: containedIn ? { label: containedIn.label, selector: containedIn.selector } : null,\r\n outOfBounds,\r\n };\r\n}\r\n\r\n/**\r\n * Detect if the target rect overflows viewport or its nearest container.\r\n */\r\nfunction detectBoundsOverflow(\r\n targetEdges: { top: number; bottom: number; left: number; right: number },\r\n targetRect: SectionRect,\r\n viewportWidth: number,\r\n viewportHeight: number,\r\n container: { label: string; selector: string; _area: number } | null,\r\n candidates: Candidate[],\r\n): BoundsOverflow | null {\r\n const result: BoundsOverflow = {};\r\n let hasOverflow = false;\r\n\r\n // Viewport overflow (using viewport-relative edges)\r\n const vpOverflow: (\"left\" | \"right\" | \"top\" | \"bottom\")[] = [];\r\n if (targetEdges.left < -2) vpOverflow.push(\"left\");\r\n if (targetEdges.right > viewportWidth + 2) vpOverflow.push(\"right\");\r\n if (targetEdges.top < -2) vpOverflow.push(\"top\");\r\n if (targetEdges.bottom > viewportHeight + 2) vpOverflow.push(\"bottom\");\r\n if (vpOverflow.length > 0) {\r\n result.viewport = vpOverflow;\r\n hasOverflow = true;\r\n }\r\n\r\n // Container overflow — check if target extends past its nearest container\r\n if (container) {\r\n const cont = candidates.find(c =>\r\n c.label === container.label &&\r\n c.selector === container.selector &&\r\n Math.abs(c.area - container._area) < 10,\r\n );\r\n if (cont) {\r\n const contOverflow: (\"left\" | \"right\" | \"top\" | \"bottom\")[] = [];\r\n if (targetEdges.left < cont.left - 2) contOverflow.push(\"left\");\r\n if (targetEdges.right > cont.right + 2) contOverflow.push(\"right\");\r\n if (targetEdges.top < cont.top - 2) contOverflow.push(\"top\");\r\n if (targetEdges.bottom > cont.bottom + 2) contOverflow.push(\"bottom\");\r\n if (contOverflow.length > 0) {\r\n result.container = { label: container.label, edges: contOverflow };\r\n hasOverflow = true;\r\n }\r\n }\r\n }\r\n\r\n return hasOverflow ? result : null;\r\n}\r\n\r\nfunction getAlignment(rect: SectionRect, viewportWidth: number): SpatialContext[\"alignment\"] {\r\n const ratio = rect.width / viewportWidth;\r\n if (ratio > 0.85) return \"full-width\";\r\n\r\n const centerX = rect.x + rect.width / 2;\r\n const viewportCenter = viewportWidth / 2;\r\n const offset = centerX - viewportCenter;\r\n const tolerance = viewportWidth * 0.08;\r\n\r\n if (Math.abs(offset) < tolerance) return \"center\";\r\n if (offset < 0) return \"left\";\r\n return \"right\";\r\n}\r\n\r\n/**\r\n * Format alignment as human-readable text.\r\n */\r\nfunction formatAlignment(alignment: SpatialContext[\"alignment\"]): string {\r\n switch (alignment) {\r\n case \"full-width\": return \"full-width\";\r\n case \"center\": return \"centered\";\r\n case \"left\": return \"left-aligned\";\r\n case \"right\": return \"right-aligned\";\r\n }\r\n}\r\n\r\n/**\r\n * Format a SpatialContext into human-readable description lines.\r\n * Returns an array of strings, each a markdown line (without leading \" - \").\r\n */\r\nexport function formatSpatialLines(\r\n ctx: SpatialContext,\r\n options: { includeLeftRight?: boolean; includePixelRef?: boolean; pixelRef?: string } = {},\r\n): string[] {\r\n const lines: string[] = [];\r\n\r\n if (ctx.above) {\r\n lines.push(`Below \\`${ctx.above.label}\\`${ctx.above.gap > 0 ? ` (${ctx.above.gap}px gap)` : \"\"}`);\r\n }\r\n if (ctx.below) {\r\n lines.push(`Above \\`${ctx.below.label}\\`${ctx.below.gap > 0 ? ` (${ctx.below.gap}px gap)` : \"\"}`);\r\n }\r\n if (options.includeLeftRight) {\r\n if (ctx.left) {\r\n lines.push(`Right of \\`${ctx.left.label}\\`${ctx.left.gap > 0 ? ` (${ctx.left.gap}px gap)` : \"\"}`);\r\n }\r\n if (ctx.right) {\r\n lines.push(`Left of \\`${ctx.right.label}\\`${ctx.right.gap > 0 ? ` (${ctx.right.gap}px gap)` : \"\"}`);\r\n }\r\n }\r\n\r\n // Alignment + container on one line\r\n const alignStr = formatAlignment(ctx.alignment);\r\n if (ctx.containedIn) {\r\n lines.push(`${alignStr.charAt(0).toUpperCase() + alignStr.slice(1)} in \\`${ctx.containedIn.label}\\``);\r\n } else {\r\n lines.push(`${alignStr.charAt(0).toUpperCase() + alignStr.slice(1)} in page`);\r\n }\r\n\r\n if (options.includePixelRef && options.pixelRef) {\r\n lines.push(`Pixel ref: \\`${options.pixelRef}\\``);\r\n }\r\n\r\n // Out-of-bounds warnings\r\n if (ctx.outOfBounds) {\r\n if (ctx.outOfBounds.viewport) {\r\n lines.push(`**Outside viewport** (${ctx.outOfBounds.viewport.join(\", \")} edge${ctx.outOfBounds.viewport.length > 1 ? \"s\" : \"\"})`);\r\n }\r\n if (ctx.outOfBounds.container) {\r\n lines.push(`**Outside \\`${ctx.outOfBounds.container.label}\\`** (${ctx.outOfBounds.container.edges.join(\", \")} edge${ctx.outOfBounds.container.edges.length > 1 ? \"s\" : \"\"})`);\r\n }\r\n }\r\n\r\n return lines;\r\n}\r\n\r\n/**\r\n * Describe a position with coordinates and spatial context.\r\n * Returns a single line like: \"at (428, 96), 32×32px: below `Navigation`, left-aligned\"\r\n */\r\nexport function formatPositionSummary(\r\n ctx: SpatialContext,\r\n coords: { x: number; y: number },\r\n size?: { width: number; height: number },\r\n): string {\r\n const parts: string[] = [];\r\n\r\n // Neighbor context (most useful for an implementing agent)\r\n if (ctx.above) parts.push(`below \\`${ctx.above.label}\\``);\r\n if (ctx.below) parts.push(`above \\`${ctx.below.label}\\``);\r\n if (ctx.left) parts.push(`right of \\`${ctx.left.label}\\``);\r\n if (ctx.right) parts.push(`left of \\`${ctx.right.label}\\``);\r\n\r\n // Container\r\n if (ctx.containedIn) parts.push(`inside \\`${ctx.containedIn.label}\\``);\r\n\r\n // Alignment\r\n parts.push(formatAlignment(ctx.alignment));\r\n\r\n // Out-of-bounds flag\r\n if (ctx.outOfBounds?.viewport) {\r\n parts.push(`**outside viewport** (${ctx.outOfBounds.viewport.join(\", \")})`);\r\n }\r\n if (ctx.outOfBounds?.container) {\r\n parts.push(`**outside \\`${ctx.outOfBounds.container.label}\\`** (${ctx.outOfBounds.container.edges.join(\", \")})`);\r\n }\r\n\r\n const sizeStr = size ? `, ${Math.round(size.width)}×${Math.round(size.height)}px` : \"\";\r\n return `at (${Math.round(coords.x)}, ${Math.round(coords.y)})${sizeStr}: ${parts.join(\", \")}`;\r\n}\r\n\r\n// =============================================================================\r\n// Layout Group Detection\r\n// =============================================================================\r\n\r\nexport type LayoutGroup = {\r\n labels: string[];\r\n type: \"row\" | \"column\";\r\n sharedEdge: number; // avg y (row) or avg x (column)\r\n gaps: number[]; // gaps between consecutive members\r\n avgGap: number;\r\n};\r\n\r\nconst GROUP_TOLERANCE = 15; // px tolerance for shared edge detection\r\n\r\n/**\r\n * Detect rows and columns from a set of labeled rects.\r\n * A \"row\" = 2+ elements with similar y. A \"column\" = 2+ elements with similar x.\r\n */\r\nexport function detectGroups(items: { label: string; rect: SectionRect }[]): LayoutGroup[] {\r\n if (items.length < 2) return [];\r\n\r\n const groups: LayoutGroup[] = [];\r\n const used = new Set<number>();\r\n\r\n // Find rows (shared y within tolerance)\r\n for (let i = 0; i < items.length; i++) {\r\n if (used.has(i)) continue;\r\n const row = [i];\r\n for (let j = i + 1; j < items.length; j++) {\r\n if (used.has(j)) continue;\r\n if (Math.abs(items[i].rect.y - items[j].rect.y) < GROUP_TOLERANCE) {\r\n row.push(j);\r\n }\r\n }\r\n if (row.length >= 2) {\r\n const members = row.map(idx => items[idx]);\r\n members.sort((a, b) => a.rect.x - b.rect.x);\r\n const gaps: number[] = [];\r\n for (let k = 0; k < members.length - 1; k++) {\r\n gaps.push(Math.round(members[k + 1].rect.x - (members[k].rect.x + members[k].rect.width)));\r\n }\r\n const avgY = Math.round(members.reduce((sum, m) => sum + m.rect.y, 0) / members.length);\r\n groups.push({\r\n labels: members.map(m => m.label),\r\n type: \"row\",\r\n sharedEdge: avgY,\r\n gaps,\r\n avgGap: gaps.length ? Math.round(gaps.reduce((a, b) => a + b, 0) / gaps.length) : 0,\r\n });\r\n row.forEach(idx => used.add(idx));\r\n }\r\n }\r\n\r\n // Find columns (shared x within tolerance) from remaining\r\n for (let i = 0; i < items.length; i++) {\r\n if (used.has(i)) continue;\r\n const col = [i];\r\n for (let j = i + 1; j < items.length; j++) {\r\n if (used.has(j)) continue;\r\n if (Math.abs(items[i].rect.x - items[j].rect.x) < GROUP_TOLERANCE) {\r\n col.push(j);\r\n }\r\n }\r\n if (col.length >= 2) {\r\n const members = col.map(idx => items[idx]);\r\n members.sort((a, b) => a.rect.y - b.rect.y);\r\n const gaps: number[] = [];\r\n for (let k = 0; k < members.length - 1; k++) {\r\n gaps.push(Math.round(members[k + 1].rect.y - (members[k].rect.y + members[k].rect.height)));\r\n }\r\n const avgX = Math.round(members.reduce((sum, m) => sum + m.rect.x, 0) / members.length);\r\n groups.push({\r\n labels: members.map(m => m.label),\r\n type: \"column\",\r\n sharedEdge: avgX,\r\n gaps,\r\n avgGap: gaps.length ? Math.round(gaps.reduce((a, b) => a + b, 0) / gaps.length) : 0,\r\n });\r\n col.forEach(idx => used.add(idx));\r\n }\r\n }\r\n\r\n return groups;\r\n}\r\n\r\n/**\r\n * Analyze how layout groupings changed between original and current positions.\r\n * Returns markdown lines describing structural changes (row→column, dissolved groups, etc.)\r\n */\r\nexport function analyzeLayoutPatterns(\r\n sections: { label: string; originalRect: SectionRect; currentRect: SectionRect }[],\r\n): string[] {\r\n if (sections.length < 2) return [];\r\n\r\n const origGroups = detectGroups(sections.map(s => ({ label: s.label, rect: s.originalRect })));\r\n const currGroups = detectGroups(sections.map(s => ({ label: s.label, rect: s.currentRect })));\r\n\r\n const lines: string[] = [];\r\n const described = new Set<string>();\r\n\r\n // For each original group, find matching current arrangement\r\n for (const og of origGroups) {\r\n const ogSet = new Set(og.labels);\r\n\r\n // Find current group with most label overlap\r\n let bestMatch: LayoutGroup | null = null;\r\n let bestOverlap = 0;\r\n for (const cg of currGroups) {\r\n const overlap = cg.labels.filter(l => ogSet.has(l)).length;\r\n if (overlap >= 2 && overlap > bestOverlap) {\r\n bestMatch = cg;\r\n bestOverlap = overlap;\r\n }\r\n }\r\n\r\n if (bestMatch) {\r\n const sharedLabels = bestMatch.labels.filter(l => ogSet.has(l));\r\n const names = sharedLabels.join(\", \");\r\n\r\n if (bestMatch.type !== og.type) {\r\n // Layout pattern changed (row → column or column → row)\r\n const fromAxis = og.type === \"row\" ? \"y\" : \"x\";\r\n const toAxis = bestMatch.type === \"row\" ? \"y\" : \"x\";\r\n lines.push(\r\n `**${names}**: ${og.type} (${fromAxis}≈${og.sharedEdge}, ${og.avgGap}px gaps) → ${bestMatch.type} (${toAxis}≈${bestMatch.sharedEdge}, ${bestMatch.avgGap}px gaps)`,\r\n );\r\n } else if (Math.abs(og.sharedEdge - bestMatch.sharedEdge) > 20 || Math.abs(og.avgGap - bestMatch.avgGap) > 5) {\r\n // Same arrangement type but moved or respaced\r\n const axis = og.type === \"row\" ? \"y\" : \"x\";\r\n const posChange = Math.abs(og.sharedEdge - bestMatch.sharedEdge) > 20\r\n ? ` ${axis}: ${og.sharedEdge} → ${bestMatch.sharedEdge}`\r\n : \"\";\r\n const gapChange = Math.abs(og.avgGap - bestMatch.avgGap) > 5\r\n ? ` gaps: ${og.avgGap}px → ${bestMatch.avgGap}px`\r\n : \"\";\r\n lines.push(`**${names}**: ${og.type} shifted —${posChange}${gapChange}`);\r\n }\r\n sharedLabels.forEach(l => described.add(l));\r\n } else {\r\n // Group dissolved\r\n const names = og.labels.join(\", \");\r\n const axis = og.type === \"row\" ? \"y\" : \"x\";\r\n lines.push(`**${names}**: ${og.type} (${axis}≈${og.sharedEdge}) dissolved`);\r\n og.labels.forEach(l => described.add(l));\r\n }\r\n }\r\n\r\n // New groups that didn't exist in original\r\n for (const cg of currGroups) {\r\n if (cg.labels.every(l => described.has(l))) continue;\r\n\r\n const newLabels = cg.labels.filter(l => !described.has(l));\r\n if (newLabels.length < 2) continue;\r\n\r\n // Check if these were ungrouped originally\r\n const wasGrouped = origGroups.some(og => {\r\n const overlap = og.labels.filter(l => cg.labels.includes(l));\r\n return overlap.length >= 2;\r\n });\r\n\r\n if (!wasGrouped) {\r\n const axis = cg.type === \"row\" ? \"y\" : \"x\";\r\n lines.push(`**${cg.labels.join(\", \")}**: new ${cg.type} (${axis}≈${cg.sharedEdge}, ${cg.avgGap}px gaps)`);\r\n cg.labels.forEach(l => described.add(l));\r\n }\r\n }\r\n\r\n // Shared edge callouts — elements that aren't in a group but share an edge\r\n const ungroupedCurr = sections.filter(s => !described.has(s.label));\r\n if (ungroupedCurr.length >= 2) {\r\n // Check for shared left edges\r\n const byX: Record<number, string[]> = {};\r\n for (const s of ungroupedCurr) {\r\n const x = Math.round(s.currentRect.x / 5) * 5; // round to nearest 5px\r\n (byX[x] ??= []).push(s.label);\r\n }\r\n for (const [x, labels] of Object.entries(byX)) {\r\n if (labels.length >= 2) {\r\n lines.push(`**${labels.join(\", \")}**: shared left edge at x≈${x}`);\r\n }\r\n }\r\n }\r\n\r\n return lines;\r\n}\r\n\r\n// =============================================================================\r\n// Page Layout & CSS Context (for translation formulas)\r\n// =============================================================================\r\n\r\nexport type PageLayout = {\r\n viewport: { width: number; height: number };\r\n contentArea: {\r\n width: number;\r\n left: number;\r\n right: number;\r\n centerX: number;\r\n selector: string;\r\n } | null;\r\n};\r\n\r\n/**\r\n * Detect the page's content container and viewport dimensions.\r\n * The content area is the narrowest wrapping element that holds the page content\r\n * (e.g., a centered `max-width` container).\r\n */\r\nexport function getPageLayout(viewport: { width: number; height: number }): PageLayout {\r\n if (typeof document === \"undefined\") return { viewport, contentArea: null };\r\n\r\n // Walk the DOM to find the content container. Check <main>, [role='main'],\r\n // body children, and walk 3 levels deep to handle framework wrappers (e.g., Next.js __next div).\r\n const candidates: HTMLElement[] = [];\r\n const seen = new Set<HTMLElement>();\r\n\r\n const addCandidate = (el: HTMLElement) => {\r\n if (seen.has(el)) return;\r\n if (!(el instanceof HTMLElement)) return;\r\n if (el.hasAttribute(\"data-feedback-toolbar\")) return;\r\n if (SKIP_TAGS.has(el.tagName.toLowerCase())) return;\r\n seen.add(el);\r\n candidates.push(el);\r\n };\r\n\r\n const main = document.querySelector(\"main\") as HTMLElement | null;\r\n if (main) addCandidate(main);\r\n\r\n const roleMain = document.querySelector(\"[role='main']\") as HTMLElement | null;\r\n if (roleMain) addCandidate(roleMain);\r\n\r\n // Walk 3 levels deep from body to catch framework wrappers\r\n for (const l1 of Array.from(document.body.children) as HTMLElement[]) {\r\n addCandidate(l1);\r\n if (l1.children) {\r\n for (const l2 of Array.from(l1.children) as HTMLElement[]) {\r\n addCandidate(l2);\r\n if (l2.children) {\r\n for (const l3 of Array.from(l2.children) as HTMLElement[]) {\r\n addCandidate(l3);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Find the best content container: prefer elements with explicit max-width,\r\n // then fall back to elements narrower than the viewport.\r\n let bestContainer: { el: HTMLElement; rect: DOMRect } | null = null;\r\n\r\n for (const el of candidates) {\r\n const rect = el.getBoundingClientRect();\r\n if (rect.height < 50) continue; // skip tiny elements\r\n const style = getComputedStyle(el);\r\n\r\n // Has explicit max-width — strong signal\r\n if (style.maxWidth && style.maxWidth !== \"none\" && style.maxWidth !== \"0px\") {\r\n // Prefer the narrowest max-width container (most specific)\r\n if (!bestContainer || rect.width < bestContainer.rect.width) {\r\n bestContainer = { el, rect };\r\n }\r\n continue;\r\n }\r\n\r\n // Narrower than viewport — likely a container (only if no max-width match found)\r\n if (!bestContainer && rect.width < viewport.width - 20 && rect.width > 100) {\r\n bestContainer = { el, rect };\r\n }\r\n }\r\n\r\n if (bestContainer) {\r\n const { el, rect } = bestContainer;\r\n return {\r\n viewport,\r\n contentArea: {\r\n width: Math.round(rect.width),\r\n left: Math.round(rect.left),\r\n right: Math.round(rect.right),\r\n centerX: Math.round(rect.left + rect.width / 2),\r\n selector: generateSelector(el),\r\n },\r\n };\r\n }\r\n\r\n return { viewport, contentArea: null };\r\n}\r\n\r\nexport type ElementCSSContext = {\r\n parentDisplay: string;\r\n parentSelector: string;\r\n flexDirection?: string;\r\n gridCols?: string;\r\n gap?: string;\r\n};\r\n\r\n/**\r\n * Read the CSS layout context of an element's parent container.\r\n * Returns the parent's display mode, flex/grid properties, and gap.\r\n */\r\nexport function getElementCSSContext(selector: string): ElementCSSContext | null {\r\n if (typeof document === \"undefined\") return null;\r\n\r\n const el = document.querySelector(selector) as HTMLElement | null;\r\n if (!el?.parentElement) return null;\r\n\r\n const ps = getComputedStyle(el.parentElement);\r\n\r\n const result: ElementCSSContext = {\r\n parentDisplay: ps.display,\r\n parentSelector: generateSelector(el.parentElement),\r\n };\r\n\r\n if (ps.display.includes(\"flex\")) {\r\n result.flexDirection = ps.flexDirection;\r\n }\r\n if (ps.display.includes(\"grid\") && ps.gridTemplateColumns !== \"none\") {\r\n result.gridCols = ps.gridTemplateColumns;\r\n }\r\n if (ps.gap && ps.gap !== \"normal\" && ps.gap !== \"0px\") {\r\n result.gap = ps.gap;\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Format CSS-ready position values for an element relative to the content area.\r\n */\r\nexport function formatCSSPosition(\r\n rect: SectionRect,\r\n layout: PageLayout,\r\n): string | null {\r\n const ref = layout.contentArea;\r\n const containerWidth = ref ? ref.width : layout.viewport.width;\r\n const containerLeft = ref ? ref.left : 0;\r\n const containerCenterX = ref ? ref.centerX : Math.round(layout.viewport.width / 2);\r\n\r\n const leftInContainer = Math.round(rect.x - containerLeft);\r\n const rightInContainer = Math.round((containerLeft + containerWidth) - (rect.x + rect.width));\r\n const widthPct = (rect.width / containerWidth * 100).toFixed(1);\r\n const centerX = rect.x + rect.width / 2;\r\n const isCentered = Math.abs(centerX - containerCenterX) < 20;\r\n const isFullWidth = rect.width / containerWidth > 0.95;\r\n\r\n const parts: string[] = [];\r\n\r\n if (isFullWidth) {\r\n parts.push(\"`width: 100%` of container\");\r\n } else {\r\n parts.push(`left \\`${leftInContainer}px\\` in container, right \\`${rightInContainer}px\\`, width \\`${widthPct}%\\` (\\`${Math.round(rect.width)}px\\`)`);\r\n }\r\n\r\n if (isCentered && !isFullWidth) {\r\n parts.push(\"centered — `margin-inline: auto`\");\r\n }\r\n\r\n return parts.join(\" — \");\r\n}\r\n","// =============================================================================\r\n// Layout Mode Output Generator\r\n// =============================================================================\r\n\r\nimport { COMPONENT_MAP, type DesignPlacement, type RearrangeState } from \"./types\";\r\nimport {\r\n getSpatialContext,\r\n formatSpatialLines,\r\n formatPositionSummary,\r\n analyzeLayoutPatterns,\r\n getPageLayout,\r\n getElementCSSContext,\r\n formatCSSPosition,\r\n type PageLayout,\r\n} from \"./spatial\";\r\n\r\ntype ViewportSize = { width: number; height: number };\r\ntype OutputDetailLevel = \"compact\" | \"standard\" | \"detailed\" | \"forensic\";\r\n\r\ntype DesignOutputOptions = {\r\n blankCanvas?: boolean;\r\n wireframePurpose?: string;\r\n};\r\n\r\n// =============================================================================\r\n// Shared: Reference Frame\r\n// =============================================================================\r\n\r\n/**\r\n * Generate a reference frame section with viewport, content area, and\r\n * pixel-to-CSS translation formulas. Included in all non-compact output.\r\n */\r\nfunction formatReferenceFrame(layout: PageLayout): string {\r\n const { viewport, contentArea } = layout;\r\n let out = \"### Reference Frame\\n\";\r\n out += `- Viewport: \\`${viewport.width}×${viewport.height}px\\`\\n`;\r\n\r\n if (contentArea) {\r\n const ca = contentArea;\r\n out += `- Content area: \\`${ca.width}px\\` wide, left edge at \\`x=${ca.left}\\`, right at \\`x=${ca.right}\\` (\\`${ca.selector}\\`)\\n`;\r\n out += `- Pixel → CSS translation:\\n`;\r\n out += ` - **Horizontal position in container**: \\`element.x - ${ca.left}\\` → use as \\`margin-left\\` or \\`left\\`\\n`;\r\n out += ` - **Width as % of container**: \\`element.width / ${ca.width} × 100\\` → use as \\`width: X%\\`\\n`;\r\n out += ` - **Vertical gap between elements**: \\`nextElement.y - (prevElement.y + prevElement.height)\\` → use as \\`margin-top\\` or \\`gap\\`\\n`;\r\n out += ` - **Centered**: if \\`|element.centerX - ${ca.centerX}| < 20px\\` → use \\`margin-inline: auto\\`\\n`;\r\n } else {\r\n out += `- No distinct content container — elements positioned relative to full viewport\\n`;\r\n out += `- Pixel → CSS translation:\\n`;\r\n out += ` - **Width as % of viewport**: \\`element.width / ${viewport.width} × 100\\` → use as \\`width: X%\\`\\n`;\r\n out += ` - **Centered**: if \\`|(element.x + element.width/2) - ${Math.round(viewport.width / 2)}| < 20px\\` → use \\`margin-inline: auto\\`\\n`;\r\n }\r\n\r\n out += \"\\n\";\r\n return out;\r\n}\r\n\r\n/**\r\n * Format parent layout context for an element.\r\n * Returns a line like: \"Parent: `flex`, flex-direction: `column`, gap: `24px` (`main > div`)\"\r\n */\r\nfunction formatParentContext(selector: string): string | null {\r\n const ctx = getElementCSSContext(selector);\r\n if (!ctx) return null;\r\n\r\n let desc = `\\`${ctx.parentDisplay}\\``;\r\n if (ctx.flexDirection) desc += `, flex-direction: \\`${ctx.flexDirection}\\``;\r\n if (ctx.gridCols) desc += `, grid-template-columns: \\`${ctx.gridCols}\\``;\r\n if (ctx.gap) desc += `, gap: \\`${ctx.gap}\\``;\r\n\r\n return `Parent: ${desc} (\\`${ctx.parentSelector}\\`)`;\r\n}\r\n\r\n// =============================================================================\r\n// Design (Add/Place) Output\r\n// =============================================================================\r\n\r\nexport function generateDesignOutput(\r\n placements: DesignPlacement[],\r\n viewport: ViewportSize,\r\n options?: DesignOutputOptions,\r\n detailLevel: OutputDetailLevel = \"standard\",\r\n): string {\r\n if (placements.length === 0) return \"\";\r\n\r\n // Sort by vertical then horizontal position\r\n const sorted = [...placements].sort((a, b) => {\r\n if (Math.abs(a.y - b.y) < 20) return a.x - b.x;\r\n return a.y - b.y;\r\n });\r\n\r\n let out = \"\";\r\n if (options?.blankCanvas) {\r\n out += `## Wireframe: New Page\\n\\n`;\r\n if (options.wireframePurpose) {\r\n out += `> **Purpose:** ${options.wireframePurpose}\\n>\\n`;\r\n }\r\n out += `> ${placements.length} component${placements.length !== 1 ? \"s\" : \"\"} placed — this is a standalone wireframe, not related to the current page.\\n>\\n> This wireframe is a rough sketch for exploring ideas.\\n\\n`;\r\n } else {\r\n out += `## Design Layout\\n\\n> ${placements.length} component${placements.length !== 1 ? \"s\" : \"\"} placed\\n\\n`;\r\n }\r\n\r\n // Compact: no reference frame\r\n if (detailLevel === \"compact\") {\r\n out += \"### Components\\n\";\r\n sorted.forEach((c, i) => {\r\n const label = COMPONENT_MAP[c.type]?.label || c.type;\r\n out += `${i + 1}. **${label}** — \\`${Math.round(c.width)}×${Math.round(c.height)}px\\` at \\`(${Math.round(c.x)}, ${Math.round(c.y)})\\`\\n`;\r\n });\r\n return out;\r\n }\r\n\r\n // Reference frame for standard+\r\n const layout = getPageLayout(viewport);\r\n out += formatReferenceFrame(layout);\r\n\r\n // --- Component list ---\r\n out += \"### Components\\n\";\r\n sorted.forEach((c, i) => {\r\n const label = COMPONENT_MAP[c.type]?.label || c.type;\r\n const rect = { x: c.x, y: c.y, width: c.width, height: c.height };\r\n\r\n out += `${i + 1}. **${label}** — \\`${Math.round(c.width)}×${Math.round(c.height)}px\\` at \\`(${Math.round(c.x)}, ${Math.round(c.y)})\\`\\n`;\r\n\r\n // Spatial context\r\n const ctx = getSpatialContext(rect);\r\n const includeLeftRight = detailLevel === \"detailed\" || detailLevel === \"forensic\";\r\n const lines = formatSpatialLines(ctx, { includeLeftRight });\r\n for (const line of lines) {\r\n out += ` - ${line}\\n`;\r\n }\r\n\r\n // CSS position relative to content area\r\n const cssPos = formatCSSPosition(rect, layout);\r\n if (cssPos) {\r\n out += ` - CSS: ${cssPos}\\n`;\r\n }\r\n });\r\n\r\n // --- Layout analysis: group by rows ---\r\n out += \"\\n### Layout Analysis\\n\";\r\n const rows: { y: number; items: DesignPlacement[] }[] = [];\r\n for (const c of sorted) {\r\n const existing = rows.find((r) => Math.abs(r.y - c.y) < 30);\r\n if (existing) {\r\n existing.items.push(c);\r\n } else {\r\n rows.push({ y: c.y, items: [c] });\r\n }\r\n }\r\n rows.sort((a, b) => a.y - b.y);\r\n\r\n rows.forEach((row, i) => {\r\n row.items.sort((a, b) => a.x - b.x);\r\n const labels = row.items.map((c) => COMPONENT_MAP[c.type]?.label || c.type);\r\n\r\n if (row.items.length === 1) {\r\n const c = row.items[0];\r\n const isFullWidth = c.width > viewport.width * 0.8;\r\n out += `- Row ${i + 1} (y≈${Math.round(row.y)}): ${labels[0]}${isFullWidth ? \" — full width\" : \"\"}\\n`;\r\n } else {\r\n out += `- Row ${i + 1} (y≈${Math.round(row.y)}): ${labels.join(\" | \")} — ${row.items.length} items side by side\\n`;\r\n }\r\n });\r\n\r\n // --- Spacing/gap relationships (detailed+) ---\r\n if (detailLevel === \"detailed\" || detailLevel === \"forensic\") {\r\n out += \"\\n### Spacing & Gaps\\n\";\r\n for (let i = 0; i < sorted.length - 1; i++) {\r\n const a = sorted[i];\r\n const b = sorted[i + 1];\r\n const labelA = COMPONENT_MAP[a.type]?.label || a.type;\r\n const labelB = COMPONENT_MAP[b.type]?.label || b.type;\r\n const vGap = Math.round(b.y - (a.y + a.height));\r\n const hGap = Math.round(b.x - (a.x + a.width));\r\n if (Math.abs(a.y - b.y) < 30) {\r\n out += `- ${labelA} → ${labelB}: \\`${hGap}px\\` horizontal gap\\n`;\r\n } else {\r\n out += `- ${labelA} → ${labelB}: \\`${vGap}px\\` vertical gap\\n`;\r\n }\r\n }\r\n\r\n if (detailLevel === \"forensic\" && sorted.length > 2) {\r\n out += \"\\n### All Pairwise Gaps\\n\";\r\n for (let i = 0; i < sorted.length; i++) {\r\n for (let j = i + 1; j < sorted.length; j++) {\r\n const a = sorted[i];\r\n const b = sorted[j];\r\n const labelA = COMPONENT_MAP[a.type]?.label || a.type;\r\n const labelB = COMPONENT_MAP[b.type]?.label || b.type;\r\n const vGap = Math.round(b.y - (a.y + a.height));\r\n const hGap = Math.round(b.x - (a.x + a.width));\r\n out += `- ${labelA} ↔ ${labelB}: h=\\`${hGap}px\\` v=\\`${vGap}px\\`\\n`;\r\n }\r\n }\r\n }\r\n\r\n if (detailLevel === \"forensic\") {\r\n out += \"\\n### Z-Order (placement order)\\n\";\r\n placements.forEach((c, i) => {\r\n const label = COMPONENT_MAP[c.type]?.label || c.type;\r\n out += `${i}. ${label} at \\`(${Math.round(c.x)}, ${Math.round(c.y)})\\`\\n`;\r\n });\r\n }\r\n }\r\n\r\n // --- Suggested implementation ---\r\n out += \"\\n### Suggested Implementation\\n\";\r\n\r\n const hasNav = sorted.some((c) => c.type === \"navigation\");\r\n const hasHero = sorted.some((c) => c.type === \"hero\");\r\n const hasSidebar = sorted.some((c) => c.type === \"sidebar\");\r\n const hasFooter = sorted.some((c) => c.type === \"footer\");\r\n const cards = sorted.filter((c) => c.type === \"card\");\r\n const forms = sorted.filter((c) => c.type === \"form\");\r\n const tables = sorted.filter((c) => c.type === \"table\");\r\n const modals = sorted.filter((c) => c.type === \"modal\");\r\n\r\n if (hasNav) out += \"- Top navigation bar with logo + nav links + CTA\\n\";\r\n if (hasHero) out += \"- Hero section with heading, subtext, and call-to-action\\n\";\r\n if (hasSidebar) out += \"- Sidebar layout — use CSS Grid with sidebar + main content area\\n\";\r\n if (cards.length > 1) out += `- ${cards.length}-column card grid — use CSS Grid or Flexbox\\n`;\r\n else if (cards.length === 1) out += \"- Card component with image + content area\\n\";\r\n if (forms.length > 0) out += `- ${forms.length} form${forms.length > 1 ? \"s\" : \"\"} — add proper labels, validation, and submit handling\\n`;\r\n if (tables.length > 0) out += \"- Data table — consider sortable columns and pagination\\n\";\r\n if (modals.length > 0) out += \"- Modal dialog — add overlay backdrop and focus trapping\\n\";\r\n if (hasFooter) out += \"- Multi-column footer with links\\n\";\r\n\r\n if (detailLevel === \"detailed\" || detailLevel === \"forensic\") {\r\n out += \"\\n### CSS Suggestions\\n\";\r\n if (hasSidebar) {\r\n const sidebar = sorted.find((c) => c.type === \"sidebar\")!;\r\n out += `- \\`display: grid; grid-template-columns: ${Math.round(sidebar.width)}px 1fr;\\`\\n`;\r\n }\r\n if (cards.length > 1) {\r\n const cardW = Math.round(cards[0].width);\r\n out += `- \\`display: grid; grid-template-columns: repeat(${cards.length}, ${cardW}px); gap: 16px;\\`\\n`;\r\n }\r\n if (hasNav) {\r\n out += `- Navigation: \\`position: sticky; top: 0; z-index: 50;\\`\\n`;\r\n }\r\n }\r\n\r\n return out;\r\n}\r\n\r\n// =============================================================================\r\n// Rearrange Output\r\n// =============================================================================\r\n\r\n/**\r\n * Generate markdown output describing position/size changes vs original.\r\n * Returns empty string if nothing has been moved or resized.\r\n */\r\nexport function generateRearrangeOutput(\r\n state: RearrangeState,\r\n detailLevel: OutputDetailLevel = \"standard\",\r\n viewport?: ViewportSize,\r\n): string {\r\n const { sections } = state;\r\n\r\n // Collect sections that actually changed\r\n type ChangeEntry = {\r\n section: (typeof sections)[number];\r\n posMoved: boolean;\r\n sizeChanged: boolean;\r\n };\r\n const changed: ChangeEntry[] = [];\r\n\r\n for (const s of sections) {\r\n const o = s.originalRect;\r\n const c = s.currentRect;\r\n\r\n const posMoved = Math.abs(o.x - c.x) > 1 || Math.abs(o.y - c.y) > 1;\r\n const sizeChanged = Math.abs(o.width - c.width) > 1 || Math.abs(o.height - c.height) > 1;\r\n\r\n if (!posMoved && !sizeChanged) {\r\n if (detailLevel === \"forensic\") {\r\n changed.push({ section: s, posMoved: false, sizeChanged: false });\r\n }\r\n continue;\r\n }\r\n\r\n changed.push({ section: s, posMoved, sizeChanged });\r\n }\r\n\r\n // Nothing changed\r\n if (changed.length === 0) return \"\";\r\n if (detailLevel !== \"forensic\" && changed.every((e) => !e.posMoved && !e.sizeChanged)) return \"\";\r\n\r\n let out = \"## Suggested Layout Changes\\n\\n\";\r\n\r\n // --- Reference frame (always for non-compact) ---\r\n const vw = viewport ? viewport.width : (typeof window !== \"undefined\" ? window.innerWidth : 0);\r\n const vh = viewport ? viewport.height : (typeof window !== \"undefined\" ? window.innerHeight : 0);\r\n const layout = getPageLayout({ width: vw, height: vh });\r\n\r\n if (detailLevel !== \"compact\") {\r\n out += formatReferenceFrame(layout);\r\n }\r\n\r\n // Forensic extras\r\n if (detailLevel === \"forensic\") {\r\n out += `> Detected at: \\`${new Date(state.detectedAt).toISOString()}\\`\\n`;\r\n out += `> Total sections: ${sections.length}\\n\\n`;\r\n }\r\n\r\n // Build sibling candidates from ALL sections\r\n const siblingCandidates = (rects: \"original\" | \"current\") =>\r\n sections.map(s => ({\r\n label: s.label,\r\n selector: s.selector,\r\n rect: rects === \"original\" ? s.originalRect : s.currentRect,\r\n }));\r\n\r\n out += \"**Changes:**\\n\";\r\n\r\n for (const { section: s, posMoved, sizeChanged } of changed) {\r\n const o = s.originalRect;\r\n const c = s.currentRect;\r\n\r\n if (!posMoved && !sizeChanged) {\r\n out += `- ${s.label} — unchanged at (${Math.round(c.x)}, ${Math.round(c.y)}) ${Math.round(c.width)}×${Math.round(c.height)}px\\n`;\r\n continue;\r\n }\r\n\r\n // --- Compact: target only, no spatial context ---\r\n if (detailLevel === \"compact\") {\r\n if (posMoved && sizeChanged) {\r\n out += `- Suggested: move **${s.label}** to (${Math.round(c.x)}, ${Math.round(c.y)}) ${Math.round(c.width)}×${Math.round(c.height)}px\\n`;\r\n } else if (posMoved) {\r\n out += `- Suggested: move **${s.label}** to (${Math.round(c.x)}, ${Math.round(c.y)})\\n`;\r\n } else {\r\n out += `- Suggested: resize **${s.label}** to ${Math.round(c.width)}×${Math.round(c.height)}px\\n`;\r\n }\r\n continue;\r\n }\r\n\r\n // --- Standard / Detailed / Forensic: spatial context with coordinates ---\r\n if (posMoved && sizeChanged) {\r\n out += `- Suggested: move and resize **${s.label}**\\n`;\r\n } else if (posMoved) {\r\n out += `- Suggested: move **${s.label}**\\n`;\r\n } else {\r\n out += `- Suggested: resize **${s.label}** from ${Math.round(o.width)}×${Math.round(o.height)}px to ${Math.round(c.width)}×${Math.round(c.height)}px\\n`;\r\n }\r\n\r\n if (posMoved) {\r\n const origCtx = getSpatialContext(o, siblingCandidates(\"original\"));\r\n const currCtx = getSpatialContext(c, siblingCandidates(\"current\"));\r\n\r\n // Currently at: coordinates + size (if resized) + spatial context\r\n const wasSize = sizeChanged ? { width: o.width, height: o.height } : undefined;\r\n out += ` - Currently ${formatPositionSummary(origCtx, { x: o.x, y: o.y }, wasSize)}\\n`;\r\n\r\n // Suggested position: coordinates + size (if resized) + spatial context with gap values\r\n const nowSize = sizeChanged ? { width: c.width, height: c.height } : undefined;\r\n const coordStr = `at (${Math.round(c.x)}, ${Math.round(c.y)})`;\r\n const sizeStr = nowSize ? `, ${Math.round(nowSize.width)}×${Math.round(nowSize.height)}px` : \"\";\r\n const includeLeftRight = detailLevel === \"detailed\" || detailLevel === \"forensic\";\r\n const nowLines = formatSpatialLines(currCtx, { includeLeftRight });\r\n if (nowLines.length > 0) {\r\n out += ` - Suggested position ${coordStr}${sizeStr}: ${nowLines[0]}\\n`;\r\n for (let i = 1; i < nowLines.length; i++) {\r\n out += ` ${nowLines[i]}\\n`;\r\n }\r\n } else {\r\n out += ` - Suggested position ${coordStr}${sizeStr}\\n`;\r\n }\r\n\r\n // CSS position relative to content area\r\n const cssPos = formatCSSPosition(c, layout);\r\n if (cssPos) {\r\n out += ` - CSS: ${cssPos}\\n`;\r\n }\r\n }\r\n\r\n // Parent layout context (standard+)\r\n const parentCtx = formatParentContext(s.selector);\r\n if (parentCtx) {\r\n out += ` - ${parentCtx}\\n`;\r\n }\r\n\r\n // Selector\r\n out += ` - Selector: \\`${s.selector}\\`\\n`;\r\n\r\n // Detailed/Forensic extras\r\n if (detailLevel === \"detailed\" || detailLevel === \"forensic\") {\r\n const ident = s.className ? `${s.tagName}.${s.className.split(\" \")[0]}` : s.tagName;\r\n if (ident !== s.selector) {\r\n out += ` - Element: \\`${ident}\\`\\n`;\r\n }\r\n if (s.role) out += ` - Role: \\`${s.role}\\`\\n`;\r\n if (detailLevel === \"forensic\" && s.textSnippet) {\r\n out += ` - Text: \"${s.textSnippet}\"\\n`;\r\n }\r\n }\r\n\r\n // Forensic: full structured rects\r\n if (detailLevel === \"forensic\") {\r\n out += ` - Original rect: \\`{ x: ${Math.round(o.x)}, y: ${Math.round(o.y)}, w: ${Math.round(o.width)}, h: ${Math.round(o.height)} }\\`\\n`;\r\n out += ` - Current rect: \\`{ x: ${Math.round(c.x)}, y: ${Math.round(c.y)}, w: ${Math.round(c.width)}, h: ${Math.round(c.height)} }\\`\\n`;\r\n }\r\n }\r\n\r\n // --- Layout Summary (standard+, not compact) ---\r\n if (detailLevel !== \"compact\") {\r\n const movedSections = changed\r\n .filter(e => e.posMoved)\r\n .map(e => ({\r\n label: e.section.label,\r\n originalRect: e.section.originalRect,\r\n currentRect: e.section.currentRect,\r\n }));\r\n\r\n const patterns = analyzeLayoutPatterns(movedSections);\r\n if (patterns.length > 0) {\r\n out += \"\\n### Layout Summary\\n\";\r\n for (const line of patterns) {\r\n out += `- ${line}\\n`;\r\n }\r\n }\r\n }\r\n\r\n // --- All Sections Snapshot (standard+) ---\r\n // Gives the implementing agent full layout context\r\n if (detailLevel !== \"compact\" && sections.length > 1) {\r\n out += \"\\n### All Sections (current positions)\\n\";\r\n const sortedSections = [...sections].sort((a, b) => {\r\n if (Math.abs(a.currentRect.y - b.currentRect.y) < 20) return a.currentRect.x - b.currentRect.x;\r\n return a.currentRect.y - b.currentRect.y;\r\n });\r\n for (const s of sortedSections) {\r\n const r = s.currentRect;\r\n const moved = Math.abs(r.x - s.originalRect.x) > 1 || Math.abs(r.y - s.originalRect.y) > 1 ||\r\n Math.abs(r.width - s.originalRect.width) > 1 || Math.abs(r.height - s.originalRect.height) > 1;\r\n out += `- ${s.label}: \\`${Math.round(r.width)}×${Math.round(r.height)}px\\` at \\`(${Math.round(r.x)}, ${Math.round(r.y)})\\`${moved ? \" ← suggested\" : \"\"}\\n`;\r\n }\r\n }\r\n\r\n return out;\r\n}\r\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// Layout Mode Storage\n// =============================================================================\n\nconst DESIGN_PREFIX = \"agentation-design-\";\n\nexport function loadDesignPlacements<T = unknown>(pathname: string): T[] {\n if (typeof window === \"undefined\") return [];\n try {\n const stored = localStorage.getItem(`${DESIGN_PREFIX}${pathname}`);\n if (!stored) return [];\n return JSON.parse(stored);\n } catch {\n return [];\n }\n}\n\nexport function saveDesignPlacements<T = unknown>(pathname: string, placements: T[]): void {\n if (typeof window === \"undefined\") return;\n try {\n localStorage.setItem(`${DESIGN_PREFIX}${pathname}`, JSON.stringify(placements));\n } catch {\n // localStorage might be full or disabled\n }\n}\n\nexport function clearDesignPlacements(pathname: string): void {\n if (typeof window === \"undefined\") return;\n try {\n localStorage.removeItem(`${DESIGN_PREFIX}${pathname}`);\n } catch {\n // ignore\n }\n}\n\n// =============================================================================\n// Rearrange Mode Storage\n// =============================================================================\n\nconst REARRANGE_PREFIX = \"agentation-rearrange-\";\n\nexport function loadRearrangeState<T = unknown>(pathname: string): T | null {\n if (typeof window === \"undefined\") return null;\n try {\n const stored = localStorage.getItem(`${REARRANGE_PREFIX}${pathname}`);\n if (!stored) return null;\n return JSON.parse(stored);\n } catch {\n return null;\n }\n}\n\nexport function saveRearrangeState<T = unknown>(pathname: string, state: T): void {\n if (typeof window === \"undefined\") return;\n try {\n localStorage.setItem(`${REARRANGE_PREFIX}${pathname}`, JSON.stringify(state));\n } catch {\n // localStorage might be full or disabled\n }\n}\n\nexport function clearRearrangeState(pathname: string): void {\n if (typeof window === \"undefined\") return;\n try {\n localStorage.removeItem(`${REARRANGE_PREFIX}${pathname}`);\n } catch {\n // ignore\n }\n}\n\n// =============================================================================\n// Wireframe Storage (persists wireframe state across page refresh)\n// =============================================================================\n\nconst WIREFRAME_PREFIX = \"agentation-wireframe-\";\n\nexport function loadWireframeState<T = unknown>(pathname: string): { rearrange: T | null; placements: unknown[]; purpose: string } | null {\n if (typeof window === \"undefined\") return null;\n try {\n const stored = localStorage.getItem(`${WIREFRAME_PREFIX}${pathname}`);\n if (!stored) return null;\n return JSON.parse(stored);\n } catch {\n return null;\n }\n}\n\nexport function saveWireframeState(pathname: string, state: { rearrange: unknown; placements: unknown[]; purpose: string }): void {\n if (typeof window === \"undefined\") return;\n try {\n localStorage.setItem(`${WIREFRAME_PREFIX}${pathname}`, JSON.stringify(state));\n } catch {\n // localStorage might be full or disabled\n }\n}\n\nexport function clearWireframeState(pathname: string): void {\n if (typeof window === \"undefined\") return;\n try {\n localStorage.removeItem(`${WIREFRAME_PREFIX}${pathname}`);\n } catch {\n // ignore\n }\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// =============================================================================\n// Toolbar Visibility (per-tab session)\n// =============================================================================\n\nconst TOOLBAR_HIDDEN_SESSION_KEY = `${SESSION_PREFIX}toolbar-hidden`;\n\nexport function loadToolbarHidden(): boolean {\n if (typeof window === \"undefined\") return false;\n try {\n return sessionStorage.getItem(TOOLBAR_HIDDEN_SESSION_KEY) === \"1\";\n } catch {\n return false;\n }\n}\n\nexport function saveToolbarHidden(hidden: boolean): void {\n if (typeof window === \"undefined\") return;\n try {\n if (hidden) {\n sessionStorage.setItem(TOOLBAR_HIDDEN_SESSION_KEY, \"1\");\n } else {\n sessionStorage.removeItem(TOOLBAR_HIDDEN_SESSION_KEY);\n }\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 /^Segment(ViewNode|Node)$/, // Next.js App Router internals\n /^LayoutSegment/, // Next.js layout segment wrappers\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","import React from \"react\";\n\n// =============================================================================\n// Source Location Detection Utilities\n// =============================================================================\n//\n// This module provides utilities for detecting React source file locations from\n// DOM elements. It works by accessing React's internal fiber tree and extracting\n// _debugSource information that's available in development builds.\n//\n// Compatibility:\n// - React 16.8+ (Hooks era)\n// - React 17.x\n// - React 18.x\n// - React 19.x (with fallbacks for changed internals)\n//\n// Limitations:\n// - Only works in development builds (production builds strip _debugSource)\n// - Requires React DevTools-style fiber access\n// - Some bundlers may strip debug info even in development\n// =============================================================================\n\n/**\n * Source location information for a React component\n */\nexport interface SourceLocation {\n /** Absolute or relative file path */\n fileName: string;\n /** Line number (1-indexed) */\n lineNumber: number;\n /** Column number (0-indexed, may be undefined) */\n columnNumber?: number;\n /** Component display name if available */\n componentName?: string;\n /** React version detected */\n reactVersion?: string;\n}\n\n/**\n * Result of source location detection\n */\nexport interface SourceLocationResult {\n /** Whether source location was found */\n found: boolean;\n /** Source location data (if found) */\n source?: SourceLocation;\n /** Reason if not found */\n reason?: SourceLocationNotFoundReason;\n /** Whether the app appears to be a React app */\n isReactApp: boolean;\n /** Whether running in production mode */\n isProduction: boolean;\n}\n\n/**\n * Reasons why source location might not be found\n */\nexport type SourceLocationNotFoundReason =\n | \"not-react-app\"\n | \"production-build\"\n | \"no-fiber\"\n | \"no-debug-source\"\n | \"react-19-changed\"\n | \"element-not-in-react-tree\"\n | \"unknown\";\n\n/**\n * React Fiber node structure (partial, for type safety)\n * Based on React's internal FiberNode type\n */\ninterface ReactFiber {\n // Debug source info (only in development)\n _debugSource?: {\n fileName: string;\n lineNumber: number;\n columnNumber?: number;\n };\n // Owner info (React 19 may use this differently)\n _debugOwner?: ReactFiber;\n // Component type\n type?: {\n name?: string;\n displayName?: string;\n // For class components\n prototype?: {\n isReactComponent?: boolean;\n };\n } | string | null;\n // Element type for built-in elements\n elementType?: unknown;\n // Tag indicating fiber type\n tag?: number;\n // Fiber tree navigation\n return?: ReactFiber | null;\n child?: ReactFiber | null;\n sibling?: ReactFiber | null;\n // Memoized props (for context)\n memoizedProps?: Record<string, unknown>;\n // State node for class components\n stateNode?: unknown;\n}\n\n/**\n * Extended HTMLElement with React fiber properties\n */\ninterface ReactDOMElement extends HTMLElement {\n // React 16-17 fiber key\n __reactFiber$?: string;\n // React 18+ fiber key pattern\n __reactFiber?: ReactFiber;\n // React internal instance (older pattern)\n __reactInternalInstance$?: string;\n // Alternative patterns\n _reactRootContainer?: unknown;\n}\n\n// React fiber tag constants (for reference)\nconst FIBER_TAGS = {\n FunctionComponent: 0,\n ClassComponent: 1,\n IndeterminateComponent: 2,\n HostRoot: 3,\n HostPortal: 4,\n HostComponent: 5,\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} as const;\n\n/**\n * Checks if the page appears to be running a React application\n *\n * @returns Object with detection results\n */\nexport function detectReactApp(): {\n isReact: boolean;\n version?: string;\n isProduction: boolean;\n} {\n if (typeof window === \"undefined\") {\n return { isReact: false, isProduction: true };\n }\n\n // Check for React DevTools hook (most reliable)\n const devToolsHook = (window as unknown as Record<string, unknown>).__REACT_DEVTOOLS_GLOBAL_HOOK__;\n\n if (devToolsHook && typeof devToolsHook === \"object\") {\n const hook = devToolsHook as Record<string, unknown>;\n\n // Check for renderers (React 16+)\n const renderers = hook.renderers as Map<number, { version?: string }> | undefined;\n if (renderers && renderers.size > 0) {\n // Get version from first renderer\n const firstRenderer = renderers.values().next().value;\n const version = firstRenderer?.version;\n\n // Check for production mode via lack of development tools\n const isProduction = !hook.supportsFiber;\n\n return {\n isReact: true,\n version: version || \"unknown\",\n isProduction,\n };\n }\n }\n\n // Fallback: Check for React root markers on DOM\n const hasReactRoot = document.querySelector(\"[data-reactroot]\") !== null;\n const hasReactContainer = document.getElementById(\"root\")?._reactRootContainer !== undefined;\n\n // Check for fiber keys on body's children\n const bodyChildren = document.body.children;\n let hasFiberKey = false;\n\n for (let i = 0; i < bodyChildren.length && !hasFiberKey; i++) {\n const child = bodyChildren[i];\n const keys = Object.keys(child);\n hasFiberKey = keys.some(\n (key) => key.startsWith(\"__reactFiber$\") || key.startsWith(\"__reactInternalInstance$\")\n );\n }\n\n if (hasReactRoot || hasReactContainer || hasFiberKey) {\n return {\n isReact: true,\n version: \"unknown\",\n // Assume production if we can't detect dev tools\n isProduction: !devToolsHook,\n };\n }\n\n return { isReact: false, isProduction: true };\n}\n\n/**\n * Gets the React fiber node associated with a DOM element\n *\n * @param element - DOM element to get fiber for\n * @returns React fiber node or null if not found\n */\nexport function getFiberFromElement(element: HTMLElement): ReactFiber | null {\n if (!element || typeof element !== \"object\") {\n return null;\n }\n\n const keys = Object.keys(element);\n\n // React 18+ uses __reactFiber$ prefix\n const fiberKey = keys.find((key) => key.startsWith(\"__reactFiber$\"));\n if (fiberKey) {\n return (element as unknown as Record<string, ReactFiber>)[fiberKey] || null;\n }\n\n // React 16-17 uses __reactInternalInstance$ prefix\n const instanceKey = keys.find((key) => key.startsWith(\"__reactInternalInstance$\"));\n if (instanceKey) {\n return (element as unknown as Record<string, ReactFiber>)[instanceKey] || null;\n }\n\n // React 19 may use different patterns - check for any fiber-like object\n const possibleFiberKey = keys.find((key) => {\n if (!key.startsWith(\"__react\")) return false;\n const value = (element as unknown as Record<string, unknown>)[key];\n return value && typeof value === \"object\" && \"_debugSource\" in (value as object);\n });\n\n if (possibleFiberKey) {\n return (element as unknown as Record<string, ReactFiber>)[possibleFiberKey] || null;\n }\n\n return null;\n}\n\n/**\n * Gets the display name of a React component from its fiber\n *\n * @param fiber - React fiber node\n * @returns Component name or null\n */\nfunction getComponentName(fiber: ReactFiber): string | null {\n if (!fiber.type) {\n return null;\n }\n\n // String type means host component (div, span, etc.)\n if (typeof fiber.type === \"string\") {\n return null; // We want React component names, not HTML tags\n }\n\n // Function/class component\n if (typeof fiber.type === \"object\" || typeof fiber.type === \"function\") {\n const type = fiber.type as { displayName?: string; name?: string };\n\n // Prefer displayName (set by React DevTools or manually)\n if (type.displayName) {\n return type.displayName;\n }\n\n // Fall back to function/class name\n if (type.name) {\n return type.name;\n }\n }\n\n return null;\n}\n\n/**\n * Walks up the fiber tree to find the nearest component with _debugSource\n *\n * @param fiber - Starting fiber node\n * @param maxDepth - Maximum tree depth to traverse (default: 50)\n * @returns Object with source info and component name, or null\n */\nfunction findDebugSource(\n fiber: ReactFiber,\n maxDepth = 50\n): { source: ReactFiber[\"_debugSource\"]; componentName: string | null } | null {\n let current: ReactFiber | null | undefined = fiber;\n let depth = 0;\n\n while (current && depth < maxDepth) {\n // Check current fiber for debug source\n if (current._debugSource) {\n return {\n source: current._debugSource,\n componentName: getComponentName(current),\n };\n }\n\n // Check debug owner (for components that wrap the element)\n if (current._debugOwner?._debugSource) {\n return {\n source: current._debugOwner._debugSource,\n componentName: getComponentName(current._debugOwner),\n };\n }\n\n // Move up the tree\n current = current.return;\n depth++;\n }\n\n return null;\n}\n\n/**\n * Attempts to find source location using React 19's potentially different structure\n *\n * @param fiber - Starting fiber node\n * @returns Source location info or null\n */\nfunction findDebugSourceReact19(\n fiber: ReactFiber\n): { source: ReactFiber[\"_debugSource\"]; componentName: string | null } | null {\n // React 19 may store debug info differently\n // This is a forward-compatible attempt based on React 19 RFCs\n\n let current: ReactFiber | null | undefined = fiber;\n let depth = 0;\n const maxDepth = 50;\n\n while (current && depth < maxDepth) {\n // Check for new React 19 debug patterns\n const anyFiber = current as unknown as Record<string, unknown>;\n\n // Possible React 19 locations for debug info\n const possibleSourceKeys = [\n \"_debugSource\",\n \"__source\",\n \"_source\",\n \"debugSource\",\n ];\n\n for (const key of possibleSourceKeys) {\n const source = anyFiber[key];\n if (source && typeof source === \"object\" && \"fileName\" in source) {\n return {\n source: source as ReactFiber[\"_debugSource\"],\n componentName: getComponentName(current),\n };\n }\n }\n\n // Check if debug info is in the element itself\n if (current.memoizedProps) {\n const props = current.memoizedProps as Record<string, unknown>;\n if (props.__source && typeof props.__source === \"object\") {\n const source = props.__source as { fileName?: string; lineNumber?: number };\n if (source.fileName && source.lineNumber) {\n return {\n source: {\n fileName: source.fileName,\n lineNumber: source.lineNumber,\n columnNumber: (source as { columnNumber?: number }).columnNumber,\n },\n componentName: getComponentName(current),\n };\n }\n }\n }\n\n current = current.return;\n depth++;\n }\n\n return null;\n}\n\n// =============================================================================\n// Stack-Trace Fallback for Source File Detection\n// =============================================================================\n//\n// When _debugSource is unavailable (e.g. Next.js with SWC), we fall back to\n// invoking the component function with a throwing hooks dispatcher, parsing\n// the error stack trace, and stripping bundler URL prefixes. In dev mode,\n// stack frames already contain original source paths.\n// =============================================================================\n\n/** Cache: component function → probed SourceLocation (or null if unresolvable) */\nconst sourceProbeCache = new Map<Function, SourceLocation | null>();\n\n/**\n * Extract the callable function from a fiber, handling wrappers.\n * Returns null for class components, host elements, or unrecognized types.\n */\nfunction unwrapComponentType(fiber: ReactFiber): Function | null {\n const tag = fiber.tag;\n const type = fiber.type;\n const elementType = fiber.elementType as Record<string, unknown> | null | undefined;\n\n // Host elements (div, span, etc.)\n if (typeof type === \"string\" || type == null) return null;\n\n // Class components — skip (need `new`, different lifecycle)\n if (\n typeof type === \"function\" &&\n (type as { prototype?: { isReactComponent?: boolean } }).prototype?.isReactComponent\n ) {\n return null;\n }\n\n // FunctionComponent / IndeterminateComponent\n if (\n (tag === FIBER_TAGS.FunctionComponent || tag === FIBER_TAGS.IndeterminateComponent) &&\n typeof type === \"function\"\n ) {\n return type as Function;\n }\n\n // ForwardRef\n if (tag === FIBER_TAGS.ForwardRef && elementType) {\n const render = elementType.render;\n if (typeof render === \"function\") return render as Function;\n }\n\n // Memo / SimpleMemo\n if (\n (tag === FIBER_TAGS.MemoComponent || tag === FIBER_TAGS.SimpleMemoComponent) &&\n elementType\n ) {\n const inner = elementType.type;\n if (typeof inner === \"function\") return inner as Function;\n }\n\n // Generic fallback: if type is a plain function, use it\n if (typeof type === \"function\") return type as Function;\n\n return null;\n}\n\n/**\n * Access the React hooks dispatcher from React's module internals.\n * These are properties on the `react` module export, NOT on `window`.\n * Returns get/set helpers or null if not found.\n */\nfunction getReactDispatcher(): {\n get: () => unknown;\n set: (d: unknown) => void;\n} | null {\n // Access React internals from the imported module\n const reactModule = React as unknown as Record<string, unknown>;\n\n // React 19: __CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE.H\n const r19 = reactModule.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE as\n | Record<string, unknown>\n | undefined;\n if (r19 && \"H\" in r19) {\n return {\n get: () => r19.H,\n set: (d: unknown) => { r19.H = d; },\n };\n }\n\n // React 16-18: __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentDispatcher.current\n const r18 = reactModule.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED as\n | Record<string, unknown>\n | undefined;\n if (r18) {\n const dispatcher = r18.ReactCurrentDispatcher as\n | { current: unknown }\n | undefined;\n if (dispatcher && \"current\" in dispatcher) {\n return {\n get: () => dispatcher.current,\n set: (d: unknown) => { dispatcher.current = d; },\n };\n }\n }\n\n return null;\n}\n\n/**\n * Parse the first non-internal frame from an error stack string.\n */\nfunction parseComponentFrame(\n stack: string\n): { fileName: string; line: number; column?: number } | null {\n const lines = stack.split(\"\\n\");\n\n // Patterns to skip: our own bundle, React internals, node_modules, chunk files\n const skipPatterns = [\n /source-location/,\n /\\/dist\\/index\\./, // Our bundled output (dist/index.mjs, dist/index.js)\n /node_modules\\//, // Any package in node_modules\n /react-dom/,\n /react\\.development/,\n /react\\.production/,\n /chunk-[A-Z0-9]+/i,\n /react-stack-bottom-frame/,\n /react-reconciler/,\n /scheduler/,\n /<anonymous>/, // Proxy handler frames\n ];\n\n // V8 format: \" at FnName (file:line:col)\" or \" at file:line:col\"\n const v8Re = /^\\s*at\\s+(?:.*?\\s+\\()?(.+?):(\\d+):(\\d+)\\)?$/;\n // WebKit/Gecko: \"FnName@file:line:col\" or \"@file:line:col\"\n const webkitRe = /^[^@]*@(.+?):(\\d+):(\\d+)$/;\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n // Skip frames from internal files\n if (skipPatterns.some((p) => p.test(trimmed))) continue;\n\n const match = v8Re.exec(trimmed) || webkitRe.exec(trimmed);\n if (match) {\n return {\n fileName: match[1],\n line: parseInt(match[2], 10),\n column: parseInt(match[3], 10),\n };\n }\n }\n\n return null;\n}\n\n/**\n * Strip bundler URL prefixes from a raw source path.\n */\nfunction cleanSourcePath(rawPath: string): string {\n let path = rawPath;\n\n // 1. Strip query params and hashes\n path = path.replace(/[?#].*$/, \"\");\n\n // 2. Turbopack project prefix\n path = path.replace(/^turbopack:\\/\\/\\/\\[project\\]\\//, \"\");\n\n // 3. webpack-internal\n path = path.replace(/^webpack-internal:\\/\\/\\/\\.\\//, \"\");\n path = path.replace(/^webpack-internal:\\/\\/\\//, \"\");\n\n // 4. webpack\n path = path.replace(/^webpack:\\/\\/\\/\\.\\//, \"\");\n path = path.replace(/^webpack:\\/\\/\\//, \"\");\n\n // 5. turbopack generic\n path = path.replace(/^turbopack:\\/\\/\\//, \"\");\n\n // 6. http(s)://host:port/\n path = path.replace(/^https?:\\/\\/[^/]+\\//, \"\");\n\n // 7. file:///\n path = path.replace(/^file:\\/\\/\\//, \"/\");\n\n // 8. Webpack chunk group prefixes like (app-pages-browser)/./\n path = path.replace(/^\\([^)]+\\)\\/\\.\\//, \"\");\n\n // 9. Leading ./\n path = path.replace(/^\\.\\//, \"\");\n\n return path;\n}\n\n/**\n * Probe a single fiber's component function by invoking it with a\n * throwing hooks dispatcher and parsing the resulting error stack.\n */\nfunction probeComponentSource(fiber: ReactFiber): SourceLocation | null {\n const fn = unwrapComponentType(fiber);\n if (!fn) return null;\n\n // Check cache\n if (sourceProbeCache.has(fn)) {\n return sourceProbeCache.get(fn)!;\n }\n\n const dispatcher = getReactDispatcher();\n if (!dispatcher) {\n sourceProbeCache.set(fn, null);\n return null;\n }\n\n const original = dispatcher.get();\n let result: SourceLocation | null = null;\n\n try {\n // Install a proxy dispatcher that throws an Error (with stack) on any hook access.\n // When the component calls useState/useEffect/etc., the proxy's get trap fires,\n // creating an Error whose stack trace includes the component's source location.\n const stackCapturingDispatcher = new Proxy(\n {},\n {\n get() {\n throw new Error(\"probe\");\n },\n }\n );\n dispatcher.set(stackCapturingDispatcher);\n\n try {\n // Invoke the component — it will either:\n // 1. Call a hook → throws Error with stack (ideal case)\n // 2. Have no hooks → runs to completion (harmless, discarded), no stack to parse\n fn({});\n } catch (e) {\n if (e instanceof Error && e.message === \"probe\" && e.stack) {\n const frame = parseComponentFrame(e.stack);\n if (frame) {\n const cleaned = cleanSourcePath(frame.fileName);\n result = {\n fileName: cleaned,\n lineNumber: frame.line,\n columnNumber: frame.column,\n componentName: getComponentName(fiber) || undefined,\n };\n }\n }\n }\n } finally {\n dispatcher.set(original);\n }\n\n sourceProbeCache.set(fn, result);\n return result;\n}\n\n/**\n * Walk the fiber tree via .return, probing each fiber for source info.\n * Stops at the first success.\n */\nfunction probeSourceWalk(\n fiber: ReactFiber,\n maxDepth = 15\n): SourceLocation | null {\n let current: ReactFiber | null | undefined = fiber;\n let depth = 0;\n\n while (current && depth < maxDepth) {\n const source = probeComponentSource(current);\n if (source) return source;\n\n current = current.return;\n depth++;\n }\n\n return null;\n}\n\n/**\n * Gets the source file location for a DOM element in a React application\n *\n * This function attempts to extract the source file path and line number\n * where a React component is defined. This only works in development mode\n * as production builds strip debug information.\n *\n * @param element - DOM element to get source location for\n * @returns SourceLocationResult with location info or reason for failure\n *\n * @example\n * ```ts\n * const result = getSourceLocation(element);\n * if (result.found && result.source) {\n * console.log(`${result.source.fileName}:${result.source.lineNumber}`);\n * // Output: \"/src/components/Button.tsx:42\"\n * }\n * ```\n */\nexport function getSourceLocation(element: HTMLElement): SourceLocationResult {\n // Try to get fiber directly from the element (same approach as getReactComponentName)\n // This avoids detectReactApp() whose production heuristic can give false positives\n const fiber = getFiberFromElement(element);\n\n if (!fiber) {\n return {\n found: false,\n reason: \"no-fiber\",\n isReactApp: false,\n isProduction: false,\n };\n }\n\n // Try standard React 16-18 debug source finding\n let debugInfo = findDebugSource(fiber);\n\n // If not found, try React 19 patterns\n if (!debugInfo) {\n debugInfo = findDebugSourceReact19(fiber);\n }\n\n if (debugInfo?.source) {\n return {\n found: true,\n source: {\n fileName: debugInfo.source.fileName,\n lineNumber: debugInfo.source.lineNumber,\n columnNumber: debugInfo.source.columnNumber,\n componentName: debugInfo.componentName || undefined,\n },\n isReactApp: true,\n isProduction: false,\n };\n }\n\n // Fallback: probe component via stack trace\n const probed = probeSourceWalk(fiber);\n if (probed) {\n return { found: true, source: probed, isReactApp: true, isProduction: false };\n }\n\n return {\n found: false,\n reason: \"no-debug-source\",\n isReactApp: true,\n isProduction: false,\n };\n}\n\n/**\n * Formats a source location as a clickable file path string\n *\n * @param source - Source location object\n * @param format - Output format: \"vscode\" for VSCode URL, \"path\" for file:line format\n * @returns Formatted string\n *\n * @example\n * ```ts\n * formatSourceLocation(source, \"path\")\n * // Returns: \"src/components/Button.tsx:42:8\"\n *\n * formatSourceLocation(source, \"vscode\")\n * // Returns: \"vscode://file/absolute/path/src/components/Button.tsx:42:8\"\n * ```\n */\nexport function formatSourceLocation(\n source: SourceLocation,\n format: \"path\" | \"vscode\" = \"path\"\n): string {\n const { fileName, lineNumber, columnNumber } = source;\n\n // Build line:column suffix\n let location = `${fileName}:${lineNumber}`;\n if (columnNumber !== undefined) {\n location += `:${columnNumber}`;\n }\n\n if (format === \"vscode\") {\n // VSCode can open files via URL protocol\n // Assumes fileName is absolute or can be resolved\n return `vscode://file${fileName.startsWith(\"/\") ? \"\" : \"/\"}${location}`;\n }\n\n return location;\n}\n\n/**\n * Gets source locations for multiple elements at once\n *\n * @param elements - Array of DOM elements\n * @returns Array of source location results\n */\nexport function getSourceLocations(elements: HTMLElement[]): SourceLocationResult[] {\n return elements.map((element) => getSourceLocation(element));\n}\n\n/**\n * Finds the nearest React component ancestor that has source info\n *\n * Useful when clicking on a deeply nested element (like text or an icon)\n * and wanting to find the component that contains it.\n *\n * @param element - Starting DOM element\n * @param maxAncestors - Maximum DOM ancestors to check (default: 10)\n * @returns Source location result\n */\nexport function findNearestComponentSource(\n element: HTMLElement,\n maxAncestors = 10\n): SourceLocationResult {\n let current: HTMLElement | null = element;\n let depth = 0;\n\n while (current && depth < maxAncestors) {\n const result = getSourceLocation(current);\n\n // Return first successful result\n if (result.found) {\n return result;\n }\n\n // If we found fiber but no source, keep looking up DOM\n // (might find a parent component with source info)\n current = current.parentElement;\n depth++;\n }\n\n // Return result for original element (will explain why not found)\n return getSourceLocation(element);\n}\n\n/**\n * Gets all component sources in the ancestor chain\n *\n * Useful for understanding the component hierarchy.\n *\n * @param element - Starting DOM element\n * @returns Array of unique source locations from element up to root\n */\nexport function getComponentHierarchy(element: HTMLElement): SourceLocation[] {\n const fiber = getFiberFromElement(element);\n if (!fiber) {\n return [];\n }\n\n const sources: SourceLocation[] = [];\n const seenFiles = new Set<string>();\n\n let current: ReactFiber | null | undefined = fiber;\n let depth = 0;\n const maxDepth = 100;\n\n while (current && depth < maxDepth) {\n if (current._debugSource) {\n const key = `${current._debugSource.fileName}:${current._debugSource.lineNumber}`;\n\n // Avoid duplicates\n if (!seenFiles.has(key)) {\n seenFiles.add(key);\n sources.push({\n fileName: current._debugSource.fileName,\n lineNumber: current._debugSource.lineNumber,\n columnNumber: current._debugSource.columnNumber,\n componentName: getComponentName(current) || undefined,\n });\n }\n }\n\n current = current.return;\n depth++;\n }\n\n return sources;\n}\n\n/**\n * Checks if source location detection is likely to work in the current environment\n *\n * @returns Object describing support status\n */\nexport function checkSourceLocationSupport(): {\n supported: boolean;\n reason: string;\n suggestions: string[];\n} {\n const reactInfo = detectReactApp();\n\n if (!reactInfo.isReact) {\n return {\n supported: false,\n reason: \"No React application detected on this page\",\n suggestions: [\n \"Ensure you're on a page built with React\",\n \"The page may use a different framework (Vue, Angular, etc.)\",\n ],\n };\n }\n\n if (reactInfo.isProduction) {\n return {\n supported: false,\n reason: \"Production build detected - source info is stripped\",\n suggestions: [\n \"Run the application in development mode\",\n \"Set NODE_ENV=development\",\n \"Ensure your bundler includes source info in development\",\n ],\n };\n }\n\n // Check for DevTools\n const hasDevTools = typeof window !== \"undefined\" &&\n !!(window as unknown as Record<string, unknown>).__REACT_DEVTOOLS_GLOBAL_HOOK__;\n\n if (!hasDevTools) {\n return {\n supported: true,\n reason: \"Development mode detected, but React DevTools not installed\",\n suggestions: [\n \"Install React DevTools browser extension for best results\",\n \"Source detection may still work without it\",\n ],\n };\n }\n\n return {\n supported: true,\n reason: `React ${reactInfo.version || \"unknown\"} development mode detected`,\n suggestions: [],\n };\n}\n","\nconst css = \".styles-module__toolbar___wNsdK svg[fill=none],\\n.styles-module__markersLayer___-25j1 svg[fill=none],\\n.styles-module__fixedMarkersLayer___ffyX6 svg[fill=none] {\\n fill: none !important;\\n}\\n.styles-module__toolbar___wNsdK svg[fill=none] :not([fill]),\\n.styles-module__markersLayer___-25j1 svg[fill=none] :not([fill]),\\n.styles-module__fixedMarkersLayer___ffyX6 svg[fill=none] :not([fill]) {\\n fill: none !important;\\n}\\n\\n.styles-module__controlsContent___9GJWU :where(button, input, select, textarea, label) {\\n background: unset;\\n border: unset;\\n border-radius: unset;\\n padding: unset;\\n margin: unset;\\n color: unset;\\n font-family: unset;\\n font-weight: unset;\\n font-style: unset;\\n line-height: unset;\\n letter-spacing: unset;\\n text-transform: unset;\\n text-decoration: unset;\\n box-shadow: unset;\\n outline: unset;\\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__toolbarHide___y8kaT {\\n from {\\n opacity: 1;\\n transform: scale(1);\\n }\\n to {\\n opacity: 0;\\n transform: scale(0.8);\\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__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__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.styles-module__disableTransitions___EopxO :is(*, *::before, *::after) {\\n transition: none !important;\\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:where(.styles-module__toolbar___wNsdK) {\\n bottom: 1.25rem;\\n right: 1.25rem;\\n}\\n\\n.styles-module__toolbarContainer___dIhma {\\n position: relative;\\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 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__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__hiding___1td44 {\\n animation: styles-module__toolbarHide___y8kaT 0.4s cubic-bezier(0.4, 0, 1, 1) forwards;\\n pointer-events: none;\\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-color: var(--agentation-color-accent);\\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;\\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: var(--agentation-color-blue);\\n background-color: color-mix(in srgb, var(--agentation-color-blue) 25%, transparent);\\n}\\n.styles-module__controlButton___8Q0jc[data-error=true] {\\n color: var(--agentation-color-red);\\n background-color: color-mix(in srgb, var(--agentation-color-red) 25%, transparent);\\n}\\n.styles-module__controlButton___8Q0jc[data-danger]:hover:not(:disabled):not([data-active=true]):not([data-failed=true]) {\\n background-color: color-mix(in srgb, var(--agentation-color-red) 25%, transparent);\\n color: var(--agentation-color-red);\\n}\\n.styles-module__controlButton___8Q0jc[data-no-hover=true], .styles-module__controlButton___8Q0jc.styles-module__statusShowing___te6iu {\\n cursor: default;\\n pointer-events: none;\\n background: transparent !important;\\n}\\n.styles-module__controlButton___8Q0jc[data-auto-sync=true] {\\n color: var(--agentation-color-green);\\n background: transparent;\\n cursor: default;\\n}\\n.styles-module__controlButton___8Q0jc[data-failed=true] {\\n color: var(--agentation-color-red);\\n background-color: color-mix(in srgb, var(--agentation-color-red) 25%, transparent);\\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-color: var(--agentation-color-accent);\\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[data-agentation-theme=light] .styles-module__buttonBadge___NeFWb {\\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 color-mix(in srgb, var(--agentation-color-green) 50%, transparent);\\n }\\n 50% {\\n box-shadow: 0 0 0 5px color-mix(in srgb, var(--agentation-color-green) 0%, transparent);\\n }\\n}\\n@keyframes styles-module__mcpIndicatorPulseConnecting___cCYte {\\n 0%, 100% {\\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--agentation-color-yellow) 50%, transparent);\\n }\\n 50% {\\n box-shadow: 0 0 0 5px color-mix(in srgb, var(--agentation-color-yellow) 0%, transparent);\\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-color 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-color: var(--agentation-color-green);\\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-color: var(--agentation-color-yellow);\\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-color 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-color: var(--agentation-color-green);\\n animation: styles-module__connectionPulse___-Zycw 2.5s ease-in-out infinite;\\n}\\n\\n.styles-module__connectionIndicatorDisconnected___kmpaZ {\\n background-color: var(--agentation-color-red);\\n animation: none;\\n}\\n\\n.styles-module__connectionIndicatorConnecting___QmSLH {\\n background-color: var(--agentation-color-yellow);\\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__tooltipsInSession___-0lHH .styles-module__buttonWrapper___rBcdv:hover .styles-module__buttonTooltip___Burd9 {\\n transition-delay: 0s;\\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 color-mix(in srgb, var(--agentation-color-accent) 50%, transparent);\\n border-radius: 4px;\\n background-color: color-mix(in srgb, var(--agentation-color-accent) 4%, transparent);\\n pointer-events: none !important;\\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 color-mix(in srgb, var(--agentation-color-green) 60%, transparent);\\n border-radius: 4px;\\n pointer-events: none !important;\\n background-color: color-mix(in srgb, var(--agentation-color-green) 5%, transparent);\\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 color-mix(in srgb, var(--agentation-color-blue) 60%, transparent);\\n border-radius: 4px;\\n pointer-events: none !important;\\n background-color: color-mix(in srgb, var(--agentation-color-blue) 5%, transparent);\\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: var(--agentation-color-blue);\\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-color: var(--agentation-color-blue);\\n cursor: default;\\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-color: var(--agentation-color-green);\\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-color: var(--agentation-color-green);\\n}\\n.styles-module__marker___6sQrs.styles-module__hovered___ZgXIy {\\n background-color: var(--agentation-color-red);\\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\\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-color 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__themeToggle___2rUjA {\\n transition: background-color 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[data-agentation-theme=dark] .styles-module__settingsPanel___OxX3Y {\\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[data-agentation-theme=dark] .styles-module__settingsPanel___OxX3Y .styles-module__settingsLabel___8UjfX {\\n color: rgba(255, 255, 255, 0.6);\\n}\\n[data-agentation-theme=dark] .styles-module__settingsPanel___OxX3Y .styles-module__settingsOption___UNa12 {\\n color: rgba(255, 255, 255, 0.85);\\n}\\n[data-agentation-theme=dark] .styles-module__settingsPanel___OxX3Y .styles-module__settingsOption___UNa12:hover {\\n background: rgba(255, 255, 255, 0.1);\\n}\\n[data-agentation-theme=dark] .styles-module__settingsPanel___OxX3Y .styles-module__settingsOption___UNa12.styles-module__selected___OwRqP {\\n background: rgba(255, 255, 255, 0.15);\\n color: #fff;\\n}\\n[data-agentation-theme=dark] .styles-module__settingsPanel___OxX3Y .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\\n.styles-module__settingsPage___6YfHH {\\n min-width: 100%;\\n flex-shrink: 0;\\n transition: transform 0.2s ease, opacity 0.2s ease;\\n transition-delay: 0s;\\n opacity: 1;\\n}\\n\\n.styles-module__settingsPage___6YfHH.styles-module__slideLeft___Ps01J {\\n transform: translateX(-24px);\\n opacity: 0;\\n pointer-events: none;\\n}\\n\\n.styles-module__automationsPage___uvCq6 {\\n position: absolute;\\n top: 0;\\n left: 24px;\\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.2s ease, opacity 0.2s ease;\\n opacity: 0;\\n pointer-events: none;\\n}\\n\\n.styles-module__automationsPage___uvCq6.styles-module__slideIn___4-qXe {\\n transform: translateX(-24px);\\n opacity: 1;\\n pointer-events: auto;\\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[data-agentation-theme=light] .styles-module__settingsNavLink___wCzJt {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n[data-agentation-theme=light] .styles-module__settingsNavLink___wCzJt: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[data-agentation-theme=light] .styles-module__settingsNavLink___wCzJt svg {\\n color: rgba(0, 0, 0, 0.25);\\n}\\n[data-agentation-theme=light] .styles-module__settingsNavLink___wCzJt: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-color: var(--agentation-color-green);\\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-color: var(--agentation-color-yellow);\\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 {\\n border-bottom-color: rgba(255, 255, 255, 0.07);\\n}\\n.styles-module__settingsBackButton___bIe2j:hover svg {\\n opacity: 1;\\n}\\n[data-agentation-theme=light] .styles-module__settingsBackButton___bIe2j {\\n color: rgba(0, 0, 0, 0.85);\\n border-bottom-color: rgba(0, 0, 0, 0.08);\\n}\\n[data-agentation-theme=light] .styles-module__settingsBackButton___bIe2j:hover {\\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[data-agentation-theme=light] .styles-module__automationHeader___InP0r {\\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[data-agentation-theme=light] .styles-module__automationDescription___NKlmo {\\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[data-agentation-theme=light] .styles-module__learnMoreLink___8xv-x {\\n color: rgba(0, 0, 0, 0.6);\\n text-decoration-color: rgba(0, 0, 0, 0.2);\\n}\\n[data-agentation-theme=light] .styles-module__learnMoreLink___8xv-x: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 color: color(display-p3 0.4 0.72 1);\\n}\\n[data-agentation-theme=light] .styles-module__autoSendLabel___icDc2 {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n[data-agentation-theme=light] .styles-module__autoSendLabel___icDc2.styles-module__active___-zoN6 {\\n color: var(--agentation-color-blue);\\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 user-select: text;\\n transition: border-color 0.15s ease, background-color 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[data-agentation-theme=light] .styles-module__webhookUrlInput___2375C {\\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[data-agentation-theme=light] .styles-module__webhookUrlInput___2375C::placeholder {\\n color: rgba(0, 0, 0, 0.3);\\n}\\n[data-agentation-theme=light] .styles-module__webhookUrlInput___2375C: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 text-decoration: none;\\n}\\n\\n.styles-module__settingsBrandSlash___uTG18 {\\n color: var(--agentation-color-accent);\\n transition: color 0.2s ease;\\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[data-agentation-theme=light] .styles-module__cycleButton___FMKfw {\\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[data-agentation-theme=light] .styles-module__settingsRowDisabled___EgS0V .styles-module__settingsLabel___8UjfX {\\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[data-agentation-theme=light] .styles-module__cycleDot___nPgLY {\\n background: rgba(0, 0, 0, 0.2);\\n}\\n[data-agentation-theme=light] .styles-module__cycleDot___nPgLY.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[data-agentation-theme=light] .styles-module__settingsLabel___8UjfX {\\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: color-mix(in srgb, var(--agentation-color-blue) 15%, transparent);\\n color: var(--agentation-color-blue);\\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 background-color: var(--swatch);\\n cursor: pointer;\\n transition: transform 0.2s cubic-bezier(0.25, 1, 0.5, 1);\\n}\\n@supports (color: color(display-p3 0 0 0)) {\\n .styles-module__colorOption___IodiY {\\n background-color: var(--swatch-p3);\\n }\\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__colorOptionRing___U2xpo.styles-module__selected___OwRqP {\\n border-color: var(--swatch);\\n}\\n@supports (color: color(display-p3 0 0 0)) {\\n .styles-module__colorOptionRing___U2xpo.styles-module__selected___OwRqP {\\n border-color: var(--swatch-p3);\\n }\\n}\\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-color 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[data-agentation-theme=light] .styles-module__customCheckbox___U39ax {\\n border: 1px solid rgba(0, 0, 0, 0.15);\\n background: #fff;\\n}\\n[data-agentation-theme=light] .styles-module__customCheckbox___U39ax.styles-module__checked___mnZLo {\\n border-color: #1a1a1a;\\n background: #1a1a1a;\\n}\\n[data-agentation-theme=light] .styles-module__customCheckbox___U39ax.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[data-agentation-theme=light] .styles-module__toggleLabel___Xm8Aa {\\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: background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1);\\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-color: var(--agentation-color-blue);\\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}\\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[data-agentation-theme=light] .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}\\n\\n@keyframes styles-module__mcpPulse___uNggr {\\n 0% {\\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--agentation-color-green) 50%, transparent);\\n }\\n 70% {\\n box-shadow: 0 0 0 6px color-mix(in srgb, var(--agentation-color-green) 0%, transparent);\\n }\\n 100% {\\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--agentation-color-green) 0%, transparent);\\n }\\n}\\n@keyframes styles-module__mcpPulseError___fov9B {\\n 0% {\\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--agentation-color-red) 50%, transparent);\\n }\\n 70% {\\n box-shadow: 0 0 0 6px color-mix(in srgb, var(--agentation-color-red) 0%, transparent);\\n }\\n 100% {\\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--agentation-color-red) 0%, transparent);\\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-color: var(--agentation-color-yellow);\\n animation: styles-module__mcpPulse___uNggr 1.5s infinite;\\n}\\n.styles-module__mcpStatusDot___ibgkc.styles-module__connected___7c28g {\\n background-color: var(--agentation-color-green);\\n animation: styles-module__mcpPulse___uNggr 2.5s ease-in-out infinite;\\n}\\n.styles-module__mcpStatusDot___ibgkc.styles-module__disconnected___cHPxR {\\n background-color: var(--agentation-color-red);\\n animation: styles-module__mcpPulseError___fov9B 2s infinite;\\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 color-mix(in srgb, var(--agentation-color-green) 60%, transparent);\\n border-radius: 4px;\\n background-color: color-mix(in srgb, var(--agentation-color-green) 8%, transparent);\\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-color: var(--agentation-color-green);\\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 color-mix(in srgb, var(--agentation-color-green) 50%, transparent);\\n border-radius: 4px;\\n background: color-mix(in srgb, var(--agentation-color-green) 6%, transparent);\\n pointer-events: none;\\n will-change: transform, width, height;\\n contain: layout style;\\n}\\n\\n[data-agentation-theme=light] .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[data-agentation-theme=light] .styles-module__toolbarContainer___dIhma.styles-module__collapsed___Rydsn:hover {\\n background: #f5f5f5;\\n}\\n[data-agentation-theme=light] .styles-module__controlButton___8Q0jc {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n[data-agentation-theme=light] .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[data-agentation-theme=light] .styles-module__controlButton___8Q0jc[data-active=true] {\\n color: var(--agentation-color-blue);\\n background: color-mix(in srgb, var(--agentation-color-blue) 15%, transparent);\\n}\\n[data-agentation-theme=light] .styles-module__controlButton___8Q0jc[data-error=true] {\\n color: var(--agentation-color-red);\\n background: color-mix(in srgb, var(--agentation-color-red) 15%, transparent);\\n}\\n[data-agentation-theme=light] .styles-module__controlButton___8Q0jc[data-danger]:hover:not(:disabled):not([data-active=true]):not([data-failed=true]) {\\n color: var(--agentation-color-red);\\n background: color-mix(in srgb, var(--agentation-color-red) 15%, transparent);\\n}\\n[data-agentation-theme=light] .styles-module__controlButton___8Q0jc[data-auto-sync=true] {\\n color: var(--agentation-color-green);\\n background: transparent;\\n}\\n[data-agentation-theme=light] .styles-module__controlButton___8Q0jc[data-failed=true] {\\n color: var(--agentation-color-red);\\n background: color-mix(in srgb, var(--agentation-color-red) 15%, transparent);\\n}\\n[data-agentation-theme=light] .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[data-agentation-theme=light] .styles-module__buttonTooltip___Burd9::after {\\n background: #fff;\\n}\\n[data-agentation-theme=light] .styles-module__divider___c--s1 {\\n background: rgba(0, 0, 0, 0.1);\\n}\";\nconst classNames = {\"toolbar\":\"styles-module__toolbar___wNsdK\",\"markersLayer\":\"styles-module__markersLayer___-25j1\",\"fixedMarkersLayer\":\"styles-module__fixedMarkersLayer___ffyX6\",\"controlsContent\":\"styles-module__controlsContent___9GJWU\",\"disableTransitions\":\"styles-module__disableTransitions___EopxO\",\"toolbarContainer\":\"styles-module__toolbarContainer___dIhma\",\"entrance\":\"styles-module__entrance___sgHd8\",\"toolbarEnter\":\"styles-module__toolbarEnter___u8RRu\",\"hiding\":\"styles-module__hiding___1td44\",\"toolbarHide\":\"styles-module__toolbarHide___y8kaT\",\"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\",\"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\",\"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\",\"tooltipsInSession\":\"styles-module__tooltipsInSession___-0lHH\",\"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\",\"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\",\"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\",\"themeToggle\":\"styles-module__themeToggle___2rUjA\",\"settingsOption\":\"styles-module__settingsOption___UNa12\",\"selected\":\"styles-module__selected___OwRqP\",\"settingsPanelContainer\":\"styles-module__settingsPanelContainer___Xksv8\",\"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\",\"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\",\"scaleOut\":\"styles-module__scaleOut___Wctwz\",\"slideUp\":\"styles-module__slideUp___kgD36\",\"slideDown\":\"styles-module__slideDown___zcdje\"};\n\n// SSR-safe style injection (always update for HMR)\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 document.head.appendChild(style);\n }\n style.textContent = css;\n}\n\nexport default classNames;\n","import {\n OutputDetailLevel,\n ReactComponentMode,\n} from \"../components/page-toolbar-css\";\nimport { Annotation } from \"../types\";\n\nexport const OUTPUT_TO_REACT_MODE: Record<\n OutputDetailLevel,\n ReactComponentMode\n> = {\n compact: \"off\",\n standard: \"filtered\",\n detailed: \"smart\",\n forensic: \"all\",\n};\n\nexport const OUTPUT_DETAIL_OPTIONS: {\n value: OutputDetailLevel;\n label: string;\n}[] = [\n { value: \"compact\", label: \"Compact\" },\n { value: \"standard\", label: \"Standard\" },\n { value: \"detailed\", label: \"Detailed\" },\n { value: \"forensic\", label: \"Forensic\" },\n];\n\nexport function generateOutput(\n annotations: Annotation[],\n pathname: string,\n detailLevel: OutputDetailLevel = \"standard\",\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 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.sourceFile ? ` (${a.sourceFile})` : \"\"}: ${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 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.sourceFile) {\n output += `**Source:** ${a.sourceFile}\\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\n output += `### ${i + 1}. ${a.element}\\n`;\n output += `**Location:** ${a.elementPath}\\n`;\n if (a.sourceFile) {\n output += `**Source:** ${a.sourceFile}\\n`;\n }\n if (a.reactComponents) {\n output += `**React:** ${a.reactComponents}\\n`;\n }\n if (detailLevel === \"detailed\") {\n if (a.cssClasses) {\n output += `**Classes:** ${a.cssClasses}\\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 if (a.selectedText) {\n output += `**Selected text:** \"${a.selectedText}\"\\n`;\n }\n if (detailLevel === \"detailed\" && a.nearbyText && !a.selectedText) {\n output += `**Context:** ${a.nearbyText.slice(0, 100)}\\n`;\n }\n output += `**Feedback:** ${a.comment}\\n\\n`;\n }\n });\n\n return output.trim();\n}\n","\nconst css = \"@keyframes styles-module__markerIn___x4G8D {\\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___6VhQN {\\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__tooltipIn___aJslQ {\\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__renumberRoll___akV9B {\\n 0% {\\n transform: translateX(-40%);\\n opacity: 0;\\n }\\n 100% {\\n transform: translateX(0);\\n opacity: 1;\\n }\\n}\\n.styles-module__marker___9CKF7 {\\n position: absolute;\\n width: 22px;\\n height: 22px;\\n background: var(--agentation-color-blue);\\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___9CKF7:hover {\\n z-index: 2;\\n}\\n.styles-module__marker___9CKF7:not(.styles-module__enter___8kI3q):not(.styles-module__exit___KBdR3):not(.styles-module__clearing___8rM7K) {\\n transition: background-color 0.15s ease, transform 0.1s ease;\\n}\\n.styles-module__marker___9CKF7.styles-module__enter___8kI3q {\\n animation: styles-module__markerIn___x4G8D 0.25s cubic-bezier(0.22, 1, 0.36, 1) both;\\n}\\n.styles-module__marker___9CKF7.styles-module__exit___KBdR3 {\\n animation: styles-module__markerOut___6VhQN 0.2s ease-out both;\\n pointer-events: none;\\n}\\n.styles-module__marker___9CKF7.styles-module__clearing___8rM7K {\\n animation: styles-module__markerOut___6VhQN 0.15s ease-out both;\\n pointer-events: none;\\n}\\n.styles-module__marker___9CKF7:not(.styles-module__enter___8kI3q):not(.styles-module__exit___KBdR3):not(.styles-module__clearing___8rM7K):hover {\\n transform: translate(-50%, -50%) scale(1.1);\\n}\\n.styles-module__marker___9CKF7.styles-module__pending___BiY-U {\\n position: fixed;\\n background-color: var(--agentation-color-blue);\\n cursor: default;\\n}\\n.styles-module__marker___9CKF7.styles-module__fixed___aKrQO {\\n position: fixed;\\n}\\n.styles-module__marker___9CKF7.styles-module__multiSelect___CPfTC {\\n background-color: var(--agentation-color-green);\\n width: 26px;\\n height: 26px;\\n border-radius: 6px;\\n font-size: 0.75rem;\\n}\\n.styles-module__marker___9CKF7.styles-module__multiSelect___CPfTC.styles-module__pending___BiY-U {\\n background-color: var(--agentation-color-green);\\n}\\n.styles-module__marker___9CKF7.styles-module__hovered___-mg2N {\\n background-color: var(--agentation-color-red);\\n}\\n\\n.styles-module__renumber___16lvD {\\n display: block;\\n animation: styles-module__renumberRoll___akV9B 0.2s ease-out;\\n}\\n\\n.styles-module__markerTooltip___-VUm- {\\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___-VUm-.styles-module__enter___8kI3q {\\n animation: styles-module__tooltipIn___aJslQ 0.1s ease-out forwards;\\n}\\n\\n.styles-module__markerQuote___tQake {\\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___Rh4eI {\\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[data-agentation-theme=light] .styles-module__markerTooltip___-VUm- {\\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[data-agentation-theme=light] .styles-module__markerTooltip___-VUm- .styles-module__markerQuote___tQake {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n[data-agentation-theme=light] .styles-module__markerTooltip___-VUm- .styles-module__markerNote___Rh4eI {\\n color: rgba(0, 0, 0, 0.85);\\n}\";\nconst classNames = {\"marker\":\"styles-module__marker___9CKF7\",\"enter\":\"styles-module__enter___8kI3q\",\"exit\":\"styles-module__exit___KBdR3\",\"clearing\":\"styles-module__clearing___8rM7K\",\"markerIn\":\"styles-module__markerIn___x4G8D\",\"markerOut\":\"styles-module__markerOut___6VhQN\",\"pending\":\"styles-module__pending___BiY-U\",\"fixed\":\"styles-module__fixed___aKrQO\",\"multiSelect\":\"styles-module__multiSelect___CPfTC\",\"hovered\":\"styles-module__hovered___-mg2N\",\"renumber\":\"styles-module__renumber___16lvD\",\"renumberRoll\":\"styles-module__renumberRoll___akV9B\",\"markerTooltip\":\"styles-module__markerTooltip___-VUm-\",\"tooltipIn\":\"styles-module__tooltipIn___aJslQ\",\"markerQuote\":\"styles-module__markerQuote___tQake\",\"markerNote\":\"styles-module__markerNote___Rh4eI\"};\n\n// SSR-safe style injection (always update for HMR)\nif (typeof document !== 'undefined') {\n let style = document.getElementById('feedback-tool-styles-annotation-marker-styles');\n if (!style) {\n style = document.createElement('style');\n style.id = 'feedback-tool-styles-annotation-marker-styles';\n document.head.appendChild(style);\n }\n style.textContent = css;\n}\n\nexport default classNames;\n","import { Annotation } from \"../../../types\";\nimport { IconEdit, IconPlus, IconXmark } from \"../../icons\";\nimport styles from \"./styles.module.scss\";\n\ntype MarkerClickBehavior = \"edit\" | \"delete\";\n\n// =============================================================================\n// AnnotationMarker\n// =============================================================================\n\ntype AnnotationMarkerProps = {\n annotation: Annotation;\n globalIndex: number;\n /** Display index within this layer (for staggered animation delays) */\n layerIndex: number;\n layerSize: number;\n isExiting: boolean;\n isClearing: boolean;\n isAnimated: boolean;\n isHovered: boolean;\n isDeleting: boolean;\n isEditingAny: boolean;\n renumberFrom: number | null;\n markerClickBehavior: MarkerClickBehavior;\n tooltipStyle?: React.CSSProperties;\n onHoverEnter: (annotation: Annotation) => void;\n onHoverLeave: () => void;\n onClick: (annotation: Annotation) => void;\n onContextMenu?: (annotation: Annotation) => void;\n};\n\nexport function AnnotationMarker({\n annotation,\n globalIndex,\n layerIndex,\n layerSize,\n isExiting,\n isClearing,\n isAnimated,\n isHovered,\n isDeleting,\n isEditingAny,\n renumberFrom,\n markerClickBehavior,\n tooltipStyle,\n onHoverEnter,\n onHoverLeave,\n onClick,\n onContextMenu,\n}: AnnotationMarkerProps) {\n const showDeleteState = (isHovered || isDeleting) && !isEditingAny;\n const showDeleteHover = showDeleteState && markerClickBehavior === \"delete\";\n const isMulti = annotation.isMultiSelect;\n\n const markerColor = isMulti\n ? \"var(--agentation-color-green)\"\n : \"var(--agentation-color-accent)\";\n\n const animClass = isExiting\n ? styles.exit\n : isClearing\n ? styles.clearing\n : !isAnimated\n ? styles.enter\n : \"\";\n\n const animationDelay = isExiting\n ? `${(layerSize - 1 - layerIndex) * 20}ms`\n : `${layerIndex * 20}ms`;\n\n return (\n <div\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,\n }}\n onMouseEnter={() => onHoverEnter(annotation)}\n onMouseLeave={onHoverLeave}\n onClick={(e) => {\n e.stopPropagation();\n if (!isExiting) onClick(annotation);\n }}\n onContextMenu={\n onContextMenu\n ? (e) => {\n if (markerClickBehavior === \"delete\") {\n e.preventDefault();\n e.stopPropagation();\n if (!isExiting) onContextMenu(annotation);\n }\n }\n : undefined\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\n {isHovered && !isEditingAny && (\n <div\n className={`${styles.markerTooltip} ${styles.enter}`}\n style={tooltipStyle}\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}>{annotation.comment}</span>\n </div>\n )}\n </div>\n );\n}\n\n// =============================================================================\n// PendingMarker\n// =============================================================================\n\ntype PendingMarkerProps = {\n x: number;\n y: number;\n isMultiSelect?: boolean;\n isExiting: boolean;\n};\n\nexport function PendingMarker({\n x,\n y,\n isMultiSelect,\n isExiting,\n}: PendingMarkerProps) {\n return (\n <div\n className={`${styles.marker} ${styles.pending} ${isMultiSelect ? styles.multiSelect : \"\"} ${isExiting ? styles.exit : styles.enter}`}\n style={{\n left: `${x}%`,\n top: y,\n backgroundColor: isMultiSelect\n ? \"var(--agentation-color-green)\"\n : \"var(--agentation-color-accent)\",\n }}\n >\n <IconPlus size={12} />\n </div>\n );\n}\n\n// =============================================================================\n// ExitingMarker\n// =============================================================================\n\ntype ExitingMarkerProps = {\n annotation: Annotation;\n fixed?: boolean;\n};\n\nexport function ExitingMarker({ annotation, fixed }: ExitingMarkerProps) {\n const isMulti = annotation.isMultiSelect;\n return (\n <div\n className={`${styles.marker} ${fixed ? 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 <IconXmark size={isMulti ? 12 : 10} />\n </div>\n );\n}\n","\nconst css = \".styles-module__switchContainer___Ka-AB {\\n display: flex;\\n align-items: center;\\n position: relative;\\n padding: 2px;\\n width: 24px;\\n height: 16px;\\n border-radius: 8px;\\n background-color: #cdcdcd;\\n transition: background-color 0.15s, opacity 0.15s;\\n}\\n[data-agentation-theme=dark] .styles-module__switchContainer___Ka-AB {\\n background-color: #484848;\\n}\\n.styles-module__switchContainer___Ka-AB:has(.styles-module__switchInput___kYDSD:checked) {\\n background-color: var(--agentation-color-blue);\\n}\\n.styles-module__switchContainer___Ka-AB:has(.styles-module__switchInput___kYDSD:disabled) {\\n opacity: 0.3;\\n}\\n\\n.styles-module__switchInput___kYDSD {\\n position: absolute;\\n z-index: 1;\\n inset: 0;\\n border-radius: inherit;\\n opacity: 0;\\n cursor: pointer;\\n}\\n.styles-module__switchInput___kYDSD:disabled {\\n cursor: not-allowed;\\n}\\n\\n.styles-module__switchThumb___4sCPH {\\n border-radius: 50%;\\n width: 12px;\\n height: 12px;\\n background-color: #fff;\\n transition: transform 0.15s;\\n}\\n.styles-module__switchContainer___Ka-AB:has(.styles-module__switchInput___kYDSD:checked) .styles-module__switchThumb___4sCPH {\\n transform: translateX(8px);\\n}\";\nconst classNames = {\"switchContainer\":\"styles-module__switchContainer___Ka-AB\",\"switchInput\":\"styles-module__switchInput___kYDSD\",\"switchThumb\":\"styles-module__switchThumb___4sCPH\"};\n\n// SSR-safe style injection (always update for HMR)\nif (typeof document !== 'undefined') {\n let style = document.getElementById('feedback-tool-styles-switch-styles');\n if (!style) {\n style = document.createElement('style');\n style.id = 'feedback-tool-styles-switch-styles';\n document.head.appendChild(style);\n }\n style.textContent = css;\n}\n\nexport default classNames;\n","import styles from \"./styles.module.scss\";\n\ninterface SwitchProps extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nexport const Switch = ({ className = \"\", ...props }: SwitchProps) => {\n return (\n <div className={`${styles.switchContainer} ${className}`}>\n <input className={styles.switchInput} type=\"checkbox\" {...props} />\n <div className={styles.switchThumb}></div>\n </div>\n );\n};\n","import { useId } from \"react\";\nimport { Checkbox } from \"../../../checkbox\";\nimport { HelpTooltip } from \"../../../help-tooltip\";\nimport styles from \"./styles.module.scss\";\n\ninterface CheckboxFieldProps extends React.HTMLAttributes<HTMLDivElement> {\n label: string;\n tooltip?: string;\n checked?: boolean;\n onChange?: React.ChangeEventHandler<HTMLInputElement>;\n}\n\nexport const CheckboxField = ({\n className = \"\",\n label,\n tooltip,\n checked,\n onChange,\n ...props\n}: CheckboxFieldProps) => {\n const id = useId();\n\n return (\n <div className={`${styles.container} ${className}`} {...props}>\n <Checkbox id={id} onChange={onChange} checked={checked} />\n <label className={styles.label} htmlFor={id}>\n {label}\n </label>\n {tooltip && <HelpTooltip content={tooltip} />}\n </div>\n );\n};\n","\nconst css = \".styles-module__checkboxContainer___joqZk {\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n position: relative;\\n border: 1px solid rgba(26, 26, 26, 0.2);\\n border-radius: 4px;\\n width: 14px;\\n height: 14px;\\n background-color: #fff;\\n transition: background-color 0.2s ease;\\n}\\n[data-agentation-theme=dark] .styles-module__checkboxContainer___joqZk {\\n border-color: rgba(255, 255, 255, 0.2);\\n background-color: #252525;\\n}\\n.styles-module__checkboxContainer___joqZk:has(.styles-module__checkboxInput___ECzzO:checked) {\\n background-color: #1a1a1a;\\n}\\n[data-agentation-theme=dark] .styles-module__checkboxContainer___joqZk:has(.styles-module__checkboxInput___ECzzO:checked) {\\n background-color: #fff;\\n}\\n\\n.styles-module__checkboxInput___ECzzO {\\n position: absolute;\\n z-index: 1;\\n inset: -1px;\\n border-radius: inherit;\\n opacity: 0;\\n cursor: pointer;\\n}\\n\\n.styles-module__checkboxCheck___fUXpr {\\n color: #fafafa;\\n}\\n[data-agentation-theme=dark] .styles-module__checkboxCheck___fUXpr {\\n color: #1a1a1a;\\n}\\n\\n.styles-module__checkboxCheckPath___cDyh8 {\\n stroke-dasharray: 9.29px;\\n stroke-dashoffset: 9.29px;\\n color: #fafafa;\\n transition: stroke-dashoffset 0.1s ease;\\n}\\n[data-agentation-theme=dark] .styles-module__checkboxCheckPath___cDyh8 {\\n color: #1a1a1a;\\n}\\n.styles-module__checkboxContainer___joqZk:has(.styles-module__checkboxInput___ECzzO:checked) .styles-module__checkboxCheckPath___cDyh8 {\\n transition-duration: 0.2s;\\n stroke-dashoffset: 0;\\n}\";\nconst classNames = {\"checkboxContainer\":\"styles-module__checkboxContainer___joqZk\",\"checkboxInput\":\"styles-module__checkboxInput___ECzzO\",\"checkboxCheck\":\"styles-module__checkboxCheck___fUXpr\",\"checkboxCheckPath\":\"styles-module__checkboxCheckPath___cDyh8\"};\n\n// SSR-safe style injection (always update for HMR)\nif (typeof document !== 'undefined') {\n let style = document.getElementById('feedback-tool-styles-checkbox-styles');\n if (!style) {\n style = document.createElement('style');\n style.id = 'feedback-tool-styles-checkbox-styles';\n document.head.appendChild(style);\n }\n style.textContent = css;\n}\n\nexport default classNames;\n","import styles from \"./styles.module.scss\";\n\ninterface CheckboxProps extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nexport const Checkbox = ({ className = \"\", ...props }: CheckboxProps) => {\n return (\n <div className={`${styles.checkboxContainer} ${className}`}>\n <input className={styles.checkboxInput} type=\"checkbox\" {...props} />\n <svg\n className={styles.checkboxCheck}\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n >\n <path\n className={styles.checkboxCheckPath}\n d=\"M3.94 7L6.13 9.19L10.5 4.81\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n );\n};\n","\nconst css = \".styles-module__container___w8eAF {\\n display: flex;\\n align-items: center;\\n height: 24px;\\n}\\n\\n.styles-module__label___J5mxE {\\n padding-inline: 8px 2px;\\n line-height: 20px;\\n font-size: 13px;\\n letter-spacing: -0.15px;\\n color: rgba(26, 26, 26, 0.5);\\n cursor: pointer;\\n}\\n[data-agentation-theme=dark] .styles-module__label___J5mxE {\\n color: rgba(255, 255, 255, 0.5);\\n}\";\nconst classNames = {\"container\":\"styles-module__container___w8eAF\",\"label\":\"styles-module__label___J5mxE\"};\n\n// SSR-safe style injection (always update for HMR)\nif (typeof document !== 'undefined') {\n let style = document.getElementById('feedback-tool-styles-checkbox-field-styles');\n if (!style) {\n style = document.createElement('style');\n style.id = 'feedback-tool-styles-checkbox-field-styles';\n document.head.appendChild(style);\n }\n style.textContent = css;\n}\n\nexport default classNames;\n","\nconst css = \"@keyframes styles-module__cycleTextIn___VBNTi {\\n 0% {\\n opacity: 0;\\n transform: translateY(-6px);\\n }\\n 100% {\\n opacity: 1;\\n transform: translateY(0);\\n }\\n}\\n@keyframes styles-module__scaleIn___QpQ8E {\\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__mcpPulse___5Q3Jj {\\n 0% {\\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--agentation-color-green) 50%, transparent);\\n }\\n 70% {\\n box-shadow: 0 0 0 6px color-mix(in srgb, var(--agentation-color-green) 0%, transparent);\\n }\\n 100% {\\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--agentation-color-green) 0%, transparent);\\n }\\n}\\n@keyframes styles-module__mcpPulseError___VHxhx {\\n 0% {\\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--agentation-color-red) 50%, transparent);\\n }\\n 70% {\\n box-shadow: 0 0 0 6px color-mix(in srgb, var(--agentation-color-red) 0%, transparent);\\n }\\n 100% {\\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--agentation-color-red) 0%, transparent);\\n }\\n}\\n@keyframes styles-module__themeIconIn___qUWMV {\\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}\\n.styles-module__settingsPanel___qNkn- {\\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: 16px;\\n padding: 12px 0;\\n width: 100%;\\n max-width: 253px;\\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-color 0.25s ease, box-shadow 0.25s ease;\\n}\\n.styles-module__settingsPanel___qNkn-::before, .styles-module__settingsPanel___qNkn-::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___qNkn-::before {\\n left: 0;\\n background: linear-gradient(to right, #1c1c1c 0%, transparent 100%);\\n}\\n.styles-module__settingsPanel___qNkn-::after {\\n right: 0;\\n background: linear-gradient(to left, #1c1c1c 0%, transparent 100%);\\n}\\n.styles-module__settingsPanel___qNkn- .styles-module__settingsHeader___Fn1DP,\\n.styles-module__settingsPanel___qNkn- .styles-module__settingsBrand___OoKlM,\\n.styles-module__settingsPanel___qNkn- .styles-module__settingsBrandSlash___Q-AU9,\\n.styles-module__settingsPanel___qNkn- .styles-module__settingsVersion___rXmL9,\\n.styles-module__settingsPanel___qNkn- .styles-module__settingsSection___n5V-4,\\n.styles-module__settingsPanel___qNkn- .styles-module__settingsLabel___VCVOQ,\\n.styles-module__settingsPanel___qNkn- .styles-module__cycleButton___XMBx3,\\n.styles-module__settingsPanel___qNkn- .styles-module__cycleDot___zgSXY,\\n.styles-module__settingsPanel___qNkn- .styles-module__dropdownButton___mKHe8,\\n.styles-module__settingsPanel___qNkn- .styles-module__sliderLabel___6K5v1,\\n.styles-module__settingsPanel___qNkn- .styles-module__slider___v5z-c,\\n.styles-module__settingsPanel___qNkn- .styles-module__themeToggle___3imlT {\\n transition: background-color 0.25s ease, color 0.25s ease, border-color 0.25s ease;\\n}\\n.styles-module__settingsPanel___qNkn-.styles-module__enter___wginS {\\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___qNkn-.styles-module__exit___A4iJc {\\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[data-agentation-theme=dark] .styles-module__settingsPanel___qNkn- {\\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[data-agentation-theme=dark] .styles-module__settingsPanel___qNkn- .styles-module__settingsLabel___VCVOQ {\\n color: rgba(255, 255, 255, 0.6);\\n}\\n[data-agentation-theme=dark] .styles-module__settingsPanel___qNkn- .styles-module__settingsOption___JoyH- {\\n color: rgba(255, 255, 255, 0.85);\\n}\\n[data-agentation-theme=dark] .styles-module__settingsPanel___qNkn- .styles-module__settingsOption___JoyH-:hover {\\n background: rgba(255, 255, 255, 0.1);\\n}\\n[data-agentation-theme=dark] .styles-module__settingsPanel___qNkn- .styles-module__settingsOption___JoyH-.styles-module__selected___k1-Vq {\\n background: rgba(255, 255, 255, 0.15);\\n color: #fff;\\n}\\n\\n.styles-module__settingsPanelContainer___5it-H {\\n overflow: visible;\\n position: relative;\\n display: flex;\\n padding: 0 16px;\\n}\\n\\n.styles-module__settingsPage___BMn-3 {\\n min-width: 100%;\\n flex-shrink: 0;\\n transition: transform 0.2s ease, opacity 0.2s ease;\\n transition-delay: 0s;\\n opacity: 1;\\n}\\n\\n.styles-module__settingsPage___BMn-3.styles-module__slideLeft___qUvW4 {\\n transform: translateX(-24px);\\n opacity: 0;\\n pointer-events: none;\\n}\\n\\n.styles-module__automationsPage___N7By0 {\\n position: absolute;\\n top: 0;\\n left: 24px;\\n width: 100%;\\n height: 100%;\\n padding: 0 16px 4px;\\n box-sizing: border-box;\\n display: flex;\\n flex-direction: column;\\n transition: transform 0.2s ease, opacity 0.2s ease;\\n opacity: 0;\\n pointer-events: none;\\n}\\n\\n.styles-module__automationsPage___N7By0.styles-module__slideIn___uXDSu {\\n transform: translateX(-24px);\\n opacity: 1;\\n pointer-events: auto;\\n}\\n\\n.styles-module__settingsHeader___Fn1DP {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n height: 24px;\\n}\\n\\n.styles-module__settingsBrand___OoKlM {\\n font-size: 0.8125rem;\\n font-weight: 600;\\n letter-spacing: -0.0094em;\\n color: #fff;\\n text-decoration: none;\\n}\\n\\n.styles-module__settingsBrandSlash___Q-AU9 {\\n color: var(--agentation-color-accent);\\n transition: color 0.2s ease;\\n}\\n\\n.styles-module__settingsVersion___rXmL9 {\\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__themeToggle___3imlT {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 22px;\\n height: 22px;\\n margin-left: 8px;\\n border: none;\\n border-radius: 6px;\\n background: transparent;\\n color: rgba(255, 255, 255, 0.4);\\n transition: background-color 0.15s ease, color 0.15s ease;\\n cursor: pointer;\\n}\\n.styles-module__themeToggle___3imlT:hover {\\n background: rgba(255, 255, 255, 0.1);\\n color: rgba(255, 255, 255, 0.8);\\n}\\n[data-agentation-theme=light] .styles-module__themeToggle___3imlT {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n[data-agentation-theme=light] .styles-module__themeToggle___3imlT:hover {\\n background: rgba(0, 0, 0, 0.06);\\n color: rgba(0, 0, 0, 0.7);\\n}\\n\\n.styles-module__themeIconWrapper___pyaYa {\\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___w7lAm {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n animation: styles-module__themeIconIn___qUWMV 0.35s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;\\n}\\n\\n.styles-module__settingsSectionGrow___eZTRw {\\n flex: 1;\\n display: flex;\\n flex-direction: column;\\n}\\n\\n.styles-module__settingsRow___y-tDE {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n min-height: 24px;\\n}\\n.styles-module__settingsRow___y-tDE.styles-module__settingsRowMarginTop___uLpGb {\\n margin-top: 8px;\\n}\\n\\n.styles-module__settingsRowDisabled___ydl3Q .styles-module__settingsLabel___VCVOQ {\\n color: rgba(255, 255, 255, 0.2);\\n}\\n[data-agentation-theme=light] .styles-module__settingsRowDisabled___ydl3Q .styles-module__settingsLabel___VCVOQ {\\n color: rgba(0, 0, 0, 0.2);\\n}\\n\\n.styles-module__settingsLabel___VCVOQ {\\n display: flex;\\n align-items: center;\\n column-gap: 2px;\\n line-height: 20px;\\n font-size: 13px;\\n font-weight: 400;\\n letter-spacing: -0.15px;\\n color: rgba(255, 255, 255, 0.5);\\n}\\n[data-agentation-theme=light] .styles-module__settingsLabel___VCVOQ {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n\\n.styles-module__cycleButton___XMBx3 {\\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[data-agentation-theme=light] .styles-module__cycleButton___XMBx3 {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n.styles-module__cycleButton___XMBx3:disabled {\\n opacity: 0.35;\\n cursor: not-allowed;\\n}\\n\\n.styles-module__cycleButtonText___mbbnD {\\n display: inline-block;\\n animation: styles-module__cycleTextIn___VBNTi 0.2s ease-out;\\n}\\n\\n.styles-module__cycleDots___ehp6i {\\n display: flex;\\n flex-direction: column;\\n gap: 2px;\\n}\\n\\n.styles-module__cycleDot___zgSXY {\\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___zgSXY.styles-module__active___dpAhM {\\n background: #fff;\\n transform: scale(1);\\n}\\n[data-agentation-theme=light] .styles-module__cycleDot___zgSXY {\\n background: rgba(0, 0, 0, 0.2);\\n}\\n[data-agentation-theme=light] .styles-module__cycleDot___zgSXY.styles-module__active___dpAhM {\\n background: rgba(0, 0, 0, 0.7);\\n}\\n\\n.styles-module__colorOptions___pbxZx {\\n display: flex;\\n justify-content: space-between;\\n align-items: center;\\n margin-top: 6px;\\n height: 26px;\\n}\\n\\n.styles-module__colorOption___Co955 {\\n position: relative;\\n border-radius: 50%;\\n width: 20px;\\n height: 20px;\\n background-color: #fff;\\n cursor: pointer;\\n}\\n[data-agentation-theme=dark] .styles-module__colorOption___Co955 {\\n background-color: #1a1a1a;\\n}\\n.styles-module__colorOption___Co955::before, .styles-module__colorOption___Co955::after {\\n content: \\\"\\\";\\n position: absolute;\\n inset: 0;\\n border-radius: 50%;\\n background-color: var(--swatch);\\n transition: opacity 0.2s, transform 0.2s;\\n}\\n@supports (color: color(display-p3 0 0 0)) {\\n .styles-module__colorOption___Co955::before, .styles-module__colorOption___Co955::after {\\n --color: var(--swatch-p3);\\n }\\n}\\n.styles-module__colorOption___Co955::after {\\n z-index: -1;\\n transform: scale(1.2);\\n opacity: 0;\\n}\\n.styles-module__colorOption___Co955.styles-module__selected___k1-Vq::before {\\n transform: scale(0.8);\\n}\\n.styles-module__colorOption___Co955.styles-module__selected___k1-Vq::after {\\n opacity: 1;\\n}\\n\\n.styles-module__settingsNavLink___uYIwM {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n width: 100%;\\n height: 24px;\\n padding: 0;\\n border: none;\\n background: transparent;\\n font-family: inherit;\\n line-height: 20px;\\n font-size: 13px;\\n font-weight: 400;\\n color: rgba(255, 255, 255, 0.5);\\n transition: color 0.15s ease;\\n cursor: pointer;\\n}\\n.styles-module__settingsNavLink___uYIwM:hover {\\n color: rgba(255, 255, 255, 0.9);\\n}\\n.styles-module__settingsNavLink___uYIwM svg {\\n color: rgba(255, 255, 255, 0.4);\\n transition: color 0.15s ease;\\n}\\n.styles-module__settingsNavLink___uYIwM:hover svg {\\n color: #fff;\\n}\\n[data-agentation-theme=light] .styles-module__settingsNavLink___uYIwM {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n[data-agentation-theme=light] .styles-module__settingsNavLink___uYIwM:hover {\\n color: rgba(0, 0, 0, 0.8);\\n}\\n[data-agentation-theme=light] .styles-module__settingsNavLink___uYIwM svg {\\n color: rgba(0, 0, 0, 0.25);\\n}\\n[data-agentation-theme=light] .styles-module__settingsNavLink___uYIwM:hover svg {\\n color: rgba(0, 0, 0, 0.8);\\n}\\n\\n.styles-module__settingsNavLinkRight___XBUzC {\\n display: flex;\\n align-items: center;\\n gap: 6px;\\n}\\n\\n.styles-module__settingsBackButton___fflll {\\n display: flex;\\n align-items: center;\\n gap: 4px;\\n height: 24px;\\n background: transparent;\\n font-family: inherit;\\n line-height: 20px;\\n font-size: 13px;\\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___fflll 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___fflll:hover svg {\\n opacity: 1;\\n}\\n[data-agentation-theme=light] .styles-module__settingsBackButton___fflll {\\n color: rgba(0, 0, 0, 0.85);\\n border-bottom-color: rgba(0, 0, 0, 0.08);\\n}\\n\\n.styles-module__automationHeader___Avra9 {\\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[data-agentation-theme=light] .styles-module__automationHeader___Avra9 {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n\\n.styles-module__automationDescription___vFTmJ {\\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[data-agentation-theme=light] .styles-module__automationDescription___vFTmJ {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n\\n.styles-module__learnMoreLink___cG7OI {\\n color: rgba(255, 255, 255, 0.8);\\n text-decoration-line: underline;\\n text-decoration-style: 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___cG7OI:hover {\\n color: #fff;\\n}\\n[data-agentation-theme=light] .styles-module__learnMoreLink___cG7OI {\\n color: rgba(0, 0, 0, 0.6);\\n text-decoration-color: rgba(0, 0, 0, 0.2);\\n}\\n[data-agentation-theme=light] .styles-module__learnMoreLink___cG7OI:hover {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n\\n.styles-module__autoSendContainer___VpkXk {\\n display: flex;\\n align-items: center;\\n}\\n\\n.styles-module__autoSendLabel___ngNdC {\\n padding-inline-end: 8px;\\n font-size: 11px;\\n font-weight: 400;\\n color: rgba(255, 255, 255, 0.4);\\n transition: color 0.15s, opacity 0.15s;\\n cursor: pointer;\\n}\\n.styles-module__autoSendLabel___ngNdC.styles-module__active___dpAhM {\\n color: #66b8ff;\\n color: color(display-p3 0.4 0.72 1);\\n}\\n[data-agentation-theme=light] .styles-module__autoSendLabel___ngNdC {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n[data-agentation-theme=light] .styles-module__autoSendLabel___ngNdC.styles-module__active___dpAhM {\\n color: var(--agentation-color-blue);\\n}\\n.styles-module__autoSendLabel___ngNdC.styles-module__disabled___9AZYS {\\n opacity: 0.3;\\n cursor: not-allowed;\\n}\\n\\n.styles-module__mcpStatusDot___8AMxP {\\n width: 8px;\\n height: 8px;\\n border-radius: 50%;\\n flex-shrink: 0;\\n}\\n.styles-module__mcpStatusDot___8AMxP.styles-module__connecting___QEO1r {\\n background-color: var(--agentation-color-yellow);\\n animation: styles-module__mcpPulse___5Q3Jj 1.5s infinite;\\n}\\n.styles-module__mcpStatusDot___8AMxP.styles-module__connected___WyFkx {\\n background-color: var(--agentation-color-green);\\n animation: styles-module__mcpPulse___5Q3Jj 2.5s ease-in-out infinite;\\n}\\n.styles-module__mcpStatusDot___8AMxP.styles-module__disconnected___mvmvQ {\\n background-color: var(--agentation-color-red);\\n animation: styles-module__mcpPulseError___VHxhx 2s infinite;\\n}\\n\\n.styles-module__mcpNavIndicator___auBHI {\\n width: 8px;\\n height: 8px;\\n border-radius: 50%;\\n flex-shrink: 0;\\n}\\n.styles-module__mcpNavIndicator___auBHI.styles-module__connected___WyFkx {\\n background-color: var(--agentation-color-green);\\n animation: styles-module__mcpPulse___5Q3Jj 2.5s ease-in-out infinite;\\n}\\n.styles-module__mcpNavIndicator___auBHI.styles-module__connecting___QEO1r {\\n background-color: var(--agentation-color-yellow);\\n animation: styles-module__mcpPulse___5Q3Jj 1.5s ease-in-out infinite;\\n}\\n\\n.styles-module__webhookUrlInput___WDDDC {\\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 user-select: text;\\n transition: border-color 0.15s ease, background-color 0.15s ease, box-shadow 0.15s ease;\\n}\\n.styles-module__webhookUrlInput___WDDDC::placeholder {\\n color: rgba(255, 255, 255, 0.3);\\n}\\n.styles-module__webhookUrlInput___WDDDC:focus {\\n border-color: rgba(255, 255, 255, 0.3);\\n background: rgba(255, 255, 255, 0.08);\\n}\\n[data-agentation-theme=light] .styles-module__webhookUrlInput___WDDDC {\\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[data-agentation-theme=light] .styles-module__webhookUrlInput___WDDDC::placeholder {\\n color: rgba(0, 0, 0, 0.3);\\n}\\n[data-agentation-theme=light] .styles-module__webhookUrlInput___WDDDC:focus {\\n border-color: rgba(0, 0, 0, 0.25);\\n background: rgba(0, 0, 0, 0.05);\\n}\\n\\n[data-agentation-theme=light] .styles-module__settingsPanel___qNkn- {\\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[data-agentation-theme=light] .styles-module__settingsPanel___qNkn-::before {\\n background: linear-gradient(to right, #fff 0%, transparent 100%);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___qNkn-::after {\\n background: linear-gradient(to left, #fff 0%, transparent 100%);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___qNkn- .styles-module__settingsHeader___Fn1DP {\\n border-bottom-color: rgba(0, 0, 0, 0.08);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___qNkn- .styles-module__settingsBrand___OoKlM {\\n color: #E5484D;\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___qNkn- .styles-module__settingsVersion___rXmL9 {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___qNkn- .styles-module__settingsSection___n5V-4 {\\n border-top-color: rgba(0, 0, 0, 0.08);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___qNkn- .styles-module__settingsLabel___VCVOQ {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___qNkn- .styles-module__cycleButton___XMBx3 {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___qNkn- .styles-module__cycleDot___zgSXY {\\n background: rgba(0, 0, 0, 0.2);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___qNkn- .styles-module__cycleDot___zgSXY.styles-module__active___dpAhM {\\n background: rgba(0, 0, 0, 0.7);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___qNkn- .styles-module__dropdownButton___mKHe8 {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n[data-agentation-theme=light] .styles-module__settingsPanel___qNkn- .styles-module__dropdownButton___mKHe8:hover {\\n background: rgba(0, 0, 0, 0.05);\\n}\\n\\n.styles-module__checkboxField___ZrSqv:not(:first-child) {\\n margin-top: 8px;\\n}\\n\\n.styles-module__divider___h6Yux {\\n margin-block: 8px;\\n width: 100%;\\n height: 1px;\\n background-color: rgba(26, 26, 26, 0.07);\\n}\\n[data-agentation-theme=dark] .styles-module__divider___h6Yux {\\n background-color: rgba(255, 255, 255, 0.07);\\n}\";\nconst classNames = {\"settingsPanel\":\"styles-module__settingsPanel___qNkn-\",\"settingsHeader\":\"styles-module__settingsHeader___Fn1DP\",\"settingsBrand\":\"styles-module__settingsBrand___OoKlM\",\"settingsBrandSlash\":\"styles-module__settingsBrandSlash___Q-AU9\",\"settingsVersion\":\"styles-module__settingsVersion___rXmL9\",\"settingsSection\":\"styles-module__settingsSection___n5V-4\",\"settingsLabel\":\"styles-module__settingsLabel___VCVOQ\",\"cycleButton\":\"styles-module__cycleButton___XMBx3\",\"cycleDot\":\"styles-module__cycleDot___zgSXY\",\"dropdownButton\":\"styles-module__dropdownButton___mKHe8\",\"sliderLabel\":\"styles-module__sliderLabel___6K5v1\",\"slider\":\"styles-module__slider___v5z-c\",\"themeToggle\":\"styles-module__themeToggle___3imlT\",\"enter\":\"styles-module__enter___wginS\",\"exit\":\"styles-module__exit___A4iJc\",\"settingsOption\":\"styles-module__settingsOption___JoyH-\",\"selected\":\"styles-module__selected___k1-Vq\",\"settingsPanelContainer\":\"styles-module__settingsPanelContainer___5it-H\",\"settingsPage\":\"styles-module__settingsPage___BMn-3\",\"slideLeft\":\"styles-module__slideLeft___qUvW4\",\"automationsPage\":\"styles-module__automationsPage___N7By0\",\"slideIn\":\"styles-module__slideIn___uXDSu\",\"themeIconWrapper\":\"styles-module__themeIconWrapper___pyaYa\",\"themeIcon\":\"styles-module__themeIcon___w7lAm\",\"themeIconIn\":\"styles-module__themeIconIn___qUWMV\",\"settingsSectionGrow\":\"styles-module__settingsSectionGrow___eZTRw\",\"settingsRow\":\"styles-module__settingsRow___y-tDE\",\"settingsRowMarginTop\":\"styles-module__settingsRowMarginTop___uLpGb\",\"settingsRowDisabled\":\"styles-module__settingsRowDisabled___ydl3Q\",\"cycleButtonText\":\"styles-module__cycleButtonText___mbbnD\",\"cycleTextIn\":\"styles-module__cycleTextIn___VBNTi\",\"cycleDots\":\"styles-module__cycleDots___ehp6i\",\"active\":\"styles-module__active___dpAhM\",\"colorOptions\":\"styles-module__colorOptions___pbxZx\",\"colorOption\":\"styles-module__colorOption___Co955\",\"settingsNavLink\":\"styles-module__settingsNavLink___uYIwM\",\"settingsNavLinkRight\":\"styles-module__settingsNavLinkRight___XBUzC\",\"settingsBackButton\":\"styles-module__settingsBackButton___fflll\",\"automationHeader\":\"styles-module__automationHeader___Avra9\",\"automationDescription\":\"styles-module__automationDescription___vFTmJ\",\"learnMoreLink\":\"styles-module__learnMoreLink___cG7OI\",\"autoSendContainer\":\"styles-module__autoSendContainer___VpkXk\",\"autoSendLabel\":\"styles-module__autoSendLabel___ngNdC\",\"disabled\":\"styles-module__disabled___9AZYS\",\"mcpStatusDot\":\"styles-module__mcpStatusDot___8AMxP\",\"connecting\":\"styles-module__connecting___QEO1r\",\"mcpPulse\":\"styles-module__mcpPulse___5Q3Jj\",\"connected\":\"styles-module__connected___WyFkx\",\"disconnected\":\"styles-module__disconnected___mvmvQ\",\"mcpPulseError\":\"styles-module__mcpPulseError___VHxhx\",\"mcpNavIndicator\":\"styles-module__mcpNavIndicator___auBHI\",\"webhookUrlInput\":\"styles-module__webhookUrlInput___WDDDC\",\"checkboxField\":\"styles-module__checkboxField___ZrSqv\",\"divider\":\"styles-module__divider___h6Yux\",\"scaleIn\":\"styles-module__scaleIn___QpQ8E\"};\n\n// SSR-safe style injection (always update for HMR)\nif (typeof document !== 'undefined') {\n let style = document.getElementById('feedback-tool-styles-settings-panel-styles');\n if (!style) {\n style = document.createElement('style');\n style.id = 'feedback-tool-styles-settings-panel-styles';\n document.head.appendChild(style);\n }\n style.textContent = css;\n}\n\nexport default classNames;\n","import { COLOR_OPTIONS, ToolbarSettings } from \"..\";\nimport { OUTPUT_DETAIL_OPTIONS } from \"../../../utils/generate-output\";\nimport { HelpTooltip } from \"../../help-tooltip\";\nimport { IconChevronLeft, IconMoon, IconSun } from \"../../icons\";\nimport { Switch } from \"../../switch\";\nimport { CheckboxField } from \"./checkbox-field\";\nimport styles from \"./styles.module.scss\";\n\ntype ConnectionStatus = \"disconnected\" | \"connecting\" | \"connected\";\n\nexport type SettingsPanelProps = {\n settings: ToolbarSettings;\n onSettingsChange: (patch: Partial<ToolbarSettings>) => void;\n\n isDarkMode: boolean;\n onToggleTheme: () => void;\n\n isDevMode: boolean;\n\n connectionStatus: ConnectionStatus;\n endpoint?: string;\n\n /** Whether the panel is mounted (controls enter/exit class) */\n isVisible: boolean;\n\n /** Position override: show panel above toolbar when toolbar is near bottom */\n toolbarNearBottom: boolean;\n\n settingsPage: \"main\" | \"automations\";\n onSettingsPageChange: (page: \"main\" | \"automations\") => void;\n\n onHideToolbar: () => void;\n};\n\nexport function SettingsPanel({\n settings,\n onSettingsChange,\n isDarkMode,\n onToggleTheme,\n isDevMode,\n connectionStatus,\n endpoint,\n isVisible,\n toolbarNearBottom,\n settingsPage,\n onSettingsPageChange,\n onHideToolbar,\n}: SettingsPanelProps) {\n return (\n <div\n className={`${styles.settingsPanel} ${isVisible ? styles.enter : styles.exit}`}\n style={\n toolbarNearBottom\n ? { bottom: \"auto\", top: \"calc(100% + 0.5rem)\" }\n : undefined\n }\n data-agentation-settings-panel\n >\n <div className={styles.settingsPanelContainer}>\n {/* ── Main page ── */}\n <div\n className={`${styles.settingsPage} ${settingsPage === \"automations\" ? styles.slideLeft : \"\"}`}\n >\n <div className={styles.settingsHeader}>\n <a className={styles.settingsBrand} href=\"https://agentation.com\" target=\"_blank\" rel=\"noopener noreferrer\">\n <svg width=\"72\" height=\"16\" viewBox=\"0 0 676 151\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M79.6666 100.561L104.863 15.5213C107.828 4.03448 99.1201 -3.00582 88.7449 1.25541L3.52015 39.6065C1.48217 40.5329 0 42.7562 0 45.1647C0 48.6848 2.77907 51.4639 6.29922 51.4639C7.22558 51.4639 8.15193 51.2786 9.07829 50.9081L93.7472 12.7422C97.2674 11.0748 93.7472 8.29572 92.6356 12.1864L67.624 97.2259C66.5123 100.931 69.4767 105.193 73.7379 105.193C76.517 105.193 79.1108 103.155 79.6666 100.561ZM663.641 100.005C665.679 107.231 677.537 104.081 675.499 96.8553L666.05 66.2856C663.456 57.7631 655.489 55.7251 648.82 61.098L618.991 86.6654C617.324 87.9623 621.029 89.815 621.214 88.1476L625.846 61.6538C626.958 55.3546 624.179 50.5375 615.841 50.5375L579.158 51.0934C576.008 51.0934 578.417 53.8724 578.417 57.022C578.417 60.1716 580.825 61.6538 583.975 61.6538L616.212 60.9127C616.397 60.9127 614.544 59.6158 614.544 59.8011L609.727 88.7034C607.875 99.6344 617.694 102.784 626.031 95.7437L655.86 70.1763L654.192 69.6205L663.641 100.005ZM571.191 89.0739C555.443 88.7034 562.298 61.4685 578.787 61.8391C594.72 62.0243 587.124 89.2592 571.191 89.0739ZM571.006 100.375C601.575 100.931 611.024 51.6492 579.158 51.0934C547.847 50.5375 540.065 99.8197 571.006 100.375ZM521.909 46.4616C525.985 46.4616 529.505 42.9414 529.505 38.6802C529.505 34.4189 525.985 31.0841 521.909 31.0841C517.833 31.0841 514.127 34.6042 514.127 38.6802C514.127 42.7562 517.648 46.4616 521.909 46.4616ZM472.256 103.525C493.192 103.71 515.98 73.3259 519.13 62.3949L509.866 60.9127C505.234 73.3259 497.638 101.672 519.871 102.043C536.545 102.228 552.479 85.3685 563.595 70.1763C564.151 69.2499 564.706 68.1383 564.706 66.8414C564.706 63.6918 563.965 61.098 560.816 61.098C558.963 61.098 557.296 62.0243 556.184 63.5065C546.365 77.0313 530.802 90.9266 522.094 90.7414C511.904 90.5561 517.462 71.4732 519.871 64.9887C523.391 55.7251 512.831 53.5019 509.681 60.9127C506.531 68.6941 488.19 92.4088 475.035 92.2235C467.439 92.0383 464.29 83.8863 472.441 59.9864L486.707 17.7445C487.634 14.4097 485.41 10.519 481.334 10.519C478.741 10.519 476.517 12.1864 475.962 14.4097L461.696 56.4662C451.506 86.4801 455.211 103.155 472.256 103.525ZM447.43 42.5709L496.527 41.4593C499.306 41.4593 501.529 39.0507 501.529 36.2717C501.529 33.3073 499.306 31.0841 496.341 31.0841L447.245 32.1957C444.466 32.1957 442.242 34.4189 442.242 37.3833C442.242 40.1624 444.466 42.5709 447.43 42.5709ZM422.974 106.304C435.387 106.489 457.249 94.8173 472.441 53.8724C473.553 50.7228 472.071 48.3143 468.365 48.3143C466.142 48.3143 464.29 49.6112 463.548 51.6492C450.394 87.2212 431.682 96.1142 424.456 95.929C419.454 95.929 417.972 93.3352 418.713 85.5538C419.454 78.1429 410.376 74.9933 406.114 81.1073C401.297 87.777 394.442 94.2615 385.549 94.0763C370.172 93.891 376.471 67.0267 399.815 67.3972C408.338 67.5825 414.452 71.4732 417.045 76.6608C417.786 78.3282 419.454 79.6251 421.492 79.6251C424.271 79.6251 426.679 77.2166 426.679 74.4375C426.679 73.6964 426.494 72.9553 426.124 72.2143C421.862 63.6918 412.414 57.3926 400 57.2073C363.502 56.6515 353.497 104.451 383.326 104.822C397.036 105.193 410.005 94.0763 413.34 85.9243C412.599 86.8507 408.338 86.6654 408.523 84.4422C407.411 97.4111 410.931 106.119 422.974 106.304ZM335.897 104.266C335.897 115.012 347.569 117.606 347.569 103.34C347.569 89.0739 358.5 54.4282 361.464 45.1647L396.666 43.6825C405.929 43.1267 404.262 33.1221 397.036 33.3073L364.984 34.4189L368.875 22.7469C369.801 20.1531 370.542 17.9298 370.542 16.2624C370.542 13.4833 368.504 11.8159 365.911 11.8159C362.946 11.8159 360.352 12.7422 357.573 21.0794L352.942 35.16L330.153 36.0864C326.263 36.4569 323.483 38.1244 323.483 41.6445C323.483 45.5352 326.448 47.0174 330.709 46.8321L349.421 45.9058C345.901 56.6515 335.897 90.7414 335.897 104.266ZM186.939 78.6988C193.979 56.4662 212.877 54.984 212.877 62.9507C212.877 68.3236 203.984 77.0313 186.939 78.6988ZM113.942 150.955C142.844 152.437 159.704 111.492 160.63 80.5515C161.556 73.3259 153.96 70.3616 148.773 75.7344C141.918 83.1453 129.505 93.1499 119.685 93.1499C103.011 93.1499 116.165 59.8011 143.956 59.8011C149.514 59.8011 153.59 61.6538 156.184 64.0623C160.815 68.3236 170.82 62.0243 165.818 56.0957C161.927 51.4639 155.072 48.129 144.882 48.129C102.455 48.129 83.7426 105.007 116.721 105.007C134.692 105.007 151.367 88.3329 155.257 82.7747C154.516 83.5158 149.329 81.2925 149.699 79.4398L149.143 83.5158C148.958 107.045 134.322 141.506 116.536 139.838C113.386 139.468 112.089 137.43 112.089 134.836C112.089 128.907 122.094 119.273 145.067 113.53C159.518 109.824 152.293 101.487 143.4 104.081C111.163 113.53 99.6759 127.425 99.6759 137.8C99.6759 145.026 105.605 150.584 113.942 150.955ZM194.72 109.454C214.359 109.454 239 95.3732 251.228 77.9577C250.301 82.96 246.596 96.8553 246.596 101.487C246.596 110.01 254.748 109.454 261.232 102.784L288.097 75.5491L290.32 85.7391C293.284 99.4491 299.213 104.822 308.847 104.822C326.263 104.822 342.196 85.7391 349.421 74.8081L344.049 63.6918C339.787 74.8081 321.631 92.5941 311.626 92.5941C306.994 92.5941 304.771 89.815 303.289 83.7011L300.325 71.2879C297.916 60.7275 289.023 58.3189 279.018 68.1383L261.788 84.8127L264.382 69.991C266.235 59.2453 255.674 58.1337 250.116 65.915C241.779 77.0313 216.767 97.7817 196.387 97.7817C187.865 97.7817 185.456 93.7057 185.456 88.3329C230.848 84.998 239.185 47.2027 208.986 47.2027C172.858 47.2027 157.11 109.454 194.72 109.454Z\" fill=\"currentColor\"/>\n </svg>\n </a>\n <p className={styles.settingsVersion}>v{__VERSION__}</p>\n <button\n className={styles.themeToggle}\n onClick={onToggleTheme}\n title={\n isDarkMode ? \"Switch to light mode\" : \"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 ? <IconSun size={20} /> : <IconMoon size={20} />}\n </span>\n </span>\n </button>\n </div>\n\n <div className={styles.divider}></div>\n\n {/* Output detail + React toggle */}\n <div className={styles.settingsSection}>\n <div className={styles.settingsRow}>\n <div className={styles.settingsLabel}>\n Output Detail\n <HelpTooltip content=\"Controls how much detail is included in the copied output\" />\n </div>\n <button\n className={styles.cycleButton}\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 onSettingsChange({\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) => (\n <span\n key={option.value}\n className={`${styles.cycleDot} ${settings.outputDetail === option.value ? styles.active : \"\"}`}\n />\n ))}\n </span>\n </button>\n </div>\n\n <div\n className={`${styles.settingsRow} ${styles.settingsRowMarginTop} ${!isDevMode ? styles.settingsRowDisabled : \"\"}`}\n >\n <div className={styles.settingsLabel}>\n React Components\n <HelpTooltip\n content={\n !isDevMode\n ? \"Disabled — production builds minify component names, making detection unreliable. Use in development mode.\"\n : \"Include React component names in annotations\"\n }\n />\n </div>\n <Switch\n checked={isDevMode && settings.reactEnabled}\n onChange={(e) =>\n onSettingsChange({ reactEnabled: e.target.checked })\n }\n disabled={!isDevMode}\n />\n </div>\n\n <div\n className={`${styles.settingsRow} ${styles.settingsRowMarginTop}`}\n >\n <div className={styles.settingsLabel}>\n Hide Until Restart\n <HelpTooltip content=\"Hides the toolbar until you open a new tab\" />\n </div>\n <Switch\n checked={false}\n onChange={(e) => {\n if (e.target.checked) onHideToolbar();\n }}\n />\n </div>\n </div>\n\n <div className={styles.divider}></div>\n\n {/* Color picker */}\n <div className={styles.settingsSection}>\n <div\n className={`${styles.settingsLabel} ${styles.settingsLabelMarker}`}\n >\n Marker Color\n </div>\n <div className={styles.colorOptions}>\n {COLOR_OPTIONS.map((color) => (\n <button\n className={`${styles.colorOption} ${settings.annotationColorId === color.id ? styles.selected : \"\"}`}\n style={\n {\n \"--swatch\": color.srgb,\n \"--swatch-p3\": color.p3,\n } as React.CSSProperties\n }\n onClick={() =>\n onSettingsChange({ annotationColorId: color.id })\n }\n title={color.label}\n type=\"button\"\n key={color.id}\n ></button>\n ))}\n </div>\n </div>\n\n <div className={styles.divider}></div>\n\n {/* Checkboxes */}\n <div className={styles.settingsSection}>\n <CheckboxField\n className=\"checkbox-field\"\n label=\"Clear on copy/send\"\n checked={settings.autoClearAfterCopy}\n onChange={(e) =>\n onSettingsChange({ autoClearAfterCopy: e.target.checked })\n }\n tooltip=\"Automatically clear annotations after copying\"\n />\n <CheckboxField\n className={styles.checkboxField}\n label=\"Block page interactions\"\n checked={settings.blockInteractions}\n onChange={(e) =>\n onSettingsChange({ blockInteractions: e.target.checked })\n }\n />\n </div>\n\n <div className={styles.divider} />\n\n {/* Nav to automations */}\n <button\n className={styles.settingsNavLink}\n onClick={() => onSettingsPageChange(\"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\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M7.5 12.5L12 8L7.5 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n </button>\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}\n onClick={() => onSettingsPageChange(\"main\")}\n >\n <IconChevronLeft size={16} />\n <span>Manage MCP & Webhooks</span>\n </button>\n\n <div className={styles.divider}></div>\n\n {/* MCP section */}\n <div className={styles.settingsSection}>\n <div className={styles.settingsRow}>\n <span className={styles.automationHeader}>\n MCP Connection\n <HelpTooltip content=\"Connect via Model Context Protocol to let AI agents like Claude Code receive annotations in real-time.\" />\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}\n style={{ paddingBottom: 6 }}\n >\n MCP connection allows agents to receive and act on annotations.{\" \"}\n <a\n href=\"https://agentation.dev/mcp\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={styles.learnMoreLink}\n >\n Learn more\n </a>\n </p>\n </div>\n\n <div className={styles.divider}></div>\n\n {/* Webhooks section */}\n <div\n className={`${styles.settingsSection} ${styles.settingsSectionGrow}`}\n >\n <div className={styles.settingsRow}>\n <span className={styles.automationHeader}>\n Webhooks\n <HelpTooltip content=\"Send annotation data to any URL endpoint when annotations change. Useful for custom integrations.\" />\n </span>\n <div className={styles.autoSendContainer}>\n <label\n htmlFor=\"agentation-auto-send\"\n className={`${styles.autoSendLabel} ${settings.webhooksEnabled ? styles.active : \"\"} ${!settings.webhookUrl ? styles.disabled : \"\"}`}\n >\n Auto-Send\n </label>\n <Switch\n id=\"agentation-auto-send\"\n checked={settings.webhooksEnabled}\n onChange={(e) =>\n onSettingsChange({\n webhooksEnabled: e.target.checked,\n })\n }\n disabled={!settings.webhookUrl}\n />\n </div>\n </div>\n <p className={styles.automationDescription}>\n The webhook URL will receive live annotation changes and\n annotation data.\n </p>\n <textarea\n className={styles.webhookUrlInput}\n placeholder=\"Webhook URL\"\n value={settings.webhookUrl}\n onKeyDown={(e) => e.stopPropagation()}\n onChange={(e) => onSettingsChange({ webhookUrl: e.target.value })}\n />\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["useState","useCallback","useEffect","useRef","createPortal","css","classNames","jsx","jsxs","AnnotationPopupCSS","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","css","classNames","styles_module_default","jsx","styles_module_default","useState","useCallback","useEffect","useRef","jsx","jsxs","_","css","classNames","styles_module_default","Fragment","jsx","jsxs","useState","useRef","useEffect","useCallback","styles_module_default","scrollY","id","useEffect","useRef","useState","Fragment","jsx","jsxs","styles_module_default","useState","useRef","useEffect","Tooltip","useState","useCallback","useEffect","useRef","Fragment","jsx","jsxs","MIN_SIZE","SNAP_THRESHOLD","s","SKIP_TAGS","useRef","useState","useEffect","useCallback","styles_module_default","id","exiting","prev","SKIP_TAGS","s","s","result","getFiberFromElement","css","classNames","styles_module_default","css","classNames","styles_module_default","jsx","jsxs","styles_module_default","css","classNames","styles_module_default","jsx","jsxs","styles_module_default","css","classNames","styles_module_default","jsx","jsxs","styles_module_default","css","classNames","styles_module_default","jsx","jsxs","styles_module_default","css","classNames","styles_module_default","jsx","jsxs","styles_module_default","Fragment","jsx","jsxs","useState","useRef","useEffect","styles_module_default","annotations","s","useCallback","elementUnder","rect","name","path","reactComponents","left","top","deleteAnnotation","updateAnnotation","scrollY","DRAG_THRESHOLD","createPortal","bb"]}
|