agentation 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of agentation might be problematic. Click here for more details.
- package/README.md +169 -0
- package/dist/index.cjs +2290 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +183 -0
- package/dist/index.d.ts +183 -0
- package/dist/index.js +2243 -0
- package/dist/index.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/page-toolbar/index.tsx","../src/components/annotation-popup/index.tsx","../src/components/annotation-popup/styles.module.scss","../src/components/icons.tsx","../src/utils/element-identification.ts","../src/utils/storage.ts","../src/components/page-toolbar/styles.module.scss","../src/components/page-toolbar/index-css.tsx","../src/components/annotation-popup/index-css.tsx","../src/components/icons-css.tsx"],"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 (with framer-motion - smoother animations):\n// import { Agentation } from 'agentation';\n// <Agentation />\n//\n// Usage (CSS-only - zero runtime deps):\n// import { AgentationCSS } from 'agentation';\n// <AgentationCSS />\n//\n// =============================================================================\n\n// Main components\n// Framer-motion version (default - smoother animations, requires framer-motion peer dep)\nexport { PageFeedbackToolbar as Agentation } from \"./components/page-toolbar\";\nexport { PageFeedbackToolbar as FeedbackToolbar } from \"./components/page-toolbar\"; // legacy alias\nexport { PageFeedbackToolbar } from \"./components/page-toolbar\"; // legacy alias\n\n// CSS-only version (no framer-motion dependency)\nexport { PageFeedbackToolbarCSS as AgentationCSS } from \"./components/page-toolbar/index-css\";\nexport { PageFeedbackToolbarCSS } from \"./components/page-toolbar/index-css\";\n\n// Shared components (for building custom UIs)\nexport { AnnotationPopup, AnnotationPopupPresence } from \"./components/annotation-popup\";\nexport { AnnotationPopupCSS } from \"./components/annotation-popup/index-css\";\nexport type { AnnotationPopupProps, AnnotationPopupHandle } from \"./components/annotation-popup\";\n\n// Icons\nexport * from \"./components/icons\";\nexport * as IconsCSS from \"./components/icons-css\";\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 { motion, AnimatePresence } from \"framer-motion\";\nimport { createPortal } from \"react-dom\";\n\nimport { AnnotationPopup, AnnotationPopupHandle } from \"../annotation-popup\";\nimport {\n IconFeedback,\n IconPlay,\n IconPause,\n EyeMorphIcon,\n CopyMorphIcon,\n TrashMorphIcon,\n IconChevronDown,\n IconClose,\n IconPlus,\n} from \"../icons\";\nimport {\n identifyElement,\n getNearbyText,\n getElementClasses,\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// =============================================================================\n// Types\n// =============================================================================\n\ntype HoverInfo = {\n element: string;\n elementPath: string;\n rect: DOMRect | null;\n};\n\n// =============================================================================\n// Utils\n// =============================================================================\n\nfunction generateOutput(annotations: Annotation[], pathname: string): string {\n if (annotations.length === 0) return \"\";\n\n // Include viewport dimensions\n const viewport = typeof window !== \"undefined\"\n ? `${window.innerWidth}×${window.innerHeight}`\n : \"unknown\";\n\n let output = `## Page Feedback: ${pathname}\\n`;\n output += `**Viewport:** ${viewport}\\n\\n`;\n\n annotations.forEach((a, i) => {\n output += `### ${i + 1}. ${a.element}\\n`;\n output += `**Location:** ${a.elementPath}\\n`;\n\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 if (a.selectedText) {\n output += `**Selected text:** \"${a.selectedText}\"\\n`;\n }\n\n if (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 return output.trim();\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\nexport function PageFeedbackToolbar() {\n const [isActive, setIsActive] = useState(false);\n const [annotations, setAnnotations] = useState<Annotation[]>([]);\n const [showMarkers, setShowMarkers] = useState(true);\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 } | null>(null);\n const [copied, setCopied] = useState(false);\n const [cleared, setCleared] = useState(false);\n const [hoveredMarkerId, setHoveredMarkerId] = useState<string | null>(null);\n const [scrollY, setScrollY] = useState(0);\n const [mounted, setMounted] = useState(false);\n const [isFrozen, setIsFrozen] = useState(false);\n\n const popupRef = useRef<AnnotationPopupHandle>(null);\n\n const pathname = typeof window !== \"undefined\" ? window.location.pathname : \"/\";\n\n // Mount and load\n useEffect(() => {\n setMounted(true);\n setScrollY(window.scrollY);\n const stored = loadAnnotations<Annotation>(pathname);\n setAnnotations(stored);\n }, [pathname]);\n\n // Track scroll for marker positions\n useEffect(() => {\n const handleScroll = () => setScrollY(window.scrollY);\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n return () => window.removeEventListener(\"scroll\", handleScroll);\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 *, *::before, *::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 // Toggle freeze\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 setHoverInfo(null);\n if (isFrozen) {\n unfreezeAnimations();\n }\n }\n }, [isActive, isFrozen, unfreezeAnimations]);\n\n // Handle mouse move (document level)\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(e.clientX, e.clientY) 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 (document level)\n useEffect(() => {\n if (!isActive) return;\n\n const handleClick = (e: MouseEvent) => {\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 e.preventDefault();\n\n // If there's a pending annotation, clicking outside always shakes\n if (pendingAnnotation) {\n popupRef.current?.shake();\n return;\n }\n\n const elementUnder = document.elementFromPoint(e.clientX, e.clientY) 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 const y = 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 setPendingAnnotation({\n x,\n y,\n clientY: e.clientY,\n element: name,\n elementPath: path,\n selectedText,\n boundingBox: { x: rect.left, y: rect.top + window.scrollY, width: rect.width, height: rect.height },\n nearbyText: getNearbyText(elementUnder),\n cssClasses: getElementClasses(elementUnder),\n });\n setHoverInfo(null);\n };\n\n document.addEventListener(\"click\", handleClick);\n return () => document.removeEventListener(\"click\", handleClick);\n }, [isActive, pendingAnnotation]);\n\n // Add annotation\n const addAnnotation = useCallback((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 };\n\n setAnnotations((prev) => [...prev, newAnnotation]);\n setPendingAnnotation(null);\n window.getSelection()?.removeAllRanges();\n }, [pendingAnnotation]);\n\n // Cancel annotation\n const cancelAnnotation = useCallback(() => {\n setPendingAnnotation(null);\n }, []);\n\n // Delete annotation\n const deleteAnnotation = useCallback((id: string) => {\n setAnnotations((prev) => prev.filter((a) => a.id !== id));\n }, []);\n\n // Copy output\n const copyOutput = useCallback(async () => {\n const output = generateOutput(annotations, pathname);\n if (!output) return;\n\n await navigator.clipboard.writeText(output);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [annotations, pathname]);\n\n // Clear all\n const clearAll = useCallback(() => {\n setAnnotations([]);\n localStorage.removeItem(getStorageKey(pathname));\n setCleared(true);\n setTimeout(() => setCleared(false), 1500);\n }, [pathname]);\n\n // Keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n if (pendingAnnotation) {\n // Let the popup handle its own escape\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 const toViewportY = (absoluteY: number) => absoluteY - scrollY;\n\n return createPortal(\n <>\n {/* Toolbar */}\n <div className={styles.toolbar} data-feedback-toolbar>\n <AnimatePresence mode=\"wait\" initial={false}>\n {!isActive ? (\n <motion.button\n key=\"toggle\"\n className={styles.toggleButton}\n onClick={(e) => { e.stopPropagation(); setIsActive(true); }}\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.8 }}\n transition={{\n type: \"spring\",\n stiffness: 500,\n damping: 30,\n mass: 0.8,\n }}\n title=\"Start feedback mode\"\n >\n <IconFeedback size={18} />\n {hasAnnotations && <span className={styles.badge}>{annotations.length}</span>}\n </motion.button>\n ) : (\n <motion.div\n key=\"controls\"\n className={styles.controls}\n initial={{ opacity: 0, scale: 0.85, y: 8 }}\n animate={{ opacity: 1, scale: 1, y: 0 }}\n exit={{ opacity: 0, scale: 0.85, y: 8 }}\n transition={{\n type: \"spring\",\n stiffness: 600,\n damping: 35,\n mass: 0.6,\n }}\n >\n <motion.button\n className={styles.controlButton}\n onClick={(e) => { e.stopPropagation(); toggleFreeze(); }}\n title={isFrozen ? \"Resume animations\" : \"Pause animations\"}\n data-active={isFrozen}\n whileTap={{ scale: 0.95 }}\n >\n {isFrozen ? <IconPlay size={16} /> : <IconPause size={16} />}\n </motion.button>\n\n <motion.button\n className={styles.controlButton}\n onClick={(e) => { e.stopPropagation(); setShowMarkers(!showMarkers); }}\n title={showMarkers ? \"Hide markers\" : \"Show markers\"}\n whileTap={{ scale: 0.95 }}\n >\n <EyeMorphIcon size={16} visible={showMarkers} />\n </motion.button>\n\n <motion.button\n className={styles.controlButton}\n onClick={(e) => { e.stopPropagation(); copyOutput(); }}\n disabled={!hasAnnotations}\n title=\"Copy feedback\"\n whileTap={{ scale: 0.95 }}\n >\n <CopyMorphIcon size={16} checked={copied} />\n </motion.button>\n\n <motion.button\n className={styles.controlButton}\n onClick={(e) => { e.stopPropagation(); clearAll(); }}\n disabled={!hasAnnotations}\n title=\"Clear all\"\n data-danger\n whileTap={{ scale: 0.95 }}\n >\n <TrashMorphIcon size={16} checked={cleared} />\n </motion.button>\n\n {/* NOTE: External link button removed - was site-specific */}\n\n <div className={styles.divider} />\n\n <motion.button\n className={styles.controlButton}\n onClick={(e) => { e.stopPropagation(); setIsActive(false); }}\n title=\"Exit feedback mode\"\n whileTap={{ scale: 0.95 }}\n >\n <IconChevronDown size={16} />\n </motion.button>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n\n {/* Markers layer */}\n <div className={styles.markersLayer} data-feedback-toolbar>\n <AnimatePresence>\n {isActive && showMarkers &&\n annotations.map((annotation, index) => {\n const viewportY = toViewportY(annotation.y);\n const isVisible = viewportY > -30 && viewportY < window.innerHeight + 30;\n if (!isVisible) return null;\n\n const isHovered = hoveredMarkerId === annotation.id;\n\n return (\n <motion.div\n key={annotation.id}\n className={`${styles.marker} ${isHovered ? styles.hovered : \"\"}`}\n data-annotation-marker\n initial={{ scale: 0, opacity: 0 }}\n animate={{\n scale: 1,\n opacity: 1,\n transition: {\n type: \"spring\",\n stiffness: 400,\n damping: 25,\n delay: index * 0.03,\n },\n }}\n exit={{\n scale: 0,\n opacity: 0,\n transition: { duration: 0.15, ease: \"easeIn\" },\n }}\n whileHover={{ scale: 1.1 }}\n style={{\n left: `${annotation.x}%`,\n top: viewportY,\n }}\n onMouseEnter={() => setHoveredMarkerId(annotation.id)}\n onMouseLeave={() => setHoveredMarkerId(null)}\n onClick={(e) => {\n e.stopPropagation();\n deleteAnnotation(annotation.id);\n }}\n >\n {isHovered ? <IconClose size={10} /> : index + 1}\n <AnimatePresence>\n {isHovered && (\n <motion.div\n className={styles.markerTooltip}\n initial={{ opacity: 0, y: 2, scale: 0.98 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 2, scale: 0.98 }}\n transition={{ duration: 0.1, ease: \"easeOut\" }}\n >\n {annotation.selectedText && (\n <span className={styles.markerQuote}>\n “{annotation.selectedText.slice(0, 50)}\n {annotation.selectedText.length > 50 ? \"...\" : \"\"}”\n </span>\n )}\n <span className={styles.markerNote}>{annotation.comment}</span>\n <span className={styles.markerHint}>Click to remove</span>\n </motion.div>\n )}\n </AnimatePresence>\n </motion.div>\n );\n })}\n </AnimatePresence>\n </div>\n\n {/* Interactive overlay */}\n {isActive && (\n <div className={styles.overlay} data-feedback-toolbar>\n {/* Hover highlight */}\n <AnimatePresence>\n {hoverInfo?.rect && !pendingAnnotation && (\n <motion.div\n key=\"hover-highlight\"\n className={styles.hoverHighlight}\n initial={{ opacity: 0, scale: 0.98 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.98 }}\n transition={{ duration: 0.12, ease: \"easeOut\" }}\n style={{\n left: hoverInfo.rect.left,\n top: hoverInfo.rect.top,\n width: hoverInfo.rect.width,\n height: hoverInfo.rect.height,\n }}\n />\n )}\n </AnimatePresence>\n\n {/* Hover tooltip */}\n <AnimatePresence>\n {hoverInfo && !pendingAnnotation && (\n <motion.div\n key=\"hover-tooltip\"\n className={styles.hoverTooltip}\n initial={{ opacity: 0, scale: 0.95, y: 4 }}\n animate={{ opacity: 1, scale: 1, y: 0 }}\n exit={{ opacity: 0, scale: 0.95, y: 4 }}\n transition={{ duration: 0.1, ease: \"easeOut\" }}\n style={{\n left: Math.min(hoverPosition.x, window.innerWidth - 150),\n top: Math.max(hoverPosition.y - 32, 8),\n }}\n >\n {hoverInfo.element}\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Pending annotation marker + popup */}\n <AnimatePresence>\n {pendingAnnotation && (\n <>\n <motion.div\n className={`${styles.marker} ${styles.pending}`}\n initial={{ scale: 0, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0, opacity: 0, transition: { duration: 0.15, ease: \"easeIn\" } }}\n transition={{ type: \"spring\", stiffness: 500, damping: 30 }}\n style={{\n left: `${pendingAnnotation.x}%`,\n top: pendingAnnotation.clientY,\n }}\n >\n <IconPlus size={12} />\n </motion.div>\n\n <AnnotationPopup\n ref={popupRef}\n element={pendingAnnotation.element}\n selectedText={pendingAnnotation.selectedText}\n onSubmit={addAnnotation}\n onCancel={cancelAnnotation}\n style={{\n left: `${Math.min(Math.max(pendingAnnotation.x, 15), 85)}%`,\n top: Math.min(pendingAnnotation.clientY + 20, window.innerHeight - 180),\n }}\n />\n </>\n )}\n </AnimatePresence>\n </div>\n )}\n </>,\n document.body\n );\n}\n\nexport default PageFeedbackToolbar;\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(() => textareaRef.current?.focus(), 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 “{selectedText.slice(0, 80)}\n {selectedText.length > 80 ? \"...\" : \"\"}”\n </div>\n )}\n\n <textarea\n ref={textareaRef}\n className={styles.textarea}\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;\\n background: white;\\n border-radius: 0.75rem;\\n box-shadow: 0 4px 24px rgba(0, 0, 0, 0.15), 0 0 0 1px rgba(0, 0, 0, 0.04);\\n cursor: default;\\n z-index: 100;\\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(0, 0, 0, 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(0, 0, 0, 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(0, 0, 0, 0.5);\\n margin-bottom: 0.5rem;\\n padding: 0.4rem 0.5rem;\\n background: rgba(0, 0, 0, 0.03);\\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 border: 1px solid rgba(0, 0, 0, 0.12);\\n border-radius: 0.375rem;\\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::placeholder {\\n color: rgba(0, 0, 0, 0.35);\\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(0, 0, 0, 0.5);\\n}\\n.styles-module__cancel___-xAEc:hover {\\n background: rgba(0, 0, 0, 0.05);\\n color: rgba(0, 0, 0, 0.7);\\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\",\"actions\":\"styles-module__actions___bxQCu\",\"cancel\":\"styles-module__cancel___-xAEc\",\"submit\":\"styles-module__submit___nnXO9\",\"green\":\"styles-module__green___zdmke\"};\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","\"use client\";\n\nimport { motion } from \"framer-motion\";\n\n// =============================================================================\n// Shared transition for morphing icons\n// =============================================================================\n\nconst transition = { type: \"spring\" as const, stiffness: 500, damping: 30 };\n\n// =============================================================================\n// Icons\n// =============================================================================\n\n// Feedback/comment bubble with plus (Material Design style)\nexport const IconFeedback = ({ size = 18 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12,4c4.97,0,8.9,4.56,7.82,9.72c-0.68,3.23-3.4,5.74-6.67,6.2c-1.59,0.22-3.14-0.01-4.58-0.7 c-0.27-0.13-0.56-0.19-0.86-0.19c-0.19,0-0.38,0.03-0.56,0.08l-2.31,0.68c-0.38,0.11-0.74-0.24-0.63-0.63l0.7-2.39 c0.13-0.45,0.07-0.92-0.14-1.35C4.26,14.34,4,13.18,4,12C4,7.59,7.59,4,12,4 M12,2C6.48,2,2,6.48,2,12c0,1.54,0.36,2.98,0.97,4.29 l-1.46,4.96C1.29,22,2,22.71,2.76,22.48l4.96-1.46c1.66,0.79,3.56,1.15,5.58,0.89c4.56-0.59,8.21-4.35,8.66-8.92 C22.53,7.03,17.85,2,12,2L12,2z\"/>\n <path d=\"M12,8L12,8c-0.55,0-1,0.45-1,1v2H9c-0.55,0-1,0.45-1,1v0c0,0.55,0.45,1,1,1h2v2 c0,0.55,0.45,1,1,1h0c0.55,0,1-0.45,1-1v-2h2c0.55,0,1-0.45,1-1v0c0-0.55-0.45-1-1-1h-2V9C13,8.45,12.55,8,12,8z\" fillRule=\"evenodd\"/>\n </svg>\n);\n\n// Play icon (triangle pointing right)\nexport const IconPlay = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M5 3.5v9l7-4.5-7-4.5z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Pause icon (two vertical bars)\nexport const IconPause = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M5.5 4v8M10.5 4v8\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n);\n\n// Eye icon with morph animation (Material Design filled style)\nexport const EyeMorphIcon = ({ size = 16, visible }: { size?: number; visible: boolean }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n {/* Eye shape - Material Design style */}\n <path d=\"M12 4C7 4 2.73 7.11 1 11.5 2.73 15.89 7 19 12 19s9.27-3.11 11-7.5C21.27 7.11 17 4 12 4zm0 12.5c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\" />\n {/* Slash line for hidden state */}\n <motion.g\n initial={false}\n animate={{ opacity: visible ? 0 : 1 }}\n transition={{ duration: 0.15 }}\n >\n <line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"4\" stroke=\"white\" strokeWidth=\"4\" strokeLinecap=\"round\" />\n <line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </motion.g>\n </svg>\n);\n\n// Document/save icon that morphs to checkmark (Material Design style)\nexport const CopyMorphIcon = ({ size = 16, checked }: { size?: number; checked: boolean }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <motion.path\n d=\"M14.17,3H5C3.9,3,3,3.9,3,5v14c0,1.1,0.9,2,2,2h14c1.1,0,2-0.9,2-2V9.83c0-0.53-0.21-1.04-0.59-1.41l-4.83-4.83 C15.21,3.21,14.7,3,14.17,3L14.17,3z M8,15h8c0.55,0,1,0.45,1,1v0c0,0.55-0.45,1-1,1H8c-0.55,0-1-0.45-1-1v0C7,15.45,7.45,15,8,15z M8,11h8c0.55,0,1,0.45,1,1v0c0,0.55-0.45,1-1,1H8c-0.55,0-1-0.45-1-1v0C7,11.45,7.45,11,8,11z M8,7h5c0.55,0,1,0.45,1,1v0 c0,0.55-0.45,1-1,1H8C7.45,9,7,8.55,7,8v0C7,7.45,7.45,7,8,7z\"\n initial={false}\n animate={{ opacity: checked ? 0 : 1 }}\n transition={{ duration: 0.15 }}\n />\n <motion.path\n d=\"M6 12.5l3.5 3.5L18 7\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n initial={false}\n animate={{ opacity: checked ? 1 : 0, scale: checked ? 1 : 0.5 }}\n transition={transition}\n style={{ transformOrigin: \"12px 12px\" }}\n />\n </svg>\n);\n\n// Refresh/reset icon that morphs to checkmark (Material Design style)\nexport const TrashMorphIcon = ({ size = 16, checked }: { size?: number; checked: boolean }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <motion.path\n d=\"M17.65 6.35c-1.63-1.63-3.94-2.57-6.48-2.31-3.67.37-6.69 3.35-7.1 7.02C3.52 15.91 7.27 20 12 20c3.19 0 5.93-1.87 7.21-4.56.32-.67-.16-1.44-.9-1.44-.37 0-.72.2-.88.53-1.13 2.43-3.84 3.97-6.8 3.31-2.22-.49-4.01-2.3-4.48-4.52C5.31 9.44 8.26 6 12 6c1.66 0 3.14.69 4.22 1.78l-1.51 1.51c-.63.63-.19 1.71.7 1.71H19c.55 0 1-.45 1-1V6.41c0-.89-1.08-1.34-1.71-.71l-.64.65z\"\n initial={false}\n animate={{ opacity: checked ? 0 : 1 }}\n transition={{ duration: 0.15 }}\n />\n <motion.path\n d=\"M6 12.5l3.5 3.5L18 7\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n initial={false}\n animate={{ opacity: checked ? 1 : 0, scale: checked ? 1 : 0.5 }}\n transition={transition}\n style={{ transformOrigin: \"12px 12px\" }}\n />\n </svg>\n);\n\n// External link arrow\nexport const IconExternal = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M6 3h7v7M13 3L6 10\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Chevron down for close/collapse\nexport const IconChevronDown = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M4 6l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\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 d=\"M4 4l8 8M12 4l-8 8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\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 d=\"M8 3v10M3 8h10\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\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 = \".styles-module__toolbar___50aIA {\\n position: fixed;\\n bottom: 1.25rem;\\n right: 1.25rem;\\n z-index: 100000;\\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, sans-serif;\\n}\\n\\n.styles-module__toggleButton___kgnvI {\\n position: relative;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 44px;\\n height: 44px;\\n border-radius: 22px;\\n border: none;\\n background: #1a1a1a;\\n color: #fff;\\n cursor: pointer;\\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2), 0 4px 16px rgba(0, 0, 0, 0.1);\\n transition: all 0.15s ease;\\n}\\n.styles-module__toggleButton___kgnvI svg {\\n margin-top: -1px;\\n}\\n.styles-module__toggleButton___kgnvI:hover {\\n background: #2a2a2a;\\n}\\n\\n.styles-module__badge___WRMxo {\\n position: absolute;\\n top: -4px;\\n right: -4px;\\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}\\n\\n.styles-module__controls___2-kD- {\\n display: flex;\\n align-items: center;\\n gap: 0.25rem;\\n padding: 0.375rem;\\n border-radius: 1.5rem;\\n background: #1a1a1a;\\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2), 0 4px 16px rgba(0, 0, 0, 0.1);\\n}\\n\\n.styles-module__controlButton___RB3R5 {\\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 cursor: pointer;\\n transition: all 0.15s ease;\\n}\\n.styles-module__controlButton___RB3R5:hover:not(:disabled) {\\n background: rgba(255, 255, 255, 0.12);\\n color: #fff;\\n}\\n.styles-module__controlButton___RB3R5:active:not(:disabled) {\\n transform: scale(0.92);\\n}\\n.styles-module__controlButton___RB3R5:disabled {\\n opacity: 0.35;\\n cursor: not-allowed;\\n}\\n.styles-module__controlButton___RB3R5[data-active=true] {\\n color: #3c82f7;\\n background: rgba(60, 130, 247, 0.25);\\n}\\n.styles-module__controlButton___RB3R5[data-danger]:hover:not(:disabled) {\\n background: rgba(255, 59, 48, 0.25);\\n color: #ff3b30;\\n}\\n\\n.styles-module__divider___yO3YX {\\n width: 1px;\\n height: 20px;\\n background: rgba(255, 255, 255, 0.15);\\n margin: 0 0.125rem;\\n}\\n\\n.styles-module__overlay___pQK74 {\\n position: fixed;\\n inset: 0;\\n z-index: 99999;\\n pointer-events: none;\\n}\\n.styles-module__overlay___pQK74 > * {\\n pointer-events: auto;\\n}\\n\\n.styles-module__hoverHighlight___iUTDq {\\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\\n.styles-module__hoverTooltip___eOid- {\\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\\n.styles-module__markersLayer___RFGiE {\\n position: absolute;\\n top: 0;\\n left: 0;\\n right: 0;\\n z-index: 99998;\\n pointer-events: none;\\n}\\n.styles-module__markersLayer___RFGiE > * {\\n pointer-events: auto;\\n}\\n\\n.styles-module__marker___XNegd {\\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%);\\n cursor: pointer;\\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);\\n transition: background 0.15s ease;\\n user-select: none;\\n will-change: transform;\\n contain: layout style;\\n}\\n.styles-module__marker___XNegd.styles-module__pending___h4sf4 {\\n position: fixed;\\n background: #3c82f7;\\n}\\n.styles-module__marker___XNegd.styles-module__hovered___WMoLv {\\n background: #ff3b30;\\n}\\n\\n.styles-module__markerTooltip___pbJGs {\\n position: absolute;\\n top: calc(100% + 10px);\\n left: 50%;\\n transform: translateX(-50%);\\n background: white;\\n padding: 0.625rem 0.75rem;\\n border-radius: 0.5rem;\\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(0, 0, 0, 0.04);\\n min-width: 160px;\\n max-width: 280px;\\n pointer-events: none;\\n cursor: default;\\n}\\n\\n.styles-module__markerQuote___bZuZt {\\n display: block;\\n font-size: 0.6875rem;\\n font-style: italic;\\n color: rgba(0, 0, 0, 0.5);\\n margin-bottom: 0.375rem;\\n line-height: 1.4;\\n}\\n\\n.styles-module__markerNote___AvTvH {\\n display: block;\\n font-size: 0.75rem;\\n font-weight: 450;\\n line-height: 1.4;\\n color: #333;\\n white-space: normal;\\n}\\n\\n.styles-module__markerHint___drxqW {\\n display: block;\\n font-size: 0.625rem;\\n font-weight: 400;\\n color: rgba(0, 0, 0, 0.3);\\n margin-top: 0.375rem;\\n}\";\nconst classNames = {\"toolbar\":\"styles-module__toolbar___50aIA\",\"toggleButton\":\"styles-module__toggleButton___kgnvI\",\"badge\":\"styles-module__badge___WRMxo\",\"controls\":\"styles-module__controls___2-kD-\",\"controlButton\":\"styles-module__controlButton___RB3R5\",\"divider\":\"styles-module__divider___yO3YX\",\"overlay\":\"styles-module__overlay___pQK74\",\"hoverHighlight\":\"styles-module__hoverHighlight___iUTDq\",\"hoverTooltip\":\"styles-module__hoverTooltip___eOid-\",\"markersLayer\":\"styles-module__markersLayer___RFGiE\",\"marker\":\"styles-module__marker___XNegd\",\"pending\":\"styles-module__pending___h4sf4\",\"hovered\":\"styles-module__hovered___WMoLv\",\"markerTooltip\":\"styles-module__markerTooltip___pbJGs\",\"markerQuote\":\"styles-module__markerQuote___bZuZt\",\"markerNote\":\"styles-module__markerNote___AvTvH\",\"markerHint\":\"styles-module__markerHint___drxqW\"};\n\n// SSR-safe style injection\nif (typeof document !== 'undefined') {\n let style = document.getElementById('feedback-tool-styles-page-toolbar-styles');\n if (!style) {\n style = document.createElement('style');\n style.id = 'feedback-tool-styles-page-toolbar-styles';\n style.textContent = css;\n document.head.appendChild(style);\n }\n}\n\nexport default classNames;\n","\"use client\";\n\nimport { useState, useCallback, useEffect, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { AnnotationPopupCSS, type AnnotationPopupHandle } from \"../annotation-popup/index-css\";\nimport {\n IconFeedback,\n IconPlay,\n IconPause,\n EyeMorphIcon,\n CopyMorphIcon,\n TrashMorphIcon,\n IconChevronDown,\n IconClose,\n IconPlus,\n} from \"../icons-css\";\nimport {\n identifyElement,\n getNearbyText,\n getElementClasses,\n getNearbyElements,\n getComputedStylesSnapshot,\n getFullElementPath,\n getAccessibilityInfo,\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// =============================================================================\n// CSS Animation Styles (injected once)\n// =============================================================================\n\nconst cssAnimationStyles = `\n/* Toolbar toggle button - calmer animation */\n@keyframes agentation-toggle-in {\n from { opacity: 0; transform: scale(0.92); }\n to { opacity: 1; transform: scale(1); }\n}\n\n.agentation-toggle-enter {\n animation: agentation-toggle-in 0.2s ease-out forwards;\n}\n\n/* Controls bar - calmer animation */\n@keyframes agentation-controls-in {\n from { opacity: 0; transform: scale(0.96); }\n to { opacity: 1; transform: scale(1); }\n}\n\n.agentation-controls-enter {\n animation: agentation-controls-in 0.2s ease-out forwards;\n}\n\n/* Hover highlight - simple fast fade */\n.agentation-highlight-animate {\n animation: agentation-fade-in 0.08s ease-out forwards;\n}\n\n@keyframes agentation-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* Marker animations - only for newly added markers */\n/* Note: markers use position: absolute with transform: translate(-50%, -50%) for centering */\n@keyframes agentation-marker-in {\n from { opacity: 0; transform: translate(-50%, -50%) scale(0); }\n to { opacity: 1; transform: translate(-50%, -50%) scale(1); }\n}\n\n@keyframes agentation-marker-out {\n from { opacity: 1; transform: translate(-50%, -50%) scale(1); }\n to { opacity: 0; transform: translate(-50%, -50%) scale(0); }\n}\n\n.agentation-marker-new {\n animation: agentation-marker-in 0.2s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;\n}\n\n.agentation-marker-exit {\n animation: agentation-marker-out 0.15s ease-in forwards;\n pointer-events: none;\n}\n\n/* Markers layer fade for visibility toggle and toolbar close */\n.agentation-markers-layer {\n transition: opacity 0.15s ease-out;\n}\n\n.agentation-markers-layer.hiding {\n opacity: 0;\n pointer-events: none;\n}\n\n/* Pending marker animation */\n@keyframes agentation-pending-in {\n from { opacity: 0; transform: translate(-50%, -50%) scale(0); }\n to { opacity: 1; transform: translate(-50%, -50%) scale(1); }\n}\n\n@keyframes agentation-pending-out {\n from { opacity: 1; transform: translate(-50%, -50%) scale(1); }\n to { opacity: 0; transform: translate(-50%, -50%) scale(0); }\n}\n\n.agentation-pending-enter {\n animation: agentation-pending-in 0.2s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;\n}\n\n.agentation-pending-exit {\n animation: agentation-pending-out 0.15s ease-in forwards;\n pointer-events: none;\n}\n\n/* Tooltip animations */\n@keyframes agentation-tooltip-in {\n from { opacity: 0; transform: translateX(-50%) translateY(4px); }\n to { opacity: 1; transform: translateX(-50%) translateY(0); }\n}\n\n.agentation-tooltip-animate {\n animation: agentation-tooltip-in 0.1s ease-out forwards;\n}\n\n/* Hover tooltip fade */\n.agentation-hover-tooltip-animate {\n animation: agentation-fade-in 0.08s ease-out forwards;\n}\n\n/* Hide hover elements during scroll - applied to body */\nbody.agentation-scrolling .agentation-hover-highlight,\nbody.agentation-scrolling .agentation-hover-tooltip {\n opacity: 0 !important;\n pointer-events: none !important;\n}\n\n/* Cursor styles for annotation mode */\n.agentation-active-cursor {\n cursor: crosshair !important;\n}\n\n.agentation-active-cursor *:not([data-feedback-toolbar] *):not([data-annotation-popup] *):not([data-annotation-marker]) {\n cursor: crosshair !important;\n}\n\n/* Allow text cursor for text selection */\n.agentation-active-cursor p,\n.agentation-active-cursor span,\n.agentation-active-cursor a,\n.agentation-active-cursor h1,\n.agentation-active-cursor h2,\n.agentation-active-cursor h3,\n.agentation-active-cursor h4,\n.agentation-active-cursor h5,\n.agentation-active-cursor h6,\n.agentation-active-cursor li,\n.agentation-active-cursor label,\n.agentation-active-cursor blockquote,\n.agentation-active-cursor code,\n.agentation-active-cursor pre {\n cursor: text !important;\n}\n`;\n\n// Inject styles once\nif (typeof document !== \"undefined\") {\n if (!document.getElementById(\"agentation-toolbar-css-animations\")) {\n const style = document.createElement(\"style\");\n style.id = \"agentation-toolbar-css-animations\";\n style.textContent = cssAnimationStyles;\n document.head.appendChild(style);\n }\n}\n\n// =============================================================================\n// Types\n// =============================================================================\n\ntype HoverInfo = {\n element: string;\n elementPath: string;\n rect: DOMRect | null;\n};\n\n// =============================================================================\n// Utils\n// =============================================================================\n\ntype OutputFormat = 'compact' | 'standard' | 'detailed' | 'forensic';\ntype FeedbackStyle = 'direct' | 'instructional' | 'contextual';\n\n// Transform feedback text based on style\nfunction stylizeFeedback(comment: string, element: string, style: FeedbackStyle): string {\n if (style === 'direct') {\n return comment;\n }\n\n const lower = comment.toLowerCase();\n\n if (style === 'instructional') {\n // If already starts with action verb, keep as-is\n const actionStarts = ['fix', 'change', 'update', 'add', 'remove', 'delete', 'move', 'resize', 'replace', 'make', 'set', 'increase', 'decrease', 'adjust'];\n if (actionStarts.some(v => lower.startsWith(v))) {\n return comment;\n }\n\n // Detect issue type and add appropriate action verb\n if (lower.includes('typo') || lower.includes('misspell') || lower.includes('→') || lower.includes('->')) {\n return `Fix typo: ${comment}`;\n }\n if (lower.includes('missing') || lower.includes('need') || lower.includes('should have') || lower.includes('no ')) {\n return `Add: ${comment}`;\n }\n if (lower.includes('wrong') || lower.includes('incorrect') || lower.includes('should be') || lower.includes('should say')) {\n return `Change: ${comment}`;\n }\n if (lower.includes('broken') || lower.includes(\"doesn't work\") || lower.includes('not working')) {\n return `Fix: ${comment}`;\n }\n if (lower.includes('too ')) {\n return `Adjust: ${comment}`;\n }\n\n // Default: keep as-is (user's phrasing is probably fine)\n return comment;\n }\n\n if (style === 'contextual') {\n // Add relevant context suffix based on detected issue type\n if (lower.includes('typo') || lower.includes('misspell') || lower.includes('→') || lower.includes('->') || lower.includes('spelling')) {\n return `${comment} — looks unprofessional`;\n }\n if (lower.includes('missing') || lower.includes(\"can't find\") || lower.includes('should have') || lower.includes('need')) {\n return `${comment} — users expect this`;\n }\n if (lower.includes('confus') || lower.includes('unclear') || lower.includes(\"don't understand\") || lower.includes('hard to')) {\n return `${comment} — hurts usability`;\n }\n if (lower.includes('broken') || lower.includes(\"doesn't work\") || lower.includes('not working') || lower.includes('bug')) {\n return `${comment} — blocks user flow`;\n }\n if (lower.includes('slow') || lower.includes('lag') || lower.includes('loading')) {\n return `${comment} — feels sluggish`;\n }\n if (lower.includes('align') || lower.includes('spacing') || lower.includes('margin') || lower.includes('position')) {\n return `${comment} — visual inconsistency`;\n }\n if (lower.includes('color') || lower.includes('contrast') || lower.includes('can\\'t read') || lower.includes('hard to see')) {\n return `${comment} — accessibility concern`;\n }\n if (lower.includes('too small') || lower.includes('too big') || lower.includes('too large') || lower.includes('size')) {\n return `${comment} — affects tap/click target`;\n }\n\n // No pattern matched - return as-is (don't add generic fluff)\n return comment;\n }\n\n return comment;\n}\n\nfunction generateOutput(annotations: Annotation[], pathname: string, format: OutputFormat = 'standard', style: FeedbackStyle = 'direct'): string {\n if (annotations.length === 0) return \"\";\n\n const viewport = typeof window !== \"undefined\"\n ? `${window.innerWidth}×${window.innerHeight}`\n : \"unknown\";\n\n if (format === 'compact') {\n // Compact: Essentials with element name for identification\n let output = `## Feedback: ${pathname}\\n\\n`;\n annotations.forEach((a, i) => {\n const selector = a.cssClasses ? `.${a.cssClasses.split(',')[0].trim()}` : a.elementPath;\n output += `${i + 1}. **${a.element}** (\\`${selector}\\`)`;\n if (a.selectedText) output += `\\n > \"${a.selectedText.slice(0, 50)}...\"`;\n output += `\\n ${stylizeFeedback(a.comment, a.element, style)}\\n\\n`;\n });\n return output.trim();\n }\n\n if (format === 'detailed') {\n // Detailed: Full context for complex debugging\n let output = `## Page Feedback: ${pathname}\\n`;\n output += `**Viewport:** ${viewport}\\n`;\n output += `**URL:** ${typeof window !== \"undefined\" ? window.location.href : pathname}\\n`;\n output += `**User Agent:** ${typeof navigator !== \"undefined\" ? navigator.userAgent.split(' ').slice(-2).join(' ') : 'unknown'}\\n\\n`;\n output += `---\\n\\n`;\n\n annotations.forEach((a, i) => {\n output += `### ${i + 1}. ${a.element}\\n\\n`;\n\n // Searchable selectors\n output += `**Selector:** \\`${a.elementPath}\\`\\n`;\n if (a.cssClasses) {\n const classes = a.cssClasses.split(' ').map(c => `.${c}`).join(', ');\n output += `**Classes:** \\`${classes}\\`\\n`;\n }\n\n // Position info\n if (a.boundingBox) {\n output += `**Bounding box:** 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\n // Computed styles (new)\n if (a.computedStyles) {\n output += `**Styles:** ${a.computedStyles}\\n`;\n }\n\n // Text context\n if (a.selectedText) {\n output += `**Selected text:** \"${a.selectedText}\"\\n`;\n }\n if (a.nearbyText) {\n output += `**Nearby text:** \"${a.nearbyText.slice(0, 150)}\"\\n`;\n }\n\n // Structural context\n if (a.nearbyElements) {\n output += `**Siblings:** ${a.nearbyElements}\\n`;\n }\n\n output += `\\n**Issue:** ${stylizeFeedback(a.comment, a.element, style)}\\n\\n`;\n output += `---\\n\\n`;\n });\n\n // Add search hints\n output += `**Search tips:** Use the class names or selectors above to find these elements in your codebase. Try \\`grep -r \"className.*submit-btn\"\\` or search for the nearby text content.\\n`;\n\n return output.trim();\n }\n\n if (format === 'forensic') {\n // Forensic: Maximum context for complex debugging\n let output = `## Page Feedback: ${pathname}\\n\\n`;\n output += `**Environment:**\\n`;\n output += `- Viewport: ${viewport}\\n`;\n output += `- URL: ${typeof window !== \"undefined\" ? window.location.href : pathname}\\n`;\n output += `- User Agent: ${typeof navigator !== \"undefined\" ? navigator.userAgent : 'unknown'}\\n`;\n output += `- Timestamp: ${new Date().toISOString()}\\n`;\n output += `- Device Pixel Ratio: ${typeof window !== \"undefined\" ? window.devicePixelRatio : 'unknown'}\\n\\n`;\n output += `---\\n\\n`;\n\n annotations.forEach((a, i) => {\n output += `### ${i + 1}. ${a.element}\\n\\n`;\n\n // Full DOM path\n if (a.fullPath) {\n output += `**Full DOM Path:**\\n\\`\\`\\`\\n${a.fullPath}\\n\\`\\`\\`\\n\\n`;\n } else {\n output += `**Selector:** \\`${a.elementPath}\\`\\n`;\n }\n\n // CSS info\n if (a.cssClasses) {\n output += `**CSS Classes:** \\`${a.cssClasses}\\`\\n`;\n }\n\n // Detailed position\n if (a.boundingBox) {\n output += `**Position:**\\n`;\n output += `- Bounding box: x:${Math.round(a.boundingBox.x)}, y:${Math.round(a.boundingBox.y)}\\n`;\n output += `- Dimensions: ${Math.round(a.boundingBox.width)}×${Math.round(a.boundingBox.height)}px\\n`;\n output += `- Annotation at: ${a.x.toFixed(1)}% from left, ${Math.round(a.y)}px from top\\n`;\n }\n\n // Computed styles\n if (a.computedStyles) {\n output += `**Computed Styles:** ${a.computedStyles}\\n`;\n }\n\n // Accessibility\n if (a.accessibility) {\n output += `**Accessibility:** ${a.accessibility}\\n`;\n }\n\n // Text context\n if (a.selectedText) {\n output += `**Selected Text:** \"${a.selectedText}\"\\n`;\n }\n if (a.nearbyText) {\n output += `**Nearby Text:** \"${a.nearbyText}\"\\n`;\n }\n\n // Structural context\n if (a.nearbyElements) {\n output += `**Sibling Elements:** ${a.nearbyElements}\\n`;\n }\n\n output += `\\n**Issue:** ${stylizeFeedback(a.comment, a.element, style)}\\n\\n`;\n output += `---\\n\\n`;\n });\n\n // Detailed search hints\n output += `## Search Strategies\\n\\n`;\n output += `1. **By class name:** \\`grep -r \"className.*yourClass\" src/\\`\\n`;\n output += `2. **By text content:** \\`grep -r \"the text you see\" src/\\`\\n`;\n output += `3. **By element path:** Use the DOM path to locate nested components\\n`;\n output += `4. **By computed styles:** If a style looks wrong, search for those CSS values\\n`;\n\n return output.trim();\n }\n\n // Standard format (default)\n let output = `## Page Feedback: ${pathname}\\n`;\n output += `**Viewport:** ${viewport}\\n\\n`;\n\n annotations.forEach((a, i) => {\n output += `### ${i + 1}. ${a.element}\\n`;\n output += `**Selector:** \\`${a.elementPath}\\`\\n`;\n\n if (a.cssClasses) {\n output += `**Classes:** \\`${a.cssClasses}\\`\\n`;\n }\n\n if (a.boundingBox) {\n output += `**Position:** ${Math.round(a.boundingBox.x)}, ${Math.round(a.boundingBox.y)} (${Math.round(a.boundingBox.width)}×${Math.round(a.boundingBox.height)})\\n`;\n }\n\n if (a.selectedText) {\n output += `**Selected:** \"${a.selectedText}\"\\n`;\n } else if (a.nearbyText) {\n output += `**Context:** \"${a.nearbyText.slice(0, 80)}\"\\n`;\n }\n\n if (a.nearbyElements) {\n output += `**Siblings:** ${a.nearbyElements}\\n`;\n }\n\n output += `**Feedback:** ${stylizeFeedback(a.comment, a.element, style)}\\n\\n`;\n });\n\n return output.trim();\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\nexport function PageFeedbackToolbarCSS() {\n const [isActive, setIsActive] = useState(false);\n const [annotations, setAnnotations] = useState<Annotation[]>([]);\n const [showMarkers, setShowMarkers] = useState(true);\n const [markersHiding, setMarkersHiding] = useState(false); // For fade out animation\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 nearbyElements?: string;\n computedStyles?: string;\n fullPath?: string;\n accessibility?: string;\n } | null>(null);\n const [pendingExiting, setPendingExiting] = useState(false);\n const [copied, setCopied] = useState(false);\n const [cleared, setCleared] = useState(false);\n const [hoveredMarkerId, setHoveredMarkerId] = useState<string | null>(null);\n const [scrollY, setScrollY] = useState(0);\n const [mounted, setMounted] = useState(false);\n const [isFrozen, setIsFrozen] = useState(false);\n const [exitingIds, setExitingIds] = useState<Set<string>>(new Set()); // IDs currently animating out\n const [outputFormat, setOutputFormat] = useState<OutputFormat>('standard');\n const [feedbackStyle, setFeedbackStyle] = useState<FeedbackStyle>('direct');\n\n const popupRef = useRef<AnnotationPopupHandle>(null);\n const overlayRef = useRef<HTMLDivElement>(null);\n const isScrollingRef = useRef(false);\n // Track which marker IDs have already animated in (to prevent re-animation)\n const animatedIdsRef = useRef<Set<string>>(new Set());\n // Track the most recently added ID for hover protection\n const recentlyAddedIdRef = useRef<string | null>(null);\n // Scroll timeout ref for debouncing\n const scrollTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const pathname = typeof window !== \"undefined\" ? window.location.pathname : \"/\";\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 // Load saved output format and style\n const savedFormat = localStorage.getItem('agentation-output-format');\n if (savedFormat && ['compact', 'standard', 'detailed', 'forensic'].includes(savedFormat)) {\n setOutputFormat(savedFormat as OutputFormat);\n }\n const savedStyle = localStorage.getItem('agentation-feedback-style');\n if (savedStyle && ['direct', 'instructional', 'contextual'].includes(savedStyle)) {\n setFeedbackStyle(savedStyle as FeedbackStyle);\n }\n }, [pathname]);\n\n // Listen for format changes from the page\n useEffect(() => {\n const handleFormatChange = (e: CustomEvent<OutputFormat>) => {\n setOutputFormat(e.detail);\n };\n window.addEventListener('agentation-format-change', handleFormatChange as EventListener);\n return () => window.removeEventListener('agentation-format-change', handleFormatChange as EventListener);\n }, []);\n\n // Listen for style changes from the page\n useEffect(() => {\n const handleStyleChange = (e: CustomEvent<FeedbackStyle>) => {\n setFeedbackStyle(e.detail);\n };\n window.addEventListener('agentation-style-change', handleStyleChange as EventListener);\n return () => window.removeEventListener('agentation-style-change', handleStyleChange as EventListener);\n }, []);\n\n // Track scroll - hide hover elements during scroll for clean UX\n useEffect(() => {\n const handleScroll = () => {\n setScrollY(window.scrollY);\n\n // Immediately hide hover elements via CSS (instant, no React render needed)\n if (!isScrollingRef.current) {\n isScrollingRef.current = true;\n document.body.classList.add('agentation-scrolling');\n }\n\n // Clear existing timeout\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n\n // Restore after scrolling stops\n scrollTimeoutRef.current = setTimeout(() => {\n isScrollingRef.current = false;\n document.body.classList.remove('agentation-scrolling');\n setHoverInfo(null); // Clear stale hover info\n }, 100);\n };\n\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n return () => {\n window.removeEventListener(\"scroll\", handleScroll);\n document.body.classList.remove('agentation-scrolling');\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 (excluding toolbar UI)\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-annotation-popup] *):not([data-annotation-marker] *),\n *:not([data-feedback-toolbar] *)::before,\n *:not([data-feedback-toolbar] *)::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 // Toggle freeze\n const toggleFreeze = useCallback(() => {\n if (isFrozen) unfreezeAnimations();\n else freezeAnimations();\n }, [isFrozen, freezeAnimations, unfreezeAnimations]);\n\n // Handle closing toolbar - fade out markers, then close\n const handleCloseToolbar = useCallback(() => {\n if (annotations.length > 0) {\n // Fade out markers layer\n setMarkersHiding(true);\n // Wait for fade then close\n setTimeout(() => {\n setIsActive(false);\n setMarkersHiding(false);\n }, 150);\n } else {\n setIsActive(false);\n }\n }, [annotations.length]);\n\n // Handle visibility toggle with animation\n const toggleMarkersVisibility = useCallback(() => {\n if (showMarkers) {\n // Fade out then hide\n setMarkersHiding(true);\n setTimeout(() => {\n setShowMarkers(false);\n setMarkersHiding(false);\n }, 150);\n } else {\n // Show immediately (will fade in via CSS)\n setShowMarkers(true);\n }\n }, [showMarkers]);\n\n // Reset state when deactivating\n useEffect(() => {\n if (!isActive) {\n setPendingAnnotation(null);\n setHoverInfo(null);\n if (isFrozen) unfreezeAnimations();\n // Clear animated IDs so markers animate in again when toolbar reopens\n animatedIdsRef.current.clear();\n }\n }, [isActive, isFrozen, unfreezeAnimations]);\n\n // Apply cursor class when active\n useEffect(() => {\n if (isActive) {\n document.body.classList.add('agentation-active-cursor');\n } else {\n document.body.classList.remove('agentation-active-cursor');\n }\n return () => {\n document.body.classList.remove('agentation-active-cursor');\n };\n }, [isActive]);\n\n // Handle mouse move\n useEffect(() => {\n if (!isActive || pendingAnnotation) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n // Skip updates while scrolling\n if (isScrollingRef.current) return;\n\n if ((e.target as HTMLElement).closest(\"[data-feedback-toolbar]\")) {\n setHoverInfo(null);\n return;\n }\n\n const elementUnder = document.elementFromPoint(e.clientX, e.clientY) 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 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 e.preventDefault();\n\n if (pendingAnnotation) {\n popupRef.current?.shake();\n return;\n }\n\n const elementUnder = document.elementFromPoint(e.clientX, e.clientY) 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 const y = 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 setPendingAnnotation({\n x,\n y,\n clientY: e.clientY,\n element: name,\n elementPath: path,\n selectedText,\n boundingBox: { x: rect.left, y: rect.top + window.scrollY, width: rect.width, height: rect.height },\n nearbyText: getNearbyText(elementUnder),\n cssClasses: getElementClasses(elementUnder),\n nearbyElements: getNearbyElements(elementUnder),\n computedStyles: getComputedStylesSnapshot(elementUnder),\n fullPath: getFullElementPath(elementUnder),\n accessibility: getAccessibilityInfo(elementUnder),\n });\n setHoverInfo(null);\n };\n\n document.addEventListener(\"click\", handleClick);\n return () => document.removeEventListener(\"click\", handleClick);\n }, [isActive, pendingAnnotation]);\n\n // Add annotation\n const addAnnotation = useCallback((comment: string) => {\n if (!pendingAnnotation) return;\n\n const newId = Date.now().toString();\n const newAnnotation: Annotation = {\n id: newId,\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 nearbyElements: pendingAnnotation.nearbyElements,\n computedStyles: pendingAnnotation.computedStyles,\n fullPath: pendingAnnotation.fullPath,\n accessibility: pendingAnnotation.accessibility,\n };\n\n setAnnotations((prev) => [...prev, newAnnotation]);\n setPendingAnnotation(null);\n window.getSelection()?.removeAllRanges();\n\n // Prevent immediate hover on the new marker\n recentlyAddedIdRef.current = newId;\n setTimeout(() => {\n recentlyAddedIdRef.current = null;\n }, 300);\n }, [pendingAnnotation]);\n\n // Cancel annotation with exit animation\n const cancelAnnotation = useCallback(() => {\n setPendingExiting(true);\n setTimeout(() => {\n setPendingExiting(false);\n setPendingAnnotation(null);\n }, 150);\n }, []);\n\n // Delete annotation with exit animation\n const deleteAnnotation = useCallback((id: string) => {\n setExitingIds(prev => new Set(prev).add(id));\n setTimeout(() => {\n setAnnotations((prev) => prev.filter((a) => a.id !== id));\n setExitingIds(prev => {\n const next = new Set(prev);\n next.delete(id);\n return next;\n });\n // Also remove from animated set\n animatedIdsRef.current.delete(id);\n }, 150);\n }, []);\n\n // Copy output\n const copyOutput = useCallback(async () => {\n const output = generateOutput(annotations, pathname, outputFormat, feedbackStyle);\n if (!output) return;\n\n await navigator.clipboard.writeText(output);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [annotations, pathname, outputFormat, feedbackStyle]);\n\n // Clear all\n const clearAll = useCallback(() => {\n setAnnotations([]);\n localStorage.removeItem(getStorageKey(pathname));\n setCleared(true);\n setTimeout(() => setCleared(false), 1500);\n }, [pathname]);\n\n // Keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Don't trigger shortcuts when typing in inputs\n const target = e.target as HTMLElement;\n const isTyping = target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable;\n\n // Global shortcut: Cmd/Ctrl + Shift + A to toggle feedback mode\n if ((e.metaKey || e.ctrlKey) && e.shiftKey && e.key.toLowerCase() === 'a') {\n e.preventDefault();\n if (isActive) {\n handleCloseToolbar();\n } else {\n setIsActive(true);\n }\n return;\n }\n\n // Escape to close\n if (e.key === \"Escape\") {\n if (pendingAnnotation) {\n // Let popup handle it\n } else if (isActive) {\n handleCloseToolbar();\n }\n return;\n }\n\n // Active mode shortcuts (only when not typing)\n if (isActive && !isTyping && !pendingAnnotation) {\n switch (e.key.toLowerCase()) {\n case 'p':\n // P to toggle pause animations\n e.preventDefault();\n toggleFreeze();\n break;\n case 'h':\n // H to toggle marker visibility\n e.preventDefault();\n toggleMarkersVisibility();\n break;\n case 'c':\n // C to copy output\n if (annotations.length > 0) {\n e.preventDefault();\n copyOutput();\n }\n break;\n case 'x':\n // X to clear all\n if (annotations.length > 0) {\n e.preventDefault();\n clearAll();\n }\n break;\n }\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [isActive, pendingAnnotation, handleCloseToolbar, toggleFreeze, toggleMarkersVisibility, annotations.length, copyOutput, clearAll]);\n\n if (!mounted) return null;\n\n const hasAnnotations = annotations.length > 0;\n // Check if marker is visible in viewport (for culling off-screen markers)\n const isInViewport = (absoluteY: number) => {\n const viewportY = absoluteY - scrollY;\n return viewportY > -30 && viewportY < window.innerHeight + 30;\n };\n\n return createPortal(\n <>\n {/* Toolbar */}\n <div className={styles.toolbar} data-feedback-toolbar>\n {/* Toggle button - shown when collapsed */}\n {!isActive && (\n <button\n className={`${styles.toggleButton} agentation-toggle-enter`}\n onClick={(e) => { e.stopPropagation(); setIsActive(true); }}\n title=\"Start feedback mode (⌘⇧A)\"\n >\n <IconFeedback size={18} />\n {hasAnnotations && <span className={styles.badge}>{annotations.length}</span>}\n </button>\n )}\n\n {/* Controls bar - shown when expanded */}\n {isActive && (\n <div className={`${styles.controls} agentation-controls-enter`}>\n <button\n className={styles.controlButton}\n onClick={(e) => { e.stopPropagation(); toggleFreeze(); }}\n title={isFrozen ? \"Resume animations (P)\" : \"Pause animations (P)\"}\n data-active={isFrozen}\n >\n {isFrozen ? <IconPlay size={16} /> : <IconPause size={16} />}\n </button>\n\n <button\n className={styles.controlButton}\n onClick={(e) => { e.stopPropagation(); toggleMarkersVisibility(); }}\n title={showMarkers ? \"Hide markers (H)\" : \"Show markers (H)\"}\n >\n <EyeMorphIcon size={16} visible={showMarkers} />\n </button>\n\n <button\n className={styles.controlButton}\n onClick={(e) => { e.stopPropagation(); copyOutput(); }}\n disabled={!hasAnnotations}\n title=\"Copy feedback (C)\"\n >\n <CopyMorphIcon size={16} checked={copied} />\n </button>\n\n <button\n className={styles.controlButton}\n onClick={(e) => { e.stopPropagation(); clearAll(); }}\n disabled={!hasAnnotations}\n title=\"Clear all (X)\"\n data-danger\n >\n <TrashMorphIcon size={16} checked={cleared} />\n </button>\n\n <div className={styles.divider} />\n\n <button\n className={styles.controlButton}\n onClick={(e) => { e.stopPropagation(); handleCloseToolbar(); }}\n title=\"Exit feedback mode (Esc)\"\n >\n <IconChevronDown size={16} />\n </button>\n </div>\n )}\n </div>\n\n {/* Markers layer - uses absolute positioning for scroll-locked markers */}\n <div\n className={`${styles.markersLayer} agentation-markers-layer ${markersHiding ? 'hiding' : ''}`}\n data-feedback-toolbar\n >\n {isActive && showMarkers &&\n annotations.map((annotation, index) => {\n // Only render markers visible in viewport (optimization)\n if (!isInViewport(annotation.y)) return null;\n\n const isHovered = hoveredMarkerId === annotation.id;\n const isExiting = exitingIds.has(annotation.id);\n const isNew = !animatedIdsRef.current.has(annotation.id) && !isExiting;\n // Keep hovered state while exiting to avoid flash back to number\n const showAsHovered = isHovered || isExiting;\n\n // Mark as animated after render\n if (isNew) {\n animatedIdsRef.current.add(annotation.id);\n }\n\n return (\n <div\n key={annotation.id}\n className={`${styles.marker} ${showAsHovered ? styles.hovered : \"\"} ${isExiting ? 'agentation-marker-exit' : ''} ${isNew ? 'agentation-marker-new' : ''}`}\n data-annotation-marker\n style={{\n left: `${annotation.x}%`,\n top: annotation.y, // Absolute document position - browser handles scroll\n }}\n onMouseEnter={() => !isExiting && annotation.id !== recentlyAddedIdRef.current && setHoveredMarkerId(annotation.id)}\n onMouseLeave={() => setHoveredMarkerId(null)}\n onClick={(e) => {\n e.stopPropagation();\n if (!isExiting) deleteAnnotation(annotation.id);\n }}\n >\n {showAsHovered ? <IconClose size={10} /> : index + 1}\n {isHovered && !isExiting && (\n <div className={`${styles.markerTooltip} agentation-tooltip-animate`}>\n {annotation.selectedText && (\n <span className={styles.markerQuote}>\n “{annotation.selectedText.slice(0, 50)}\n {annotation.selectedText.length > 50 ? \"...\" : \"\"}”\n </span>\n )}\n <span className={styles.markerNote}>{annotation.comment}</span>\n <span className={styles.markerHint}>Click to remove</span>\n </div>\n )}\n </div>\n );\n })}\n </div>\n\n {/* Interactive overlay - fades during scroll via .scrolling class */}\n {isActive && (\n <div\n ref={overlayRef}\n className={styles.overlay}\n data-feedback-toolbar\n >\n {/* Hover highlight - hidden during scroll via body class */}\n {hoverInfo?.rect && !pendingAnnotation && (\n <div\n key={`${hoverInfo.rect.left}-${hoverInfo.rect.top}-${hoverInfo.rect.width}`}\n className={`${styles.hoverHighlight} agentation-highlight-animate agentation-hover-highlight`}\n style={{\n left: hoverInfo.rect.left,\n top: hoverInfo.rect.top,\n width: hoverInfo.rect.width,\n height: hoverInfo.rect.height,\n }}\n />\n )}\n\n {/* Hover tooltip - hidden during scroll via body class */}\n {hoverInfo && !pendingAnnotation && (\n <div\n className={`${styles.hoverTooltip} agentation-hover-tooltip-animate agentation-hover-tooltip`}\n style={{\n left: Math.min(hoverPosition.x, window.innerWidth - 150),\n top: Math.max(hoverPosition.y - 32, 8),\n }}\n >\n {hoverInfo.element}\n </div>\n )}\n\n {/* Pending annotation marker + popup */}\n {(pendingAnnotation || pendingExiting) && (\n <>\n <div\n className={`${styles.marker} ${styles.pending} ${pendingExiting ? 'agentation-pending-exit' : 'agentation-pending-enter'}`}\n style={{\n left: `${pendingAnnotation?.x ?? 0}%`,\n top: pendingAnnotation?.clientY ?? 0,\n }}\n >\n <IconPlus size={12} />\n </div>\n\n {pendingAnnotation && !pendingExiting && (\n <AnnotationPopupCSS\n ref={popupRef}\n element={pendingAnnotation.element}\n selectedText={pendingAnnotation.selectedText}\n onSubmit={addAnnotation}\n onCancel={cancelAnnotation}\n style={{\n left: `${Math.min(Math.max(pendingAnnotation.x, 15), 85)}%`,\n top: Math.min(pendingAnnotation.clientY + 20, window.innerHeight - 180),\n }}\n />\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// CSS Animation Styles (injected once)\n// =============================================================================\n\nconst cssAnimationStyles = `\n@keyframes agentation-popup-in {\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\n@keyframes agentation-popup-shake {\n 0%, 100% { transform: translateX(-50%); }\n 15% { transform: translateX(-50%) translateX(-3px); }\n 30% { transform: translateX(-50%) translateX(3px); }\n 45% { transform: translateX(-50%) translateX(-2px); }\n 60% { transform: translateX(-50%) translateX(2px); }\n 75% { transform: translateX(-50%) translateX(-1px); }\n 90% { transform: translateX(-50%) translateX(1px); }\n}\n\n.agentation-popup-animate-in {\n animation: agentation-popup-in 0.2s ease-out forwards;\n}\n\n.agentation-popup-shake {\n animation: agentation-popup-shake 0.3s ease-out forwards !important;\n}\n`;\n\n// Inject styles once\nif (typeof document !== \"undefined\") {\n if (!document.getElementById(\"agentation-popup-css-animations\")) {\n const style = document.createElement(\"style\");\n style.id = \"agentation-popup-css-animations\";\n style.textContent = cssAnimationStyles;\n document.head.appendChild(style);\n }\n}\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface AnnotationPopupProps {\n element: string;\n timestamp?: string;\n selectedText?: string;\n placeholder?: string;\n onSubmit: (text: string) => void;\n onCancel: () => void;\n style?: React.CSSProperties;\n variant?: \"blue\" | \"green\";\n}\n\nexport interface AnnotationPopupHandle {\n shake: () => void;\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\nexport const AnnotationPopupCSS = forwardRef<AnnotationPopupHandle, AnnotationPopupProps>(\n function AnnotationPopupCSS(\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 [hasAnimatedIn, setHasAnimatedIn] = useState(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Focus textarea on mount\n useEffect(() => {\n const timer = setTimeout(() => textareaRef.current?.focus(), 10);\n return () => clearTimeout(timer);\n }, []);\n\n // Shake animation - use CSS directly to avoid re-render flash\n const shake = useCallback(() => {\n const el = containerRef.current;\n if (!el) return;\n\n // Remove and re-add shake class to restart animation\n el.classList.remove('agentation-popup-shake');\n // Force reflow\n void el.offsetWidth;\n el.classList.add('agentation-popup-shake');\n }, []);\n\n // Handle animation end\n const handleAnimationEnd = useCallback((e: React.AnimationEvent) => {\n if (e.animationName === 'agentation-popup-in') {\n setHasAnimatedIn(true);\n }\n if (e.animationName === 'agentation-popup-shake') {\n textareaRef.current?.focus();\n }\n }, []);\n\n // Expose shake to parent\n useImperativeHandle(ref, () => ({ shake }), [shake]);\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 onCancel();\n }\n },\n [handleSubmit, onCancel]\n );\n\n return (\n <div\n ref={containerRef}\n className={`${styles.popup} ${!hasAnimatedIn ? \"agentation-popup-animate-in\" : \"\"}`}\n data-annotation-popup\n style={style}\n onClick={(e) => e.stopPropagation()}\n onAnimationEnd={handleAnimationEnd}\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 “{selectedText.slice(0, 80)}\n {selectedText.length > 80 ? \"...\" : \"\"}”\n </div>\n )}\n\n <textarea\n ref={textareaRef}\n className={styles.textarea}\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 </div>\n );\n }\n);\n\nexport default AnnotationPopupCSS;\n","\"use client\";\n\n// =============================================================================\n// CSS-only icons (no framer-motion dependency)\n// =============================================================================\n\n// Feedback/comment bubble with plus (Material Design style)\nexport const IconFeedback = ({ size = 18 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12,4c4.97,0,8.9,4.56,7.82,9.72c-0.68,3.23-3.4,5.74-6.67,6.2c-1.59,0.22-3.14-0.01-4.58-0.7 c-0.27-0.13-0.56-0.19-0.86-0.19c-0.19,0-0.38,0.03-0.56,0.08l-2.31,0.68c-0.38,0.11-0.74-0.24-0.63-0.63l0.7-2.39 c0.13-0.45,0.07-0.92-0.14-1.35C4.26,14.34,4,13.18,4,12C4,7.59,7.59,4,12,4 M12,2C6.48,2,2,6.48,2,12c0,1.54,0.36,2.98,0.97,4.29 l-1.46,4.96C1.29,22,2,22.71,2.76,22.48l4.96-1.46c1.66,0.79,3.56,1.15,5.58,0.89c4.56-0.59,8.21-4.35,8.66-8.92 C22.53,7.03,17.85,2,12,2L12,2z\"/>\n <path d=\"M12,8L12,8c-0.55,0-1,0.45-1,1v2H9c-0.55,0-1,0.45-1,1v0c0,0.55,0.45,1,1,1h2v2 c0,0.55,0.45,1,1,1h0c0.55,0,1-0.45,1-1v-2h2c0.55,0,1-0.45,1-1v0c0-0.55-0.45-1-1-1h-2V9C13,8.45,12.55,8,12,8z\" fillRule=\"evenodd\"/>\n </svg>\n);\n\n// Play icon (triangle pointing right)\nexport const IconPlay = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M5 3.5v9l7-4.5-7-4.5z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Pause icon (two vertical bars)\nexport const IconPause = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M5.5 4v8M10.5 4v8\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n);\n\n// Eye icon with CSS transition (Material Design style)\nexport const EyeMorphIcon = ({ size = 16, visible }: { size?: number; visible: boolean }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 4C7 4 2.73 7.11 1 11.5 2.73 15.89 7 19 12 19s9.27-3.11 11-7.5C21.27 7.11 17 4 12 4zm0 12.5c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\" />\n <g style={{ opacity: visible ? 0 : 1, transition: \"opacity 0.15s ease\" }}>\n <line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"4\" stroke=\"white\" strokeWidth=\"4\" strokeLinecap=\"round\" />\n <line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </g>\n </svg>\n);\n\n// Document/save icon with CSS transition (Material Design style)\nexport const CopyMorphIcon = ({ size = 16, checked }: { size?: number; checked: boolean }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path\n d=\"M14.17,3H5C3.9,3,3,3.9,3,5v14c0,1.1,0.9,2,2,2h14c1.1,0,2-0.9,2-2V9.83c0-0.53-0.21-1.04-0.59-1.41l-4.83-4.83 C15.21,3.21,14.7,3,14.17,3L14.17,3z M8,15h8c0.55,0,1,0.45,1,1v0c0,0.55-0.45,1-1,1H8c-0.55,0-1-0.45-1-1v0C7,15.45,7.45,15,8,15z M8,11h8c0.55,0,1,0.45,1,1v0c0,0.55-0.45,1-1,1H8c-0.55,0-1-0.45-1-1v0C7,11.45,7.45,11,8,11z M8,7h5c0.55,0,1,0.45,1,1v0 c0,0.55-0.45,1-1,1H8C7.45,9,7,8.55,7,8v0C7,7.45,7.45,7,8,7z\"\n style={{ opacity: checked ? 0 : 1, transition: \"opacity 0.15s ease\" }}\n />\n <path\n d=\"M6 12.5l3.5 3.5L18 7\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n style={{\n opacity: checked ? 1 : 0,\n transform: checked ? \"scale(1)\" : \"scale(0.5)\",\n transformOrigin: \"12px 12px\",\n transition: \"opacity 0.2s ease, transform 0.2s ease\",\n }}\n />\n </svg>\n);\n\n// Refresh/reset icon with spin animation (Material Design style)\nexport const TrashMorphIcon = ({ size = 16, checked }: { size?: number; checked: boolean }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n style={{\n transform: checked ? \"rotate(360deg)\" : \"rotate(0deg)\",\n transition: \"transform 0.5s cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n >\n <path d=\"M17.65 6.35c-1.63-1.63-3.94-2.57-6.48-2.31-3.67.37-6.69 3.35-7.1 7.02C3.52 15.91 7.27 20 12 20c3.19 0 5.93-1.87 7.21-4.56.32-.67-.16-1.44-.9-1.44-.37 0-.72.2-.88.53-1.13 2.43-3.84 3.97-6.8 3.31-2.22-.49-4.01-2.3-4.48-4.52C5.31 9.44 8.26 6 12 6c1.66 0 3.14.69 4.22 1.78l-1.51 1.51c-.63.63-.19 1.71.7 1.71H19c.55 0 1-.45 1-1V6.41c0-.89-1.08-1.34-1.71-.71l-.64.65z\" />\n </svg>\n);\n\n// External link arrow\nexport const IconExternal = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M6 3h7v7M13 3L6 10\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Chevron down for close/collapse\nexport const IconChevronDown = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M4 6l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\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 d=\"M4 4l8 8M12 4l-8 8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\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 d=\"M8 3v10M3 8h10\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n"],"mappings":"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","names":["import_react","import_framer_motion","AnnotationPopup","import_framer_motion","import_jsx_runtime","css","classNames","styles_module_default","import_jsx_runtime","styles_module_default","import_react","import_react_dom","import_react","import_jsx_runtime","AnnotationPopupCSS","CopyMorphIcon","EyeMorphIcon","IconChevronDown","IconClose","IconExternal","IconFeedback","IconPause","IconPlay","IconPlus","TrashMorphIcon","import_jsx_runtime","import_jsx_runtime","cssAnimationStyles","generateOutput","output","styles_module_default","IconFeedback","IconPlay","IconPause","EyeMorphIcon","CopyMorphIcon","TrashMorphIcon","IconChevronDown","IconClose","IconPlus"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
declare function PageFeedbackToolbar(): react.ReactPortal | null;
|
|
5
|
+
|
|
6
|
+
declare function PageFeedbackToolbarCSS(): react.ReactPortal | null;
|
|
7
|
+
|
|
8
|
+
interface AnnotationPopupProps$1 {
|
|
9
|
+
/** Element name to display in header */
|
|
10
|
+
element: string;
|
|
11
|
+
/** Optional timestamp display (e.g., "@ 1.23s" for animation feedback) */
|
|
12
|
+
timestamp?: string;
|
|
13
|
+
/** Optional selected/highlighted text */
|
|
14
|
+
selectedText?: string;
|
|
15
|
+
/** Placeholder text for the textarea */
|
|
16
|
+
placeholder?: string;
|
|
17
|
+
/** Called when annotation is submitted with text */
|
|
18
|
+
onSubmit: (text: string) => void;
|
|
19
|
+
/** Called when popup is cancelled/dismissed */
|
|
20
|
+
onCancel: () => void;
|
|
21
|
+
/** Position styles (left, top) */
|
|
22
|
+
style?: React.CSSProperties;
|
|
23
|
+
/** Color variant for submit button */
|
|
24
|
+
variant?: "blue" | "green";
|
|
25
|
+
}
|
|
26
|
+
interface AnnotationPopupHandle$1 {
|
|
27
|
+
/** Shake the popup (e.g., when user clicks outside) */
|
|
28
|
+
shake: () => void;
|
|
29
|
+
}
|
|
30
|
+
declare const AnnotationPopup: react.ForwardRefExoticComponent<AnnotationPopupProps$1 & react.RefAttributes<AnnotationPopupHandle$1>>;
|
|
31
|
+
declare function AnnotationPopupPresence({ isOpen, ...props }: AnnotationPopupProps$1 & {
|
|
32
|
+
isOpen: boolean;
|
|
33
|
+
}): react_jsx_runtime.JSX.Element;
|
|
34
|
+
|
|
35
|
+
interface AnnotationPopupProps {
|
|
36
|
+
element: string;
|
|
37
|
+
timestamp?: string;
|
|
38
|
+
selectedText?: string;
|
|
39
|
+
placeholder?: string;
|
|
40
|
+
onSubmit: (text: string) => void;
|
|
41
|
+
onCancel: () => void;
|
|
42
|
+
style?: React.CSSProperties;
|
|
43
|
+
variant?: "blue" | "green";
|
|
44
|
+
}
|
|
45
|
+
interface AnnotationPopupHandle {
|
|
46
|
+
shake: () => void;
|
|
47
|
+
}
|
|
48
|
+
declare const AnnotationPopupCSS: react.ForwardRefExoticComponent<AnnotationPopupProps & react.RefAttributes<AnnotationPopupHandle>>;
|
|
49
|
+
|
|
50
|
+
declare const IconFeedback$1: ({ size }: {
|
|
51
|
+
size?: number;
|
|
52
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
53
|
+
declare const IconPlay$1: ({ size }: {
|
|
54
|
+
size?: number;
|
|
55
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
56
|
+
declare const IconPause$1: ({ size }: {
|
|
57
|
+
size?: number;
|
|
58
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
59
|
+
declare const EyeMorphIcon$1: ({ size, visible }: {
|
|
60
|
+
size?: number;
|
|
61
|
+
visible: boolean;
|
|
62
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
63
|
+
declare const CopyMorphIcon$1: ({ size, checked }: {
|
|
64
|
+
size?: number;
|
|
65
|
+
checked: boolean;
|
|
66
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
67
|
+
declare const TrashMorphIcon$1: ({ size, checked }: {
|
|
68
|
+
size?: number;
|
|
69
|
+
checked: boolean;
|
|
70
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
71
|
+
declare const IconExternal$1: ({ size }: {
|
|
72
|
+
size?: number;
|
|
73
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
74
|
+
declare const IconChevronDown$1: ({ size }: {
|
|
75
|
+
size?: number;
|
|
76
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
77
|
+
declare const IconClose$1: ({ size }: {
|
|
78
|
+
size?: number;
|
|
79
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
80
|
+
declare const IconPlus$1: ({ size }: {
|
|
81
|
+
size?: number;
|
|
82
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
83
|
+
|
|
84
|
+
declare const IconFeedback: ({ size }: {
|
|
85
|
+
size?: number;
|
|
86
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
87
|
+
declare const IconPlay: ({ size }: {
|
|
88
|
+
size?: number;
|
|
89
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
90
|
+
declare const IconPause: ({ size }: {
|
|
91
|
+
size?: number;
|
|
92
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
93
|
+
declare const EyeMorphIcon: ({ size, visible }: {
|
|
94
|
+
size?: number;
|
|
95
|
+
visible: boolean;
|
|
96
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
97
|
+
declare const CopyMorphIcon: ({ size, checked }: {
|
|
98
|
+
size?: number;
|
|
99
|
+
checked: boolean;
|
|
100
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
101
|
+
declare const TrashMorphIcon: ({ size, checked }: {
|
|
102
|
+
size?: number;
|
|
103
|
+
checked: boolean;
|
|
104
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
105
|
+
declare const IconExternal: ({ size }: {
|
|
106
|
+
size?: number;
|
|
107
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
108
|
+
declare const IconChevronDown: ({ size }: {
|
|
109
|
+
size?: number;
|
|
110
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
111
|
+
declare const IconClose: ({ size }: {
|
|
112
|
+
size?: number;
|
|
113
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
114
|
+
declare const IconPlus: ({ size }: {
|
|
115
|
+
size?: number;
|
|
116
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
117
|
+
|
|
118
|
+
declare const iconsCss_CopyMorphIcon: typeof CopyMorphIcon;
|
|
119
|
+
declare const iconsCss_EyeMorphIcon: typeof EyeMorphIcon;
|
|
120
|
+
declare const iconsCss_IconChevronDown: typeof IconChevronDown;
|
|
121
|
+
declare const iconsCss_IconClose: typeof IconClose;
|
|
122
|
+
declare const iconsCss_IconExternal: typeof IconExternal;
|
|
123
|
+
declare const iconsCss_IconFeedback: typeof IconFeedback;
|
|
124
|
+
declare const iconsCss_IconPause: typeof IconPause;
|
|
125
|
+
declare const iconsCss_IconPlay: typeof IconPlay;
|
|
126
|
+
declare const iconsCss_IconPlus: typeof IconPlus;
|
|
127
|
+
declare const iconsCss_TrashMorphIcon: typeof TrashMorphIcon;
|
|
128
|
+
declare namespace iconsCss {
|
|
129
|
+
export { iconsCss_CopyMorphIcon as CopyMorphIcon, iconsCss_EyeMorphIcon as EyeMorphIcon, iconsCss_IconChevronDown as IconChevronDown, iconsCss_IconClose as IconClose, iconsCss_IconExternal as IconExternal, iconsCss_IconFeedback as IconFeedback, iconsCss_IconPause as IconPause, iconsCss_IconPlay as IconPlay, iconsCss_IconPlus as IconPlus, iconsCss_TrashMorphIcon as TrashMorphIcon };
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Gets a readable path for an element (e.g., "article > section > p")
|
|
134
|
+
*/
|
|
135
|
+
declare function getElementPath(target: HTMLElement, maxDepth?: number): string;
|
|
136
|
+
/**
|
|
137
|
+
* Identifies an element and returns a human-readable name + path
|
|
138
|
+
*/
|
|
139
|
+
declare function identifyElement(target: HTMLElement): {
|
|
140
|
+
name: string;
|
|
141
|
+
path: string;
|
|
142
|
+
};
|
|
143
|
+
/**
|
|
144
|
+
* Gets text content from element and siblings for context
|
|
145
|
+
*/
|
|
146
|
+
declare function getNearbyText(element: HTMLElement): string;
|
|
147
|
+
/**
|
|
148
|
+
* Simplified element identifier for animation feedback (less verbose)
|
|
149
|
+
*/
|
|
150
|
+
declare function identifyAnimationElement(target: HTMLElement): string;
|
|
151
|
+
/**
|
|
152
|
+
* Gets CSS class names from an element (cleaned of module hashes)
|
|
153
|
+
*/
|
|
154
|
+
declare function getElementClasses(target: HTMLElement): string;
|
|
155
|
+
|
|
156
|
+
type Annotation = {
|
|
157
|
+
id: string;
|
|
158
|
+
x: number;
|
|
159
|
+
y: number;
|
|
160
|
+
comment: string;
|
|
161
|
+
element: string;
|
|
162
|
+
elementPath: string;
|
|
163
|
+
timestamp: number;
|
|
164
|
+
selectedText?: string;
|
|
165
|
+
boundingBox?: {
|
|
166
|
+
x: number;
|
|
167
|
+
y: number;
|
|
168
|
+
width: number;
|
|
169
|
+
height: number;
|
|
170
|
+
};
|
|
171
|
+
nearbyText?: string;
|
|
172
|
+
cssClasses?: string;
|
|
173
|
+
nearbyElements?: string;
|
|
174
|
+
computedStyles?: string;
|
|
175
|
+
fullPath?: string;
|
|
176
|
+
accessibility?: string;
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
declare function getStorageKey(pathname: string): string;
|
|
180
|
+
declare function loadAnnotations<T = Annotation>(pathname: string): T[];
|
|
181
|
+
declare function saveAnnotations<T = Annotation>(pathname: string, annotations: T[]): void;
|
|
182
|
+
|
|
183
|
+
export { PageFeedbackToolbar as Agentation, PageFeedbackToolbarCSS as AgentationCSS, type Annotation, AnnotationPopup, AnnotationPopupCSS, type AnnotationPopupHandle$1 as AnnotationPopupHandle, AnnotationPopupPresence, type AnnotationPopupProps$1 as AnnotationPopupProps, CopyMorphIcon$1 as CopyMorphIcon, EyeMorphIcon$1 as EyeMorphIcon, PageFeedbackToolbar as FeedbackToolbar, IconChevronDown$1 as IconChevronDown, IconClose$1 as IconClose, IconExternal$1 as IconExternal, IconFeedback$1 as IconFeedback, IconPause$1 as IconPause, IconPlay$1 as IconPlay, IconPlus$1 as IconPlus, iconsCss as IconsCSS, PageFeedbackToolbar, PageFeedbackToolbarCSS, TrashMorphIcon$1 as TrashMorphIcon, getElementClasses, getElementPath, getNearbyText, getStorageKey, identifyAnimationElement, identifyElement, loadAnnotations, saveAnnotations };
|