agentation 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/components/page-toolbar-css/index.tsx","../src/components/annotation-popup-css/index.tsx","../src/components/annotation-popup-css/styles.module.scss","../src/components/icons.tsx","../src/utils/element-identification.ts","../src/utils/storage.ts","../src/components/page-toolbar-css/styles.module.scss","../src/components/annotation-popup/index.tsx","../src/components/annotation-popup/styles.module.scss"],"sourcesContent":["// =============================================================================\n// Agentation\n// =============================================================================\n//\n// A floating toolbar for annotating web pages and collecting structured feedback\n// for AI coding agents.\n//\n// Usage:\n// import { Agentation } from 'agentation';\n// <Agentation />\n//\n// =============================================================================\n\n// Main components\n// CSS-only version (default - zero runtime deps)\nexport { PageFeedbackToolbarCSS as Agentation } from \"./components/page-toolbar-css\";\nexport { PageFeedbackToolbarCSS as AgentationCSS } from \"./components/page-toolbar-css\"; // Deprecated: use Agentation\nexport { PageFeedbackToolbarCSS } from \"./components/page-toolbar-css\";\nexport type { DemoAnnotation } from \"./components/page-toolbar-css\";\n\n// Shared components (for building custom UIs)\nexport { AnnotationPopup, AnnotationPopupPresence } from \"./components/annotation-popup\";\nexport { AnnotationPopupCSS } from \"./components/annotation-popup-css\";\nexport type { AnnotationPopupProps, AnnotationPopupHandle } from \"./components/annotation-popup\";\nexport type { AnnotationPopupCSSProps, AnnotationPopupCSSHandle } from \"./components/annotation-popup-css\";\n\n// Icons (same for both versions - they're pure SVG)\nexport * from \"./components/icons\";\n\n// Utilities (for building custom UIs)\nexport {\n identifyElement,\n identifyAnimationElement,\n getElementPath,\n getNearbyText,\n getElementClasses,\n} from \"./utils/element-identification\";\n\nexport {\n loadAnnotations,\n saveAnnotations,\n getStorageKey,\n} from \"./utils/storage\";\n\n// Types\nexport type { Annotation } from \"./types\";\n","\"use client\";\n\nimport { useState, useCallback, useEffect, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport {\n AnnotationPopupCSS,\n AnnotationPopupCSSHandle,\n} from \"../annotation-popup-css\";\nimport {\n IconListSparkle,\n IconPlayAlt,\n IconPauseAlt,\n IconClose,\n IconPlus,\n IconGear,\n IconCheck,\n IconCheckSmall,\n IconCheckSmallAnimated,\n IconHelp,\n AnimatedBunny,\n IconEye,\n IconEyeMinus,\n IconCopyAlt,\n IconCopyAnimated,\n IconTrashAlt,\n IconXmark,\n IconCheckmark,\n IconCheckmarkLarge,\n IconCheckmarkCircle,\n IconPause,\n IconEyeAnimated,\n IconPausePlayAnimated,\n IconSun,\n IconMoon,\n IconXmarkLarge,\n} from \"../icons\";\nimport {\n identifyElement,\n getNearbyText,\n getElementClasses,\n getDetailedComputedStyles,\n getFullElementPath,\n getAccessibilityInfo,\n getNearbyElements,\n} from \"../../utils/element-identification\";\nimport {\n loadAnnotations,\n saveAnnotations,\n getStorageKey,\n} from \"../../utils/storage\";\n\nimport type { Annotation } from \"../../types\";\nimport styles from \"./styles.module.scss\";\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 elementPath: string;\n rect: DOMRect | null;\n};\n\ntype OutputDetailLevel = \"compact\" | \"standard\" | \"detailed\" | \"forensic\";\n\ntype ToolbarSettings = {\n outputDetail: OutputDetailLevel;\n autoClearAfterCopy: boolean;\n annotationColor: string;\n blockInteractions: boolean;\n};\n\nconst DEFAULT_SETTINGS: ToolbarSettings = {\n outputDetail: \"standard\",\n autoClearAfterCopy: false,\n annotationColor: \"#3c82f7\",\n blockInteractions: false,\n};\n\nconst OUTPUT_DETAIL_OPTIONS: { value: OutputDetailLevel; label: string }[] = [\n { value: \"compact\", label: \"Compact\" },\n { value: \"standard\", label: \"Standard\" },\n { value: \"detailed\", label: \"Detailed\" },\n { value: \"forensic\", label: \"Forensic\" },\n];\n\nconst COLOR_OPTIONS = [\n { value: \"#AF52DE\", label: \"Purple\" },\n { value: \"#3c82f7\", label: \"Blue\" },\n { value: \"#5AC8FA\", label: \"Cyan\" },\n { value: \"#34C759\", label: \"Green\" },\n { value: \"#FFD60A\", label: \"Yellow\" },\n { value: \"#FF9500\", label: \"Orange\" },\n { value: \"#FF3B30\", label: \"Red\" },\n];\n\n// =============================================================================\n// Utils\n// =============================================================================\n\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 getActiveButtonStyle(\n isActive: boolean,\n color: string,\n): React.CSSProperties | undefined {\n if (!isActive) return undefined;\n return {\n color: color,\n backgroundColor: hexToRgba(color, 0.25),\n };\n}\n\nfunction generateOutput(\n annotations: Annotation[],\n pathname: string,\n detailLevel: OutputDetailLevel = \"standard\",\n): string {\n if (annotations.length === 0) return \"\";\n\n const viewport =\n typeof window !== \"undefined\"\n ? `${window.innerWidth}×${window.innerHeight}`\n : \"unknown\";\n\n let output = `## Page Feedback: ${pathname}\\n`;\n\n if (detailLevel === \"forensic\") {\n // Full environment info for forensic mode\n output += `\\n**Environment:**\\n`;\n output += `- Viewport: ${viewport}\\n`;\n if (typeof window !== \"undefined\") {\n output += `- URL: ${window.location.href}\\n`;\n output += `- User Agent: ${navigator.userAgent}\\n`;\n output += `- Timestamp: ${new Date().toISOString()}\\n`;\n output += `- Device Pixel Ratio: ${window.devicePixelRatio}\\n`;\n }\n output += `\\n---\\n`;\n } else if (detailLevel !== \"compact\") {\n output += `**Viewport:** ${viewport}\\n`;\n }\n output += \"\\n\";\n\n annotations.forEach((a, i) => {\n if (detailLevel === \"compact\") {\n output += `${i + 1}. **${a.element}**: ${a.comment}`;\n if (a.selectedText) {\n output += ` (re: \"${a.selectedText.slice(0, 30)}${a.selectedText.length > 30 ? \"...\" : \"\"}\")`;\n }\n output += \"\\n\";\n } else if (detailLevel === \"forensic\") {\n // Forensic mode - order matches output page example\n output += `### ${i + 1}. ${a.element}\\n`;\n if (a.isMultiSelect && a.fullPath) {\n output += `*Forensic data shown for first element of selection*\\n`;\n }\n if (a.fullPath) {\n output += `**Full DOM Path:** ${a.fullPath}\\n`;\n }\n if (a.cssClasses) {\n output += `**CSS Classes:** ${a.cssClasses}\\n`;\n }\n if (a.boundingBox) {\n output += `**Position:** x:${Math.round(a.boundingBox.x)}, y:${Math.round(a.boundingBox.y)} (${Math.round(a.boundingBox.width)}×${Math.round(a.boundingBox.height)}px)\\n`;\n }\n output += `**Annotation at:** ${a.x.toFixed(1)}% from left, ${Math.round(a.y)}px from top\\n`;\n if (a.selectedText) {\n output += `**Selected text:** \"${a.selectedText}\"\\n`;\n }\n if (a.nearbyText && !a.selectedText) {\n output += `**Context:** ${a.nearbyText.slice(0, 100)}\\n`;\n }\n if (a.computedStyles) {\n output += `**Computed Styles:** ${a.computedStyles}\\n`;\n }\n if (a.accessibility) {\n output += `**Accessibility:** ${a.accessibility}\\n`;\n }\n if (a.nearbyElements) {\n output += `**Nearby Elements:** ${a.nearbyElements}\\n`;\n }\n 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 (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\ntype PageFeedbackToolbarCSSProps = {\n demoAnnotations?: DemoAnnotation[];\n demoDelay?: number;\n enableDemoMode?: boolean;\n};\n\n// =============================================================================\n// Component\n// =============================================================================\n\nexport function PageFeedbackToolbarCSS({\n demoAnnotations,\n demoDelay = 1000,\n enableDemoMode = false,\n}: PageFeedbackToolbarCSSProps = {}) {\n const [isActive, setIsActive] = useState(false);\n const [annotations, setAnnotations] = useState<Annotation[]>([]);\n const [showMarkers, setShowMarkers] = useState(true);\n\n // Unified marker visibility state - controls both toolbar and eye toggle\n const [markersVisible, setMarkersVisible] = useState(false);\n const [markersExiting, setMarkersExiting] = useState(false);\n const [hoverInfo, setHoverInfo] = useState<HoverInfo | null>(null);\n const [hoverPosition, setHoverPosition] = useState({ x: 0, y: 0 });\n const [pendingAnnotation, setPendingAnnotation] = useState<{\n x: number;\n y: number;\n clientY: number;\n element: string;\n elementPath: string;\n selectedText?: string;\n boundingBox?: { x: number; y: number; width: number; height: number };\n nearbyText?: string;\n cssClasses?: string;\n isMultiSelect?: boolean;\n isFixed?: boolean;\n fullPath?: string;\n accessibility?: string;\n computedStyles?: string;\n nearbyElements?: string;\n } | null>(null);\n const [copied, setCopied] = useState(false);\n const [cleared, setCleared] = useState(false);\n const [isClearing, setIsClearing] = useState(false);\n const [hoveredMarkerId, setHoveredMarkerId] = useState<string | null>(null);\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 [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 [settings, setSettings] = useState<ToolbarSettings>(DEFAULT_SETTINGS);\n const [isDarkMode, setIsDarkMode] = useState(true);\n const [showEntranceAnimation, setShowEntranceAnimation] = useState(false);\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 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 const timer = setTimeout(() => 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 = setTimeout(() => {\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 = setTimeout(() => {\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);\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 setTimeout(() => setShowEntranceAnimation(false), 750);\n }\n\n try {\n const storedSettings = localStorage.getItem(\"feedback-toolbar-settings\");\n if (storedSettings) {\n setSettings({ ...DEFAULT_SETTINGS, ...JSON.parse(storedSettings) });\n }\n } catch (e) {\n // Ignore parsing errors\n }\n\n // Load saved theme preference, default to dark mode\n try {\n const savedTheme = localStorage.getItem(\"feedback-toolbar-theme\");\n if (savedTheme !== null) {\n setIsDarkMode(savedTheme === \"dark\");\n }\n // If no saved preference, keep default (dark mode)\n } catch (e) {\n // Ignore localStorage errors\n }\n }, [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 // 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 setTimeout(() => {\n setIsActive(true);\n }, demoDelay - 200),\n );\n\n demoAnnotations.forEach((demo, index) => {\n const annotationDelay = demoDelay + index * 300;\n\n timeoutIds.push(\n setTimeout(() => {\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 = setTimeout(() => {\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\n useEffect(() => {\n if (mounted && annotations.length > 0) {\n saveAnnotations(pathname, annotations);\n } else if (mounted && annotations.length === 0) {\n localStorage.removeItem(getStorageKey(pathname));\n }\n }, [annotations, pathname, mounted]);\n\n // Freeze animations\n const freezeAnimations = useCallback(() => {\n if (isFrozen) return;\n\n const style = document.createElement(\"style\");\n style.id = \"feedback-freeze-styles\";\n style.textContent = `\n *:not([data-feedback-toolbar]):not([data-feedback-toolbar] *):not([data-annotation-popup]):not([data-annotation-popup] *):not([data-annotation-marker]):not([data-annotation-marker] *),\n *:not([data-feedback-toolbar]):not([data-feedback-toolbar] *):not([data-annotation-popup]):not([data-annotation-popup] *):not([data-annotation-marker]):not([data-annotation-marker] *)::before,\n *:not([data-feedback-toolbar]):not([data-feedback-toolbar] *):not([data-annotation-popup]):not([data-annotation-popup] *):not([data-annotation-marker]):not([data-annotation-marker] *)::after {\n animation-play-state: paused !important;\n transition: none !important;\n }\n `;\n document.head.appendChild(style);\n\n document.querySelectorAll(\"video\").forEach((video) => {\n if (!video.paused) {\n video.dataset.wasPaused = \"false\";\n video.pause();\n }\n });\n\n setIsFrozen(true);\n }, [isFrozen]);\n\n // Unfreeze animations\n const unfreezeAnimations = useCallback(() => {\n if (!isFrozen) return;\n\n const style = document.getElementById(\"feedback-freeze-styles\");\n if (style) style.remove();\n\n document.querySelectorAll(\"video\").forEach((video) => {\n if (video.dataset.wasPaused === \"false\") {\n video.play();\n delete video.dataset.wasPaused;\n }\n });\n\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 // Reset state when deactivating\n useEffect(() => {\n if (!isActive) {\n setPendingAnnotation(null);\n setEditingAnnotation(null);\n setHoverInfo(null);\n setShowSettings(false); // Close settings when toolbar closes\n if (isFrozen) {\n unfreezeAnimations();\n }\n }\n }, [isActive, isFrozen, unfreezeAnimations]);\n\n // Custom cursor\n useEffect(() => {\n if (!isActive) return;\n\n const style = document.createElement(\"style\");\n style.id = \"feedback-cursor-styles\";\n // Text elements get text cursor (higher specificity with body prefix)\n // Everything else gets crosshair\n style.textContent = `\n body * {\n cursor: crosshair !important;\n }\n body p, body span, body h1, body h2, body h3, body h4, body h5, body h6,\n body li, body td, body th, body label, body blockquote, body figcaption,\n body caption, body legend, body dt, body dd, body pre, body code,\n body em, body strong, body b, body i, body u, body s, body a,\n body time, body address, body cite, body q, body abbr, body dfn,\n body mark, body small, body sub, body sup, body [contenteditable],\n body p *, body span *, body h1 *, body h2 *, body h3 *, body h4 *,\n body h5 *, body h6 *, body li *, body a *, body label *, body pre *,\n body code *, body blockquote *, body [contenteditable] * {\n cursor: text !important;\n }\n [data-feedback-toolbar], [data-feedback-toolbar] * {\n cursor: default !important;\n }\n [data-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 if ((e.target as HTMLElement).closest(\"[data-feedback-toolbar]\")) {\n setHoverInfo(null);\n return;\n }\n\n const elementUnder = document.elementFromPoint(\n e.clientX,\n e.clientY,\n ) as HTMLElement;\n if (!elementUnder || elementUnder.closest(\"[data-feedback-toolbar]\")) {\n setHoverInfo(null);\n return;\n }\n\n const { name, path } = identifyElement(elementUnder);\n const rect = elementUnder.getBoundingClientRect();\n\n setHoverInfo({ element: name, elementPath: path, rect });\n setHoverPosition({ x: e.clientX, y: e.clientY });\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove);\n return () => document.removeEventListener(\"mousemove\", handleMouseMove);\n }, [isActive, pendingAnnotation]);\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 const target = e.target as HTMLElement;\n\n if (target.closest(\"[data-feedback-toolbar]\")) return;\n if (target.closest(\"[data-annotation-popup]\")) return;\n if (target.closest(\"[data-annotation-marker]\")) return;\n\n const isInteractive = target.closest(\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 = document.elementFromPoint(\n e.clientX,\n e.clientY,\n ) as HTMLElement;\n if (!elementUnder) return;\n\n const { name, path } = identifyElement(elementUnder);\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 forensic data\n const computedStylesObj = getDetailedComputedStyles(elementUnder);\n const computedStylesStr = Object.entries(computedStylesObj)\n .map(([k, v]) => `${k}: ${v}`)\n .join(\"; \");\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 nearbyElements: getNearbyElements(elementUnder),\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 ]);\n\n // Multi-select drag - mousedown\n useEffect(() => {\n if (!isActive || pendingAnnotation) return;\n\n const handleMouseDown = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n\n if (target.closest(\"[data-feedback-toolbar]\")) return;\n if (target.closest(\"[data-annotation-marker]\")) return;\n if (target.closest(\"[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 el.closest(\"[data-feedback-toolbar]\") ||\n el.closest(\"[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 el.closest(\"[data-feedback-toolbar]\") ||\n el.closest(\"[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 forensic data from first element (Option A)\n const firstElement = finalElements[0].element;\n const firstElementComputedStyles =\n getDetailedComputedStyles(firstElement);\n const firstElementComputedStylesStr = Object.entries(\n firstElementComputedStyles,\n )\n .map(([k, v]) => `${k}: ${v}`)\n .join(\"; \");\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 nearbyElements: getNearbyElements(firstElement),\n cssClasses: getElementClasses(firstElement),\n nearbyText: getNearbyText(firstElement),\n });\n } else {\n // No elements selected, but allow annotation on empty area\n const width = Math.abs(right - left);\n const height = Math.abs(bottom - top);\n\n // Only create if drag area is meaningful size (not just a click)\n if (width > 20 && height > 20) {\n setPendingAnnotation({\n x,\n y,\n clientY: e.clientY,\n element: \"Area selection\",\n elementPath: `region at (${Math.round(left)}, ${Math.round(top)})`,\n boundingBox: {\n x: left,\n y: top + window.scrollY,\n width,\n height,\n },\n isMultiSelect: true,\n });\n }\n }\n setHoverInfo(null);\n } else if (wasDragging) {\n justFinishedDragRef.current = true;\n }\n\n mouseDownPosRef.current = null;\n dragStartRef.current = null;\n setIsDragging(false);\n // Clear highlights container\n if (highlightsContainerRef.current) {\n highlightsContainerRef.current.innerHTML = \"\";\n }\n };\n\n document.addEventListener(\"mouseup\", handleMouseUp);\n return () => document.removeEventListener(\"mouseup\", handleMouseUp);\n }, [isActive, isDragging]);\n\n // 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 };\n\n setAnnotations((prev) => [...prev, newAnnotation]);\n // Prevent immediate hover on newly added marker\n recentlyAddedIdRef.current = newAnnotation.id;\n setTimeout(() => {\n recentlyAddedIdRef.current = null;\n }, 300);\n // Mark as needing animation (will be set to animated after animation completes)\n setTimeout(() => {\n setAnimatedMarkers((prev) => new Set(prev).add(newAnnotation.id));\n }, 250);\n\n // Animate out the pending annotation UI\n setPendingExiting(true);\n setTimeout(() => {\n setPendingAnnotation(null);\n setPendingExiting(false);\n }, 150);\n\n window.getSelection()?.removeAllRanges();\n },\n [pendingAnnotation],\n );\n\n // Cancel annotation with exit animation\n const cancelAnnotation = useCallback(() => {\n setPendingExiting(true);\n setTimeout(() => {\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 setDeletingMarkerId(id);\n setExitingMarkers((prev) => new Set(prev).add(id));\n\n // Wait for exit animation then remove\n setTimeout(() => {\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 setTimeout(() => setRenumberFrom(null), 200);\n }\n }, 150);\n },\n [annotations],\n );\n\n // Start editing an annotation (right-click)\n const startEditAnnotation = useCallback((annotation: Annotation) => {\n setEditingAnnotation(annotation);\n setHoveredMarkerId(null);\n }, []);\n\n // Update annotation (edit mode submit)\n const updateAnnotation = useCallback(\n (newComment: string) => {\n if (!editingAnnotation) return;\n\n setAnnotations((prev) =>\n prev.map((a) =>\n a.id === editingAnnotation.id ? { ...a, comment: newComment } : a,\n ),\n );\n\n // Animate out the edit popup\n setEditExiting(true);\n setTimeout(() => {\n setEditingAnnotation(null);\n setEditExiting(false);\n }, 150);\n },\n [editingAnnotation],\n );\n\n // Cancel editing with exit animation\n const cancelEditAnnotation = useCallback(() => {\n setEditExiting(true);\n setTimeout(() => {\n setEditingAnnotation(null);\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 setIsClearing(true);\n setCleared(true);\n\n const totalAnimationTime = count * 30 + 200;\n setTimeout(() => {\n setAnnotations([]);\n setAnimatedMarkers(new Set()); // Reset animated markers\n localStorage.removeItem(getStorageKey(pathname));\n setIsClearing(false);\n }, totalAnimationTime);\n\n setTimeout(() => setCleared(false), 1500);\n }, [pathname, annotations.length]);\n\n // Copy output\n const copyOutput = useCallback(async () => {\n const output = generateOutput(annotations, pathname, settings.outputDetail);\n if (!output) return;\n\n await navigator.clipboard.writeText(output);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n\n if (settings.autoClearAfterCopy) {\n setTimeout(() => clearAll(), 500);\n }\n }, [\n annotations,\n pathname,\n settings.outputDetail,\n settings.autoClearAfterCopy,\n clearAll,\n ]);\n\n // Toolbar dragging - mousemove and mouseup\n useEffect(() => {\n if (!dragStartPos) return;\n\n const DRAG_THRESHOLD = 5; // 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 containerWidth = 257;\n const circleWidth = 44;\n const toolbarHeight = 44;\n\n // When expanded, constrain the full container\n // When collapsed, only constrain the visible circle\n if (isActive) {\n // Expanded: constrain full 257px container\n newX = Math.max(\n padding,\n Math.min(window.innerWidth - containerWidth - padding, newX),\n );\n } else {\n // Collapsed: constrain 44px circle (which is at the right edge of the 257px container)\n const circleOffset = containerWidth - circleWidth;\n const minX = padding - circleOffset;\n const maxX = window.innerWidth - padding - circleOffset - circleWidth;\n newX = Math.max(minX, Math.min(maxX, newX));\n }\n\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 // Clear flag after a short delay\n setTimeout(() => {\n justFinishedToolbarDragRef.current = false;\n }, 50);\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]);\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 containerWidth = 257;\n const circleWidth = 44;\n const toolbarHeight = 44;\n\n let newX = toolbarPosition.x;\n let newY = toolbarPosition.y;\n\n // Constrain to viewport dimensions\n if (isActive) {\n // Expanded: constrain full 257px container\n newX = Math.max(\n padding,\n Math.min(window.innerWidth - containerWidth - padding, newX),\n );\n } else {\n // Collapsed: constrain 44px circle (which is at the right edge of the 257px container)\n const circleOffset = containerWidth - circleWidth;\n const minX = padding - circleOffset;\n const maxX = window.innerWidth - padding - circleOffset - circleWidth;\n newX = Math.max(minX, Math.min(maxX, newX));\n }\n\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]);\n\n // Keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n if (pendingAnnotation) {\n // Let popup handle\n } else if (isActive) {\n setIsActive(false);\n }\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [isActive, pendingAnnotation]);\n\n if (!mounted) return null;\n\n const hasAnnotations = annotations.length > 0;\n\n // Filter annotations for rendering (exclude exiting ones from normal flow)\n const visibleAnnotations = annotations.filter(\n (a) => !exitingMarkers.has(a.id),\n );\n const exitingAnnotationsList = annotations.filter((a) =>\n exitingMarkers.has(a.id),\n );\n\n // Helper function to calculate viewport-aware tooltip positioning\n const getTooltipPosition = (annotation: Annotation): React.CSSProperties => {\n // Tooltip dimensions (from CSS)\n const tooltipMaxWidth = 200;\n const tooltipEstimatedHeight = 80; // Estimated max height\n const markerSize = 22;\n const gap = 10;\n\n // Convert percentage-based x to pixels\n const markerX = (annotation.x / 100) * window.innerWidth;\n const markerY =\n typeof annotation.y === \"string\"\n ? parseFloat(annotation.y)\n : annotation.y;\n\n const styles: React.CSSProperties = {};\n\n // Vertical positioning: flip if near bottom\n const spaceBelow = window.innerHeight - markerY - markerSize - gap;\n if (spaceBelow < tooltipEstimatedHeight) {\n // Show above marker\n styles.top = \"auto\";\n styles.bottom = `calc(100% + ${gap}px)`;\n }\n // If enough space below, use default CSS (top: calc(100% + 10px))\n\n // Horizontal positioning: adjust if near edges\n const centerX = markerX - tooltipMaxWidth / 2;\n const edgePadding = 10;\n\n if (centerX < edgePadding) {\n // Too close to left edge\n const offset = edgePadding - centerX;\n styles.left = `calc(50% + ${offset}px)`;\n } else if (centerX + tooltipMaxWidth > window.innerWidth - edgePadding) {\n // Too close to right edge\n const overflow =\n centerX + tooltipMaxWidth - (window.innerWidth - edgePadding);\n styles.left = `calc(50% - ${overflow}px)`;\n }\n // If centered position is fine, use default CSS (left: 50%)\n\n return styles;\n };\n\n return createPortal(\n <>\n {/* Toolbar */}\n <div\n className={styles.toolbar}\n data-feedback-toolbar\n style={\n toolbarPosition\n ? {\n left: toolbarPosition.x,\n top: toolbarPosition.y,\n right: \"auto\",\n bottom: \"auto\",\n }\n : undefined\n }\n >\n {/* Morphing container */}\n <div\n className={`${styles.toolbarContainer} ${!isDarkMode ? styles.light : \"\"} ${isActive ? styles.expanded : styles.collapsed} ${showEntranceAnimation ? styles.entrance : \"\"} ${isDraggingToolbar ? styles.dragging : \"\"}`}\n onClick={\n !isActive\n ? (e) => {\n // Don't activate if we just finished dragging\n if (justFinishedToolbarDragRef.current) {\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 ? {\n transform: `scale(1.05) rotate(${dragRotation}deg)`,\n cursor: \"grabbing\",\n }\n : undefined\n }\n >\n {/* Toggle content - visible when collapsed */}\n <div\n className={`${styles.toggleContent} ${!isActive ? styles.visible : styles.hidden}`}\n >\n <IconListSparkle size={24} />\n {hasAnnotations && (\n <span\n className={`${styles.badge} ${isActive ? styles.fadeOut : \"\"} ${showEntranceAnimation ? styles.entrance : \"\"}`}\n style={{ backgroundColor: settings.annotationColor }}\n >\n {annotations.length}\n </span>\n )}\n </div>\n\n {/* Controls content - visible when expanded */}\n <div\n className={`${styles.controlsContent} ${isActive ? styles.visible : styles.hidden}`}\n >\n <button\n className={`${styles.controlButton} ${!isDarkMode ? styles.light : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n toggleFreeze();\n }}\n title={isFrozen ? \"Resume animations\" : \"Pause animations\"}\n data-active={isFrozen}\n >\n <IconPausePlayAnimated size={24} isPaused={isFrozen} />\n </button>\n\n <button\n className={`${styles.controlButton} ${!isDarkMode ? styles.light : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n setShowMarkers(!showMarkers);\n }}\n disabled={!hasAnnotations}\n title={showMarkers ? \"Hide markers\" : \"Show markers\"}\n >\n <IconEyeAnimated size={24} isOpen={showMarkers} />\n </button>\n\n <button\n className={`${styles.controlButton} ${!isDarkMode ? styles.light : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n copyOutput();\n }}\n disabled={!hasAnnotations}\n title=\"Copy feedback\"\n data-active={copied}\n >\n <IconCopyAnimated size={24} copied={copied} />\n </button>\n\n <button\n className={`${styles.controlButton} ${!isDarkMode ? styles.light : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n clearAll();\n }}\n disabled={!hasAnnotations}\n title=\"Clear all\"\n data-danger\n >\n <IconTrashAlt size={24} />\n </button>\n\n <button\n className={`${styles.controlButton} ${!isDarkMode ? styles.light : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n setShowSettings(!showSettings);\n }}\n title=\"Settings\"\n >\n <IconGear size={24} />\n </button>\n\n <div\n className={`${styles.divider} ${!isDarkMode ? styles.light : \"\"}`}\n />\n\n <button\n className={`${styles.controlButton} ${!isDarkMode ? styles.light : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n setIsActive(false);\n }}\n title=\"Exit feedback mode\"\n >\n <IconXmarkLarge size={24} />\n </button>\n </div>\n\n {/* Settings Panel */}\n <div\n className={`${styles.settingsPanel} ${isDarkMode ? styles.dark : styles.light} ${showSettingsVisible ? styles.enter : styles.exit}`}\n onClick={(e) => e.stopPropagation()}\n style={\n toolbarPosition && toolbarPosition.y < 230\n ? {\n bottom: \"auto\",\n top: \"calc(100% + 0.5rem)\",\n }\n : undefined\n }\n >\n <div className={styles.settingsHeader}>\n <span className={styles.settingsBrand}>\n <span\n className={styles.settingsBrandSlash}\n style={{\n color: settings.annotationColor,\n transition: \"color 0.2s ease\",\n }}\n >\n /\n </span>\n agentation\n </span>\n <span className={styles.settingsVersion}>v{__VERSION__}</span>\n <button\n className={styles.themeToggle}\n onClick={() => setIsDarkMode(!isDarkMode)}\n title={\n isDarkMode ? \"Switch to light mode\" : \"Switch to dark mode\"\n }\n >\n {isDarkMode ? <IconSun size={14} /> : <IconMoon size={14} />}\n </button>\n </div>\n\n <div className={styles.settingsSection}>\n <div className={styles.settingsRow}>\n <div\n className={`${styles.settingsLabel} ${!isDarkMode ? styles.light : \"\"}`}\n >\n Output Detail\n <span\n className={styles.helpIcon}\n data-tooltip=\"Controls how much detail is included in the copied output\"\n >\n <IconHelp size={20} />\n </span>\n </div>\n <button\n className={`${styles.cycleButton} ${!isDarkMode ? styles.light : \"\"}`}\n onClick={() => {\n const currentIndex = OUTPUT_DETAIL_OPTIONS.findIndex(\n (opt) => opt.value === settings.outputDetail,\n );\n const nextIndex =\n (currentIndex + 1) % OUTPUT_DETAIL_OPTIONS.length;\n setSettings((s) => ({\n ...s,\n outputDetail: OUTPUT_DETAIL_OPTIONS[nextIndex].value,\n }));\n }}\n >\n <span\n key={settings.outputDetail}\n className={styles.cycleButtonText}\n >\n {\n OUTPUT_DETAIL_OPTIONS.find(\n (opt) => opt.value === settings.outputDetail,\n )?.label\n }\n </span>\n <span className={styles.cycleDots}>\n {OUTPUT_DETAIL_OPTIONS.map((option, i) => (\n <span\n key={option.value}\n className={`${styles.cycleDot} ${!isDarkMode ? styles.light : \"\"} ${settings.outputDetail === option.value ? styles.active : \"\"}`}\n />\n ))}\n </span>\n </button>\n </div>\n </div>\n\n <div className={styles.settingsSection}>\n <div\n className={`${styles.settingsLabel} ${styles.settingsLabelMarker} ${!isDarkMode ? styles.light : \"\"}`}\n >\n Marker Colour\n </div>\n <div className={styles.colorOptions}>\n {COLOR_OPTIONS.map((color) => (\n <div\n onClick={() =>\n setSettings((s) => ({\n ...s,\n annotationColor: color.value,\n }))\n }\n style={{\n borderColor:\n settings.annotationColor === color.value\n ? color.value\n : \"transparent\",\n }}\n className={`${styles.colorOptionRing} ${settings.annotationColor === color.value ? styles.selected : \"\"}`}\n >\n <div\n key={color.value}\n className={`${styles.colorOption} ${settings.annotationColor === color.value ? styles.selected : \"\"}`}\n style={{ backgroundColor: color.value }}\n title={color.label}\n />\n </div>\n ))}\n </div>\n </div>\n\n <div className={styles.settingsSection}>\n <label className={styles.settingsToggle}>\n <input\n type=\"checkbox\"\n id=\"autoClearAfterCopy\"\n checked={settings.autoClearAfterCopy}\n onChange={(e) =>\n setSettings((s) => ({\n ...s,\n autoClearAfterCopy: e.target.checked,\n }))\n }\n />\n <label\n className={`${styles.customCheckbox} ${settings.autoClearAfterCopy ? styles.checked : \"\"}`}\n htmlFor=\"autoClearAfterCopy\"\n >\n {settings.autoClearAfterCopy && (\n <IconCheckSmallAnimated size={14} />\n )}\n </label>\n <span\n className={`${styles.toggleLabel} ${!isDarkMode ? styles.light : \"\"}`}\n >\n Clear after output\n <span\n className={styles.helpIcon}\n data-tooltip=\"Automatically clear annotations after copying\"\n >\n <IconHelp size={20} />\n </span>\n </span>\n </label>\n <label className={styles.settingsToggle}>\n <input\n type=\"checkbox\"\n id=\"blockInteractions\"\n checked={settings.blockInteractions}\n onChange={(e) =>\n setSettings((s) => ({\n ...s,\n blockInteractions: e.target.checked,\n }))\n }\n />\n <label\n className={`${styles.customCheckbox} ${settings.blockInteractions ? styles.checked : \"\"}`}\n htmlFor=\"blockInteractions\"\n >\n {settings.blockInteractions && (\n <IconCheckSmallAnimated size={14} />\n )}\n </label>\n <span\n className={`${styles.toggleLabel} ${!isDarkMode ? styles.light : \"\"}`}\n >\n Block page interactions\n </span>\n </label>\n </div>\n </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 = isHovered || isDeleting;\n const isMulti = annotation.isMultiSelect;\n const markerColor = isMulti\n ? \"#34C759\"\n : settings.annotationColor;\n const globalIndex = annotations.findIndex(\n (a) => a.id === annotation.id,\n );\n const needsEnterAnimation = !animatedMarkers.has(annotation.id);\n const animClass = markersExiting\n ? styles.exit\n : isClearing\n ? styles.clearing\n : needsEnterAnimation\n ? styles.enter\n : \"\";\n\n return (\n <div\n key={annotation.id}\n className={`${styles.marker} ${showDeleteState ? styles.hovered : \"\"} ${isMulti ? styles.multiSelect : \"\"} ${animClass}`}\n data-annotation-marker\n style={{\n left: `${annotation.x}%`,\n top: annotation.y,\n backgroundColor: showDeleteState ? 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 setHoveredMarkerId(annotation.id)\n }\n onMouseLeave={() => setHoveredMarkerId(null)}\n onClick={(e) => {\n e.stopPropagation();\n if (!markersExiting) deleteAnnotation(annotation.id);\n }}\n onContextMenu={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (!markersExiting) startEditAnnotation(annotation);\n }}\n >\n {showDeleteState ? (\n <IconXmark size={isMulti ? 18 : 16} />\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} ${!isDarkMode ? styles.light : \"\"} ${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 = isHovered || isDeleting;\n const isMulti = annotation.isMultiSelect;\n const markerColor = isMulti\n ? \"#34C759\"\n : settings.annotationColor;\n const globalIndex = annotations.findIndex(\n (a) => a.id === annotation.id,\n );\n const needsEnterAnimation = !animatedMarkers.has(annotation.id);\n const animClass = markersExiting\n ? styles.exit\n : isClearing\n ? styles.clearing\n : needsEnterAnimation\n ? styles.enter\n : \"\";\n\n return (\n <div\n key={annotation.id}\n className={`${styles.marker} ${styles.fixed} ${showDeleteState ? styles.hovered : \"\"} ${isMulti ? styles.multiSelect : \"\"} ${animClass}`}\n data-annotation-marker\n style={{\n left: `${annotation.x}%`,\n top: annotation.y,\n backgroundColor: showDeleteState ? 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 setHoveredMarkerId(annotation.id)\n }\n onMouseLeave={() => setHoveredMarkerId(null)}\n onClick={(e) => {\n e.stopPropagation();\n if (!markersExiting) deleteAnnotation(annotation.id);\n }}\n onContextMenu={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (!markersExiting) startEditAnnotation(annotation);\n }}\n >\n {showDeleteState ? (\n <IconClose size={isMulti ? 12 : 10} />\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} ${!isDarkMode ? styles.light : \"\"} ${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: `${settings.annotationColor}80`,\n backgroundColor: `${settings.annotationColor}0A`,\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 const bb = hoveredAnnotation.boundingBox;\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 - scrollY,\n width: bb.width,\n height: bb.height,\n ...(isMulti\n ? {}\n : {\n borderColor: `${settings.annotationColor}99`,\n backgroundColor: `${settings.annotationColor}0D`,\n }),\n }}\n />\n );\n })()}\n\n {/* Hover tooltip */}\n {hoverInfo && !pendingAnnotation && !isScrolling && !isDragging && (\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(hoverPosition.y - 32, 8),\n }}\n >\n {hoverInfo.element}\n </div>\n )}\n\n {/* Pending annotation marker + popup */}\n {pendingAnnotation && (\n <>\n {/* Show element/area outline while adding annotation */}\n {pendingAnnotation.boundingBox && (\n <div\n className={`${pendingAnnotation.isMultiSelect ? styles.multiSelectOutline : styles.singleSelectOutline} ${pendingExiting ? styles.exit : styles.enter}`}\n style={{\n left: pendingAnnotation.boundingBox.x,\n top: pendingAnnotation.boundingBox.y - scrollY,\n width: pendingAnnotation.boundingBox.width,\n height: pendingAnnotation.boundingBox.height,\n ...(pendingAnnotation.isMultiSelect\n ? {}\n : {\n borderColor: `${settings.annotationColor}99`,\n backgroundColor: `${settings.annotationColor}0D`,\n }),\n }}\n />\n )}\n\n <div\n className={`${styles.marker} ${styles.pending} ${pendingAnnotation.isMultiSelect ? styles.multiSelect : \"\"} ${pendingExiting ? styles.exit : styles.enter}`}\n style={{\n left: `${pendingAnnotation.x}%`,\n top: pendingAnnotation.clientY,\n backgroundColor: pendingAnnotation.isMultiSelect\n ? \"#34C759\"\n : settings.annotationColor,\n }}\n >\n <IconPlus size={12} />\n </div>\n\n <AnnotationPopupCSS\n ref={popupRef}\n element={pendingAnnotation.element}\n selectedText={pendingAnnotation.selectedText}\n placeholder={\n pendingAnnotation.element === \"Area selection\"\n ? \"What should change in this area?\"\n : pendingAnnotation.isMultiSelect\n ? \"Feedback for this group of elements...\"\n : \"What should change?\"\n }\n onSubmit={addAnnotation}\n onCancel={cancelAnnotation}\n isExiting={pendingExiting}\n lightMode={!isDarkMode}\n accentColor={\n pendingAnnotation.isMultiSelect\n ? \"#34C759\"\n : settings.annotationColor\n }\n style={{\n // Popup is 280px wide, centered with translateX(-50%), so 140px each side\n // Clamp so popup stays 20px from viewport edges\n left: Math.max(\n 160,\n Math.min(\n window.innerWidth - 160,\n (pendingAnnotation.x / 100) * window.innerWidth,\n ),\n ),\n top: Math.max(\n 20,\n Math.min(\n pendingAnnotation.clientY + 20,\n window.innerHeight - 180,\n ),\n ),\n }}\n />\n </>\n )}\n\n {/* Edit annotation popup */}\n {editingAnnotation && (\n <>\n {/* Show element/area outline while editing */}\n {editingAnnotation.boundingBox && (\n <div\n className={`${editingAnnotation.isMultiSelect ? styles.multiSelectOutline : styles.singleSelectOutline} ${styles.enter}`}\n style={{\n left: editingAnnotation.boundingBox.x,\n top: editingAnnotation.boundingBox.y - scrollY,\n width: editingAnnotation.boundingBox.width,\n height: editingAnnotation.boundingBox.height,\n ...(editingAnnotation.isMultiSelect\n ? {}\n : {\n borderColor: `${settings.annotationColor}99`,\n backgroundColor: `${settings.annotationColor}0D`,\n }),\n }}\n />\n )}\n\n <AnnotationPopupCSS\n ref={editPopupRef}\n element={editingAnnotation.element}\n selectedText={editingAnnotation.selectedText}\n placeholder=\"Edit your feedback...\"\n initialValue={editingAnnotation.comment}\n submitLabel=\"Save\"\n onSubmit={updateAnnotation}\n onCancel={cancelEditAnnotation}\n isExiting={editExiting}\n lightMode={!isDarkMode}\n accentColor={\n editingAnnotation.isMultiSelect\n ? \"#34C759\"\n : settings.annotationColor\n }\n style={{\n // Popup is 280px wide, centered with translateX(-50%), so 140px each side\n // Clamp so popup stays 20px from viewport edges\n left: Math.max(\n 160,\n Math.min(\n window.innerWidth - 160,\n (editingAnnotation.x / 100) * window.innerWidth,\n ),\n ),\n top: Math.max(\n 20,\n Math.min(\n (editingAnnotation.isFixed\n ? editingAnnotation.y\n : editingAnnotation.y - scrollY) + 20,\n window.innerHeight - 180,\n ),\n ),\n }}\n />\n </>\n )}\n\n {/* Drag selection - all visuals use refs for smooth 60fps */}\n {isDragging && (\n <>\n <div ref={dragRectRef} className={styles.dragSelection} />\n <div\n ref={highlightsContainerRef}\n className={styles.highlightsContainer}\n />\n </>\n )}\n </div>\n )}\n </>,\n document.body,\n );\n}\n\nexport default PageFeedbackToolbarCSS;\n","\"use client\";\n\nimport { useState, useRef, useEffect, useCallback, forwardRef, useImperativeHandle } from \"react\";\nimport styles from \"./styles.module.scss\";\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 /** 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}\n\nexport interface AnnotationPopupCSSHandle {\n /** Shake the popup (e.g., when user clicks outside) */\n shake: () => void;\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\n// Darken a hex color by a percentage\nfunction darkenColor(hex: string, percent: number): string {\n const num = parseInt(hex.replace(\"#\", \"\"), 16);\n const amt = Math.round(2.55 * percent);\n const R = Math.max((num >> 16) - amt, 0);\n const G = Math.max((num >> 8 & 0x00FF) - amt, 0);\n const B = Math.max((num & 0x0000FF) - amt, 0);\n return `#${(0x1000000 + R * 0x10000 + G * 0x100 + B).toString(16).slice(1)}`;\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 style,\n accentColor = \"#3c82f7\",\n isExiting = false,\n lightMode = false,\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 textareaRef = useRef<HTMLTextAreaElement>(null);\n const popupRef = useRef<HTMLDivElement>(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\n requestAnimationFrame(() => {\n setAnimState(\"enter\");\n });\n // Transition to entered state after animation completes\n const enterTimer = setTimeout(() => {\n setAnimState(\"entered\");\n }, 200); // Match animation duration\n const focusTimer = setTimeout(() => {\n const textarea = textareaRef.current;\n if (textarea) {\n textarea.focus();\n textarea.selectionStart = textarea.selectionEnd = textarea.value.length;\n textarea.scrollTop = textarea.scrollHeight;\n }\n }, 50);\n return () => {\n clearTimeout(enterTimer);\n clearTimeout(focusTimer);\n };\n }, []);\n\n // Shake animation\n const shake = useCallback(() => {\n setIsShaking(true);\n setTimeout(() => {\n setIsShaking(false);\n textareaRef.current?.focus();\n }, 250);\n }, []);\n\n // Expose shake to parent via ref\n useImperativeHandle(ref, () => ({\n shake,\n }), [shake]);\n\n // Handle cancel with exit animation\n const handleCancel = useCallback(() => {\n setAnimState(\"exit\");\n setTimeout(() => {\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) => {\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 <span className={styles.element}>{element}</span>\n {timestamp && <span className={styles.timestamp}>{timestamp}</span>}\n </div>\n\n {selectedText && (\n <div className={styles.quote}>\n &ldquo;{selectedText.slice(0, 80)}\n {selectedText.length > 80 ? \"...\" : \"\"}&rdquo;\n </div>\n )}\n\n <textarea\n ref={textareaRef}\n className={styles.textarea}\n style={{ borderColor: isFocused ? accentColor : undefined }}\n placeholder={placeholder}\n value={text}\n onChange={(e) => setText(e.target.value)}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n rows={2}\n onKeyDown={handleKeyDown}\n />\n\n <div className={styles.actions}>\n <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 = \"@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 contain: layout style;\\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.5rem;\\n}\\n\\n.styles-module__element___fTV2z {\\n font-size: 0.75rem;\\n font-weight: 500;\\n color: rgba(255, 255, 255, 0.65);\\n max-width: 100%;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n flex: 1;\\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: 0.6875rem;\\n font-style: italic;\\n color: rgba(255, 255, 255, 0.5);\\n margin-bottom: 0.5rem;\\n padding: 0.4rem 0.5rem;\\n background: rgba(255, 255, 255, 0.05);\\n border-radius: 0.25rem;\\n line-height: 1.45;\\n}\\n\\n.styles-module__textarea___jrSae {\\n width: 100%;\\n padding: 0.5rem 0.625rem;\\n font-size: 0.8125rem;\\n font-family: inherit;\\n background: rgba(255, 255, 255, 0.05);\\n color: #fff;\\n border: 1px solid rgba(255, 255, 255, 0.15);\\n border-radius: 8px;\\n resize: none;\\n outline: none;\\n transition: border-color 0.15s ease;\\n}\\n.styles-module__textarea___jrSae:focus {\\n border-color: #3c82f7;\\n}\\n.styles-module__textarea___jrSae.styles-module__green___99l3h:focus {\\n border-color: #34C759;\\n}\\n.styles-module__textarea___jrSae::placeholder {\\n color: rgba(255, 255, 255, 0.35);\\n}\\n.styles-module__textarea___jrSae::-webkit-scrollbar {\\n width: 6px;\\n}\\n.styles-module__textarea___jrSae::-webkit-scrollbar-track {\\n background: transparent;\\n}\\n.styles-module__textarea___jrSae::-webkit-scrollbar-thumb {\\n background: rgba(255, 255, 255, 0.2);\\n border-radius: 3px;\\n}\\n\\n.styles-module__actions___D6x3f {\\n display: flex;\\n justify-content: flex-end;\\n gap: 0.375rem;\\n margin-top: 0.5rem;\\n}\\n\\n.styles-module__cancel___hRjnL,\\n.styles-module__submit___K-mIR {\\n padding: 0.4rem 0.875rem;\\n font-size: 0.75rem;\\n font-weight: 500;\\n border-radius: 1rem;\\n border: none;\\n cursor: pointer;\\n transition: background-color 0.15s ease, color 0.15s ease, opacity 0.15s ease;\\n}\\n\\n.styles-module__cancel___hRjnL {\\n background: transparent;\\n color: rgba(255, 255, 255, 0.5);\\n}\\n.styles-module__cancel___hRjnL:hover {\\n background: rgba(255, 255, 255, 0.1);\\n color: rgba(255, 255, 255, 0.8);\\n}\\n\\n.styles-module__submit___K-mIR {\\n color: white;\\n}\\n.styles-module__submit___K-mIR:hover:not(:disabled) {\\n filter: brightness(0.9);\\n}\\n.styles-module__submit___K-mIR:disabled {\\n cursor: not-allowed;\\n}\\n\\n.styles-module__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__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}\";\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\",\"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\",\"light\":\"styles-module__light___6AaSQ\"};\n\n// SSR-safe style injection\nif (typeof document !== 'undefined') {\n let style = document.getElementById('feedback-tool-styles-annotation-popup-css-styles');\n if (!style) {\n style = document.createElement('style');\n style.id = 'feedback-tool-styles-annotation-popup-css-styles';\n style.textContent = css;\n document.head.appendChild(style);\n }\n}\n\nexport default classNames;\n","\"use client\";\n\n// =============================================================================\n// Icons\n// =============================================================================\n\n// Small X for marker delete\nexport const IconClose = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n// Plus icon\nexport const IconPlus = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M8 3v10M3 8h10\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n// Checkmark icon\nexport const IconCheck = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M3 8l3.5 3.5L13 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Checkbox checkmark (smaller, optimized for checkboxes)\nexport const IconCheckSmall = ({ size = 14 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 14 14\" fill=\"none\">\n <path\n d=\"M3.9375 7L6.125 9.1875L10.5 4.8125\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// List with sparkle icon\nexport const IconListSparkle = ({\n size = 24,\n style = {},\n}: {\n size?: number;\n style?: React.CSSProperties;\n}) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" style={style}>\n <g clipPath=\"url(#clip0_list_sparkle)\">\n <path\n d=\"M11.5 12L5.5 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M18.5 6.75L5.5 6.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M9.25 17.25L5.5 17.25\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M16 12.75L16.5179 13.9677C16.8078 14.6494 17.3506 15.1922 18.0323 15.4821L19.25 16L18.0323 16.5179C17.3506 16.8078 16.8078 17.3506 16.5179 18.0323L16 19.25L15.4821 18.0323C15.1922 17.3506 14.6494 16.8078 13.9677 16.5179L12.75 16L13.9677 15.4821C14.6494 15.1922 15.1922 14.6494 15.4821 13.9677L16 12.75Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_list_sparkle\">\n <rect width=\"24\" height=\"24\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n);\n\n// Help/Question mark icon for tooltips\nexport const IconHelp = ({ size = 20 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M10 16.0417C6.66328 16.0417 3.95834 13.3367 3.95834 10C3.95834 6.66328 6.66328 3.95833 10 3.95833C13.3367 3.95833 16.0417 6.66328 16.0417 10C16.0417 13.3367 13.3367 16.0417 10 16.0417Z\"\n stroke=\"currentColor\"\n strokeOpacity=\"0.2\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M8.24188 8.18736C8.38392 7.78357 8.66429 7.44309 9.03331 7.22621C9.40234 7.00933 9.83621 6.93005 10.2581 7.00241C10.68 7.07477 11.0626 7.29411 11.3383 7.62157C11.6139 7.94903 11.7648 8.36348 11.7642 8.79152C11.7642 9.99986 10 10.604 10 10.604V10.8333\"\n stroke=\"currentColor\"\n strokeOpacity=\"0.2\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M10 13.0208H10.006\"\n stroke=\"currentColor\"\n strokeOpacity=\"0.2\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Animated checkmark with draw + bounce effect\nexport const IconCheckSmallAnimated = ({ size = 14 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 14 14\" fill=\"none\">\n <style>{`\n @keyframes checkDraw {\n 0% {\n stroke-dashoffset: 12;\n }\n 100% {\n stroke-dashoffset: 0;\n }\n }\n @keyframes checkBounce {\n 0% {\n transform: scale(0.5);\n opacity: 0;\n }\n 50% {\n transform: scale(1.12);\n opacity: 1;\n }\n 75% {\n transform: scale(0.95);\n }\n 100% {\n transform: scale(1);\n }\n }\n .check-path-animated {\n stroke-dasharray: 12;\n stroke-dashoffset: 0;\n transform-origin: center;\n animation: checkDraw 0.18s ease-out, checkBounce 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);\n }\n `}</style>\n <path\n className=\"check-path-animated\"\n d=\"M3.9375 7L6.125 9.1875L10.5 4.8125\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// =============================================================================\n// New Icons from SVG files\n// =============================================================================\n\n// Copy icon (two overlapping rectangles)\nexport const IconCopyAlt = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M4.75 11.25C4.75 10.4216 5.42157 9.75 6.25 9.75H12.75C13.5784 9.75 14.25 10.4216 14.25 11.25V17.75C14.25 18.5784 13.5784 19.25 12.75 19.25H6.25C5.42157 19.25 4.75 18.5784 4.75 17.75V11.25Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M17.25 14.25H17.75C18.5784 14.25 19.25 13.5784 19.25 12.75V6.25C19.25 5.42157 18.5784 4.75 17.75 4.75H11.25C10.4216 4.75 9.75 5.42157 9.75 6.25V6.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n// Animated copy/checkmark icon\nexport const IconCopyAnimated = ({ size = 24, copied = false }: { size?: number; copied?: boolean }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <style>{`\n .copy-icon, .check-icon {\n transition: opacity 0.2s ease, transform 0.2s ease;\n }\n `}</style>\n {/* Copy icon */}\n <g className=\"copy-icon\" style={{ opacity: copied ? 0 : 1, transform: copied ? 'scale(0.8)' : 'scale(1)', transformOrigin: 'center' }}>\n <path\n d=\"M4.75 11.25C4.75 10.4216 5.42157 9.75 6.25 9.75H12.75C13.5784 9.75 14.25 10.4216 14.25 11.25V17.75C14.25 18.5784 13.5784 19.25 12.75 19.25H6.25C5.42157 19.25 4.75 18.5784 4.75 17.75V11.25Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M17.25 14.25H17.75C18.5784 14.25 19.25 13.5784 19.25 12.75V6.25C19.25 5.42157 18.5784 4.75 17.75 4.75H11.25C10.4216 4.75 9.75 5.42157 9.75 6.25V6.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </g>\n {/* Checkmark circle */}\n <g className=\"check-icon\" style={{ opacity: copied ? 1 : 0, transform: copied ? 'scale(1)' : 'scale(0.8)', transformOrigin: 'center' }}>\n <path\n d=\"M12 20C7.58172 20 4 16.4182 4 12C4 7.58172 7.58172 4 12 4C16.4182 4 20 7.58172 20 12C20 16.4182 16.4182 20 12 20Z\"\n stroke=\"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 </svg>\n);\n\n// Eye icon (original)\nexport const IconEye = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M4.91516 12.7108C4.63794 12.2883 4.63705 11.7565 4.91242 11.3328C5.84146 9.9033 8.30909 6.74994 12 6.74994C15.6909 6.74994 18.1585 9.9033 19.0876 11.3328C19.3629 11.7565 19.3621 12.2883 19.0848 12.7108C18.1537 14.13 15.6873 17.2499 12 17.2499C8.31272 17.2499 5.8463 14.13 4.91516 12.7108Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 14.25C13.2426 14.25 14.25 13.2426 14.25 12C14.25 10.7574 13.2426 9.75 12 9.75C10.7574 9.75 9.75 10.7574 9.75 12C9.75 13.2426 10.7574 14.25 12 14.25Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Eye icon (alt version - larger pupil)\nexport const IconEyeAlt = ({ size = 24 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M3.91752 12.7539C3.65127 12.2996 3.65037 11.7515 3.9149 11.2962C4.9042 9.59346 7.72688 5.49994 12 5.49994C16.2731 5.49994 19.0958 9.59346 20.0851 11.2962C20.3496 11.7515 20.3487 12.2996 20.0825 12.7539C19.0908 14.4459 16.2694 18.4999 12 18.4999C7.73064 18.4999 4.90918 14.4459 3.91752 12.7539Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 14.8261C13.5608 14.8261 14.8261 13.5608 14.8261 12C14.8261 10.4392 13.5608 9.17392 12 9.17392C10.4392 9.17392 9.17391 10.4392 9.17391 12C9.17391 13.5608 10.4392 14.8261 12 14.8261Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Eye closed (with slash)\nexport const IconEyeClosed = ({ size = 24 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M18.6025 9.28503C18.9174 8.9701 19.4364 8.99481 19.7015 9.35271C20.1484 9.95606 20.4943 10.507 20.7342 10.9199C21.134 11.6086 21.1329 12.4454 20.7303 13.1328C20.2144 14.013 19.2151 15.5225 17.7723 16.8193C16.3293 18.1162 14.3852 19.2497 12.0008 19.25C11.4192 19.25 10.8638 19.1823 10.3355 19.0613C9.77966 18.934 9.63498 18.2525 10.0382 17.8493C10.2412 17.6463 10.5374 17.573 10.8188 17.6302C11.1993 17.7076 11.5935 17.75 12.0008 17.75C13.8848 17.7497 15.4867 16.8568 16.7693 15.7041C18.0522 14.5511 18.9606 13.1867 19.4363 12.375C19.5656 12.1543 19.5659 11.8943 19.4373 11.6729C19.2235 11.3049 18.921 10.8242 18.5364 10.3003C18.3085 9.98991 18.3302 9.5573 18.6025 9.28503ZM12.0008 4.75C12.5814 4.75006 13.1358 4.81803 13.6632 4.93953C14.2182 5.06741 14.362 5.74812 13.9593 6.15091C13.7558 6.35435 13.4589 6.42748 13.1771 6.36984C12.7983 6.29239 12.4061 6.25006 12.0008 6.25C10.1167 6.25 8.51415 7.15145 7.23028 8.31543C5.94678 9.47919 5.03918 10.8555 4.56426 11.6729C4.43551 11.8945 4.43582 12.1542 4.56524 12.375C4.77587 12.7343 5.07189 13.2012 5.44718 13.7105C5.67623 14.0213 5.65493 14.4552 5.38193 14.7282C5.0671 15.0431 4.54833 15.0189 4.28292 14.6614C3.84652 14.0736 3.50813 13.5369 3.27129 13.1328C2.86831 12.4451 2.86717 11.6088 3.26739 10.9199C3.78185 10.0345 4.77959 8.51239 6.22247 7.2041C7.66547 5.89584 9.61202 4.75 12.0008 4.75Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M5 19L19 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n// Animated eye icon that transitions between open/closed states\nexport const IconEyeAnimated = ({ size = 24, isOpen = true }: { size?: number; isOpen?: boolean }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <style>{`\n .eye-open, .eye-closed {\n transition: opacity 0.2s ease;\n }\n `}</style>\n {/* Open state - full outline + pupil */}\n <g className=\"eye-open\" style={{ opacity: isOpen ? 1 : 0 }}>\n <path\n d=\"M3.91752 12.7539C3.65127 12.2996 3.65037 11.7515 3.9149 11.2962C4.9042 9.59346 7.72688 5.49994 12 5.49994C16.2731 5.49994 19.0958 9.59346 20.0851 11.2962C20.3496 11.7515 20.3487 12.2996 20.0825 12.7539C19.0908 14.4459 16.2694 18.4999 12 18.4999C7.73064 18.4999 4.90918 14.4459 3.91752 12.7539Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 14.8261C13.5608 14.8261 14.8261 13.5608 14.8261 12C14.8261 10.4392 13.5608 9.17392 12 9.17392C10.4392 9.17392 9.17391 10.4392 9.17391 12C9.17391 13.5608 10.4392 14.8261 12 14.8261Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n {/* Closed state - split outline + slash */}\n <g className=\"eye-closed\" style={{ opacity: isOpen ? 0 : 1 }}>\n <path\n d=\"M18.6025 9.28503C18.9174 8.9701 19.4364 8.99481 19.7015 9.35271C20.1484 9.95606 20.4943 10.507 20.7342 10.9199C21.134 11.6086 21.1329 12.4454 20.7303 13.1328C20.2144 14.013 19.2151 15.5225 17.7723 16.8193C16.3293 18.1162 14.3852 19.2497 12.0008 19.25C11.4192 19.25 10.8638 19.1823 10.3355 19.0613C9.77966 18.934 9.63498 18.2525 10.0382 17.8493C10.2412 17.6463 10.5374 17.573 10.8188 17.6302C11.1993 17.7076 11.5935 17.75 12.0008 17.75C13.8848 17.7497 15.4867 16.8568 16.7693 15.7041C18.0522 14.5511 18.9606 13.1867 19.4363 12.375C19.5656 12.1543 19.5659 11.8943 19.4373 11.6729C19.2235 11.3049 18.921 10.8242 18.5364 10.3003C18.3085 9.98991 18.3302 9.5573 18.6025 9.28503ZM12.0008 4.75C12.5814 4.75006 13.1358 4.81803 13.6632 4.93953C14.2182 5.06741 14.362 5.74812 13.9593 6.15091C13.7558 6.35435 13.4589 6.42748 13.1771 6.36984C12.7983 6.29239 12.4061 6.25006 12.0008 6.25C10.1167 6.25 8.51415 7.15145 7.23028 8.31543C5.94678 9.47919 5.03918 10.8555 4.56426 11.6729C4.43551 11.8945 4.43582 12.1542 4.56524 12.375C4.77587 12.7343 5.07189 13.2012 5.44718 13.7105C5.67623 14.0213 5.65493 14.4552 5.38193 14.7282C5.0671 15.0431 4.54833 15.0189 4.28292 14.6614C3.84652 14.0736 3.50813 13.5369 3.27129 13.1328C2.86831 12.4451 2.86717 11.6088 3.26739 10.9199C3.78185 10.0345 4.77959 8.51239 6.22247 7.2041C7.66547 5.89584 9.61202 4.75 12.0008 4.75Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M5 19L19 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </g>\n </svg>\n);\n\n// Animated pause/play icon that transitions between states\nexport const IconPausePlayAnimated = ({ size = 24, isPaused = false }: { size?: number; isPaused?: boolean }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <style>{`\n .pause-bar, .play-triangle {\n transition: opacity 0.15s ease;\n }\n `}</style>\n {/* Pause bars - visible when not paused */}\n <path\n className=\"pause-bar\"\n d=\"M8 6L8 18\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n style={{ opacity: isPaused ? 0 : 1 }}\n />\n <path\n className=\"pause-bar\"\n d=\"M16 18L16 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n style={{ opacity: isPaused ? 0 : 1 }}\n />\n {/* Play triangle - visible when paused */}\n <path\n className=\"play-triangle\"\n d=\"M17.75 10.701C18.75 11.2783 18.75 12.7217 17.75 13.299L8.75 18.4952C7.75 19.0725 6.5 18.3509 6.5 17.1962L6.5 6.80384C6.5 5.64914 7.75 4.92746 8.75 5.50481L17.75 10.701Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n style={{ opacity: isPaused ? 1 : 0 }}\n />\n </svg>\n);\n\n// Eye with minus (hidden/collapsed state)\nexport const IconEyeMinus = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M4.91516 12.7108C4.63794 12.2883 4.63705 11.7565 4.91242 11.3328C5.84146 9.9033 8.30909 6.74994 12 6.74994C15.6909 6.74994 18.1585 9.9033 19.0876 11.3328C19.3629 11.7565 19.3621 12.2883 19.0848 12.7108C18.1537 14.13 15.6873 17.2499 12 17.2499C8.31272 17.2499 5.8463 14.13 4.91516 12.7108Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M9 12H15\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n// Gear icon\nexport const IconGear = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M10.6504 5.81117C10.9939 4.39628 13.0061 4.39628 13.3496 5.81117C13.5715 6.72517 14.6187 7.15891 15.4219 6.66952C16.6652 5.91193 18.0881 7.33479 17.3305 8.57815C16.8411 9.38134 17.2748 10.4285 18.1888 10.6504C19.6037 10.9939 19.6037 13.0061 18.1888 13.3496C17.2748 13.5715 16.8411 14.6187 17.3305 15.4219C18.0881 16.6652 16.6652 18.0881 15.4219 17.3305C14.6187 16.8411 13.5715 17.2748 13.3496 18.1888C13.0061 19.6037 10.9939 19.6037 10.6504 18.1888C10.4285 17.2748 9.38135 16.8411 8.57815 17.3305C7.33479 18.0881 5.91193 16.6652 6.66952 15.4219C7.15891 14.6187 6.72517 13.5715 5.81117 13.3496C4.39628 13.0061 4.39628 10.9939 5.81117 10.6504C6.72517 10.4285 7.15891 9.38134 6.66952 8.57815C5.91193 7.33479 7.33479 5.91192 8.57815 6.66952C9.38135 7.15891 10.4285 6.72517 10.6504 5.81117Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"12\" cy=\"12\" r=\"2.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n);\n\n// Pause icon (two vertical bars - original)\nexport const IconPauseAlt = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M9.25 5.75C9.80228 5.75 10.25 6.19772 10.25 6.75L10.25 17.25C10.25 17.8023 9.80228 18.25 9.25 18.25L6.75 18.25C6.19772 18.25 5.75 17.8023 5.75 17.25L5.75 6.75C5.75 6.19772 6.19772 5.75 6.75 5.75L9.25 5.75Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M17.25 5.75C17.8023 5.75 18.25 6.19772 18.25 6.75L18.25 17.25C18.25 17.8023 17.8023 18.25 17.25 18.25L14.75 18.25C14.1977 18.25 13.75 17.8023 13.75 17.25L13.75 6.75C13.75 6.19772 14.1977 5.75 14.75 5.75L17.25 5.75Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n </svg>\n);\n\n// Pause icon (simple lines)\nexport const IconPause = ({ size = 24 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M8 6L8 18\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M16 18L16 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n// Play icon (triangle pointing right)\nexport const IconPlayAlt = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M17.75 10.701C18.75 11.2783 18.75 12.7217 17.75 13.299L8.75 18.4952C7.75 19.0725 6.5 18.3509 6.5 17.1962L6.5 6.80384C6.5 5.64914 7.75 4.92746 8.75 5.50481L17.75 10.701Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n </svg>\n);\n\n// Trash can icon with detail\nexport const IconTrashAlt = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M10 11.5L10.125 15.5\"\n stroke=\"currentColor\"\n strokeOpacity=\"1\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M14 11.5L13.87 15.5\"\n stroke=\"currentColor\"\n strokeOpacity=\"1\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M9 7.5V6.25C9 5.42157 9.67157 4.75 10.5 4.75H13.5C14.3284 4.75 15 5.42157 15 6.25V7.5\"\n stroke=\"currentColor\"\n strokeOpacity=\"1\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M5.5 7.75H18.5\"\n stroke=\"currentColor\"\n strokeOpacity=\"1\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M6.75 7.75L7.11691 16.189C7.16369 17.2649 7.18708 17.8028 7.41136 18.2118C7.60875 18.5717 7.91211 18.8621 8.28026 19.0437C8.69854 19.25 9.23699 19.25 10.3139 19.25H13.6861C14.763 19.25 15.3015 19.25 15.7197 19.0437C16.0879 18.8621 16.3912 18.5717 16.5886 18.2118C16.8129 17.8028 16.8363 17.2649 16.8831 16.189L17.25 7.75\"\n stroke=\"currentColor\"\n strokeOpacity=\"1\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\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 <g clipPath=\"url(#clip0_1_660)\">\n <path\n d=\"M17.25 17.25L6.75 6.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M6.75 17.25L17.25 6.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_1_660\">\n <rect width=\"24\" height=\"24\" fill=\"white\" />\n </clipPath>\n </defs>\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 24 24\" fill=\"none\">\n <circle cx=\"12\" cy=\"12\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M12 5V3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M12 21V19\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M16.95 7.05L18.36 5.64\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M5.64 18.36L7.05 16.95\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M19 12H21\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M3 12H5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M16.95 16.95L18.36 18.36\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M5.64 5.64L7.05 7.05\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"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 24 24\" fill=\"none\">\n <path\n d=\"M21 12.79A9 9 0 1111.21 3a7 7 0 009.79 9.79z\"\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// Element Identification Utilities\n// =============================================================================\n\n/**\n * Gets a readable path for an element (e.g., \"article > section > p\")\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 parts.unshift(identifier);\n current = current.parentElement;\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\n const svg = target.closest(\"svg\");\n if (svg) {\n const parent = svg.parentElement;\n if (parent) {\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 = target.parentElement;\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 */\nexport function getNearbyElements(element: HTMLElement): string {\n const parent = element.parentElement;\n if (!parent) return \"\";\n\n const siblings = Array.from(parent.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/**\n * Gets detailed computed styles for forensic-level debugging\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\n // All the properties that are commonly relevant for debugging\n const 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\n \"display\", \"position\", \"top\", \"right\", \"bottom\", \"left\", \"zIndex\",\n \"flexDirection\", \"justifyContent\", \"alignItems\", \"gap\",\n // Visual\n \"opacity\", \"visibility\", \"overflow\", \"boxShadow\",\n // Transform\n \"transform\",\n ];\n\n for (const prop of properties) {\n const value = styles.getPropertyValue(prop.replace(/([A-Z])/g, \"-$1\").toLowerCase());\n if (value && value !== \"none\" && value !== \"normal\" && value !== \"auto\" && value !== \"0px\" && value !== \"rgba(0, 0, 0, 0)\") {\n result[prop] = value;\n }\n }\n\n return result;\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 */\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 parts.unshift(identifier);\n current = current.parentElement;\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","\nconst css = \"@keyframes styles-module__toolbarEnter___u8RRu {\\n from {\\n opacity: 0;\\n transform: scale(0.5) rotate(90deg);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1) rotate(0deg);\\n }\\n}\\n@keyframes styles-module__badgeEnter___mVQLj {\\n from {\\n opacity: 0;\\n transform: scale(0);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1);\\n }\\n}\\n@keyframes styles-module__scaleIn___c-r1K {\\n from {\\n opacity: 0;\\n transform: scale(0.85);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1);\\n }\\n}\\n@keyframes styles-module__scaleOut___Wctwz {\\n from {\\n opacity: 1;\\n transform: scale(1);\\n }\\n to {\\n opacity: 0;\\n transform: scale(0.85);\\n }\\n}\\n@keyframes styles-module__slideUp___kgD36 {\\n from {\\n opacity: 0;\\n transform: scale(0.85) translateY(8px);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1) translateY(0);\\n }\\n}\\n@keyframes styles-module__slideDown___zcdje {\\n from {\\n opacity: 1;\\n transform: scale(1) translateY(0);\\n }\\n to {\\n opacity: 0;\\n transform: scale(0.85) translateY(8px);\\n }\\n}\\n@keyframes styles-module__markerIn___5FaAP {\\n 0% {\\n opacity: 0;\\n transform: translate(-50%, -50%) scale(0.3);\\n }\\n 100% {\\n opacity: 1;\\n transform: translate(-50%, -50%) scale(1);\\n }\\n}\\n@keyframes styles-module__markerOut___GU5jX {\\n 0% {\\n opacity: 1;\\n transform: translate(-50%, -50%) scale(1);\\n }\\n 100% {\\n opacity: 0;\\n transform: translate(-50%, -50%) scale(0.3);\\n }\\n}\\n@keyframes styles-module__fadeIn___b9qmf {\\n from {\\n opacity: 0;\\n }\\n to {\\n opacity: 1;\\n }\\n}\\n@keyframes styles-module__fadeOut___6Ut6- {\\n from {\\n opacity: 1;\\n }\\n to {\\n opacity: 0;\\n }\\n}\\n@keyframes styles-module__tooltipIn___0N31w {\\n from {\\n opacity: 0;\\n transform: translateX(-50%) translateY(2px) scale(0.98);\\n }\\n to {\\n opacity: 1;\\n transform: translateX(-50%) translateY(0) scale(1);\\n }\\n}\\n@keyframes styles-module__hoverHighlightIn___6WYHY {\\n from {\\n opacity: 0;\\n transform: scale(0.98);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1);\\n }\\n}\\n@keyframes styles-module__hoverTooltipIn___FYGQx {\\n from {\\n opacity: 0;\\n transform: scale(0.95) translateY(4px);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1) translateY(0);\\n }\\n}\\n@keyframes styles-module__settingsPanelIn___MGfO8 {\\n from {\\n opacity: 0;\\n transform: translateY(10px) scale(0.95);\\n filter: blur(5px);\\n }\\n to {\\n opacity: 1;\\n transform: translateY(0) scale(1);\\n filter: blur(0px);\\n }\\n}\\n@keyframes styles-module__settingsPanelOut___Zfymi {\\n from {\\n opacity: 1;\\n transform: translateY(0) scale(1);\\n filter: blur(0px);\\n }\\n to {\\n opacity: 0;\\n transform: translateY(20px) scale(0.95);\\n filter: blur(5px);\\n }\\n}\\n.styles-module__toolbar___wNsdK {\\n position: fixed;\\n bottom: 1.25rem;\\n right: 1.25rem;\\n width: 257px;\\n z-index: 100000;\\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, sans-serif;\\n pointer-events: none;\\n transition: left 0s, top 0s, right 0s, bottom 0s;\\n}\\n\\n.styles-module__toolbarContainer___dIhma {\\n user-select: none;\\n margin-left: auto;\\n align-self: flex-end;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n background: #1a1a1a;\\n color: #fff;\\n border: none;\\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2), 0 4px 16px rgba(0, 0, 0, 0.1);\\n pointer-events: auto;\\n cursor: grab;\\n transition: width 0.4s cubic-bezier(0.19, 1, 0.22, 1), transform 0.4s cubic-bezier(0.19, 1, 0.22, 1);\\n}\\n.styles-module__toolbarContainer___dIhma.styles-module__dragging___xrolZ {\\n transition: width 0.4s cubic-bezier(0.19, 1, 0.22, 1);\\n cursor: grabbing;\\n}\\n.styles-module__toolbarContainer___dIhma.styles-module__entrance___sgHd8 {\\n animation: styles-module__toolbarEnter___u8RRu 0.5s cubic-bezier(0.34, 1.2, 0.64, 1) forwards;\\n}\\n.styles-module__toolbarContainer___dIhma.styles-module__collapsed___Rydsn {\\n width: 44px;\\n height: 44px;\\n border-radius: 22px;\\n padding: 0;\\n cursor: pointer;\\n}\\n.styles-module__toolbarContainer___dIhma.styles-module__collapsed___Rydsn svg {\\n margin-top: -1px;\\n}\\n.styles-module__toolbarContainer___dIhma.styles-module__collapsed___Rydsn:hover {\\n background: #2a2a2a;\\n}\\n.styles-module__toolbarContainer___dIhma.styles-module__collapsed___Rydsn:active {\\n transform: scale(0.95);\\n}\\n.styles-module__toolbarContainer___dIhma.styles-module__expanded___ofKPx {\\n width: calc-size(auto, size);\\n height: 44px;\\n border-radius: 1.5rem;\\n padding: 0.375rem;\\n}\\n@supports not (width: calc-size(auto, size)) {\\n .styles-module__toolbarContainer___dIhma.styles-module__expanded___ofKPx {\\n width: 257px;\\n }\\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 opacity: 0;\\n filter: blur(10px);\\n transform: scale(0.4);\\n pointer-events: none;\\n}\\n\\n.styles-module__badge___2XsgF {\\n position: absolute;\\n top: -16px;\\n right: -16px;\\n user-select: none;\\n min-width: 18px;\\n height: 18px;\\n padding: 0 5px;\\n border-radius: 9px;\\n background: #3c82f7;\\n color: white;\\n font-size: 0.625rem;\\n font-weight: 600;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);\\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 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) {\\n background: rgba(255, 255, 255, 0.12);\\n color: #fff;\\n}\\n.styles-module__controlButton___8Q0jc:active:not(:disabled) {\\n transform: scale(0.92);\\n}\\n.styles-module__controlButton___8Q0jc:disabled {\\n opacity: 0.35;\\n cursor: not-allowed;\\n}\\n.styles-module__controlButton___8Q0jc[data-active=true] {\\n color: #3c82f7;\\n background: rgba(60, 130, 247, 0.25);\\n}\\n.styles-module__controlButton___8Q0jc[data-danger]:hover:not(:disabled) {\\n background: rgba(255, 59, 48, 0.25);\\n color: #ff3b30;\\n}\\n\\n.styles-module__divider___c--s1 {\\n width: 1px;\\n height: 12px;\\n background: rgba(255, 255, 255, 0.15);\\n margin: 0 0.125rem;\\n}\\n\\n.styles-module__overlay___Q1O9y {\\n position: fixed;\\n inset: 0;\\n z-index: 99997;\\n pointer-events: none;\\n}\\n.styles-module__overlay___Q1O9y > * {\\n pointer-events: auto;\\n}\\n\\n.styles-module__hoverHighlight___ogakW {\\n position: fixed;\\n border: 2px solid rgba(60, 130, 247, 0.5);\\n border-radius: 4px;\\n pointer-events: none !important;\\n background: rgba(60, 130, 247, 0.04);\\n box-sizing: border-box;\\n will-change: opacity;\\n contain: layout style;\\n}\\n.styles-module__hoverHighlight___ogakW.styles-module__enter___WFIki {\\n animation: styles-module__hoverHighlightIn___6WYHY 0.12s ease-out forwards;\\n}\\n\\n.styles-module__multiSelectOutline___cSJ-m {\\n position: fixed;\\n border: 2px dashed rgba(52, 199, 89, 0.6);\\n border-radius: 4px;\\n pointer-events: none !important;\\n background: rgba(52, 199, 89, 0.05);\\n box-sizing: border-box;\\n will-change: opacity;\\n}\\n.styles-module__multiSelectOutline___cSJ-m.styles-module__enter___WFIki {\\n animation: styles-module__fadeIn___b9qmf 0.15s ease-out forwards;\\n}\\n.styles-module__multiSelectOutline___cSJ-m.styles-module__exit___fyOJ0 {\\n animation: styles-module__fadeOut___6Ut6- 0.15s ease-out forwards;\\n}\\n\\n.styles-module__singleSelectOutline___QhX-O {\\n position: fixed;\\n border: 2px solid rgba(60, 130, 247, 0.6);\\n border-radius: 4px;\\n pointer-events: none !important;\\n background: rgba(60, 130, 247, 0.05);\\n box-sizing: border-box;\\n will-change: opacity;\\n}\\n.styles-module__singleSelectOutline___QhX-O.styles-module__enter___WFIki {\\n animation: styles-module__fadeIn___b9qmf 0.15s ease-out forwards;\\n}\\n.styles-module__singleSelectOutline___QhX-O.styles-module__exit___fyOJ0 {\\n animation: styles-module__fadeOut___6Ut6- 0.15s ease-out forwards;\\n}\\n\\n.styles-module__hoverTooltip___bvLk7 {\\n position: fixed;\\n font-size: 0.6875rem;\\n font-weight: 500;\\n color: #fff;\\n background: rgba(0, 0, 0, 0.85);\\n padding: 0.35rem 0.6rem;\\n border-radius: 0.375rem;\\n pointer-events: none !important;\\n white-space: nowrap;\\n max-width: 200px;\\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__markersLayer___-25j1 {\\n position: absolute;\\n top: 0;\\n left: 0;\\n right: 0;\\n height: 0;\\n z-index: 99998;\\n pointer-events: none;\\n}\\n.styles-module__markersLayer___-25j1 > * {\\n pointer-events: auto;\\n}\\n\\n.styles-module__fixedMarkersLayer___ffyX6 {\\n position: fixed;\\n top: 0;\\n left: 0;\\n right: 0;\\n bottom: 0;\\n z-index: 99998;\\n pointer-events: none;\\n}\\n.styles-module__fixedMarkersLayer___ffyX6 > * {\\n pointer-events: auto;\\n}\\n\\n.styles-module__marker___6sQrs {\\n position: absolute;\\n width: 22px;\\n height: 22px;\\n background: #3c82f7;\\n color: white;\\n border-radius: 50%;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n font-size: 0.6875rem;\\n font-weight: 600;\\n transform: translate(-50%, -50%) scale(1);\\n opacity: 1;\\n cursor: pointer;\\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);\\n user-select: none;\\n will-change: transform, opacity;\\n contain: layout style;\\n z-index: 1;\\n}\\n.styles-module__marker___6sQrs:hover {\\n z-index: 2;\\n}\\n.styles-module__marker___6sQrs:not(.styles-module__enter___WFIki):not(.styles-module__exit___fyOJ0):not(.styles-module__clearing___FQ--7) {\\n transition: background-color 0.15s ease, transform 0.1s ease;\\n}\\n.styles-module__marker___6sQrs.styles-module__enter___WFIki {\\n animation: styles-module__markerIn___5FaAP 0.25s cubic-bezier(0.22, 1, 0.36, 1) both;\\n}\\n.styles-module__marker___6sQrs.styles-module__exit___fyOJ0 {\\n animation: styles-module__markerOut___GU5jX 0.2s ease-out both;\\n pointer-events: none;\\n}\\n.styles-module__marker___6sQrs.styles-module__clearing___FQ--7 {\\n animation: styles-module__markerOut___GU5jX 0.15s ease-out both;\\n pointer-events: none;\\n}\\n.styles-module__marker___6sQrs:not(.styles-module__enter___WFIki):not(.styles-module__exit___fyOJ0):not(.styles-module__clearing___FQ--7):hover {\\n transform: translate(-50%, -50%) scale(1.1);\\n}\\n.styles-module__marker___6sQrs.styles-module__pending___2IHLC {\\n position: fixed;\\n background: #3c82f7;\\n}\\n.styles-module__marker___6sQrs.styles-module__fixed___dBMHC {\\n position: fixed;\\n}\\n.styles-module__marker___6sQrs.styles-module__multiSelect___YWiuz {\\n background: #34c759;\\n width: 26px;\\n height: 26px;\\n border-radius: 6px;\\n font-size: 0.75rem;\\n}\\n.styles-module__marker___6sQrs.styles-module__multiSelect___YWiuz.styles-module__pending___2IHLC {\\n background: #34c759;\\n}\\n.styles-module__marker___6sQrs.styles-module__hovered___ZgXIy {\\n background: #ff3b30;\\n}\\n\\n.styles-module__renumber___nCTxD {\\n display: block;\\n animation: styles-module__renumberRoll___Wgbq3 0.2s ease-out;\\n}\\n\\n@keyframes styles-module__renumberRoll___Wgbq3 {\\n 0% {\\n transform: translateX(-40%);\\n opacity: 0;\\n }\\n 100% {\\n transform: translateX(0);\\n opacity: 1;\\n }\\n}\\n.styles-module__markerTooltip___aLJID {\\n position: absolute;\\n top: calc(100% + 10px);\\n left: 50%;\\n transform: translateX(-50%);\\n z-index: 100002;\\n background: #1a1a1a;\\n padding: 0.625rem 0.75rem;\\n border-radius: 0.75rem;\\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: 0.6875rem;\\n font-style: italic;\\n color: rgba(255, 255, 255, 0.5);\\n margin-bottom: 0.375rem;\\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: 0.75rem;\\n font-weight: 450;\\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.3);\\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 background: white;\\n border-radius: 1rem;\\n padding: 13px 1rem 16px;\\n min-width: 205px;\\n box-shadow: 0 1px 8px rgba(0, 0, 0, 0.25), 0 0 0 1px rgba(0, 0, 0, 0.04);\\n transition: background 0.25s ease, box-shadow 0.25s ease;\\n}\\n.styles-module__settingsPanel___OxX3Y .styles-module__settingsHeader___pwDY9,\\n.styles-module__settingsPanel___OxX3Y .styles-module__settingsBrand___0gJeM,\\n.styles-module__settingsPanel___OxX3Y .styles-module__settingsBrandSlash___uTG18,\\n.styles-module__settingsPanel___OxX3Y .styles-module__settingsVersion___TUcFq,\\n.styles-module__settingsPanel___OxX3Y .styles-module__settingsSection___m-YM2,\\n.styles-module__settingsPanel___OxX3Y .styles-module__settingsLabel___8UjfX,\\n.styles-module__settingsPanel___OxX3Y .styles-module__cycleButton___FMKfw,\\n.styles-module__settingsPanel___OxX3Y .styles-module__cycleDot___nPgLY,\\n.styles-module__settingsPanel___OxX3Y .styles-module__dropdownButton___16NPz,\\n.styles-module__settingsPanel___OxX3Y .styles-module__toggleLabel___Xm8Aa,\\n.styles-module__settingsPanel___OxX3Y .styles-module__customCheckbox___U39ax,\\n.styles-module__settingsPanel___OxX3Y .styles-module__sliderLabel___U8sPr,\\n.styles-module__settingsPanel___OxX3Y .styles-module__slider___GLdxp,\\n.styles-module__settingsPanel___OxX3Y .styles-module__helpIcon___xQg56,\\n.styles-module__settingsPanel___OxX3Y .styles-module__themeToggle___2rUjA {\\n transition: background 0.25s ease, color 0.25s ease, border-color 0.25s ease;\\n}\\n.styles-module__settingsPanel___OxX3Y.styles-module__enter___WFIki {\\n opacity: 1;\\n transform: translateY(0) scale(1);\\n filter: blur(0px);\\n transition: opacity 0.2s ease, transform 0.2s ease, filter 0.2s ease;\\n}\\n.styles-module__settingsPanel___OxX3Y.styles-module__exit___fyOJ0 {\\n opacity: 0;\\n transform: translateY(8px) scale(0.95);\\n filter: blur(5px);\\n pointer-events: none;\\n transition: opacity 0.1s ease, transform 0.1s ease, filter 0.1s ease;\\n}\\n.styles-module__settingsPanel___OxX3Y.styles-module__dark___ILIQf {\\n background: #1a1a1a;\\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(255, 255, 255, 0.08);\\n}\\n.styles-module__settingsPanel___OxX3Y.styles-module__dark___ILIQf .styles-module__settingsLabel___8UjfX {\\n color: rgba(255, 255, 255, 0.6);\\n}\\n.styles-module__settingsPanel___OxX3Y.styles-module__dark___ILIQf .styles-module__settingsOption___UNa12 {\\n color: rgba(255, 255, 255, 0.85);\\n}\\n.styles-module__settingsPanel___OxX3Y.styles-module__dark___ILIQf .styles-module__settingsOption___UNa12:hover {\\n background: rgba(255, 255, 255, 0.1);\\n}\\n.styles-module__settingsPanel___OxX3Y.styles-module__dark___ILIQf .styles-module__settingsOption___UNa12.styles-module__selected___OwRqP {\\n background: rgba(255, 255, 255, 0.15);\\n color: #fff;\\n}\\n.styles-module__settingsPanel___OxX3Y.styles-module__dark___ILIQf .styles-module__toggleLabel___Xm8Aa {\\n color: rgba(255, 255, 255, 0.85);\\n}\\n\\n.styles-module__settingsHeader___pwDY9 {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n min-height: 24px;\\n margin-bottom: 0.5rem;\\n padding-bottom: 9px;\\n border-bottom: 1px solid rgba(255, 255, 255, 0.07);\\n}\\n\\n.styles-module__settingsBrand___0gJeM {\\n font-size: 0.8125rem;\\n font-weight: 600;\\n letter-spacing: -0.0094em;\\n color: #fff;\\n}\\n\\n.styles-module__settingsBrandSlash___uTG18 {\\n color: rgba(255, 255, 255, 0.5);\\n}\\n\\n.styles-module__settingsVersion___TUcFq {\\n font-size: 0.6875rem;\\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: calc(0.5rem + 2px);\\n border-top: 1px solid rgba(255, 255, 255, 0.07);\\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\\n.styles-module__dropdownContainer___BVnxe {\\n position: relative;\\n}\\n\\n.styles-module__dropdownButton___16NPz {\\n display: flex;\\n align-items: center;\\n gap: 0.5rem;\\n padding: 0.25rem 0.5rem;\\n border: none;\\n border-radius: 0.375rem;\\n background: transparent;\\n font-size: 0.8125rem;\\n font-weight: 600;\\n color: #fff;\\n cursor: pointer;\\n transition: background-color 0.15s ease, color 0.15s ease;\\n letter-spacing: -0.0094em;\\n}\\n.styles-module__dropdownButton___16NPz:hover {\\n background: rgba(255, 255, 255, 0.08);\\n}\\n.styles-module__dropdownButton___16NPz svg {\\n opacity: 0.6;\\n}\\n\\n.styles-module__cycleButton___FMKfw {\\n display: flex;\\n align-items: center;\\n gap: 0.5rem;\\n padding: 0;\\n border: none;\\n background: transparent;\\n font-size: 0.8125rem;\\n font-weight: 500;\\n color: #fff;\\n cursor: pointer;\\n letter-spacing: -0.0094em;\\n}\\n.styles-module__cycleButton___FMKfw.styles-module__light___r6n4Y {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n\\n@keyframes styles-module__cycleTextIn___Q6zJf {\\n 0% {\\n opacity: 0;\\n transform: translateY(-6px);\\n }\\n 100% {\\n opacity: 1;\\n transform: translateY(0);\\n }\\n}\\n.styles-module__cycleButtonText___fD1LR {\\n display: inline-block;\\n animation: styles-module__cycleTextIn___Q6zJf 0.2s ease-out;\\n}\\n\\n.styles-module__cycleDots___LWuoQ {\\n display: flex;\\n flex-direction: column;\\n gap: 2px;\\n}\\n\\n.styles-module__cycleDot___nPgLY {\\n width: 3px;\\n height: 3px;\\n border-radius: 50%;\\n background: rgba(255, 255, 255, 0.3);\\n transform: scale(0.667);\\n transition: background-color 0.25s ease-out, transform 0.25s ease-out;\\n}\\n.styles-module__cycleDot___nPgLY.styles-module__active___-zoN6 {\\n background: #fff;\\n transform: scale(1);\\n}\\n.styles-module__cycleDot___nPgLY.styles-module__light___r6n4Y {\\n background: rgba(0, 0, 0, 0.2);\\n}\\n.styles-module__cycleDot___nPgLY.styles-module__light___r6n4Y.styles-module__active___-zoN6 {\\n background: rgba(0, 0, 0, 0.7);\\n}\\n\\n.styles-module__dropdownMenu___k73ER {\\n position: absolute;\\n right: 0;\\n top: calc(100% + 0.25rem);\\n background: #1a1a1a;\\n border-radius: 0.5rem;\\n padding: 0.25rem;\\n min-width: 120px;\\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(255, 255, 255, 0.1);\\n z-index: 10;\\n animation: styles-module__scaleIn___c-r1K 0.15s ease-out;\\n}\\n\\n.styles-module__dropdownItem___ylsLj {\\n width: 100%;\\n display: flex;\\n align-items: center;\\n padding: 0.5rem 0.625rem;\\n border: none;\\n border-radius: 0.375rem;\\n background: transparent;\\n font-size: 0.8125rem;\\n font-weight: 500;\\n color: rgba(255, 255, 255, 0.85);\\n cursor: pointer;\\n text-align: left;\\n transition: background-color 0.15s ease, color 0.15s ease;\\n letter-spacing: -0.0094em;\\n}\\n.styles-module__dropdownItem___ylsLj:hover {\\n background: rgba(255, 255, 255, 0.08);\\n}\\n.styles-module__dropdownItem___ylsLj.styles-module__selected___OwRqP {\\n background: rgba(255, 255, 255, 0.12);\\n color: #fff;\\n font-weight: 600;\\n}\\n\\n.styles-module__settingsLabel___8UjfX {\\n font-size: 0.8125rem;\\n font-weight: 400;\\n letter-spacing: -0.0094em;\\n color: rgba(255, 255, 255, 0.5);\\n display: flex;\\n align-items: center;\\n gap: 0.125rem;\\n}\\n.styles-module__settingsLabel___8UjfX.styles-module__light___r6n4Y {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n\\n.styles-module__settingsLabelMarker___ewdtV {\\n margin-bottom: 10px;\\n}\\n\\n.styles-module__settingsOptions___LyrBA {\\n display: flex;\\n gap: 0.25rem;\\n}\\n\\n.styles-module__settingsOption___UNa12 {\\n flex: 1;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n gap: 0.25rem;\\n padding: 0.375rem 0.5rem;\\n border: none;\\n border-radius: 0.375rem;\\n background: transparent;\\n font-size: 0.6875rem;\\n font-weight: 500;\\n color: rgba(0, 0, 0, 0.7);\\n cursor: pointer;\\n transition: background-color 0.15s ease, color 0.15s ease;\\n}\\n.styles-module__settingsOption___UNa12:hover {\\n background: rgba(0, 0, 0, 0.05);\\n}\\n.styles-module__settingsOption___UNa12.styles-module__selected___OwRqP {\\n background: rgba(60, 130, 247, 0.15);\\n color: #3c82f7;\\n}\\n\\n.styles-module__sliderContainer___ducXj {\\n display: flex;\\n flex-direction: column;\\n gap: 0.5rem;\\n}\\n\\n.styles-module__slider___GLdxp {\\n -webkit-appearance: none;\\n appearance: none;\\n width: 100%;\\n height: 4px;\\n background: rgba(255, 255, 255, 0.15);\\n border-radius: 2px;\\n outline: none;\\n cursor: pointer;\\n}\\n.styles-module__slider___GLdxp::-webkit-slider-thumb {\\n -webkit-appearance: none;\\n appearance: none;\\n width: 14px;\\n height: 14px;\\n background: white;\\n border-radius: 50%;\\n cursor: pointer;\\n transition: transform 0.15s ease, box-shadow 0.15s ease;\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);\\n}\\n.styles-module__slider___GLdxp::-moz-range-thumb {\\n width: 14px;\\n height: 14px;\\n background: white;\\n border: none;\\n border-radius: 50%;\\n cursor: pointer;\\n transition: transform 0.15s ease, box-shadow 0.15s ease;\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);\\n}\\n.styles-module__slider___GLdxp:hover::-webkit-slider-thumb {\\n transform: scale(1.15);\\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.4);\\n}\\n.styles-module__slider___GLdxp:hover::-moz-range-thumb {\\n transform: scale(1.15);\\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.4);\\n}\\n\\n.styles-module__sliderLabels___FhLDB {\\n display: flex;\\n justify-content: space-between;\\n}\\n\\n.styles-module__sliderLabel___U8sPr {\\n font-size: 0.625rem;\\n font-weight: 500;\\n color: rgba(255, 255, 255, 0.4);\\n cursor: pointer;\\n transition: color 0.15s ease;\\n}\\n.styles-module__sliderLabel___U8sPr:hover {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.styles-module__sliderLabel___U8sPr.styles-module__active___-zoN6 {\\n color: rgba(255, 255, 255, 0.9);\\n}\\n\\n.styles-module__colorOptions___iHCNX {\\n display: flex;\\n gap: 0.5rem;\\n margin-top: 0.375rem;\\n margin-bottom: 1px;\\n}\\n\\n.styles-module__colorOption___IodiY {\\n display: block;\\n width: 20px;\\n height: 20px;\\n border-radius: 50%;\\n border: 2px solid transparent;\\n cursor: pointer;\\n transition: transform 0.2s cubic-bezier(0.25, 1, 0.5, 1);\\n}\\n.styles-module__colorOption___IodiY:hover {\\n transform: scale(1.15);\\n}\\n.styles-module__colorOption___IodiY.styles-module__selected___OwRqP {\\n transform: scale(0.83);\\n}\\n\\n.styles-module__colorOptionRing___U2xpo {\\n display: flex;\\n width: 24px;\\n height: 24px;\\n border: 2px solid transparent;\\n border-radius: 50%;\\n transition: border-color 0.3s ease;\\n}\\n.styles-module__settingsToggle___fBrFn {\\n display: flex;\\n align-items: center;\\n gap: 0.5rem;\\n cursor: pointer;\\n}\\n.styles-module__settingsToggle___fBrFn + .styles-module__settingsToggle___fBrFn {\\n margin-top: calc(0.5rem + 6px);\\n}\\n.styles-module__settingsToggle___fBrFn input[type=checkbox] {\\n position: absolute;\\n opacity: 0;\\n width: 0;\\n height: 0;\\n}\\n\\n.styles-module__customCheckbox___U39ax {\\n position: relative;\\n width: 14px;\\n height: 14px;\\n border: 1px solid rgba(255, 255, 255, 0.2);\\n border-radius: 4px;\\n background: rgba(255, 255, 255, 0.05);\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n flex-shrink: 0;\\n transition: background 0.25s ease, border-color 0.25s ease;\\n}\\n.styles-module__customCheckbox___U39ax svg {\\n color: #1a1a1a;\\n opacity: 1;\\n transition: opacity 0.15s ease;\\n}\\ninput[type=checkbox]:checked + .styles-module__customCheckbox___U39ax {\\n border-color: rgba(255, 255, 255, 0.3);\\n background: rgb(255, 255, 255);\\n}\\n.styles-module__customCheckbox___U39ax.styles-module__light___r6n4Y {\\n border: 1px solid rgba(0, 0, 0, 0.15);\\n background: #fff;\\n}\\n.styles-module__customCheckbox___U39ax.styles-module__light___r6n4Y.styles-module__checked___mnZLo {\\n border-color: #1a1a1a;\\n background: #1a1a1a;\\n}\\n.styles-module__customCheckbox___U39ax.styles-module__light___r6n4Y.styles-module__checked___mnZLo svg {\\n color: #fff;\\n}\\n\\n.styles-module__toggleLabel___Xm8Aa {\\n font-size: 0.8125rem;\\n font-weight: 400;\\n color: rgba(255, 255, 255, 0.5);\\n letter-spacing: -0.0094em;\\n display: flex;\\n align-items: center;\\n gap: 0.25rem;\\n}\\n.styles-module__toggleLabel___Xm8Aa.styles-module__light___r6n4Y {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n\\n.styles-module__helpIcon___xQg56 {\\n position: relative;\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n cursor: help;\\n margin-left: 0;\\n}\\n.styles-module__helpIcon___xQg56 svg {\\n display: block;\\n transform: translateY(1px);\\n color: rgba(255, 255, 255, 0.4);\\n transition: color 0.15s ease;\\n}\\n.styles-module__helpIcon___xQg56:hover svg {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.styles-module__helpIcon___xQg56::after {\\n content: attr(data-tooltip);\\n position: absolute;\\n right: calc(100% + 8px);\\n top: 50%;\\n transform: translateY(-50%);\\n padding: 8px 10px;\\n background: #383838;\\n color: rgba(255, 255, 255, 0.7);\\n font-size: 11px;\\n font-weight: 400;\\n line-height: 1.4;\\n border-radius: 10px;\\n white-space: normal;\\n width: 152px;\\n text-align: left;\\n opacity: 0;\\n visibility: hidden;\\n transition: opacity 0.15s ease, visibility 0.15s ease;\\n pointer-events: none;\\n z-index: 100;\\n box-shadow: 0px 1px 8px rgba(0, 0, 0, 0.28);\\n}\\n.styles-module__helpIcon___xQg56:hover::after {\\n opacity: 1;\\n visibility: visible;\\n transition-delay: 0.5s;\\n}\\n\\n.styles-module__dragSelection___kZLq2 {\\n position: fixed;\\n top: 0;\\n left: 0;\\n border: 2px solid rgba(52, 199, 89, 0.6);\\n border-radius: 4px;\\n background: rgba(52, 199, 89, 0.08);\\n pointer-events: none;\\n z-index: 99997;\\n will-change: transform, width, height;\\n contain: layout style;\\n}\\n\\n.styles-module__dragCount___KM90j {\\n position: absolute;\\n top: 50%;\\n left: 50%;\\n transform: translate(-50%, -50%);\\n background: #34c759;\\n color: white;\\n font-size: 0.875rem;\\n font-weight: 600;\\n padding: 0.25rem 0.5rem;\\n border-radius: 1rem;\\n min-width: 1.5rem;\\n text-align: center;\\n}\\n\\n.styles-module__highlightsContainer___-0xzG {\\n position: fixed;\\n top: 0;\\n left: 0;\\n pointer-events: none;\\n z-index: 99996;\\n}\\n\\n.styles-module__selectedElementHighlight___fyVlI {\\n position: fixed;\\n top: 0;\\n left: 0;\\n border: 2px solid rgba(52, 199, 89, 0.5);\\n border-radius: 4px;\\n background: rgba(52, 199, 89, 0.06);\\n pointer-events: none;\\n will-change: transform, width, height;\\n contain: layout style;\\n}\\n\\n.styles-module__light___r6n4Y.styles-module__toolbarContainer___dIhma {\\n background: #fff;\\n color: rgba(0, 0, 0, 0.85);\\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08), 0 4px 16px rgba(0, 0, 0, 0.06), 0 0 0 1px rgba(0, 0, 0, 0.04);\\n}\\n.styles-module__light___r6n4Y.styles-module__toolbarContainer___dIhma.styles-module__collapsed___Rydsn:hover {\\n background: #f5f5f5;\\n}\\n.styles-module__light___r6n4Y.styles-module__controlButton___8Q0jc {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n.styles-module__light___r6n4Y.styles-module__controlButton___8Q0jc:hover:not(:disabled) {\\n background: rgba(0, 0, 0, 0.06);\\n color: rgba(0, 0, 0, 0.85);\\n}\\n.styles-module__light___r6n4Y.styles-module__controlButton___8Q0jc[data-active=true] {\\n color: #3c82f7;\\n background: rgba(60, 130, 247, 0.15);\\n}\\n.styles-module__light___r6n4Y.styles-module__controlButton___8Q0jc[data-danger]:hover:not(:disabled) {\\n background: rgba(255, 59, 48, 0.15);\\n color: #ff3b30;\\n}\\n.styles-module__light___r6n4Y.styles-module__divider___c--s1 {\\n background: rgba(0, 0, 0, 0.1);\\n}\\n.styles-module__light___r6n4Y.styles-module__markerTooltip___aLJID {\\n background: #fff;\\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(0, 0, 0, 0.06);\\n}\\n.styles-module__light___r6n4Y.styles-module__markerTooltip___aLJID .styles-module__markerQuote___FHmrz {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n.styles-module__light___r6n4Y.styles-module__markerTooltip___aLJID .styles-module__markerNote___QkrrS {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n.styles-module__light___r6n4Y.styles-module__markerTooltip___aLJID .styles-module__markerHint___2iF-6 {\\n color: rgba(0, 0, 0, 0.35);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y {\\n background: #fff;\\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08), 0 4px 16px rgba(0, 0, 0, 0.06), 0 0 0 1px rgba(0, 0, 0, 0.04);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__settingsHeader___pwDY9 {\\n border-bottom-color: rgba(0, 0, 0, 0.08);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__settingsBrand___0gJeM {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__settingsBrandSlash___uTG18 {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__settingsVersion___TUcFq {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__settingsSection___m-YM2 {\\n border-top-color: rgba(0, 0, 0, 0.08);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__settingsLabel___8UjfX {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__cycleButton___FMKfw {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__cycleDot___nPgLY {\\n background: rgba(0, 0, 0, 0.2);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__cycleDot___nPgLY.styles-module__active___-zoN6 {\\n background: rgba(0, 0, 0, 0.7);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__dropdownButton___16NPz {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__dropdownButton___16NPz:hover {\\n background: rgba(0, 0, 0, 0.05);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__toggleLabel___Xm8Aa {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__customCheckbox___U39ax {\\n border: 1px solid rgba(0, 0, 0, 0.15);\\n background: #fff;\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__customCheckbox___U39ax.styles-module__checked___mnZLo {\\n border-color: #1a1a1a;\\n background: #1a1a1a;\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__customCheckbox___U39ax.styles-module__checked___mnZLo svg {\\n color: #fff;\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__sliderLabel___U8sPr {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__sliderLabel___U8sPr:hover {\\n color: rgba(0, 0, 0, 0.7);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__sliderLabel___U8sPr.styles-module__active___-zoN6 {\\n color: rgba(0, 0, 0, 0.9);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__slider___GLdxp {\\n background: rgba(0, 0, 0, 0.1);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__slider___GLdxp::-webkit-slider-thumb {\\n background: #1a1a1a;\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__slider___GLdxp::-moz-range-thumb {\\n background: #1a1a1a;\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__helpIcon___xQg56 svg {\\n color: rgba(0, 0, 0, 0.6);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__helpIcon___xQg56:hover svg {\\n color: rgba(0, 0, 0, 0.7);\\n}\\n\\n.styles-module__themeToggle___2rUjA {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 22px;\\n height: 22px;\\n margin-left: 0.5rem;\\n border: none;\\n border-radius: 6px;\\n background: transparent;\\n color: rgba(255, 255, 255, 0.4);\\n cursor: pointer;\\n transition: background-color 0.15s ease, color 0.15s ease;\\n}\\n.styles-module__themeToggle___2rUjA:hover {\\n background: rgba(255, 255, 255, 0.1);\\n color: rgba(255, 255, 255, 0.8);\\n}\\n.styles-module__light___r6n4Y .styles-module__themeToggle___2rUjA {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n.styles-module__light___r6n4Y .styles-module__themeToggle___2rUjA:hover {\\n background: rgba(0, 0, 0, 0.06);\\n color: rgba(0, 0, 0, 0.7);\\n}\";\nconst classNames = {\"toolbar\":\"styles-module__toolbar___wNsdK\",\"toolbarContainer\":\"styles-module__toolbarContainer___dIhma\",\"dragging\":\"styles-module__dragging___xrolZ\",\"entrance\":\"styles-module__entrance___sgHd8\",\"toolbarEnter\":\"styles-module__toolbarEnter___u8RRu\",\"collapsed\":\"styles-module__collapsed___Rydsn\",\"expanded\":\"styles-module__expanded___ofKPx\",\"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\",\"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\",\"markersLayer\":\"styles-module__markersLayer___-25j1\",\"fixedMarkersLayer\":\"styles-module__fixedMarkersLayer___ffyX6\",\"marker\":\"styles-module__marker___6sQrs\",\"clearing\":\"styles-module__clearing___FQ--7\",\"markerIn\":\"styles-module__markerIn___5FaAP\",\"markerOut\":\"styles-module__markerOut___GU5jX\",\"pending\":\"styles-module__pending___2IHLC\",\"fixed\":\"styles-module__fixed___dBMHC\",\"multiSelect\":\"styles-module__multiSelect___YWiuz\",\"hovered\":\"styles-module__hovered___ZgXIy\",\"renumber\":\"styles-module__renumber___nCTxD\",\"renumberRoll\":\"styles-module__renumberRoll___Wgbq3\",\"markerTooltip\":\"styles-module__markerTooltip___aLJID\",\"tooltipIn\":\"styles-module__tooltipIn___0N31w\",\"markerQuote\":\"styles-module__markerQuote___FHmrz\",\"markerNote\":\"styles-module__markerNote___QkrrS\",\"markerHint\":\"styles-module__markerHint___2iF-6\",\"settingsPanel\":\"styles-module__settingsPanel___OxX3Y\",\"settingsHeader\":\"styles-module__settingsHeader___pwDY9\",\"settingsBrand\":\"styles-module__settingsBrand___0gJeM\",\"settingsBrandSlash\":\"styles-module__settingsBrandSlash___uTG18\",\"settingsVersion\":\"styles-module__settingsVersion___TUcFq\",\"settingsSection\":\"styles-module__settingsSection___m-YM2\",\"settingsLabel\":\"styles-module__settingsLabel___8UjfX\",\"cycleButton\":\"styles-module__cycleButton___FMKfw\",\"cycleDot\":\"styles-module__cycleDot___nPgLY\",\"dropdownButton\":\"styles-module__dropdownButton___16NPz\",\"toggleLabel\":\"styles-module__toggleLabel___Xm8Aa\",\"customCheckbox\":\"styles-module__customCheckbox___U39ax\",\"sliderLabel\":\"styles-module__sliderLabel___U8sPr\",\"slider\":\"styles-module__slider___GLdxp\",\"helpIcon\":\"styles-module__helpIcon___xQg56\",\"themeToggle\":\"styles-module__themeToggle___2rUjA\",\"dark\":\"styles-module__dark___ILIQf\",\"settingsOption\":\"styles-module__settingsOption___UNa12\",\"selected\":\"styles-module__selected___OwRqP\",\"settingsRow\":\"styles-module__settingsRow___3sdhc\",\"dropdownContainer\":\"styles-module__dropdownContainer___BVnxe\",\"light\":\"styles-module__light___r6n4Y\",\"cycleButtonText\":\"styles-module__cycleButtonText___fD1LR\",\"cycleTextIn\":\"styles-module__cycleTextIn___Q6zJf\",\"cycleDots\":\"styles-module__cycleDots___LWuoQ\",\"active\":\"styles-module__active___-zoN6\",\"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\",\"checked\":\"styles-module__checked___mnZLo\",\"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\",\"settingsPanelIn\":\"styles-module__settingsPanelIn___MGfO8\",\"settingsPanelOut\":\"styles-module__settingsPanelOut___Zfymi\"};\n\n// SSR-safe style injection\nif (typeof document !== 'undefined') {\n let style = document.getElementById('feedback-tool-styles-page-toolbar-css-styles');\n if (!style) {\n style = document.createElement('style');\n style.id = 'feedback-tool-styles-page-toolbar-css-styles';\n style.textContent = css;\n document.head.appendChild(style);\n }\n}\n\nexport default classNames;\n","\"use client\";\n\nimport { useState, useRef, useEffect, useCallback, forwardRef, useImperativeHandle } from \"react\";\nimport { motion, AnimatePresence, useAnimation } from \"framer-motion\";\nimport styles from \"./styles.module.scss\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface AnnotationPopupProps {\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 /** Called when annotation is submitted with text */\n onSubmit: (text: string) => void;\n /** Called when popup is cancelled/dismissed */\n onCancel: () => void;\n /** Position styles (left, top) */\n style?: React.CSSProperties;\n /** Color variant for submit button */\n variant?: \"blue\" | \"green\";\n}\n\nexport interface AnnotationPopupHandle {\n /** Shake the popup (e.g., when user clicks outside) */\n shake: () => void;\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\nexport const AnnotationPopup = forwardRef<AnnotationPopupHandle, AnnotationPopupProps>(\n function AnnotationPopup(\n {\n element,\n timestamp,\n selectedText,\n placeholder = \"What should change?\",\n onSubmit,\n onCancel,\n style,\n variant = \"blue\",\n },\n ref\n ) {\n const [text, setText] = useState(\"\");\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const controls = useAnimation();\n\n // Animate in on mount and focus textarea\n useEffect(() => {\n controls.start({ opacity: 1, scale: 1, y: 0 });\n const timer = setTimeout(() => {\n const textarea = textareaRef.current;\n if (textarea) {\n textarea.focus();\n textarea.selectionStart = textarea.selectionEnd = textarea.value.length;\n textarea.scrollTop = textarea.scrollHeight;\n }\n }, 10);\n return () => clearTimeout(timer);\n }, [controls]);\n\n // Shake animation - subtle shake for the popup container\n const shake = useCallback(async () => {\n await controls.start({\n x: [0, -3, 3, -2, 2, 0],\n transition: { duration: 0.25, ease: \"easeOut\" },\n });\n textareaRef.current?.focus();\n }, [controls]);\n\n // Expose shake to parent via ref (for click-outside behavior)\n useImperativeHandle(ref, () => ({\n shake,\n }), [shake]);\n\n // Handle submit - only submits if there's text\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) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n if (e.key === \"Escape\") {\n // Escape always closes\n onCancel();\n }\n },\n [handleSubmit, onCancel]\n );\n\n return (\n <motion.div\n className={styles.popup}\n data-annotation-popup\n initial={{ opacity: 0, scale: 0.95, y: 4 }}\n animate={controls}\n exit={{ opacity: 0, scale: 0.95, y: 4 }}\n transition={{ type: \"spring\", stiffness: 500, damping: 35 }}\n style={style}\n onClick={(e) => e.stopPropagation()}\n >\n <div className={styles.header}>\n <span className={styles.element}>{element}</span>\n {timestamp && <span className={styles.timestamp}>{timestamp}</span>}\n </div>\n\n {selectedText && (\n <div className={styles.quote}>\n &ldquo;{selectedText.slice(0, 80)}\n {selectedText.length > 80 ? \"...\" : \"\"}&rdquo;\n </div>\n )}\n\n <textarea\n ref={textareaRef}\n className={`${styles.textarea} ${variant === \"green\" ? styles.green : \"\"}`}\n placeholder={placeholder}\n value={text}\n onChange={(e) => setText(e.target.value)}\n rows={2}\n onKeyDown={handleKeyDown}\n />\n\n <div className={styles.actions}>\n <button className={styles.cancel} onClick={onCancel}>\n Cancel\n </button>\n <button\n className={`${styles.submit} ${variant === \"green\" ? styles.green : \"\"}`}\n onClick={handleSubmit}\n disabled={!text.trim()}\n >\n Add\n </button>\n </div>\n </motion.div>\n );\n }\n);\n\n// =============================================================================\n// Wrapper for AnimatePresence (convenience export)\n// =============================================================================\n\nexport function AnnotationPopupPresence({\n isOpen,\n ...props\n}: AnnotationPopupProps & { isOpen: boolean }) {\n return (\n <AnimatePresence>\n {isOpen && <AnnotationPopup {...props} />}\n </AnimatePresence>\n );\n}\n\nexport default AnnotationPopup;\n","\nconst css = \".styles-module__popup___MBQDV {\\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: 99999;\\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, sans-serif;\\n}\\n\\n.styles-module__header___1q-wa {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n margin-bottom: 0.5rem;\\n}\\n\\n.styles-module__element___tPxVO {\\n font-size: 0.75rem;\\n font-weight: 500;\\n color: rgba(255, 255, 255, 0.65);\\n max-width: 100%;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n flex: 1;\\n}\\n\\n.styles-module__timestamp___t7PEZ {\\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___uFJyr {\\n font-size: 0.6875rem;\\n font-style: italic;\\n color: rgba(255, 255, 255, 0.5);\\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___Pw6C4 {\\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___Pw6C4:focus {\\n border-color: #3c82f7;\\n}\\n.styles-module__textarea___Pw6C4.styles-module__green___zdmke:focus {\\n border-color: #34C759;\\n}\\n.styles-module__textarea___Pw6C4::placeholder {\\n color: rgba(255, 255, 255, 0.35);\\n}\\n.styles-module__textarea___Pw6C4::-webkit-scrollbar {\\n width: 6px;\\n}\\n.styles-module__textarea___Pw6C4::-webkit-scrollbar-track {\\n background: transparent;\\n}\\n.styles-module__textarea___Pw6C4::-webkit-scrollbar-thumb {\\n background: rgba(255, 255, 255, 0.2);\\n border-radius: 3px;\\n}\\n\\n.styles-module__actions___bxQCu {\\n display: flex;\\n justify-content: flex-end;\\n gap: 0.375rem;\\n margin-top: 0.5rem;\\n}\\n\\n.styles-module__cancel___-xAEc,\\n.styles-module__submit___nnXO9 {\\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: all 0.15s ease;\\n}\\n\\n.styles-module__cancel___-xAEc {\\n background: transparent;\\n color: rgba(255, 255, 255, 0.5);\\n}\\n.styles-module__cancel___-xAEc:hover {\\n background: rgba(255, 255, 255, 0.1);\\n color: rgba(255, 255, 255, 0.8);\\n}\\n\\n.styles-module__submit___nnXO9 {\\n background: #3c82f7;\\n color: white;\\n}\\n.styles-module__submit___nnXO9:hover:not(:disabled) {\\n background: #2d6fdf;\\n}\\n.styles-module__submit___nnXO9:disabled {\\n opacity: 0.4;\\n cursor: not-allowed;\\n}\\n.styles-module__submit___nnXO9.styles-module__green___zdmke {\\n background: #34C759;\\n}\\n.styles-module__submit___nnXO9.styles-module__green___zdmke:hover:not(:disabled) {\\n background: #2db84d;\\n}\";\nconst classNames = {\"popup\":\"styles-module__popup___MBQDV\",\"header\":\"styles-module__header___1q-wa\",\"element\":\"styles-module__element___tPxVO\",\"timestamp\":\"styles-module__timestamp___t7PEZ\",\"quote\":\"styles-module__quote___uFJyr\",\"textarea\":\"styles-module__textarea___Pw6C4\",\"green\":\"styles-module__green___zdmke\",\"actions\":\"styles-module__actions___bxQCu\",\"cancel\":\"styles-module__cancel___-xAEc\",\"submit\":\"styles-module__submit___nnXO9\"};\n\n// SSR-safe style injection\nif (typeof document !== 'undefined') {\n let style = document.getElementById('feedback-tool-styles-annotation-popup-styles');\n if (!style) {\n style = document.createElement('style');\n style.id = 'feedback-tool-styles-annotation-popup-styles';\n style.textContent = css;\n document.head.appendChild(style);\n }\n}\n\nexport default classNames;\n"],"mappings":"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","names":["import_react","AnnotationPopupCSS","import_jsx_runtime","css","classNames","styles_module_default","import_jsx_runtime","left","top","styles_module_default","DRAG_THRESHOLD","import_react","css","classNames","styles_module_default","import_jsx_runtime","AnnotationPopup","styles_module_default"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/components/page-toolbar-css/index.tsx","../src/components/annotation-popup-css/index.tsx","../src/components/annotation-popup-css/styles.module.scss","../src/components/icons.tsx","../src/utils/element-identification.ts","../src/utils/storage.ts","../src/components/page-toolbar-css/styles.module.scss"],"sourcesContent":["// =============================================================================\n// Agentation\n// =============================================================================\n//\n// A floating toolbar for annotating web pages and collecting structured feedback\n// for AI coding agents.\n//\n// Usage:\n// import { Agentation } from 'agentation';\n// <Agentation />\n//\n// =============================================================================\n\n// Main components\n// CSS-only version (default - zero runtime deps)\nexport { PageFeedbackToolbarCSS as Agentation } from \"./components/page-toolbar-css\";\nexport { PageFeedbackToolbarCSS } from \"./components/page-toolbar-css\";\nexport type { DemoAnnotation } from \"./components/page-toolbar-css\";\n\n// Shared components (for building custom UIs)\nexport { AnnotationPopupCSS } from \"./components/annotation-popup-css\";\nexport type {\n AnnotationPopupCSSProps,\n AnnotationPopupCSSHandle,\n} from \"./components/annotation-popup-css\";\n\n// Icons (same for both versions - they're pure SVG)\nexport * from \"./components/icons\";\n\n// Utilities (for building custom UIs)\nexport {\n identifyElement,\n identifyAnimationElement,\n getElementPath,\n getNearbyText,\n getElementClasses,\n} from \"./utils/element-identification\";\n\nexport {\n loadAnnotations,\n saveAnnotations,\n getStorageKey,\n} from \"./utils/storage\";\n\n// Types\nexport type { Annotation } from \"./types\";\n","\"use client\";\n\nimport { useState, useCallback, useEffect, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport {\n AnnotationPopupCSS,\n AnnotationPopupCSSHandle,\n} from \"../annotation-popup-css\";\nimport {\n IconListSparkle,\n IconPlayAlt,\n IconPauseAlt,\n IconClose,\n IconPlus,\n IconGear,\n IconCheck,\n IconCheckSmall,\n IconCheckSmallAnimated,\n IconHelp,\n AnimatedBunny,\n IconEye,\n IconEyeMinus,\n IconCopyAlt,\n IconCopyAnimated,\n IconTrashAlt,\n IconXmark,\n IconCheckmark,\n IconCheckmarkLarge,\n IconCheckmarkCircle,\n IconPause,\n IconEyeAnimated,\n IconPausePlayAnimated,\n IconSun,\n IconMoon,\n IconXmarkLarge,\n} from \"../icons\";\nimport {\n identifyElement,\n getNearbyText,\n getElementClasses,\n getDetailedComputedStyles,\n getFullElementPath,\n getAccessibilityInfo,\n getNearbyElements,\n} from \"../../utils/element-identification\";\nimport {\n loadAnnotations,\n saveAnnotations,\n getStorageKey,\n} from \"../../utils/storage\";\n\nimport type { Annotation } from \"../../types\";\nimport styles from \"./styles.module.scss\";\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 elementPath: string;\n rect: DOMRect | null;\n};\n\ntype OutputDetailLevel = \"compact\" | \"standard\" | \"detailed\" | \"forensic\";\n\ntype ToolbarSettings = {\n outputDetail: OutputDetailLevel;\n autoClearAfterCopy: boolean;\n annotationColor: string;\n blockInteractions: boolean;\n};\n\nconst DEFAULT_SETTINGS: ToolbarSettings = {\n outputDetail: \"standard\",\n autoClearAfterCopy: false,\n annotationColor: \"#3c82f7\",\n blockInteractions: false,\n};\n\nconst OUTPUT_DETAIL_OPTIONS: { value: OutputDetailLevel; label: string }[] = [\n { value: \"compact\", label: \"Compact\" },\n { value: \"standard\", label: \"Standard\" },\n { value: \"detailed\", label: \"Detailed\" },\n { value: \"forensic\", label: \"Forensic\" },\n];\n\nconst COLOR_OPTIONS = [\n { value: \"#AF52DE\", label: \"Purple\" },\n { value: \"#3c82f7\", label: \"Blue\" },\n { value: \"#5AC8FA\", label: \"Cyan\" },\n { value: \"#34C759\", label: \"Green\" },\n { value: \"#FFD60A\", label: \"Yellow\" },\n { value: \"#FF9500\", label: \"Orange\" },\n { value: \"#FF3B30\", label: \"Red\" },\n];\n\n// =============================================================================\n// Utils\n// =============================================================================\n\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 getActiveButtonStyle(\n isActive: boolean,\n color: string,\n): React.CSSProperties | undefined {\n if (!isActive) return undefined;\n return {\n color: color,\n backgroundColor: hexToRgba(color, 0.25),\n };\n}\n\nfunction generateOutput(\n annotations: Annotation[],\n pathname: string,\n detailLevel: OutputDetailLevel = \"standard\",\n): string {\n if (annotations.length === 0) return \"\";\n\n const viewport =\n typeof window !== \"undefined\"\n ? `${window.innerWidth}×${window.innerHeight}`\n : \"unknown\";\n\n let output = `## Page Feedback: ${pathname}\\n`;\n\n if (detailLevel === \"forensic\") {\n // Full environment info for forensic mode\n output += `\\n**Environment:**\\n`;\n output += `- Viewport: ${viewport}\\n`;\n if (typeof window !== \"undefined\") {\n output += `- URL: ${window.location.href}\\n`;\n output += `- User Agent: ${navigator.userAgent}\\n`;\n output += `- Timestamp: ${new Date().toISOString()}\\n`;\n output += `- Device Pixel Ratio: ${window.devicePixelRatio}\\n`;\n }\n output += `\\n---\\n`;\n } else if (detailLevel !== \"compact\") {\n output += `**Viewport:** ${viewport}\\n`;\n }\n output += \"\\n\";\n\n annotations.forEach((a, i) => {\n if (detailLevel === \"compact\") {\n output += `${i + 1}. **${a.element}**: ${a.comment}`;\n if (a.selectedText) {\n output += ` (re: \"${a.selectedText.slice(0, 30)}${a.selectedText.length > 30 ? \"...\" : \"\"}\")`;\n }\n output += \"\\n\";\n } else if (detailLevel === \"forensic\") {\n // Forensic mode - order matches output page example\n output += `### ${i + 1}. ${a.element}\\n`;\n if (a.isMultiSelect && a.fullPath) {\n output += `*Forensic data shown for first element of selection*\\n`;\n }\n if (a.fullPath) {\n output += `**Full DOM Path:** ${a.fullPath}\\n`;\n }\n if (a.cssClasses) {\n output += `**CSS Classes:** ${a.cssClasses}\\n`;\n }\n if (a.boundingBox) {\n output += `**Position:** x:${Math.round(a.boundingBox.x)}, y:${Math.round(a.boundingBox.y)} (${Math.round(a.boundingBox.width)}×${Math.round(a.boundingBox.height)}px)\\n`;\n }\n output += `**Annotation at:** ${a.x.toFixed(1)}% from left, ${Math.round(a.y)}px from top\\n`;\n if (a.selectedText) {\n output += `**Selected text:** \"${a.selectedText}\"\\n`;\n }\n if (a.nearbyText && !a.selectedText) {\n output += `**Context:** ${a.nearbyText.slice(0, 100)}\\n`;\n }\n if (a.computedStyles) {\n output += `**Computed Styles:** ${a.computedStyles}\\n`;\n }\n if (a.accessibility) {\n output += `**Accessibility:** ${a.accessibility}\\n`;\n }\n if (a.nearbyElements) {\n output += `**Nearby Elements:** ${a.nearbyElements}\\n`;\n }\n 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 (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\ntype PageFeedbackToolbarCSSProps = {\n demoAnnotations?: DemoAnnotation[];\n demoDelay?: number;\n enableDemoMode?: boolean;\n};\n\n// =============================================================================\n// Component\n// =============================================================================\n\nexport function PageFeedbackToolbarCSS({\n demoAnnotations,\n demoDelay = 1000,\n enableDemoMode = false,\n}: PageFeedbackToolbarCSSProps = {}) {\n const [isActive, setIsActive] = useState(false);\n const [annotations, setAnnotations] = useState<Annotation[]>([]);\n const [showMarkers, setShowMarkers] = useState(true);\n\n // Unified marker visibility state - controls both toolbar and eye toggle\n const [markersVisible, setMarkersVisible] = useState(false);\n const [markersExiting, setMarkersExiting] = useState(false);\n const [hoverInfo, setHoverInfo] = useState<HoverInfo | null>(null);\n const [hoverPosition, setHoverPosition] = useState({ x: 0, y: 0 });\n const [pendingAnnotation, setPendingAnnotation] = useState<{\n x: number;\n y: number;\n clientY: number;\n element: string;\n elementPath: string;\n selectedText?: string;\n boundingBox?: { x: number; y: number; width: number; height: number };\n nearbyText?: string;\n cssClasses?: string;\n isMultiSelect?: boolean;\n isFixed?: boolean;\n fullPath?: string;\n accessibility?: string;\n computedStyles?: string;\n nearbyElements?: string;\n } | null>(null);\n const [copied, setCopied] = useState(false);\n const [cleared, setCleared] = useState(false);\n const [isClearing, setIsClearing] = useState(false);\n const [hoveredMarkerId, setHoveredMarkerId] = useState<string | null>(null);\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 [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 [settings, setSettings] = useState<ToolbarSettings>(DEFAULT_SETTINGS);\n const [isDarkMode, setIsDarkMode] = useState(true);\n const [showEntranceAnimation, setShowEntranceAnimation] = useState(false);\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 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 const timer = setTimeout(() => 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 = setTimeout(() => {\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 = setTimeout(() => {\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);\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 setTimeout(() => setShowEntranceAnimation(false), 750);\n }\n\n try {\n const storedSettings = localStorage.getItem(\"feedback-toolbar-settings\");\n if (storedSettings) {\n setSettings({ ...DEFAULT_SETTINGS, ...JSON.parse(storedSettings) });\n }\n } catch (e) {\n // Ignore parsing errors\n }\n\n // Load saved theme preference, default to dark mode\n try {\n const savedTheme = localStorage.getItem(\"feedback-toolbar-theme\");\n if (savedTheme !== null) {\n setIsDarkMode(savedTheme === \"dark\");\n }\n // If no saved preference, keep default (dark mode)\n } catch (e) {\n // Ignore localStorage errors\n }\n }, [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 // 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 setTimeout(() => {\n setIsActive(true);\n }, demoDelay - 200),\n );\n\n demoAnnotations.forEach((demo, index) => {\n const annotationDelay = demoDelay + index * 300;\n\n timeoutIds.push(\n setTimeout(() => {\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 = setTimeout(() => {\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\n useEffect(() => {\n if (mounted && annotations.length > 0) {\n saveAnnotations(pathname, annotations);\n } else if (mounted && annotations.length === 0) {\n localStorage.removeItem(getStorageKey(pathname));\n }\n }, [annotations, pathname, mounted]);\n\n // Freeze animations\n const freezeAnimations = useCallback(() => {\n if (isFrozen) return;\n\n const style = document.createElement(\"style\");\n style.id = \"feedback-freeze-styles\";\n style.textContent = `\n *:not([data-feedback-toolbar]):not([data-feedback-toolbar] *):not([data-annotation-popup]):not([data-annotation-popup] *):not([data-annotation-marker]):not([data-annotation-marker] *),\n *:not([data-feedback-toolbar]):not([data-feedback-toolbar] *):not([data-annotation-popup]):not([data-annotation-popup] *):not([data-annotation-marker]):not([data-annotation-marker] *)::before,\n *:not([data-feedback-toolbar]):not([data-feedback-toolbar] *):not([data-annotation-popup]):not([data-annotation-popup] *):not([data-annotation-marker]):not([data-annotation-marker] *)::after {\n animation-play-state: paused !important;\n transition: none !important;\n }\n `;\n document.head.appendChild(style);\n\n document.querySelectorAll(\"video\").forEach((video) => {\n if (!video.paused) {\n video.dataset.wasPaused = \"false\";\n video.pause();\n }\n });\n\n setIsFrozen(true);\n }, [isFrozen]);\n\n // Unfreeze animations\n const unfreezeAnimations = useCallback(() => {\n if (!isFrozen) return;\n\n const style = document.getElementById(\"feedback-freeze-styles\");\n if (style) style.remove();\n\n document.querySelectorAll(\"video\").forEach((video) => {\n if (video.dataset.wasPaused === \"false\") {\n video.play();\n delete video.dataset.wasPaused;\n }\n });\n\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 // Reset state when deactivating\n useEffect(() => {\n if (!isActive) {\n setPendingAnnotation(null);\n setEditingAnnotation(null);\n setHoverInfo(null);\n setShowSettings(false); // Close settings when toolbar closes\n if (isFrozen) {\n unfreezeAnimations();\n }\n }\n }, [isActive, isFrozen, unfreezeAnimations]);\n\n // Custom cursor\n useEffect(() => {\n if (!isActive) return;\n\n const style = document.createElement(\"style\");\n style.id = \"feedback-cursor-styles\";\n // Text elements get text cursor (higher specificity with body prefix)\n // Everything else gets crosshair\n style.textContent = `\n body * {\n cursor: crosshair !important;\n }\n body p, body span, body h1, body h2, body h3, body h4, body h5, body h6,\n body li, body td, body th, body label, body blockquote, body figcaption,\n body caption, body legend, body dt, body dd, body pre, body code,\n body em, body strong, body b, body i, body u, body s, body a,\n body time, body address, body cite, body q, body abbr, body dfn,\n body mark, body small, body sub, body sup, body [contenteditable],\n body p *, body span *, body h1 *, body h2 *, body h3 *, body h4 *,\n body h5 *, body h6 *, body li *, body a *, body label *, body pre *,\n body code *, body blockquote *, body [contenteditable] * {\n cursor: text !important;\n }\n [data-feedback-toolbar], [data-feedback-toolbar] * {\n cursor: default !important;\n }\n [data-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 if ((e.target as HTMLElement).closest(\"[data-feedback-toolbar]\")) {\n setHoverInfo(null);\n return;\n }\n\n const elementUnder = document.elementFromPoint(\n e.clientX,\n e.clientY,\n ) as HTMLElement;\n if (!elementUnder || elementUnder.closest(\"[data-feedback-toolbar]\")) {\n setHoverInfo(null);\n return;\n }\n\n const { name, path } = identifyElement(elementUnder);\n const rect = elementUnder.getBoundingClientRect();\n\n setHoverInfo({ element: name, elementPath: path, rect });\n setHoverPosition({ x: e.clientX, y: e.clientY });\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove);\n return () => document.removeEventListener(\"mousemove\", handleMouseMove);\n }, [isActive, pendingAnnotation]);\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 const target = e.target as HTMLElement;\n\n if (target.closest(\"[data-feedback-toolbar]\")) return;\n if (target.closest(\"[data-annotation-popup]\")) return;\n if (target.closest(\"[data-annotation-marker]\")) return;\n\n const isInteractive = target.closest(\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 = document.elementFromPoint(\n e.clientX,\n e.clientY,\n ) as HTMLElement;\n if (!elementUnder) return;\n\n const { name, path } = identifyElement(elementUnder);\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 forensic data\n const computedStylesObj = getDetailedComputedStyles(elementUnder);\n const computedStylesStr = Object.entries(computedStylesObj)\n .map(([k, v]) => `${k}: ${v}`)\n .join(\"; \");\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 nearbyElements: getNearbyElements(elementUnder),\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 ]);\n\n // Multi-select drag - mousedown\n useEffect(() => {\n if (!isActive || pendingAnnotation) return;\n\n const handleMouseDown = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n\n if (target.closest(\"[data-feedback-toolbar]\")) return;\n if (target.closest(\"[data-annotation-marker]\")) return;\n if (target.closest(\"[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 el.closest(\"[data-feedback-toolbar]\") ||\n el.closest(\"[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 el.closest(\"[data-feedback-toolbar]\") ||\n el.closest(\"[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 forensic data from first element (Option A)\n const firstElement = finalElements[0].element;\n const firstElementComputedStyles =\n getDetailedComputedStyles(firstElement);\n const firstElementComputedStylesStr = Object.entries(\n firstElementComputedStyles,\n )\n .map(([k, v]) => `${k}: ${v}`)\n .join(\"; \");\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 nearbyElements: getNearbyElements(firstElement),\n cssClasses: getElementClasses(firstElement),\n nearbyText: getNearbyText(firstElement),\n });\n } else {\n // No elements selected, but allow annotation on empty area\n const width = Math.abs(right - left);\n const height = Math.abs(bottom - top);\n\n // Only create if drag area is meaningful size (not just a click)\n if (width > 20 && height > 20) {\n setPendingAnnotation({\n x,\n y,\n clientY: e.clientY,\n element: \"Area selection\",\n elementPath: `region at (${Math.round(left)}, ${Math.round(top)})`,\n boundingBox: {\n x: left,\n y: top + window.scrollY,\n width,\n height,\n },\n isMultiSelect: true,\n });\n }\n }\n setHoverInfo(null);\n } else if (wasDragging) {\n justFinishedDragRef.current = true;\n }\n\n mouseDownPosRef.current = null;\n dragStartRef.current = null;\n setIsDragging(false);\n // Clear highlights container\n if (highlightsContainerRef.current) {\n highlightsContainerRef.current.innerHTML = \"\";\n }\n };\n\n document.addEventListener(\"mouseup\", handleMouseUp);\n return () => document.removeEventListener(\"mouseup\", handleMouseUp);\n }, [isActive, isDragging]);\n\n // 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 };\n\n setAnnotations((prev) => [...prev, newAnnotation]);\n // Prevent immediate hover on newly added marker\n recentlyAddedIdRef.current = newAnnotation.id;\n setTimeout(() => {\n recentlyAddedIdRef.current = null;\n }, 300);\n // Mark as needing animation (will be set to animated after animation completes)\n setTimeout(() => {\n setAnimatedMarkers((prev) => new Set(prev).add(newAnnotation.id));\n }, 250);\n\n // Animate out the pending annotation UI\n setPendingExiting(true);\n setTimeout(() => {\n setPendingAnnotation(null);\n setPendingExiting(false);\n }, 150);\n\n window.getSelection()?.removeAllRanges();\n },\n [pendingAnnotation],\n );\n\n // Cancel annotation with exit animation\n const cancelAnnotation = useCallback(() => {\n setPendingExiting(true);\n setTimeout(() => {\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 setDeletingMarkerId(id);\n setExitingMarkers((prev) => new Set(prev).add(id));\n\n // Wait for exit animation then remove\n setTimeout(() => {\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 setTimeout(() => setRenumberFrom(null), 200);\n }\n }, 150);\n },\n [annotations],\n );\n\n // Start editing an annotation (right-click)\n const startEditAnnotation = useCallback((annotation: Annotation) => {\n setEditingAnnotation(annotation);\n setHoveredMarkerId(null);\n }, []);\n\n // Update annotation (edit mode submit)\n const updateAnnotation = useCallback(\n (newComment: string) => {\n if (!editingAnnotation) return;\n\n setAnnotations((prev) =>\n prev.map((a) =>\n a.id === editingAnnotation.id ? { ...a, comment: newComment } : a,\n ),\n );\n\n // Animate out the edit popup\n setEditExiting(true);\n setTimeout(() => {\n setEditingAnnotation(null);\n setEditExiting(false);\n }, 150);\n },\n [editingAnnotation],\n );\n\n // Cancel editing with exit animation\n const cancelEditAnnotation = useCallback(() => {\n setEditExiting(true);\n setTimeout(() => {\n setEditingAnnotation(null);\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 setIsClearing(true);\n setCleared(true);\n\n const totalAnimationTime = count * 30 + 200;\n setTimeout(() => {\n setAnnotations([]);\n setAnimatedMarkers(new Set()); // Reset animated markers\n localStorage.removeItem(getStorageKey(pathname));\n setIsClearing(false);\n }, totalAnimationTime);\n\n setTimeout(() => setCleared(false), 1500);\n }, [pathname, annotations.length]);\n\n // Copy output\n const copyOutput = useCallback(async () => {\n const output = generateOutput(annotations, pathname, settings.outputDetail);\n if (!output) return;\n\n await navigator.clipboard.writeText(output);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n\n if (settings.autoClearAfterCopy) {\n setTimeout(() => clearAll(), 500);\n }\n }, [\n annotations,\n pathname,\n settings.outputDetail,\n settings.autoClearAfterCopy,\n clearAll,\n ]);\n\n // Toolbar dragging - mousemove and mouseup\n useEffect(() => {\n if (!dragStartPos) return;\n\n const DRAG_THRESHOLD = 5; // 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 containerWidth = 257;\n const circleWidth = 44;\n const toolbarHeight = 44;\n\n // When expanded, constrain the full container\n // When collapsed, only constrain the visible circle\n if (isActive) {\n // Expanded: constrain full 257px container\n newX = Math.max(\n padding,\n Math.min(window.innerWidth - containerWidth - padding, newX),\n );\n } else {\n // Collapsed: constrain 44px circle (which is at the right edge of the 257px container)\n const circleOffset = containerWidth - circleWidth;\n const minX = padding - circleOffset;\n const maxX = window.innerWidth - padding - circleOffset - circleWidth;\n newX = Math.max(minX, Math.min(maxX, newX));\n }\n\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 // Clear flag after a short delay\n setTimeout(() => {\n justFinishedToolbarDragRef.current = false;\n }, 50);\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]);\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 containerWidth = 257;\n const circleWidth = 44;\n const toolbarHeight = 44;\n\n let newX = toolbarPosition.x;\n let newY = toolbarPosition.y;\n\n // Constrain to viewport dimensions\n if (isActive) {\n // Expanded: constrain full 257px container\n newX = Math.max(\n padding,\n Math.min(window.innerWidth - containerWidth - padding, newX),\n );\n } else {\n // Collapsed: constrain 44px circle (which is at the right edge of the 257px container)\n const circleOffset = containerWidth - circleWidth;\n const minX = padding - circleOffset;\n const maxX = window.innerWidth - padding - circleOffset - circleWidth;\n newX = Math.max(minX, Math.min(maxX, newX));\n }\n\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]);\n\n // Keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n if (pendingAnnotation) {\n // Let popup handle\n } else if (isActive) {\n setIsActive(false);\n }\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [isActive, pendingAnnotation]);\n\n if (!mounted) return null;\n\n const hasAnnotations = annotations.length > 0;\n\n // Filter annotations for rendering (exclude exiting ones from normal flow)\n const visibleAnnotations = annotations.filter(\n (a) => !exitingMarkers.has(a.id),\n );\n const exitingAnnotationsList = annotations.filter((a) =>\n exitingMarkers.has(a.id),\n );\n\n // Helper function to calculate viewport-aware tooltip positioning\n const getTooltipPosition = (annotation: Annotation): React.CSSProperties => {\n // Tooltip dimensions (from CSS)\n const tooltipMaxWidth = 200;\n const tooltipEstimatedHeight = 80; // Estimated max height\n const markerSize = 22;\n const gap = 10;\n\n // Convert percentage-based x to pixels\n const markerX = (annotation.x / 100) * window.innerWidth;\n const markerY =\n typeof annotation.y === \"string\"\n ? parseFloat(annotation.y)\n : annotation.y;\n\n const styles: React.CSSProperties = {};\n\n // Vertical positioning: flip if near bottom\n const spaceBelow = window.innerHeight - markerY - markerSize - gap;\n if (spaceBelow < tooltipEstimatedHeight) {\n // Show above marker\n styles.top = \"auto\";\n styles.bottom = `calc(100% + ${gap}px)`;\n }\n // If enough space below, use default CSS (top: calc(100% + 10px))\n\n // Horizontal positioning: adjust if near edges\n const centerX = markerX - tooltipMaxWidth / 2;\n const edgePadding = 10;\n\n if (centerX < edgePadding) {\n // Too close to left edge\n const offset = edgePadding - centerX;\n styles.left = `calc(50% + ${offset}px)`;\n } else if (centerX + tooltipMaxWidth > window.innerWidth - edgePadding) {\n // Too close to right edge\n const overflow =\n centerX + tooltipMaxWidth - (window.innerWidth - edgePadding);\n styles.left = `calc(50% - ${overflow}px)`;\n }\n // If centered position is fine, use default CSS (left: 50%)\n\n return styles;\n };\n\n return createPortal(\n <>\n {/* Toolbar */}\n <div\n className={styles.toolbar}\n data-feedback-toolbar\n style={\n toolbarPosition\n ? {\n left: toolbarPosition.x,\n top: toolbarPosition.y,\n right: \"auto\",\n bottom: \"auto\",\n }\n : undefined\n }\n >\n {/* Morphing container */}\n <div\n className={`${styles.toolbarContainer} ${!isDarkMode ? styles.light : \"\"} ${isActive ? styles.expanded : styles.collapsed} ${showEntranceAnimation ? styles.entrance : \"\"} ${isDraggingToolbar ? styles.dragging : \"\"}`}\n onClick={\n !isActive\n ? (e) => {\n // Don't activate if we just finished dragging\n if (justFinishedToolbarDragRef.current) {\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 ? {\n transform: `scale(1.05) rotate(${dragRotation}deg)`,\n cursor: \"grabbing\",\n }\n : undefined\n }\n >\n {/* Toggle content - visible when collapsed */}\n <div\n className={`${styles.toggleContent} ${!isActive ? styles.visible : styles.hidden}`}\n >\n <IconListSparkle size={24} />\n {hasAnnotations && (\n <span\n className={`${styles.badge} ${isActive ? styles.fadeOut : \"\"} ${showEntranceAnimation ? styles.entrance : \"\"}`}\n style={{ backgroundColor: settings.annotationColor }}\n >\n {annotations.length}\n </span>\n )}\n </div>\n\n {/* Controls content - visible when expanded */}\n <div\n className={`${styles.controlsContent} ${isActive ? styles.visible : styles.hidden}`}\n >\n <button\n className={`${styles.controlButton} ${!isDarkMode ? styles.light : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n toggleFreeze();\n }}\n title={isFrozen ? \"Resume animations\" : \"Pause animations\"}\n data-active={isFrozen}\n >\n <IconPausePlayAnimated size={24} isPaused={isFrozen} />\n </button>\n\n <button\n className={`${styles.controlButton} ${!isDarkMode ? styles.light : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n setShowMarkers(!showMarkers);\n }}\n disabled={!hasAnnotations}\n title={showMarkers ? \"Hide markers\" : \"Show markers\"}\n >\n <IconEyeAnimated size={24} isOpen={showMarkers} />\n </button>\n\n <button\n className={`${styles.controlButton} ${!isDarkMode ? styles.light : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n copyOutput();\n }}\n disabled={!hasAnnotations}\n title=\"Copy feedback\"\n data-active={copied}\n >\n <IconCopyAnimated size={24} copied={copied} />\n </button>\n\n <button\n className={`${styles.controlButton} ${!isDarkMode ? styles.light : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n clearAll();\n }}\n disabled={!hasAnnotations}\n title=\"Clear all\"\n data-danger\n >\n <IconTrashAlt size={24} />\n </button>\n\n <button\n className={`${styles.controlButton} ${!isDarkMode ? styles.light : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n setShowSettings(!showSettings);\n }}\n title=\"Settings\"\n >\n <IconGear size={24} />\n </button>\n\n <div\n className={`${styles.divider} ${!isDarkMode ? styles.light : \"\"}`}\n />\n\n <button\n className={`${styles.controlButton} ${!isDarkMode ? styles.light : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n setIsActive(false);\n }}\n title=\"Exit feedback mode\"\n >\n <IconXmarkLarge size={24} />\n </button>\n </div>\n\n {/* Settings Panel */}\n <div\n className={`${styles.settingsPanel} ${isDarkMode ? styles.dark : styles.light} ${showSettingsVisible ? styles.enter : styles.exit}`}\n onClick={(e) => e.stopPropagation()}\n style={\n toolbarPosition && toolbarPosition.y < 230\n ? {\n bottom: \"auto\",\n top: \"calc(100% + 0.5rem)\",\n }\n : undefined\n }\n >\n <div className={styles.settingsHeader}>\n <span className={styles.settingsBrand}>\n <span\n className={styles.settingsBrandSlash}\n style={{\n color: settings.annotationColor,\n transition: \"color 0.2s ease\",\n }}\n >\n /\n </span>\n agentation\n </span>\n <span className={styles.settingsVersion}>v{__VERSION__}</span>\n <button\n className={styles.themeToggle}\n onClick={() => setIsDarkMode(!isDarkMode)}\n title={\n isDarkMode ? \"Switch to light mode\" : \"Switch to dark mode\"\n }\n >\n {isDarkMode ? <IconSun size={14} /> : <IconMoon size={14} />}\n </button>\n </div>\n\n <div className={styles.settingsSection}>\n <div className={styles.settingsRow}>\n <div\n className={`${styles.settingsLabel} ${!isDarkMode ? styles.light : \"\"}`}\n >\n Output Detail\n <span\n className={styles.helpIcon}\n data-tooltip=\"Controls how much detail is included in the copied output\"\n >\n <IconHelp size={20} />\n </span>\n </div>\n <button\n className={`${styles.cycleButton} ${!isDarkMode ? styles.light : \"\"}`}\n onClick={() => {\n const currentIndex = OUTPUT_DETAIL_OPTIONS.findIndex(\n (opt) => opt.value === settings.outputDetail,\n );\n const nextIndex =\n (currentIndex + 1) % OUTPUT_DETAIL_OPTIONS.length;\n setSettings((s) => ({\n ...s,\n outputDetail: OUTPUT_DETAIL_OPTIONS[nextIndex].value,\n }));\n }}\n >\n <span\n key={settings.outputDetail}\n className={styles.cycleButtonText}\n >\n {\n OUTPUT_DETAIL_OPTIONS.find(\n (opt) => opt.value === settings.outputDetail,\n )?.label\n }\n </span>\n <span className={styles.cycleDots}>\n {OUTPUT_DETAIL_OPTIONS.map((option, i) => (\n <span\n key={option.value}\n className={`${styles.cycleDot} ${!isDarkMode ? styles.light : \"\"} ${settings.outputDetail === option.value ? styles.active : \"\"}`}\n />\n ))}\n </span>\n </button>\n </div>\n </div>\n\n <div className={styles.settingsSection}>\n <div\n className={`${styles.settingsLabel} ${styles.settingsLabelMarker} ${!isDarkMode ? styles.light : \"\"}`}\n >\n Marker Colour\n </div>\n <div className={styles.colorOptions}>\n {COLOR_OPTIONS.map((color) => (\n <div\n onClick={() =>\n setSettings((s) => ({\n ...s,\n annotationColor: color.value,\n }))\n }\n style={{\n borderColor:\n settings.annotationColor === color.value\n ? color.value\n : \"transparent\",\n }}\n className={`${styles.colorOptionRing} ${settings.annotationColor === color.value ? styles.selected : \"\"}`}\n >\n <div\n key={color.value}\n className={`${styles.colorOption} ${settings.annotationColor === color.value ? styles.selected : \"\"}`}\n style={{ backgroundColor: color.value }}\n title={color.label}\n />\n </div>\n ))}\n </div>\n </div>\n\n <div className={styles.settingsSection}>\n <label className={styles.settingsToggle}>\n <input\n type=\"checkbox\"\n id=\"autoClearAfterCopy\"\n checked={settings.autoClearAfterCopy}\n onChange={(e) =>\n setSettings((s) => ({\n ...s,\n autoClearAfterCopy: e.target.checked,\n }))\n }\n />\n <label\n className={`${styles.customCheckbox} ${settings.autoClearAfterCopy ? styles.checked : \"\"}`}\n htmlFor=\"autoClearAfterCopy\"\n >\n {settings.autoClearAfterCopy && (\n <IconCheckSmallAnimated size={14} />\n )}\n </label>\n <span\n className={`${styles.toggleLabel} ${!isDarkMode ? styles.light : \"\"}`}\n >\n Clear after output\n <span\n className={styles.helpIcon}\n data-tooltip=\"Automatically clear annotations after copying\"\n >\n <IconHelp size={20} />\n </span>\n </span>\n </label>\n <label className={styles.settingsToggle}>\n <input\n type=\"checkbox\"\n id=\"blockInteractions\"\n checked={settings.blockInteractions}\n onChange={(e) =>\n setSettings((s) => ({\n ...s,\n blockInteractions: e.target.checked,\n }))\n }\n />\n <label\n className={`${styles.customCheckbox} ${settings.blockInteractions ? styles.checked : \"\"}`}\n htmlFor=\"blockInteractions\"\n >\n {settings.blockInteractions && (\n <IconCheckSmallAnimated size={14} />\n )}\n </label>\n <span\n className={`${styles.toggleLabel} ${!isDarkMode ? styles.light : \"\"}`}\n >\n Block page interactions\n </span>\n </label>\n </div>\n </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 = isHovered || isDeleting;\n const isMulti = annotation.isMultiSelect;\n const markerColor = isMulti\n ? \"#34C759\"\n : settings.annotationColor;\n const globalIndex = annotations.findIndex(\n (a) => a.id === annotation.id,\n );\n const needsEnterAnimation = !animatedMarkers.has(annotation.id);\n const animClass = markersExiting\n ? styles.exit\n : isClearing\n ? styles.clearing\n : needsEnterAnimation\n ? styles.enter\n : \"\";\n\n return (\n <div\n key={annotation.id}\n className={`${styles.marker} ${showDeleteState ? styles.hovered : \"\"} ${isMulti ? styles.multiSelect : \"\"} ${animClass}`}\n data-annotation-marker\n style={{\n left: `${annotation.x}%`,\n top: annotation.y,\n backgroundColor: showDeleteState ? 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 setHoveredMarkerId(annotation.id)\n }\n onMouseLeave={() => setHoveredMarkerId(null)}\n onClick={(e) => {\n e.stopPropagation();\n if (!markersExiting) deleteAnnotation(annotation.id);\n }}\n onContextMenu={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (!markersExiting) startEditAnnotation(annotation);\n }}\n >\n {showDeleteState ? (\n <IconXmark size={isMulti ? 18 : 16} />\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} ${!isDarkMode ? styles.light : \"\"} ${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 = isHovered || isDeleting;\n const isMulti = annotation.isMultiSelect;\n const markerColor = isMulti\n ? \"#34C759\"\n : settings.annotationColor;\n const globalIndex = annotations.findIndex(\n (a) => a.id === annotation.id,\n );\n const needsEnterAnimation = !animatedMarkers.has(annotation.id);\n const animClass = markersExiting\n ? styles.exit\n : isClearing\n ? styles.clearing\n : needsEnterAnimation\n ? styles.enter\n : \"\";\n\n return (\n <div\n key={annotation.id}\n className={`${styles.marker} ${styles.fixed} ${showDeleteState ? styles.hovered : \"\"} ${isMulti ? styles.multiSelect : \"\"} ${animClass}`}\n data-annotation-marker\n style={{\n left: `${annotation.x}%`,\n top: annotation.y,\n backgroundColor: showDeleteState ? 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 setHoveredMarkerId(annotation.id)\n }\n onMouseLeave={() => setHoveredMarkerId(null)}\n onClick={(e) => {\n e.stopPropagation();\n if (!markersExiting) deleteAnnotation(annotation.id);\n }}\n onContextMenu={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (!markersExiting) startEditAnnotation(annotation);\n }}\n >\n {showDeleteState ? (\n <IconClose size={isMulti ? 12 : 10} />\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} ${!isDarkMode ? styles.light : \"\"} ${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: `${settings.annotationColor}80`,\n backgroundColor: `${settings.annotationColor}0A`,\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 const bb = hoveredAnnotation.boundingBox;\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 - scrollY,\n width: bb.width,\n height: bb.height,\n ...(isMulti\n ? {}\n : {\n borderColor: `${settings.annotationColor}99`,\n backgroundColor: `${settings.annotationColor}0D`,\n }),\n }}\n />\n );\n })()}\n\n {/* Hover tooltip */}\n {hoverInfo && !pendingAnnotation && !isScrolling && !isDragging && (\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(hoverPosition.y - 32, 8),\n }}\n >\n {hoverInfo.element}\n </div>\n )}\n\n {/* Pending annotation marker + popup */}\n {pendingAnnotation && (\n <>\n {/* Show element/area outline while adding annotation */}\n {pendingAnnotation.boundingBox && (\n <div\n className={`${pendingAnnotation.isMultiSelect ? styles.multiSelectOutline : styles.singleSelectOutline} ${pendingExiting ? styles.exit : styles.enter}`}\n style={{\n left: pendingAnnotation.boundingBox.x,\n top: pendingAnnotation.boundingBox.y - scrollY,\n width: pendingAnnotation.boundingBox.width,\n height: pendingAnnotation.boundingBox.height,\n ...(pendingAnnotation.isMultiSelect\n ? {}\n : {\n borderColor: `${settings.annotationColor}99`,\n backgroundColor: `${settings.annotationColor}0D`,\n }),\n }}\n />\n )}\n\n <div\n className={`${styles.marker} ${styles.pending} ${pendingAnnotation.isMultiSelect ? styles.multiSelect : \"\"} ${pendingExiting ? styles.exit : styles.enter}`}\n style={{\n left: `${pendingAnnotation.x}%`,\n top: pendingAnnotation.clientY,\n backgroundColor: pendingAnnotation.isMultiSelect\n ? \"#34C759\"\n : settings.annotationColor,\n }}\n >\n <IconPlus size={12} />\n </div>\n\n <AnnotationPopupCSS\n ref={popupRef}\n element={pendingAnnotation.element}\n selectedText={pendingAnnotation.selectedText}\n placeholder={\n pendingAnnotation.element === \"Area selection\"\n ? \"What should change in this area?\"\n : pendingAnnotation.isMultiSelect\n ? \"Feedback for this group of elements...\"\n : \"What should change?\"\n }\n onSubmit={addAnnotation}\n onCancel={cancelAnnotation}\n isExiting={pendingExiting}\n lightMode={!isDarkMode}\n accentColor={\n pendingAnnotation.isMultiSelect\n ? \"#34C759\"\n : settings.annotationColor\n }\n style={{\n // Popup is 280px wide, centered with translateX(-50%), so 140px each side\n // Clamp so popup stays 20px from viewport edges\n left: Math.max(\n 160,\n Math.min(\n window.innerWidth - 160,\n (pendingAnnotation.x / 100) * window.innerWidth,\n ),\n ),\n top: Math.max(\n 20,\n Math.min(\n pendingAnnotation.clientY + 20,\n window.innerHeight - 180,\n ),\n ),\n }}\n />\n </>\n )}\n\n {/* Edit annotation popup */}\n {editingAnnotation && (\n <>\n {/* Show element/area outline while editing */}\n {editingAnnotation.boundingBox && (\n <div\n className={`${editingAnnotation.isMultiSelect ? styles.multiSelectOutline : styles.singleSelectOutline} ${styles.enter}`}\n style={{\n left: editingAnnotation.boundingBox.x,\n top: editingAnnotation.boundingBox.y - scrollY,\n width: editingAnnotation.boundingBox.width,\n height: editingAnnotation.boundingBox.height,\n ...(editingAnnotation.isMultiSelect\n ? {}\n : {\n borderColor: `${settings.annotationColor}99`,\n backgroundColor: `${settings.annotationColor}0D`,\n }),\n }}\n />\n )}\n\n <AnnotationPopupCSS\n ref={editPopupRef}\n element={editingAnnotation.element}\n selectedText={editingAnnotation.selectedText}\n placeholder=\"Edit your feedback...\"\n initialValue={editingAnnotation.comment}\n submitLabel=\"Save\"\n onSubmit={updateAnnotation}\n onCancel={cancelEditAnnotation}\n isExiting={editExiting}\n lightMode={!isDarkMode}\n accentColor={\n editingAnnotation.isMultiSelect\n ? \"#34C759\"\n : settings.annotationColor\n }\n style={{\n // Popup is 280px wide, centered with translateX(-50%), so 140px each side\n // Clamp so popup stays 20px from viewport edges\n left: Math.max(\n 160,\n Math.min(\n window.innerWidth - 160,\n (editingAnnotation.x / 100) * window.innerWidth,\n ),\n ),\n top: Math.max(\n 20,\n Math.min(\n (editingAnnotation.isFixed\n ? editingAnnotation.y\n : editingAnnotation.y - scrollY) + 20,\n window.innerHeight - 180,\n ),\n ),\n }}\n />\n </>\n )}\n\n {/* Drag selection - all visuals use refs for smooth 60fps */}\n {isDragging && (\n <>\n <div ref={dragRectRef} className={styles.dragSelection} />\n <div\n ref={highlightsContainerRef}\n className={styles.highlightsContainer}\n />\n </>\n )}\n </div>\n )}\n </>,\n document.body,\n );\n}\n\nexport default PageFeedbackToolbarCSS;\n","\"use client\";\n\nimport { useState, useRef, useEffect, useCallback, forwardRef, useImperativeHandle } from \"react\";\nimport styles from \"./styles.module.scss\";\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 /** 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}\n\nexport interface AnnotationPopupCSSHandle {\n /** Shake the popup (e.g., when user clicks outside) */\n shake: () => void;\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\n// Darken a hex color by a percentage\nfunction darkenColor(hex: string, percent: number): string {\n const num = parseInt(hex.replace(\"#\", \"\"), 16);\n const amt = Math.round(2.55 * percent);\n const R = Math.max((num >> 16) - amt, 0);\n const G = Math.max((num >> 8 & 0x00FF) - amt, 0);\n const B = Math.max((num & 0x0000FF) - amt, 0);\n return `#${(0x1000000 + R * 0x10000 + G * 0x100 + B).toString(16).slice(1)}`;\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 style,\n accentColor = \"#3c82f7\",\n isExiting = false,\n lightMode = false,\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 textareaRef = useRef<HTMLTextAreaElement>(null);\n const popupRef = useRef<HTMLDivElement>(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\n requestAnimationFrame(() => {\n setAnimState(\"enter\");\n });\n // Transition to entered state after animation completes\n const enterTimer = setTimeout(() => {\n setAnimState(\"entered\");\n }, 200); // Match animation duration\n const focusTimer = setTimeout(() => {\n const textarea = textareaRef.current;\n if (textarea) {\n textarea.focus();\n textarea.selectionStart = textarea.selectionEnd = textarea.value.length;\n textarea.scrollTop = textarea.scrollHeight;\n }\n }, 50);\n return () => {\n clearTimeout(enterTimer);\n clearTimeout(focusTimer);\n };\n }, []);\n\n // Shake animation\n const shake = useCallback(() => {\n setIsShaking(true);\n setTimeout(() => {\n setIsShaking(false);\n textareaRef.current?.focus();\n }, 250);\n }, []);\n\n // Expose shake to parent via ref\n useImperativeHandle(ref, () => ({\n shake,\n }), [shake]);\n\n // Handle cancel with exit animation\n const handleCancel = useCallback(() => {\n setAnimState(\"exit\");\n setTimeout(() => {\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) => {\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 <span className={styles.element}>{element}</span>\n {timestamp && <span className={styles.timestamp}>{timestamp}</span>}\n </div>\n\n {selectedText && (\n <div className={styles.quote}>\n &ldquo;{selectedText.slice(0, 80)}\n {selectedText.length > 80 ? \"...\" : \"\"}&rdquo;\n </div>\n )}\n\n <textarea\n ref={textareaRef}\n className={styles.textarea}\n style={{ borderColor: isFocused ? accentColor : undefined }}\n placeholder={placeholder}\n value={text}\n onChange={(e) => setText(e.target.value)}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n rows={2}\n onKeyDown={handleKeyDown}\n />\n\n <div className={styles.actions}>\n <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 = \"@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 contain: layout style;\\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.5rem;\\n}\\n\\n.styles-module__element___fTV2z {\\n font-size: 0.75rem;\\n font-weight: 500;\\n color: rgba(255, 255, 255, 0.65);\\n max-width: 100%;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n flex: 1;\\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: 0.6875rem;\\n font-style: italic;\\n color: rgba(255, 255, 255, 0.5);\\n margin-bottom: 0.5rem;\\n padding: 0.4rem 0.5rem;\\n background: rgba(255, 255, 255, 0.05);\\n border-radius: 0.25rem;\\n line-height: 1.45;\\n}\\n\\n.styles-module__textarea___jrSae {\\n width: 100%;\\n padding: 0.5rem 0.625rem;\\n font-size: 0.8125rem;\\n font-family: inherit;\\n background: rgba(255, 255, 255, 0.05);\\n color: #fff;\\n border: 1px solid rgba(255, 255, 255, 0.15);\\n border-radius: 8px;\\n resize: none;\\n outline: none;\\n transition: border-color 0.15s ease;\\n}\\n.styles-module__textarea___jrSae:focus {\\n border-color: #3c82f7;\\n}\\n.styles-module__textarea___jrSae.styles-module__green___99l3h:focus {\\n border-color: #34C759;\\n}\\n.styles-module__textarea___jrSae::placeholder {\\n color: rgba(255, 255, 255, 0.35);\\n}\\n.styles-module__textarea___jrSae::-webkit-scrollbar {\\n width: 6px;\\n}\\n.styles-module__textarea___jrSae::-webkit-scrollbar-track {\\n background: transparent;\\n}\\n.styles-module__textarea___jrSae::-webkit-scrollbar-thumb {\\n background: rgba(255, 255, 255, 0.2);\\n border-radius: 3px;\\n}\\n\\n.styles-module__actions___D6x3f {\\n display: flex;\\n justify-content: flex-end;\\n gap: 0.375rem;\\n margin-top: 0.5rem;\\n}\\n\\n.styles-module__cancel___hRjnL,\\n.styles-module__submit___K-mIR {\\n padding: 0.4rem 0.875rem;\\n font-size: 0.75rem;\\n font-weight: 500;\\n border-radius: 1rem;\\n border: none;\\n cursor: pointer;\\n transition: background-color 0.15s ease, color 0.15s ease, opacity 0.15s ease;\\n}\\n\\n.styles-module__cancel___hRjnL {\\n background: transparent;\\n color: rgba(255, 255, 255, 0.5);\\n}\\n.styles-module__cancel___hRjnL:hover {\\n background: rgba(255, 255, 255, 0.1);\\n color: rgba(255, 255, 255, 0.8);\\n}\\n\\n.styles-module__submit___K-mIR {\\n color: white;\\n}\\n.styles-module__submit___K-mIR:hover:not(:disabled) {\\n filter: brightness(0.9);\\n}\\n.styles-module__submit___K-mIR:disabled {\\n cursor: not-allowed;\\n}\\n\\n.styles-module__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__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}\";\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\",\"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\",\"light\":\"styles-module__light___6AaSQ\"};\n\n// SSR-safe style injection\nif (typeof document !== 'undefined') {\n let style = document.getElementById('feedback-tool-styles-annotation-popup-css-styles');\n if (!style) {\n style = document.createElement('style');\n style.id = 'feedback-tool-styles-annotation-popup-css-styles';\n style.textContent = css;\n document.head.appendChild(style);\n }\n}\n\nexport default classNames;\n","\"use client\";\n\n// =============================================================================\n// Icons\n// =============================================================================\n\n// Small X for marker delete\nexport const IconClose = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n// Plus icon\nexport const IconPlus = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M8 3v10M3 8h10\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n// Checkmark icon\nexport const IconCheck = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M3 8l3.5 3.5L13 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Checkbox checkmark (smaller, optimized for checkboxes)\nexport const IconCheckSmall = ({ size = 14 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 14 14\" fill=\"none\">\n <path\n d=\"M3.9375 7L6.125 9.1875L10.5 4.8125\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// List with sparkle icon\nexport const IconListSparkle = ({\n size = 24,\n style = {},\n}: {\n size?: number;\n style?: React.CSSProperties;\n}) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" style={style}>\n <g clipPath=\"url(#clip0_list_sparkle)\">\n <path\n d=\"M11.5 12L5.5 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M18.5 6.75L5.5 6.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M9.25 17.25L5.5 17.25\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M16 12.75L16.5179 13.9677C16.8078 14.6494 17.3506 15.1922 18.0323 15.4821L19.25 16L18.0323 16.5179C17.3506 16.8078 16.8078 17.3506 16.5179 18.0323L16 19.25L15.4821 18.0323C15.1922 17.3506 14.6494 16.8078 13.9677 16.5179L12.75 16L13.9677 15.4821C14.6494 15.1922 15.1922 14.6494 15.4821 13.9677L16 12.75Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_list_sparkle\">\n <rect width=\"24\" height=\"24\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n);\n\n// Help/Question mark icon for tooltips\nexport const IconHelp = ({ size = 20 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M10 16.0417C6.66328 16.0417 3.95834 13.3367 3.95834 10C3.95834 6.66328 6.66328 3.95833 10 3.95833C13.3367 3.95833 16.0417 6.66328 16.0417 10C16.0417 13.3367 13.3367 16.0417 10 16.0417Z\"\n stroke=\"currentColor\"\n strokeOpacity=\"0.2\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M8.24188 8.18736C8.38392 7.78357 8.66429 7.44309 9.03331 7.22621C9.40234 7.00933 9.83621 6.93005 10.2581 7.00241C10.68 7.07477 11.0626 7.29411 11.3383 7.62157C11.6139 7.94903 11.7648 8.36348 11.7642 8.79152C11.7642 9.99986 10 10.604 10 10.604V10.8333\"\n stroke=\"currentColor\"\n strokeOpacity=\"0.2\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M10 13.0208H10.006\"\n stroke=\"currentColor\"\n strokeOpacity=\"0.2\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Animated checkmark with draw + bounce effect\nexport const IconCheckSmallAnimated = ({ size = 14 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 14 14\" fill=\"none\">\n <style>{`\n @keyframes checkDraw {\n 0% {\n stroke-dashoffset: 12;\n }\n 100% {\n stroke-dashoffset: 0;\n }\n }\n @keyframes checkBounce {\n 0% {\n transform: scale(0.5);\n opacity: 0;\n }\n 50% {\n transform: scale(1.12);\n opacity: 1;\n }\n 75% {\n transform: scale(0.95);\n }\n 100% {\n transform: scale(1);\n }\n }\n .check-path-animated {\n stroke-dasharray: 12;\n stroke-dashoffset: 0;\n transform-origin: center;\n animation: checkDraw 0.18s ease-out, checkBounce 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);\n }\n `}</style>\n <path\n className=\"check-path-animated\"\n d=\"M3.9375 7L6.125 9.1875L10.5 4.8125\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// =============================================================================\n// New Icons from SVG files\n// =============================================================================\n\n// Copy icon (two overlapping rectangles)\nexport const IconCopyAlt = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M4.75 11.25C4.75 10.4216 5.42157 9.75 6.25 9.75H12.75C13.5784 9.75 14.25 10.4216 14.25 11.25V17.75C14.25 18.5784 13.5784 19.25 12.75 19.25H6.25C5.42157 19.25 4.75 18.5784 4.75 17.75V11.25Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M17.25 14.25H17.75C18.5784 14.25 19.25 13.5784 19.25 12.75V6.25C19.25 5.42157 18.5784 4.75 17.75 4.75H11.25C10.4216 4.75 9.75 5.42157 9.75 6.25V6.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n// Animated copy/checkmark icon\nexport const IconCopyAnimated = ({ size = 24, copied = false }: { size?: number; copied?: boolean }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <style>{`\n .copy-icon, .check-icon {\n transition: opacity 0.2s ease, transform 0.2s ease;\n }\n `}</style>\n {/* Copy icon */}\n <g className=\"copy-icon\" style={{ opacity: copied ? 0 : 1, transform: copied ? 'scale(0.8)' : 'scale(1)', transformOrigin: 'center' }}>\n <path\n d=\"M4.75 11.25C4.75 10.4216 5.42157 9.75 6.25 9.75H12.75C13.5784 9.75 14.25 10.4216 14.25 11.25V17.75C14.25 18.5784 13.5784 19.25 12.75 19.25H6.25C5.42157 19.25 4.75 18.5784 4.75 17.75V11.25Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M17.25 14.25H17.75C18.5784 14.25 19.25 13.5784 19.25 12.75V6.25C19.25 5.42157 18.5784 4.75 17.75 4.75H11.25C10.4216 4.75 9.75 5.42157 9.75 6.25V6.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </g>\n {/* Checkmark circle */}\n <g className=\"check-icon\" style={{ opacity: copied ? 1 : 0, transform: copied ? 'scale(1)' : 'scale(0.8)', transformOrigin: 'center' }}>\n <path\n d=\"M12 20C7.58172 20 4 16.4182 4 12C4 7.58172 7.58172 4 12 4C16.4182 4 20 7.58172 20 12C20 16.4182 16.4182 20 12 20Z\"\n stroke=\"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 </svg>\n);\n\n// Eye icon (original)\nexport const IconEye = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M4.91516 12.7108C4.63794 12.2883 4.63705 11.7565 4.91242 11.3328C5.84146 9.9033 8.30909 6.74994 12 6.74994C15.6909 6.74994 18.1585 9.9033 19.0876 11.3328C19.3629 11.7565 19.3621 12.2883 19.0848 12.7108C18.1537 14.13 15.6873 17.2499 12 17.2499C8.31272 17.2499 5.8463 14.13 4.91516 12.7108Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 14.25C13.2426 14.25 14.25 13.2426 14.25 12C14.25 10.7574 13.2426 9.75 12 9.75C10.7574 9.75 9.75 10.7574 9.75 12C9.75 13.2426 10.7574 14.25 12 14.25Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Eye icon (alt version - larger pupil)\nexport const IconEyeAlt = ({ size = 24 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M3.91752 12.7539C3.65127 12.2996 3.65037 11.7515 3.9149 11.2962C4.9042 9.59346 7.72688 5.49994 12 5.49994C16.2731 5.49994 19.0958 9.59346 20.0851 11.2962C20.3496 11.7515 20.3487 12.2996 20.0825 12.7539C19.0908 14.4459 16.2694 18.4999 12 18.4999C7.73064 18.4999 4.90918 14.4459 3.91752 12.7539Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 14.8261C13.5608 14.8261 14.8261 13.5608 14.8261 12C14.8261 10.4392 13.5608 9.17392 12 9.17392C10.4392 9.17392 9.17391 10.4392 9.17391 12C9.17391 13.5608 10.4392 14.8261 12 14.8261Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Eye closed (with slash)\nexport const IconEyeClosed = ({ size = 24 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M18.6025 9.28503C18.9174 8.9701 19.4364 8.99481 19.7015 9.35271C20.1484 9.95606 20.4943 10.507 20.7342 10.9199C21.134 11.6086 21.1329 12.4454 20.7303 13.1328C20.2144 14.013 19.2151 15.5225 17.7723 16.8193C16.3293 18.1162 14.3852 19.2497 12.0008 19.25C11.4192 19.25 10.8638 19.1823 10.3355 19.0613C9.77966 18.934 9.63498 18.2525 10.0382 17.8493C10.2412 17.6463 10.5374 17.573 10.8188 17.6302C11.1993 17.7076 11.5935 17.75 12.0008 17.75C13.8848 17.7497 15.4867 16.8568 16.7693 15.7041C18.0522 14.5511 18.9606 13.1867 19.4363 12.375C19.5656 12.1543 19.5659 11.8943 19.4373 11.6729C19.2235 11.3049 18.921 10.8242 18.5364 10.3003C18.3085 9.98991 18.3302 9.5573 18.6025 9.28503ZM12.0008 4.75C12.5814 4.75006 13.1358 4.81803 13.6632 4.93953C14.2182 5.06741 14.362 5.74812 13.9593 6.15091C13.7558 6.35435 13.4589 6.42748 13.1771 6.36984C12.7983 6.29239 12.4061 6.25006 12.0008 6.25C10.1167 6.25 8.51415 7.15145 7.23028 8.31543C5.94678 9.47919 5.03918 10.8555 4.56426 11.6729C4.43551 11.8945 4.43582 12.1542 4.56524 12.375C4.77587 12.7343 5.07189 13.2012 5.44718 13.7105C5.67623 14.0213 5.65493 14.4552 5.38193 14.7282C5.0671 15.0431 4.54833 15.0189 4.28292 14.6614C3.84652 14.0736 3.50813 13.5369 3.27129 13.1328C2.86831 12.4451 2.86717 11.6088 3.26739 10.9199C3.78185 10.0345 4.77959 8.51239 6.22247 7.2041C7.66547 5.89584 9.61202 4.75 12.0008 4.75Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M5 19L19 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n// Animated eye icon that transitions between open/closed states\nexport const IconEyeAnimated = ({ size = 24, isOpen = true }: { size?: number; isOpen?: boolean }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <style>{`\n .eye-open, .eye-closed {\n transition: opacity 0.2s ease;\n }\n `}</style>\n {/* Open state - full outline + pupil */}\n <g className=\"eye-open\" style={{ opacity: isOpen ? 1 : 0 }}>\n <path\n d=\"M3.91752 12.7539C3.65127 12.2996 3.65037 11.7515 3.9149 11.2962C4.9042 9.59346 7.72688 5.49994 12 5.49994C16.2731 5.49994 19.0958 9.59346 20.0851 11.2962C20.3496 11.7515 20.3487 12.2996 20.0825 12.7539C19.0908 14.4459 16.2694 18.4999 12 18.4999C7.73064 18.4999 4.90918 14.4459 3.91752 12.7539Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 14.8261C13.5608 14.8261 14.8261 13.5608 14.8261 12C14.8261 10.4392 13.5608 9.17392 12 9.17392C10.4392 9.17392 9.17391 10.4392 9.17391 12C9.17391 13.5608 10.4392 14.8261 12 14.8261Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n {/* Closed state - split outline + slash */}\n <g className=\"eye-closed\" style={{ opacity: isOpen ? 0 : 1 }}>\n <path\n d=\"M18.6025 9.28503C18.9174 8.9701 19.4364 8.99481 19.7015 9.35271C20.1484 9.95606 20.4943 10.507 20.7342 10.9199C21.134 11.6086 21.1329 12.4454 20.7303 13.1328C20.2144 14.013 19.2151 15.5225 17.7723 16.8193C16.3293 18.1162 14.3852 19.2497 12.0008 19.25C11.4192 19.25 10.8638 19.1823 10.3355 19.0613C9.77966 18.934 9.63498 18.2525 10.0382 17.8493C10.2412 17.6463 10.5374 17.573 10.8188 17.6302C11.1993 17.7076 11.5935 17.75 12.0008 17.75C13.8848 17.7497 15.4867 16.8568 16.7693 15.7041C18.0522 14.5511 18.9606 13.1867 19.4363 12.375C19.5656 12.1543 19.5659 11.8943 19.4373 11.6729C19.2235 11.3049 18.921 10.8242 18.5364 10.3003C18.3085 9.98991 18.3302 9.5573 18.6025 9.28503ZM12.0008 4.75C12.5814 4.75006 13.1358 4.81803 13.6632 4.93953C14.2182 5.06741 14.362 5.74812 13.9593 6.15091C13.7558 6.35435 13.4589 6.42748 13.1771 6.36984C12.7983 6.29239 12.4061 6.25006 12.0008 6.25C10.1167 6.25 8.51415 7.15145 7.23028 8.31543C5.94678 9.47919 5.03918 10.8555 4.56426 11.6729C4.43551 11.8945 4.43582 12.1542 4.56524 12.375C4.77587 12.7343 5.07189 13.2012 5.44718 13.7105C5.67623 14.0213 5.65493 14.4552 5.38193 14.7282C5.0671 15.0431 4.54833 15.0189 4.28292 14.6614C3.84652 14.0736 3.50813 13.5369 3.27129 13.1328C2.86831 12.4451 2.86717 11.6088 3.26739 10.9199C3.78185 10.0345 4.77959 8.51239 6.22247 7.2041C7.66547 5.89584 9.61202 4.75 12.0008 4.75Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M5 19L19 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </g>\n </svg>\n);\n\n// Animated pause/play icon that transitions between states\nexport const IconPausePlayAnimated = ({ size = 24, isPaused = false }: { size?: number; isPaused?: boolean }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <style>{`\n .pause-bar, .play-triangle {\n transition: opacity 0.15s ease;\n }\n `}</style>\n {/* Pause bars - visible when not paused */}\n <path\n className=\"pause-bar\"\n d=\"M8 6L8 18\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n style={{ opacity: isPaused ? 0 : 1 }}\n />\n <path\n className=\"pause-bar\"\n d=\"M16 18L16 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n style={{ opacity: isPaused ? 0 : 1 }}\n />\n {/* Play triangle - visible when paused */}\n <path\n className=\"play-triangle\"\n d=\"M17.75 10.701C18.75 11.2783 18.75 12.7217 17.75 13.299L8.75 18.4952C7.75 19.0725 6.5 18.3509 6.5 17.1962L6.5 6.80384C6.5 5.64914 7.75 4.92746 8.75 5.50481L17.75 10.701Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n style={{ opacity: isPaused ? 1 : 0 }}\n />\n </svg>\n);\n\n// Eye with minus (hidden/collapsed state)\nexport const IconEyeMinus = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M4.91516 12.7108C4.63794 12.2883 4.63705 11.7565 4.91242 11.3328C5.84146 9.9033 8.30909 6.74994 12 6.74994C15.6909 6.74994 18.1585 9.9033 19.0876 11.3328C19.3629 11.7565 19.3621 12.2883 19.0848 12.7108C18.1537 14.13 15.6873 17.2499 12 17.2499C8.31272 17.2499 5.8463 14.13 4.91516 12.7108Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M9 12H15\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n// Gear icon\nexport const IconGear = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M10.6504 5.81117C10.9939 4.39628 13.0061 4.39628 13.3496 5.81117C13.5715 6.72517 14.6187 7.15891 15.4219 6.66952C16.6652 5.91193 18.0881 7.33479 17.3305 8.57815C16.8411 9.38134 17.2748 10.4285 18.1888 10.6504C19.6037 10.9939 19.6037 13.0061 18.1888 13.3496C17.2748 13.5715 16.8411 14.6187 17.3305 15.4219C18.0881 16.6652 16.6652 18.0881 15.4219 17.3305C14.6187 16.8411 13.5715 17.2748 13.3496 18.1888C13.0061 19.6037 10.9939 19.6037 10.6504 18.1888C10.4285 17.2748 9.38135 16.8411 8.57815 17.3305C7.33479 18.0881 5.91193 16.6652 6.66952 15.4219C7.15891 14.6187 6.72517 13.5715 5.81117 13.3496C4.39628 13.0061 4.39628 10.9939 5.81117 10.6504C6.72517 10.4285 7.15891 9.38134 6.66952 8.57815C5.91193 7.33479 7.33479 5.91192 8.57815 6.66952C9.38135 7.15891 10.4285 6.72517 10.6504 5.81117Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"12\" cy=\"12\" r=\"2.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n);\n\n// Pause icon (two vertical bars - original)\nexport const IconPauseAlt = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M9.25 5.75C9.80228 5.75 10.25 6.19772 10.25 6.75L10.25 17.25C10.25 17.8023 9.80228 18.25 9.25 18.25L6.75 18.25C6.19772 18.25 5.75 17.8023 5.75 17.25L5.75 6.75C5.75 6.19772 6.19772 5.75 6.75 5.75L9.25 5.75Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M17.25 5.75C17.8023 5.75 18.25 6.19772 18.25 6.75L18.25 17.25C18.25 17.8023 17.8023 18.25 17.25 18.25L14.75 18.25C14.1977 18.25 13.75 17.8023 13.75 17.25L13.75 6.75C13.75 6.19772 14.1977 5.75 14.75 5.75L17.25 5.75Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n </svg>\n);\n\n// Pause icon (simple lines)\nexport const IconPause = ({ size = 24 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M8 6L8 18\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M16 18L16 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n// Play icon (triangle pointing right)\nexport const IconPlayAlt = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M17.75 10.701C18.75 11.2783 18.75 12.7217 17.75 13.299L8.75 18.4952C7.75 19.0725 6.5 18.3509 6.5 17.1962L6.5 6.80384C6.5 5.64914 7.75 4.92746 8.75 5.50481L17.75 10.701Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n </svg>\n);\n\n// Trash can icon with detail\nexport const IconTrashAlt = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M10 11.5L10.125 15.5\"\n stroke=\"currentColor\"\n strokeOpacity=\"1\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M14 11.5L13.87 15.5\"\n stroke=\"currentColor\"\n strokeOpacity=\"1\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M9 7.5V6.25C9 5.42157 9.67157 4.75 10.5 4.75H13.5C14.3284 4.75 15 5.42157 15 6.25V7.5\"\n stroke=\"currentColor\"\n strokeOpacity=\"1\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M5.5 7.75H18.5\"\n stroke=\"currentColor\"\n strokeOpacity=\"1\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M6.75 7.75L7.11691 16.189C7.16369 17.2649 7.18708 17.8028 7.41136 18.2118C7.60875 18.5717 7.91211 18.8621 8.28026 19.0437C8.69854 19.25 9.23699 19.25 10.3139 19.25H13.6861C14.763 19.25 15.3015 19.25 15.7197 19.0437C16.0879 18.8621 16.3912 18.5717 16.5886 18.2118C16.8129 17.8028 16.8363 17.2649 16.8831 16.189L17.25 7.75\"\n stroke=\"currentColor\"\n strokeOpacity=\"1\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\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 <g clipPath=\"url(#clip0_1_660)\">\n <path\n d=\"M17.25 17.25L6.75 6.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M6.75 17.25L17.25 6.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_1_660\">\n <rect width=\"24\" height=\"24\" fill=\"white\" />\n </clipPath>\n </defs>\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 24 24\" fill=\"none\">\n <circle cx=\"12\" cy=\"12\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M12 5V3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M12 21V19\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M16.95 7.05L18.36 5.64\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M5.64 18.36L7.05 16.95\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M19 12H21\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M3 12H5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M16.95 16.95L18.36 18.36\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <path d=\"M5.64 5.64L7.05 7.05\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"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 24 24\" fill=\"none\">\n <path\n d=\"M21 12.79A9 9 0 1111.21 3a7 7 0 009.79 9.79z\"\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// Element Identification Utilities\n// =============================================================================\n\n/**\n * Gets a readable path for an element (e.g., \"article > section > p\")\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 parts.unshift(identifier);\n current = current.parentElement;\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\n const svg = target.closest(\"svg\");\n if (svg) {\n const parent = svg.parentElement;\n if (parent) {\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 = target.parentElement;\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 */\nexport function getNearbyElements(element: HTMLElement): string {\n const parent = element.parentElement;\n if (!parent) return \"\";\n\n const siblings = Array.from(parent.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/**\n * Gets detailed computed styles for forensic-level debugging\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\n // All the properties that are commonly relevant for debugging\n const 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\n \"display\", \"position\", \"top\", \"right\", \"bottom\", \"left\", \"zIndex\",\n \"flexDirection\", \"justifyContent\", \"alignItems\", \"gap\",\n // Visual\n \"opacity\", \"visibility\", \"overflow\", \"boxShadow\",\n // Transform\n \"transform\",\n ];\n\n for (const prop of properties) {\n const value = styles.getPropertyValue(prop.replace(/([A-Z])/g, \"-$1\").toLowerCase());\n if (value && value !== \"none\" && value !== \"normal\" && value !== \"auto\" && value !== \"0px\" && value !== \"rgba(0, 0, 0, 0)\") {\n result[prop] = value;\n }\n }\n\n return result;\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 */\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 parts.unshift(identifier);\n current = current.parentElement;\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","\nconst css = \"@keyframes styles-module__toolbarEnter___u8RRu {\\n from {\\n opacity: 0;\\n transform: scale(0.5) rotate(90deg);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1) rotate(0deg);\\n }\\n}\\n@keyframes styles-module__badgeEnter___mVQLj {\\n from {\\n opacity: 0;\\n transform: scale(0);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1);\\n }\\n}\\n@keyframes styles-module__scaleIn___c-r1K {\\n from {\\n opacity: 0;\\n transform: scale(0.85);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1);\\n }\\n}\\n@keyframes styles-module__scaleOut___Wctwz {\\n from {\\n opacity: 1;\\n transform: scale(1);\\n }\\n to {\\n opacity: 0;\\n transform: scale(0.85);\\n }\\n}\\n@keyframes styles-module__slideUp___kgD36 {\\n from {\\n opacity: 0;\\n transform: scale(0.85) translateY(8px);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1) translateY(0);\\n }\\n}\\n@keyframes styles-module__slideDown___zcdje {\\n from {\\n opacity: 1;\\n transform: scale(1) translateY(0);\\n }\\n to {\\n opacity: 0;\\n transform: scale(0.85) translateY(8px);\\n }\\n}\\n@keyframes styles-module__markerIn___5FaAP {\\n 0% {\\n opacity: 0;\\n transform: translate(-50%, -50%) scale(0.3);\\n }\\n 100% {\\n opacity: 1;\\n transform: translate(-50%, -50%) scale(1);\\n }\\n}\\n@keyframes styles-module__markerOut___GU5jX {\\n 0% {\\n opacity: 1;\\n transform: translate(-50%, -50%) scale(1);\\n }\\n 100% {\\n opacity: 0;\\n transform: translate(-50%, -50%) scale(0.3);\\n }\\n}\\n@keyframes styles-module__fadeIn___b9qmf {\\n from {\\n opacity: 0;\\n }\\n to {\\n opacity: 1;\\n }\\n}\\n@keyframes styles-module__fadeOut___6Ut6- {\\n from {\\n opacity: 1;\\n }\\n to {\\n opacity: 0;\\n }\\n}\\n@keyframes styles-module__tooltipIn___0N31w {\\n from {\\n opacity: 0;\\n transform: translateX(-50%) translateY(2px) scale(0.98);\\n }\\n to {\\n opacity: 1;\\n transform: translateX(-50%) translateY(0) scale(1);\\n }\\n}\\n@keyframes styles-module__hoverHighlightIn___6WYHY {\\n from {\\n opacity: 0;\\n transform: scale(0.98);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1);\\n }\\n}\\n@keyframes styles-module__hoverTooltipIn___FYGQx {\\n from {\\n opacity: 0;\\n transform: scale(0.95) translateY(4px);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1) translateY(0);\\n }\\n}\\n@keyframes styles-module__settingsPanelIn___MGfO8 {\\n from {\\n opacity: 0;\\n transform: translateY(10px) scale(0.95);\\n filter: blur(5px);\\n }\\n to {\\n opacity: 1;\\n transform: translateY(0) scale(1);\\n filter: blur(0px);\\n }\\n}\\n@keyframes styles-module__settingsPanelOut___Zfymi {\\n from {\\n opacity: 1;\\n transform: translateY(0) scale(1);\\n filter: blur(0px);\\n }\\n to {\\n opacity: 0;\\n transform: translateY(20px) scale(0.95);\\n filter: blur(5px);\\n }\\n}\\n.styles-module__toolbar___wNsdK {\\n position: fixed;\\n bottom: 1.25rem;\\n right: 1.25rem;\\n width: 257px;\\n z-index: 100000;\\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, sans-serif;\\n pointer-events: none;\\n transition: left 0s, top 0s, right 0s, bottom 0s;\\n}\\n\\n.styles-module__toolbarContainer___dIhma {\\n user-select: none;\\n margin-left: auto;\\n align-self: flex-end;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n background: #1a1a1a;\\n color: #fff;\\n border: none;\\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2), 0 4px 16px rgba(0, 0, 0, 0.1);\\n pointer-events: auto;\\n cursor: grab;\\n transition: width 0.4s cubic-bezier(0.19, 1, 0.22, 1), transform 0.4s cubic-bezier(0.19, 1, 0.22, 1);\\n}\\n.styles-module__toolbarContainer___dIhma.styles-module__dragging___xrolZ {\\n transition: width 0.4s cubic-bezier(0.19, 1, 0.22, 1);\\n cursor: grabbing;\\n}\\n.styles-module__toolbarContainer___dIhma.styles-module__entrance___sgHd8 {\\n animation: styles-module__toolbarEnter___u8RRu 0.5s cubic-bezier(0.34, 1.2, 0.64, 1) forwards;\\n}\\n.styles-module__toolbarContainer___dIhma.styles-module__collapsed___Rydsn {\\n width: 44px;\\n height: 44px;\\n border-radius: 22px;\\n padding: 0;\\n cursor: pointer;\\n}\\n.styles-module__toolbarContainer___dIhma.styles-module__collapsed___Rydsn svg {\\n margin-top: -1px;\\n}\\n.styles-module__toolbarContainer___dIhma.styles-module__collapsed___Rydsn:hover {\\n background: #2a2a2a;\\n}\\n.styles-module__toolbarContainer___dIhma.styles-module__collapsed___Rydsn:active {\\n transform: scale(0.95);\\n}\\n.styles-module__toolbarContainer___dIhma.styles-module__expanded___ofKPx {\\n width: calc-size(auto, size);\\n height: 44px;\\n border-radius: 1.5rem;\\n padding: 0.375rem;\\n}\\n@supports not (width: calc-size(auto, size)) {\\n .styles-module__toolbarContainer___dIhma.styles-module__expanded___ofKPx {\\n width: 257px;\\n }\\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 opacity: 0;\\n filter: blur(10px);\\n transform: scale(0.4);\\n pointer-events: none;\\n}\\n\\n.styles-module__badge___2XsgF {\\n position: absolute;\\n top: -16px;\\n right: -16px;\\n user-select: none;\\n min-width: 18px;\\n height: 18px;\\n padding: 0 5px;\\n border-radius: 9px;\\n background: #3c82f7;\\n color: white;\\n font-size: 0.625rem;\\n font-weight: 600;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);\\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 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) {\\n background: rgba(255, 255, 255, 0.12);\\n color: #fff;\\n}\\n.styles-module__controlButton___8Q0jc:active:not(:disabled) {\\n transform: scale(0.92);\\n}\\n.styles-module__controlButton___8Q0jc:disabled {\\n opacity: 0.35;\\n cursor: not-allowed;\\n}\\n.styles-module__controlButton___8Q0jc[data-active=true] {\\n color: #3c82f7;\\n background: rgba(60, 130, 247, 0.25);\\n}\\n.styles-module__controlButton___8Q0jc[data-danger]:hover:not(:disabled) {\\n background: rgba(255, 59, 48, 0.25);\\n color: #ff3b30;\\n}\\n\\n.styles-module__divider___c--s1 {\\n width: 1px;\\n height: 12px;\\n background: rgba(255, 255, 255, 0.15);\\n margin: 0 0.125rem;\\n}\\n\\n.styles-module__overlay___Q1O9y {\\n position: fixed;\\n inset: 0;\\n z-index: 99997;\\n pointer-events: none;\\n}\\n.styles-module__overlay___Q1O9y > * {\\n pointer-events: auto;\\n}\\n\\n.styles-module__hoverHighlight___ogakW {\\n position: fixed;\\n border: 2px solid rgba(60, 130, 247, 0.5);\\n border-radius: 4px;\\n pointer-events: none !important;\\n background: rgba(60, 130, 247, 0.04);\\n box-sizing: border-box;\\n will-change: opacity;\\n contain: layout style;\\n}\\n.styles-module__hoverHighlight___ogakW.styles-module__enter___WFIki {\\n animation: styles-module__hoverHighlightIn___6WYHY 0.12s ease-out forwards;\\n}\\n\\n.styles-module__multiSelectOutline___cSJ-m {\\n position: fixed;\\n border: 2px dashed rgba(52, 199, 89, 0.6);\\n border-radius: 4px;\\n pointer-events: none !important;\\n background: rgba(52, 199, 89, 0.05);\\n box-sizing: border-box;\\n will-change: opacity;\\n}\\n.styles-module__multiSelectOutline___cSJ-m.styles-module__enter___WFIki {\\n animation: styles-module__fadeIn___b9qmf 0.15s ease-out forwards;\\n}\\n.styles-module__multiSelectOutline___cSJ-m.styles-module__exit___fyOJ0 {\\n animation: styles-module__fadeOut___6Ut6- 0.15s ease-out forwards;\\n}\\n\\n.styles-module__singleSelectOutline___QhX-O {\\n position: fixed;\\n border: 2px solid rgba(60, 130, 247, 0.6);\\n border-radius: 4px;\\n pointer-events: none !important;\\n background: rgba(60, 130, 247, 0.05);\\n box-sizing: border-box;\\n will-change: opacity;\\n}\\n.styles-module__singleSelectOutline___QhX-O.styles-module__enter___WFIki {\\n animation: styles-module__fadeIn___b9qmf 0.15s ease-out forwards;\\n}\\n.styles-module__singleSelectOutline___QhX-O.styles-module__exit___fyOJ0 {\\n animation: styles-module__fadeOut___6Ut6- 0.15s ease-out forwards;\\n}\\n\\n.styles-module__hoverTooltip___bvLk7 {\\n position: fixed;\\n font-size: 0.6875rem;\\n font-weight: 500;\\n color: #fff;\\n background: rgba(0, 0, 0, 0.85);\\n padding: 0.35rem 0.6rem;\\n border-radius: 0.375rem;\\n pointer-events: none !important;\\n white-space: nowrap;\\n max-width: 200px;\\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__markersLayer___-25j1 {\\n position: absolute;\\n top: 0;\\n left: 0;\\n right: 0;\\n height: 0;\\n z-index: 99998;\\n pointer-events: none;\\n}\\n.styles-module__markersLayer___-25j1 > * {\\n pointer-events: auto;\\n}\\n\\n.styles-module__fixedMarkersLayer___ffyX6 {\\n position: fixed;\\n top: 0;\\n left: 0;\\n right: 0;\\n bottom: 0;\\n z-index: 99998;\\n pointer-events: none;\\n}\\n.styles-module__fixedMarkersLayer___ffyX6 > * {\\n pointer-events: auto;\\n}\\n\\n.styles-module__marker___6sQrs {\\n position: absolute;\\n width: 22px;\\n height: 22px;\\n background: #3c82f7;\\n color: white;\\n border-radius: 50%;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n font-size: 0.6875rem;\\n font-weight: 600;\\n transform: translate(-50%, -50%) scale(1);\\n opacity: 1;\\n cursor: pointer;\\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);\\n user-select: none;\\n will-change: transform, opacity;\\n contain: layout style;\\n z-index: 1;\\n}\\n.styles-module__marker___6sQrs:hover {\\n z-index: 2;\\n}\\n.styles-module__marker___6sQrs:not(.styles-module__enter___WFIki):not(.styles-module__exit___fyOJ0):not(.styles-module__clearing___FQ--7) {\\n transition: background-color 0.15s ease, transform 0.1s ease;\\n}\\n.styles-module__marker___6sQrs.styles-module__enter___WFIki {\\n animation: styles-module__markerIn___5FaAP 0.25s cubic-bezier(0.22, 1, 0.36, 1) both;\\n}\\n.styles-module__marker___6sQrs.styles-module__exit___fyOJ0 {\\n animation: styles-module__markerOut___GU5jX 0.2s ease-out both;\\n pointer-events: none;\\n}\\n.styles-module__marker___6sQrs.styles-module__clearing___FQ--7 {\\n animation: styles-module__markerOut___GU5jX 0.15s ease-out both;\\n pointer-events: none;\\n}\\n.styles-module__marker___6sQrs:not(.styles-module__enter___WFIki):not(.styles-module__exit___fyOJ0):not(.styles-module__clearing___FQ--7):hover {\\n transform: translate(-50%, -50%) scale(1.1);\\n}\\n.styles-module__marker___6sQrs.styles-module__pending___2IHLC {\\n position: fixed;\\n background: #3c82f7;\\n}\\n.styles-module__marker___6sQrs.styles-module__fixed___dBMHC {\\n position: fixed;\\n}\\n.styles-module__marker___6sQrs.styles-module__multiSelect___YWiuz {\\n background: #34c759;\\n width: 26px;\\n height: 26px;\\n border-radius: 6px;\\n font-size: 0.75rem;\\n}\\n.styles-module__marker___6sQrs.styles-module__multiSelect___YWiuz.styles-module__pending___2IHLC {\\n background: #34c759;\\n}\\n.styles-module__marker___6sQrs.styles-module__hovered___ZgXIy {\\n background: #ff3b30;\\n}\\n\\n.styles-module__renumber___nCTxD {\\n display: block;\\n animation: styles-module__renumberRoll___Wgbq3 0.2s ease-out;\\n}\\n\\n@keyframes styles-module__renumberRoll___Wgbq3 {\\n 0% {\\n transform: translateX(-40%);\\n opacity: 0;\\n }\\n 100% {\\n transform: translateX(0);\\n opacity: 1;\\n }\\n}\\n.styles-module__markerTooltip___aLJID {\\n position: absolute;\\n top: calc(100% + 10px);\\n left: 50%;\\n transform: translateX(-50%);\\n z-index: 100002;\\n background: #1a1a1a;\\n padding: 0.625rem 0.75rem;\\n border-radius: 0.75rem;\\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: 0.6875rem;\\n font-style: italic;\\n color: rgba(255, 255, 255, 0.5);\\n margin-bottom: 0.375rem;\\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: 0.75rem;\\n font-weight: 450;\\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.3);\\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 background: white;\\n border-radius: 1rem;\\n padding: 13px 1rem 16px;\\n min-width: 205px;\\n box-shadow: 0 1px 8px rgba(0, 0, 0, 0.25), 0 0 0 1px rgba(0, 0, 0, 0.04);\\n transition: background 0.25s ease, box-shadow 0.25s ease;\\n}\\n.styles-module__settingsPanel___OxX3Y .styles-module__settingsHeader___pwDY9,\\n.styles-module__settingsPanel___OxX3Y .styles-module__settingsBrand___0gJeM,\\n.styles-module__settingsPanel___OxX3Y .styles-module__settingsBrandSlash___uTG18,\\n.styles-module__settingsPanel___OxX3Y .styles-module__settingsVersion___TUcFq,\\n.styles-module__settingsPanel___OxX3Y .styles-module__settingsSection___m-YM2,\\n.styles-module__settingsPanel___OxX3Y .styles-module__settingsLabel___8UjfX,\\n.styles-module__settingsPanel___OxX3Y .styles-module__cycleButton___FMKfw,\\n.styles-module__settingsPanel___OxX3Y .styles-module__cycleDot___nPgLY,\\n.styles-module__settingsPanel___OxX3Y .styles-module__dropdownButton___16NPz,\\n.styles-module__settingsPanel___OxX3Y .styles-module__toggleLabel___Xm8Aa,\\n.styles-module__settingsPanel___OxX3Y .styles-module__customCheckbox___U39ax,\\n.styles-module__settingsPanel___OxX3Y .styles-module__sliderLabel___U8sPr,\\n.styles-module__settingsPanel___OxX3Y .styles-module__slider___GLdxp,\\n.styles-module__settingsPanel___OxX3Y .styles-module__helpIcon___xQg56,\\n.styles-module__settingsPanel___OxX3Y .styles-module__themeToggle___2rUjA {\\n transition: background 0.25s ease, color 0.25s ease, border-color 0.25s ease;\\n}\\n.styles-module__settingsPanel___OxX3Y.styles-module__enter___WFIki {\\n opacity: 1;\\n transform: translateY(0) scale(1);\\n filter: blur(0px);\\n transition: opacity 0.2s ease, transform 0.2s ease, filter 0.2s ease;\\n}\\n.styles-module__settingsPanel___OxX3Y.styles-module__exit___fyOJ0 {\\n opacity: 0;\\n transform: translateY(8px) scale(0.95);\\n filter: blur(5px);\\n pointer-events: none;\\n transition: opacity 0.1s ease, transform 0.1s ease, filter 0.1s ease;\\n}\\n.styles-module__settingsPanel___OxX3Y.styles-module__dark___ILIQf {\\n background: #1a1a1a;\\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(255, 255, 255, 0.08);\\n}\\n.styles-module__settingsPanel___OxX3Y.styles-module__dark___ILIQf .styles-module__settingsLabel___8UjfX {\\n color: rgba(255, 255, 255, 0.6);\\n}\\n.styles-module__settingsPanel___OxX3Y.styles-module__dark___ILIQf .styles-module__settingsOption___UNa12 {\\n color: rgba(255, 255, 255, 0.85);\\n}\\n.styles-module__settingsPanel___OxX3Y.styles-module__dark___ILIQf .styles-module__settingsOption___UNa12:hover {\\n background: rgba(255, 255, 255, 0.1);\\n}\\n.styles-module__settingsPanel___OxX3Y.styles-module__dark___ILIQf .styles-module__settingsOption___UNa12.styles-module__selected___OwRqP {\\n background: rgba(255, 255, 255, 0.15);\\n color: #fff;\\n}\\n.styles-module__settingsPanel___OxX3Y.styles-module__dark___ILIQf .styles-module__toggleLabel___Xm8Aa {\\n color: rgba(255, 255, 255, 0.85);\\n}\\n\\n.styles-module__settingsHeader___pwDY9 {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n min-height: 24px;\\n margin-bottom: 0.5rem;\\n padding-bottom: 9px;\\n border-bottom: 1px solid rgba(255, 255, 255, 0.07);\\n}\\n\\n.styles-module__settingsBrand___0gJeM {\\n font-size: 0.8125rem;\\n font-weight: 600;\\n letter-spacing: -0.0094em;\\n color: #fff;\\n}\\n\\n.styles-module__settingsBrandSlash___uTG18 {\\n color: rgba(255, 255, 255, 0.5);\\n}\\n\\n.styles-module__settingsVersion___TUcFq {\\n font-size: 0.6875rem;\\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: calc(0.5rem + 2px);\\n border-top: 1px solid rgba(255, 255, 255, 0.07);\\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\\n.styles-module__dropdownContainer___BVnxe {\\n position: relative;\\n}\\n\\n.styles-module__dropdownButton___16NPz {\\n display: flex;\\n align-items: center;\\n gap: 0.5rem;\\n padding: 0.25rem 0.5rem;\\n border: none;\\n border-radius: 0.375rem;\\n background: transparent;\\n font-size: 0.8125rem;\\n font-weight: 600;\\n color: #fff;\\n cursor: pointer;\\n transition: background-color 0.15s ease, color 0.15s ease;\\n letter-spacing: -0.0094em;\\n}\\n.styles-module__dropdownButton___16NPz:hover {\\n background: rgba(255, 255, 255, 0.08);\\n}\\n.styles-module__dropdownButton___16NPz svg {\\n opacity: 0.6;\\n}\\n\\n.styles-module__cycleButton___FMKfw {\\n display: flex;\\n align-items: center;\\n gap: 0.5rem;\\n padding: 0;\\n border: none;\\n background: transparent;\\n font-size: 0.8125rem;\\n font-weight: 500;\\n color: #fff;\\n cursor: pointer;\\n letter-spacing: -0.0094em;\\n}\\n.styles-module__cycleButton___FMKfw.styles-module__light___r6n4Y {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n\\n@keyframes styles-module__cycleTextIn___Q6zJf {\\n 0% {\\n opacity: 0;\\n transform: translateY(-6px);\\n }\\n 100% {\\n opacity: 1;\\n transform: translateY(0);\\n }\\n}\\n.styles-module__cycleButtonText___fD1LR {\\n display: inline-block;\\n animation: styles-module__cycleTextIn___Q6zJf 0.2s ease-out;\\n}\\n\\n.styles-module__cycleDots___LWuoQ {\\n display: flex;\\n flex-direction: column;\\n gap: 2px;\\n}\\n\\n.styles-module__cycleDot___nPgLY {\\n width: 3px;\\n height: 3px;\\n border-radius: 50%;\\n background: rgba(255, 255, 255, 0.3);\\n transform: scale(0.667);\\n transition: background-color 0.25s ease-out, transform 0.25s ease-out;\\n}\\n.styles-module__cycleDot___nPgLY.styles-module__active___-zoN6 {\\n background: #fff;\\n transform: scale(1);\\n}\\n.styles-module__cycleDot___nPgLY.styles-module__light___r6n4Y {\\n background: rgba(0, 0, 0, 0.2);\\n}\\n.styles-module__cycleDot___nPgLY.styles-module__light___r6n4Y.styles-module__active___-zoN6 {\\n background: rgba(0, 0, 0, 0.7);\\n}\\n\\n.styles-module__dropdownMenu___k73ER {\\n position: absolute;\\n right: 0;\\n top: calc(100% + 0.25rem);\\n background: #1a1a1a;\\n border-radius: 0.5rem;\\n padding: 0.25rem;\\n min-width: 120px;\\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(255, 255, 255, 0.1);\\n z-index: 10;\\n animation: styles-module__scaleIn___c-r1K 0.15s ease-out;\\n}\\n\\n.styles-module__dropdownItem___ylsLj {\\n width: 100%;\\n display: flex;\\n align-items: center;\\n padding: 0.5rem 0.625rem;\\n border: none;\\n border-radius: 0.375rem;\\n background: transparent;\\n font-size: 0.8125rem;\\n font-weight: 500;\\n color: rgba(255, 255, 255, 0.85);\\n cursor: pointer;\\n text-align: left;\\n transition: background-color 0.15s ease, color 0.15s ease;\\n letter-spacing: -0.0094em;\\n}\\n.styles-module__dropdownItem___ylsLj:hover {\\n background: rgba(255, 255, 255, 0.08);\\n}\\n.styles-module__dropdownItem___ylsLj.styles-module__selected___OwRqP {\\n background: rgba(255, 255, 255, 0.12);\\n color: #fff;\\n font-weight: 600;\\n}\\n\\n.styles-module__settingsLabel___8UjfX {\\n font-size: 0.8125rem;\\n font-weight: 400;\\n letter-spacing: -0.0094em;\\n color: rgba(255, 255, 255, 0.5);\\n display: flex;\\n align-items: center;\\n gap: 0.125rem;\\n}\\n.styles-module__settingsLabel___8UjfX.styles-module__light___r6n4Y {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n\\n.styles-module__settingsLabelMarker___ewdtV {\\n margin-bottom: 10px;\\n}\\n\\n.styles-module__settingsOptions___LyrBA {\\n display: flex;\\n gap: 0.25rem;\\n}\\n\\n.styles-module__settingsOption___UNa12 {\\n flex: 1;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n gap: 0.25rem;\\n padding: 0.375rem 0.5rem;\\n border: none;\\n border-radius: 0.375rem;\\n background: transparent;\\n font-size: 0.6875rem;\\n font-weight: 500;\\n color: rgba(0, 0, 0, 0.7);\\n cursor: pointer;\\n transition: background-color 0.15s ease, color 0.15s ease;\\n}\\n.styles-module__settingsOption___UNa12:hover {\\n background: rgba(0, 0, 0, 0.05);\\n}\\n.styles-module__settingsOption___UNa12.styles-module__selected___OwRqP {\\n background: rgba(60, 130, 247, 0.15);\\n color: #3c82f7;\\n}\\n\\n.styles-module__sliderContainer___ducXj {\\n display: flex;\\n flex-direction: column;\\n gap: 0.5rem;\\n}\\n\\n.styles-module__slider___GLdxp {\\n -webkit-appearance: none;\\n appearance: none;\\n width: 100%;\\n height: 4px;\\n background: rgba(255, 255, 255, 0.15);\\n border-radius: 2px;\\n outline: none;\\n cursor: pointer;\\n}\\n.styles-module__slider___GLdxp::-webkit-slider-thumb {\\n -webkit-appearance: none;\\n appearance: none;\\n width: 14px;\\n height: 14px;\\n background: white;\\n border-radius: 50%;\\n cursor: pointer;\\n transition: transform 0.15s ease, box-shadow 0.15s ease;\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);\\n}\\n.styles-module__slider___GLdxp::-moz-range-thumb {\\n width: 14px;\\n height: 14px;\\n background: white;\\n border: none;\\n border-radius: 50%;\\n cursor: pointer;\\n transition: transform 0.15s ease, box-shadow 0.15s ease;\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);\\n}\\n.styles-module__slider___GLdxp:hover::-webkit-slider-thumb {\\n transform: scale(1.15);\\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.4);\\n}\\n.styles-module__slider___GLdxp:hover::-moz-range-thumb {\\n transform: scale(1.15);\\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.4);\\n}\\n\\n.styles-module__sliderLabels___FhLDB {\\n display: flex;\\n justify-content: space-between;\\n}\\n\\n.styles-module__sliderLabel___U8sPr {\\n font-size: 0.625rem;\\n font-weight: 500;\\n color: rgba(255, 255, 255, 0.4);\\n cursor: pointer;\\n transition: color 0.15s ease;\\n}\\n.styles-module__sliderLabel___U8sPr:hover {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.styles-module__sliderLabel___U8sPr.styles-module__active___-zoN6 {\\n color: rgba(255, 255, 255, 0.9);\\n}\\n\\n.styles-module__colorOptions___iHCNX {\\n display: flex;\\n gap: 0.5rem;\\n margin-top: 0.375rem;\\n margin-bottom: 1px;\\n}\\n\\n.styles-module__colorOption___IodiY {\\n display: block;\\n width: 20px;\\n height: 20px;\\n border-radius: 50%;\\n border: 2px solid transparent;\\n cursor: pointer;\\n transition: transform 0.2s cubic-bezier(0.25, 1, 0.5, 1);\\n}\\n.styles-module__colorOption___IodiY:hover {\\n transform: scale(1.15);\\n}\\n.styles-module__colorOption___IodiY.styles-module__selected___OwRqP {\\n transform: scale(0.83);\\n}\\n\\n.styles-module__colorOptionRing___U2xpo {\\n display: flex;\\n width: 24px;\\n height: 24px;\\n border: 2px solid transparent;\\n border-radius: 50%;\\n transition: border-color 0.3s ease;\\n}\\n.styles-module__settingsToggle___fBrFn {\\n display: flex;\\n align-items: center;\\n gap: 0.5rem;\\n cursor: pointer;\\n}\\n.styles-module__settingsToggle___fBrFn + .styles-module__settingsToggle___fBrFn {\\n margin-top: calc(0.5rem + 6px);\\n}\\n.styles-module__settingsToggle___fBrFn input[type=checkbox] {\\n position: absolute;\\n opacity: 0;\\n width: 0;\\n height: 0;\\n}\\n\\n.styles-module__customCheckbox___U39ax {\\n position: relative;\\n width: 14px;\\n height: 14px;\\n border: 1px solid rgba(255, 255, 255, 0.2);\\n border-radius: 4px;\\n background: rgba(255, 255, 255, 0.05);\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n flex-shrink: 0;\\n transition: background 0.25s ease, border-color 0.25s ease;\\n}\\n.styles-module__customCheckbox___U39ax svg {\\n color: #1a1a1a;\\n opacity: 1;\\n transition: opacity 0.15s ease;\\n}\\ninput[type=checkbox]:checked + .styles-module__customCheckbox___U39ax {\\n border-color: rgba(255, 255, 255, 0.3);\\n background: rgb(255, 255, 255);\\n}\\n.styles-module__customCheckbox___U39ax.styles-module__light___r6n4Y {\\n border: 1px solid rgba(0, 0, 0, 0.15);\\n background: #fff;\\n}\\n.styles-module__customCheckbox___U39ax.styles-module__light___r6n4Y.styles-module__checked___mnZLo {\\n border-color: #1a1a1a;\\n background: #1a1a1a;\\n}\\n.styles-module__customCheckbox___U39ax.styles-module__light___r6n4Y.styles-module__checked___mnZLo svg {\\n color: #fff;\\n}\\n\\n.styles-module__toggleLabel___Xm8Aa {\\n font-size: 0.8125rem;\\n font-weight: 400;\\n color: rgba(255, 255, 255, 0.5);\\n letter-spacing: -0.0094em;\\n display: flex;\\n align-items: center;\\n gap: 0.25rem;\\n}\\n.styles-module__toggleLabel___Xm8Aa.styles-module__light___r6n4Y {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n\\n.styles-module__helpIcon___xQg56 {\\n position: relative;\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n cursor: help;\\n margin-left: 0;\\n}\\n.styles-module__helpIcon___xQg56 svg {\\n display: block;\\n transform: translateY(1px);\\n color: rgba(255, 255, 255, 0.4);\\n transition: color 0.15s ease;\\n}\\n.styles-module__helpIcon___xQg56:hover svg {\\n color: rgba(255, 255, 255, 0.7);\\n}\\n.styles-module__helpIcon___xQg56::after {\\n content: attr(data-tooltip);\\n position: absolute;\\n right: calc(100% + 8px);\\n top: 50%;\\n transform: translateY(-50%);\\n padding: 8px 10px;\\n background: #383838;\\n color: rgba(255, 255, 255, 0.7);\\n font-size: 11px;\\n font-weight: 400;\\n line-height: 1.4;\\n border-radius: 10px;\\n white-space: normal;\\n width: 152px;\\n text-align: left;\\n opacity: 0;\\n visibility: hidden;\\n transition: opacity 0.15s ease, visibility 0.15s ease;\\n pointer-events: none;\\n z-index: 100;\\n box-shadow: 0px 1px 8px rgba(0, 0, 0, 0.28);\\n}\\n.styles-module__helpIcon___xQg56:hover::after {\\n opacity: 1;\\n visibility: visible;\\n transition-delay: 0.5s;\\n}\\n\\n.styles-module__dragSelection___kZLq2 {\\n position: fixed;\\n top: 0;\\n left: 0;\\n border: 2px solid rgba(52, 199, 89, 0.6);\\n border-radius: 4px;\\n background: rgba(52, 199, 89, 0.08);\\n pointer-events: none;\\n z-index: 99997;\\n will-change: transform, width, height;\\n contain: layout style;\\n}\\n\\n.styles-module__dragCount___KM90j {\\n position: absolute;\\n top: 50%;\\n left: 50%;\\n transform: translate(-50%, -50%);\\n background: #34c759;\\n color: white;\\n font-size: 0.875rem;\\n font-weight: 600;\\n padding: 0.25rem 0.5rem;\\n border-radius: 1rem;\\n min-width: 1.5rem;\\n text-align: center;\\n}\\n\\n.styles-module__highlightsContainer___-0xzG {\\n position: fixed;\\n top: 0;\\n left: 0;\\n pointer-events: none;\\n z-index: 99996;\\n}\\n\\n.styles-module__selectedElementHighlight___fyVlI {\\n position: fixed;\\n top: 0;\\n left: 0;\\n border: 2px solid rgba(52, 199, 89, 0.5);\\n border-radius: 4px;\\n background: rgba(52, 199, 89, 0.06);\\n pointer-events: none;\\n will-change: transform, width, height;\\n contain: layout style;\\n}\\n\\n.styles-module__light___r6n4Y.styles-module__toolbarContainer___dIhma {\\n background: #fff;\\n color: rgba(0, 0, 0, 0.85);\\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08), 0 4px 16px rgba(0, 0, 0, 0.06), 0 0 0 1px rgba(0, 0, 0, 0.04);\\n}\\n.styles-module__light___r6n4Y.styles-module__toolbarContainer___dIhma.styles-module__collapsed___Rydsn:hover {\\n background: #f5f5f5;\\n}\\n.styles-module__light___r6n4Y.styles-module__controlButton___8Q0jc {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n.styles-module__light___r6n4Y.styles-module__controlButton___8Q0jc:hover:not(:disabled) {\\n background: rgba(0, 0, 0, 0.06);\\n color: rgba(0, 0, 0, 0.85);\\n}\\n.styles-module__light___r6n4Y.styles-module__controlButton___8Q0jc[data-active=true] {\\n color: #3c82f7;\\n background: rgba(60, 130, 247, 0.15);\\n}\\n.styles-module__light___r6n4Y.styles-module__controlButton___8Q0jc[data-danger]:hover:not(:disabled) {\\n background: rgba(255, 59, 48, 0.15);\\n color: #ff3b30;\\n}\\n.styles-module__light___r6n4Y.styles-module__divider___c--s1 {\\n background: rgba(0, 0, 0, 0.1);\\n}\\n.styles-module__light___r6n4Y.styles-module__markerTooltip___aLJID {\\n background: #fff;\\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(0, 0, 0, 0.06);\\n}\\n.styles-module__light___r6n4Y.styles-module__markerTooltip___aLJID .styles-module__markerQuote___FHmrz {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n.styles-module__light___r6n4Y.styles-module__markerTooltip___aLJID .styles-module__markerNote___QkrrS {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n.styles-module__light___r6n4Y.styles-module__markerTooltip___aLJID .styles-module__markerHint___2iF-6 {\\n color: rgba(0, 0, 0, 0.35);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y {\\n background: #fff;\\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08), 0 4px 16px rgba(0, 0, 0, 0.06), 0 0 0 1px rgba(0, 0, 0, 0.04);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__settingsHeader___pwDY9 {\\n border-bottom-color: rgba(0, 0, 0, 0.08);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__settingsBrand___0gJeM {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__settingsBrandSlash___uTG18 {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__settingsVersion___TUcFq {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__settingsSection___m-YM2 {\\n border-top-color: rgba(0, 0, 0, 0.08);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__settingsLabel___8UjfX {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__cycleButton___FMKfw {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__cycleDot___nPgLY {\\n background: rgba(0, 0, 0, 0.2);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__cycleDot___nPgLY.styles-module__active___-zoN6 {\\n background: rgba(0, 0, 0, 0.7);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__dropdownButton___16NPz {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__dropdownButton___16NPz:hover {\\n background: rgba(0, 0, 0, 0.05);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__toggleLabel___Xm8Aa {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__customCheckbox___U39ax {\\n border: 1px solid rgba(0, 0, 0, 0.15);\\n background: #fff;\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__customCheckbox___U39ax.styles-module__checked___mnZLo {\\n border-color: #1a1a1a;\\n background: #1a1a1a;\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__customCheckbox___U39ax.styles-module__checked___mnZLo svg {\\n color: #fff;\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__sliderLabel___U8sPr {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__sliderLabel___U8sPr:hover {\\n color: rgba(0, 0, 0, 0.7);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__sliderLabel___U8sPr.styles-module__active___-zoN6 {\\n color: rgba(0, 0, 0, 0.9);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__slider___GLdxp {\\n background: rgba(0, 0, 0, 0.1);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__slider___GLdxp::-webkit-slider-thumb {\\n background: #1a1a1a;\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__slider___GLdxp::-moz-range-thumb {\\n background: #1a1a1a;\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__helpIcon___xQg56 svg {\\n color: rgba(0, 0, 0, 0.6);\\n}\\n.styles-module__light___r6n4Y.styles-module__settingsPanel___OxX3Y .styles-module__helpIcon___xQg56:hover svg {\\n color: rgba(0, 0, 0, 0.7);\\n}\\n\\n.styles-module__themeToggle___2rUjA {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 22px;\\n height: 22px;\\n margin-left: 0.5rem;\\n border: none;\\n border-radius: 6px;\\n background: transparent;\\n color: rgba(255, 255, 255, 0.4);\\n cursor: pointer;\\n transition: background-color 0.15s ease, color 0.15s ease;\\n}\\n.styles-module__themeToggle___2rUjA:hover {\\n background: rgba(255, 255, 255, 0.1);\\n color: rgba(255, 255, 255, 0.8);\\n}\\n.styles-module__light___r6n4Y .styles-module__themeToggle___2rUjA {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n.styles-module__light___r6n4Y .styles-module__themeToggle___2rUjA:hover {\\n background: rgba(0, 0, 0, 0.06);\\n color: rgba(0, 0, 0, 0.7);\\n}\";\nconst classNames = {\"toolbar\":\"styles-module__toolbar___wNsdK\",\"toolbarContainer\":\"styles-module__toolbarContainer___dIhma\",\"dragging\":\"styles-module__dragging___xrolZ\",\"entrance\":\"styles-module__entrance___sgHd8\",\"toolbarEnter\":\"styles-module__toolbarEnter___u8RRu\",\"collapsed\":\"styles-module__collapsed___Rydsn\",\"expanded\":\"styles-module__expanded___ofKPx\",\"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\",\"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\",\"markersLayer\":\"styles-module__markersLayer___-25j1\",\"fixedMarkersLayer\":\"styles-module__fixedMarkersLayer___ffyX6\",\"marker\":\"styles-module__marker___6sQrs\",\"clearing\":\"styles-module__clearing___FQ--7\",\"markerIn\":\"styles-module__markerIn___5FaAP\",\"markerOut\":\"styles-module__markerOut___GU5jX\",\"pending\":\"styles-module__pending___2IHLC\",\"fixed\":\"styles-module__fixed___dBMHC\",\"multiSelect\":\"styles-module__multiSelect___YWiuz\",\"hovered\":\"styles-module__hovered___ZgXIy\",\"renumber\":\"styles-module__renumber___nCTxD\",\"renumberRoll\":\"styles-module__renumberRoll___Wgbq3\",\"markerTooltip\":\"styles-module__markerTooltip___aLJID\",\"tooltipIn\":\"styles-module__tooltipIn___0N31w\",\"markerQuote\":\"styles-module__markerQuote___FHmrz\",\"markerNote\":\"styles-module__markerNote___QkrrS\",\"markerHint\":\"styles-module__markerHint___2iF-6\",\"settingsPanel\":\"styles-module__settingsPanel___OxX3Y\",\"settingsHeader\":\"styles-module__settingsHeader___pwDY9\",\"settingsBrand\":\"styles-module__settingsBrand___0gJeM\",\"settingsBrandSlash\":\"styles-module__settingsBrandSlash___uTG18\",\"settingsVersion\":\"styles-module__settingsVersion___TUcFq\",\"settingsSection\":\"styles-module__settingsSection___m-YM2\",\"settingsLabel\":\"styles-module__settingsLabel___8UjfX\",\"cycleButton\":\"styles-module__cycleButton___FMKfw\",\"cycleDot\":\"styles-module__cycleDot___nPgLY\",\"dropdownButton\":\"styles-module__dropdownButton___16NPz\",\"toggleLabel\":\"styles-module__toggleLabel___Xm8Aa\",\"customCheckbox\":\"styles-module__customCheckbox___U39ax\",\"sliderLabel\":\"styles-module__sliderLabel___U8sPr\",\"slider\":\"styles-module__slider___GLdxp\",\"helpIcon\":\"styles-module__helpIcon___xQg56\",\"themeToggle\":\"styles-module__themeToggle___2rUjA\",\"dark\":\"styles-module__dark___ILIQf\",\"settingsOption\":\"styles-module__settingsOption___UNa12\",\"selected\":\"styles-module__selected___OwRqP\",\"settingsRow\":\"styles-module__settingsRow___3sdhc\",\"dropdownContainer\":\"styles-module__dropdownContainer___BVnxe\",\"light\":\"styles-module__light___r6n4Y\",\"cycleButtonText\":\"styles-module__cycleButtonText___fD1LR\",\"cycleTextIn\":\"styles-module__cycleTextIn___Q6zJf\",\"cycleDots\":\"styles-module__cycleDots___LWuoQ\",\"active\":\"styles-module__active___-zoN6\",\"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\",\"checked\":\"styles-module__checked___mnZLo\",\"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\",\"settingsPanelIn\":\"styles-module__settingsPanelIn___MGfO8\",\"settingsPanelOut\":\"styles-module__settingsPanelOut___Zfymi\"};\n\n// SSR-safe style injection\nif (typeof document !== 'undefined') {\n let style = document.getElementById('feedback-tool-styles-page-toolbar-css-styles');\n if (!style) {\n style = document.createElement('style');\n style.id = 'feedback-tool-styles-page-toolbar-css-styles';\n style.textContent = css;\n document.head.appendChild(style);\n }\n}\n\nexport default classNames;\n"],"mappings":"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","names":["import_react","AnnotationPopupCSS","import_jsx_runtime","css","classNames","styles_module_default","import_jsx_runtime","left","top","styles_module_default","DRAG_THRESHOLD"]}