@np-dev/ui-ai-anotation 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +106 -21
- package/dist/cjs/index.cjs +247 -14
- package/dist/cjs/index.cjs.map +4 -4
- package/dist/cjs/index.native.cjs +11 -11
- package/dist/cjs/index.native.cjs.map +3 -3
- package/dist/cjs/index.web.cjs +5 -5
- package/dist/cjs/index.web.cjs.map +2 -2
- package/dist/esm/index.js +248 -14
- package/dist/esm/index.js.map +4 -4
- package/dist/esm/index.native.js +11 -11
- package/dist/esm/index.native.js.map +3 -3
- package/dist/esm/index.web.js +5 -5
- package/dist/esm/index.web.js.map +2 -2
- package/dist/types/components/ErrorBoundary.d.ts +159 -0
- package/dist/types/index.d.ts +5 -3
- package/dist/types/index.web.d.ts +2 -2
- package/dist/types/store.d.ts +2 -2
- package/package.json +1 -1
- package/src/components/AnnotationInput.tsx +2 -2
- package/src/components/AnnotationList.tsx +2 -2
- package/src/components/ErrorBoundary.tsx +426 -0
- package/src/components/Highlighter.tsx +2 -2
- package/src/components/Toolbar.tsx +4 -3
- package/src/components/native/AnnotationInput.tsx +2 -2
- package/src/components/native/AnnotationList.tsx +2 -2
- package/src/components/native/Highlighter.tsx +2 -2
- package/src/components/native/Toolbar.tsx +2 -2
- package/src/components/web/AnnotationInput.tsx +2 -2
- package/src/components/web/AnnotationList.tsx +2 -2
- package/src/components/web/Highlighter.tsx +2 -2
- package/src/components/web/Toolbar.tsx +2 -2
- package/src/extension.tsx +1 -1
- package/src/index.native.tsx +4 -4
- package/src/index.tsx +6 -4
- package/src/index.web.tsx +3 -3
- package/src/store.tsx +3 -3
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/index.tsx", "../../src/store.tsx", "../../src/components/Toolbar.tsx", "../../src/components/Draggable.tsx", "../../src/components/Highlighter.tsx", "../../src/components/AnnotationInput.tsx", "../../src/utils/screenshot.ts", "../../src/utils/fiber.ts", "../../src/components/AnnotationList.tsx", "../../src/utils/platform.ts"],
|
|
4
|
-
"sourcesContent": ["import React from 'react';\nimport { AiAnnotationProvider as Provider } from './store';\nimport { Toolbar } from './components/Toolbar';\n\nexport interface AiAnnotationProviderProps {\n children: React.ReactNode;\n}\n\n/**\n * Web AI Annotation Provider\n * Wraps your app to provide annotation functionality\n */\nexport function AiAnnotationProvider({ children }: AiAnnotationProviderProps) {\n return (\n <Provider>\n {children}\n <Toolbar />\n </Provider>\n );\n}\n\n// Re-export store\nexport * from './store';\n\n// Export web components\nexport { Toolbar } from './components/Toolbar';\nexport { Highlighter } from './components/Highlighter';\nexport { AnnotationInput } from './components/AnnotationInput';\nexport { AnnotationList } from './components/AnnotationList';\nexport { Draggable } from './components/Draggable';\n\n// Export screenshot utility\nexport { captureScreenshot } from './utils/screenshot';\nexport type { ScreenshotOptions, ScreenshotResult } from './utils/screenshot';\n\n// Export fiber utilities\nexport { getReactFiber, getComponentDisplayName, getElementFromFiber } from './utils/fiber';\n\n// Export platform utilities\nexport { isWeb, isNative, getPlatform, isTauriEnv } from './utils/platform';\nexport type { PlatformType } from './utils/platform';\n", "import React, { createContext, useContext, useReducer, ReactNode } from 'react';\nimport type { ComponentDetails, ChildComponentInfo, ElementInfo } from './utils/fiber';\n\n// Re-export types for external use\nexport type { ComponentDetails, ChildComponentInfo, ElementInfo };\n\nexport type Annotation = {\n id: string;\n componentName: string;\n note: string;\n timestamp: number;\n /** Enhanced component details (optional for backward compatibility) */\n details?: ComponentDetails;\n};\n\nexport type Mode = 'disabled' | 'inspecting';\n\n/**\n * Platform-agnostic element type\n * - On web: HTMLElement\n * - On native: View ref or null\n */\nexport type HoveredElement = any;\n\n/**\n * Enhanced component info with full details\n */\nexport interface HoveredComponentInfo {\n name: string;\n /** Full component details including hierarchy, children, and element info */\n details?: ComponentDetails;\n}\n\ninterface State {\n mode: Mode;\n annotations: Annotation[];\n hoveredElement: HoveredElement;\n hoveredComponentInfo: HoveredComponentInfo | null;\n isMinimized: boolean;\n showList: boolean;\n}\n\ntype Action =\n | { type: 'SET_MODE'; payload: Mode }\n | { type: 'ADD_ANNOTATION'; payload: Annotation }\n | { type: 'REMOVE_ANNOTATION'; payload: string }\n | { type: 'CLEAR_ALL_ANNOTATIONS' }\n | { type: 'SET_HOVERED'; payload: { element: HoveredElement; name: string | null; details?: ComponentDetails } }\n | { type: 'TOGGLE_MINIMIZED' }\n | { type: 'TOGGLE_LIST' }\n | { type: 'RESET_HOVER' };\n\nconst initialState: State = {\n mode: 'disabled',\n annotations: [],\n hoveredElement: null,\n hoveredComponentInfo: null,\n isMinimized: false,\n showList: false,\n};\n\nconst AnnotationContext = createContext<{\n state: State;\n dispatch: React.Dispatch<Action>;\n} | undefined>(undefined);\n\nfunction reducer(state: State, action: Action): State {\n switch (action.type) {\n case 'SET_MODE':\n return { ...state, mode: action.payload };\n case 'ADD_ANNOTATION':\n return { ...state, annotations: [...state.annotations, action.payload] };\n case 'REMOVE_ANNOTATION':\n return {\n ...state,\n annotations: state.annotations.filter((a) => a.id !== action.payload),\n };\n case 'CLEAR_ALL_ANNOTATIONS':\n return {\n ...state,\n annotations: [],\n };\n case 'SET_HOVERED':\n // Avoid updates if same\n if (state.hoveredElement === action.payload.element) return state;\n return {\n ...state,\n hoveredElement: action.payload.element,\n hoveredComponentInfo: action.payload.name\n ? { name: action.payload.name, details: action.payload.details }\n : null\n };\n case 'RESET_HOVER':\n return { ...state, hoveredElement: null, hoveredComponentInfo: null };\n case 'TOGGLE_MINIMIZED':\n return { ...state, isMinimized: !state.isMinimized };\n case 'TOGGLE_LIST':\n return { ...state, showList: !state.showList };\n default:\n return state;\n }\n}\n\nexport function AiAnnotationProvider({ children }: { children: ReactNode }) {\n const [state, dispatch] = useReducer(reducer, initialState);\n\n return (\n <AnnotationContext.Provider value={{ state, dispatch }}>\n {children}\n </AnnotationContext.Provider>\n );\n}\n\nexport function useAiAnnotation() {\n const context = useContext(AnnotationContext);\n if (!context) {\n throw new Error('useAiAnnotation must be used within an AiAnnotationProvider');\n }\n return context;\n}\n", "import React, { useState, useEffect, useRef } from 'react';\nimport { useAiAnnotation } from '../store';\nimport { Draggable } from './Draggable';\nimport { GripVertical, MousePointer2, List, Copy, Minus, Maximize2, Ban, Check } from 'lucide-react';\nimport { Highlighter } from './Highlighter';\nimport { AnnotationList } from './AnnotationList';\n\nexport function Toolbar() {\n const { state, dispatch } = useAiAnnotation();\n const [showCopied, setShowCopied] = useState(false);\n const [isAnimating, setIsAnimating] = useState(false);\n const contentRef = useRef<HTMLDivElement>(null);\n const [contentWidth, setContentWidth] = useState<number | null>(null);\n\n // Measure content width for smooth animation\n useEffect(() => {\n if (contentRef.current && !state.isMinimized) {\n // Use requestAnimationFrame to ensure DOM is updated before measuring\n requestAnimationFrame(() => {\n if (contentRef.current) {\n setContentWidth(contentRef.current.scrollWidth);\n }\n });\n }\n }, [state.isMinimized, showCopied, state.annotations.length]);\n\n // Handle minimize toggle with animation\n const handleToggleMinimized = () => {\n setIsAnimating(true);\n dispatch({ type: 'TOGGLE_MINIMIZED' });\n setTimeout(() => setIsAnimating(false), 300);\n };\n\n const handleCopy = () => {\n if (state.annotations.length === 0) return;\n\n // Format annotations as readable text with sections\n const sections = state.annotations.map((a, index) => {\n const lines: string[] = [];\n\n // Section header\n lines.push(`${'='.repeat(50)}`);\n lines.push(`Annotation ${index + 1}: ${a.componentName}`);\n lines.push(`${'='.repeat(50)}`);\n lines.push('');\n\n // Instruction/Note\n lines.push('## Instruction');\n lines.push(a.note);\n\n return lines.join('\\n');\n });\n\n const text = sections.join('\\n\\n');\n navigator.clipboard.writeText(text).then(() => {\n setShowCopied(true);\n setTimeout(() => setShowCopied(false), 2000);\n });\n };\n\n const toggleMode = () => {\n dispatch({\n type: 'SET_MODE',\n payload: state.mode === 'disabled' ? 'inspecting' : 'disabled',\n });\n };\n\n return (\n <>\n <Highlighter />\n <AnnotationList />\n <Draggable>\n <div\n style={{\n backgroundColor: '#1e1e1e',\n border: '1px solid #333',\n borderRadius: '8px',\n padding: '8px',\n boxShadow: '0 4px 12px rgba(0,0,0,0.3)',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n color: '#e5e7eb',\n transition: 'width 0.2s',\n }}\n data-ai-annotation-ui\n >\n {/* Drag Handle */}\n <div style={{ cursor: 'grab', color: '#666', display: 'flex' }} title=\"Drag\">\n <GripVertical size={20} />\n </div>\n\n <div\n ref={contentRef}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n overflow: 'hidden',\n transition: 'max-width 0.3s ease, opacity 0.2s ease',\n maxWidth: state.isMinimized ? 0 : (contentWidth || 300),\n opacity: state.isMinimized ? 0 : 1,\n paddingTop: '4px',\n paddingBottom: '4px',\n marginTop: '-4px',\n marginBottom: '-4px',\n }}\n >\n <>\n <div style={{ width: '1px', height: '24px', backgroundColor: '#333' }} />\n\n <button\n onClick={toggleMode}\n title={state.mode === 'inspecting' ? \"Disable Inspection\" : \"Enable Inspection\"}\n style={{\n background: state.mode === 'inspecting' ? '#3b82f6' : 'transparent',\n border: 'none',\n borderRadius: '4px',\n padding: '6px',\n color: state.mode === 'inspecting' ? 'white' : 'inherit',\n cursor: 'pointer',\n display: 'flex'\n }}\n >\n {state.mode === 'inspecting' ? <MousePointer2 size={18} /> : <Ban size={18} />}\n </button>\n\n <button\n onClick={() => dispatch({ type: 'TOGGLE_LIST' })}\n title=\"List Annotations\"\n style={{\n background: 'transparent',\n border: 'none',\n borderRadius: '4px',\n padding: '6px',\n color: 'inherit',\n cursor: 'pointer',\n display: 'flex',\n position: 'relative'\n }}\n >\n <List size={18} />\n {state.annotations.length > 0 && (\n <span style={{\n position: 'absolute',\n top: -2,\n right: -2,\n background: '#ef4444',\n color: 'white',\n fontSize: '9px',\n width: '14px',\n height: '14px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center'\n }}>\n {state.annotations.length}\n </span>\n )}\n </button>\n\n <button\n onClick={handleCopy}\n title=\"Copy Annotations\"\n style={{\n background: showCopied ? '#22c55e' : 'transparent',\n border: 'none',\n borderRadius: '4px',\n padding: '6px',\n color: showCopied ? 'white' : 'inherit',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n transition: 'background-color 0.2s, color 0.2s',\n minWidth: showCopied ? '75px' : 'auto',\n }}\n >\n {showCopied ? (\n <>\n <Check size={18} />\n <span style={{ fontSize: '12px', whiteSpace: 'nowrap' }}>Copied!</span>\n </>\n ) : (\n <Copy size={18} />\n )}\n </button>\n </>\n </div>\n\n <div style={{ width: '1px', height: '24px', backgroundColor: '#333', marginLeft: state.isMinimized ? 0 : 'auto' }} />\n\n <button\n onClick={handleToggleMinimized}\n title={state.isMinimized ? \"Expand\" : \"Minimize\"}\n style={{\n background: 'transparent',\n border: 'none',\n borderRadius: '4px',\n padding: '6px',\n color: 'inherit',\n cursor: 'pointer',\n display: 'flex'\n }}\n >\n {state.isMinimized ? <Maximize2 size={18} /> : <Minus size={18} />}\n </button>\n </div>\n </Draggable>\n </>\n );\n}\n", "import React, { useState, useEffect, useRef } from 'react';\n\ninterface DraggableProps {\n children: React.ReactNode;\n initialPos?: { x: number; y: number };\n}\n\nexport function Draggable({ children, initialPos = { x: 20, y: 20 } }: DraggableProps) {\n const [pos, setPos] = useState(initialPos);\n const [dragging, setDragging] = useState(false);\n const [rel, setRel] = useState({ x: 0, y: 0 });\n const nodeRef = useRef<HTMLDivElement>(null);\n\n const onMouseDown = (e: React.MouseEvent) => {\n if (e.button !== 0) return;\n const node = nodeRef.current;\n if (!node) return;\n\n // Only drag if clicking the handle or the container itself, but usually we want a specific handle.\n // For now, let's assume the whole container is draggable unless propagation stopped.\n\n const rect = node.getBoundingClientRect();\n setDragging(true);\n setRel({\n x: e.pageX - rect.left - window.scrollX,\n y: e.pageY - rect.top - window.scrollY,\n });\n e.preventDefault();\n };\n\n const onMouseMove = (e: MouseEvent) => {\n if (!dragging) return;\n setPos({\n x: e.pageX - rel.x,\n y: e.pageY - rel.y,\n });\n e.preventDefault();\n };\n\n const onMouseUp = () => {\n setDragging(false);\n };\n\n useEffect(() => {\n if (dragging) {\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n } else {\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n }\n return () => {\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n }, [dragging]);\n\n return (\n <div\n ref={nodeRef}\n style={{\n position: 'fixed',\n left: pos.x,\n top: pos.y,\n zIndex: 9999,\n cursor: dragging ? 'grabbing' : 'grab',\n }}\n onMouseDown={onMouseDown}\n >\n {children}\n </div>\n );\n}\n", "import { useEffect, useState } from \"react\";\nimport { useAiAnnotation } from \"../store\";\nimport { AnnotationInput } from \"./AnnotationInput\";\nimport { captureScreenshot } from \"../utils/screenshot\";\nimport { getComponentDetails } from \"../utils/fiber\";\n\nexport function Highlighter() {\n const { state, dispatch } = useAiAnnotation();\n const { hoveredElement, mode, hoveredComponentInfo } = state;\n\n const [rect, setRect] = useState<DOMRect | null>(null);\n const [showInput, setShowInput] = useState(false);\n const [mousePos, setMousePos] = useState({ x: 0, y: 0 });\n const [isLocked, setIsLocked] = useState(false);\n const [lockedPos, setLockedPos] = useState({ x: 0, y: 0 });\n const [isCapturing, setIsCapturing] = useState(false);\n const [captureSuccess, setCaptureSuccess] = useState(false);\n const [showDetails, setShowDetails] = useState(false);\n\n const componentName = hoveredComponentInfo?.name || \"\";\n const componentDetails = hoveredComponentInfo?.details;\n\n // Detect hovered element when in inspecting mode\n useEffect(() => {\n if (mode !== 'inspecting') return;\n\n const handleMouseOver = (e: MouseEvent) => {\n // Don't detect if locked (user is interacting with tooltip)\n if (isLocked) return;\n\n const target = e.target as HTMLElement;\n \n // Ignore annotation UI elements\n if (target.closest('[data-ai-annotation-ui]') || target.closest('[data-annotation-tooltip]')) {\n return;\n }\n\n // Get React component info from fiber with enhanced details\n const details = getComponentDetails(target, {\n includeProps: false,\n maxParentDepth: 10,\n maxChildDepth: 5,\n });\n\n dispatch({\n type: 'SET_HOVERED',\n payload: { element: target, name: details.name, details }\n });\n };\n\n document.addEventListener('mouseover', handleMouseOver);\n \n return () => {\n document.removeEventListener('mouseover', handleMouseOver);\n };\n }, [mode, isLocked, dispatch]);\n\n // Global ESC key handler for inspecting mode - handles ESC when no element is selected\n useEffect(() => {\n if (mode !== 'inspecting') return;\n\n const handleGlobalEsc = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && !isLocked) {\n e.preventDefault();\n e.stopPropagation();\n // No highlight block selected, disable mode\n dispatch({ type: 'SET_MODE', payload: 'disabled' });\n }\n };\n\n document.addEventListener('keydown', handleGlobalEsc);\n return () => document.removeEventListener('keydown', handleGlobalEsc);\n }, [mode, isLocked, dispatch]);\n\n // Reset all state when mode changes to disabled\n useEffect(() => {\n if (mode === 'disabled') {\n setRect(null);\n setShowInput(false);\n setIsLocked(false);\n setMousePos({ x: 0, y: 0 });\n setLockedPos({ x: 0, y: 0 });\n setIsCapturing(false);\n setCaptureSuccess(false);\n setShowDetails(false);\n\n // Clear hovered element in store\n dispatch({ type: 'RESET_HOVER' });\n }\n }, [mode, dispatch]);\n\n useEffect(() => {\n if (!hoveredElement) {\n setRect(null);\n setShowInput(false);\n setIsLocked(false);\n return;\n }\n\n const updateRect = () => {\n const newRect = hoveredElement.getBoundingClientRect();\n setRect(newRect);\n };\n\n updateRect();\n\n const handleMouseMove = (e: MouseEvent) => {\n // Only update mouse position if not locked\n if (!isLocked) {\n setMousePos({ x: e.clientX, y: e.clientY });\n }\n };\n\n // Click handler to lock/unlock tooltip\n const handleClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n \n // Ignore clicks on the tooltip buttons themselves\n if (target.closest('[data-annotation-tooltip]')) {\n return;\n }\n \n // Ignore clicks on annotation input\n if (target.closest('[data-ai-annotation-ui]')) {\n return;\n }\n\n if (!isLocked) {\n // Lock the tooltip at current position\n e.preventDefault();\n e.stopPropagation();\n setIsLocked(true);\n setLockedPos({ x: e.clientX, y: e.clientY });\n } else {\n // Unlock and go back to following mode\n setIsLocked(false);\n }\n };\n\n // ESC key handler to unlock tooltip when locked\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isLocked) {\n e.preventDefault();\n e.stopPropagation();\n setIsLocked(false);\n setShowInput(false);\n }\n };\n\n window.addEventListener(\"scroll\", updateRect, true);\n window.addEventListener(\"resize\", updateRect);\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"click\", handleClick, true);\n document.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n window.removeEventListener(\"scroll\", updateRect, true);\n window.removeEventListener(\"resize\", updateRect);\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"click\", handleClick, true);\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [hoveredElement, isLocked]);\n\n const handleScreenshot = async (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!hoveredElement || isCapturing) return;\n\n setIsCapturing(true);\n try {\n const result = await captureScreenshot(hoveredElement, {\n copyToClipboard: true,\n scale: 2,\n });\n\n if (result.success) {\n setCaptureSuccess(true);\n setTimeout(() => {\n setCaptureSuccess(false);\n setIsLocked(false); // Unlock after successful capture\n }, 1500);\n }\n } catch (error) {\n console.error(\"Screenshot failed:\", error);\n } finally {\n setIsCapturing(false);\n }\n };\n\n const handleAddClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n setShowInput(true);\n setShowDetails(false);\n setIsLocked(false); // Unlock when showing input\n };\n\n const handleDetailsClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n setShowDetails(!showDetails);\n };\n\n const handleCloseInput = () => {\n setShowInput(false);\n };\n\n if (mode !== \"inspecting\" || !rect) return null;\n\n // Use locked position or current mouse position\n const tooltipX = isLocked ? lockedPos.x : mousePos.x;\n const tooltipY = isLocked ? lockedPos.y : mousePos.y;\n\n return (\n <>\n {/* Highlight overlay */}\n <div\n data-annotation-ui=\"true\"\n style={{\n position: \"fixed\",\n left: rect.left - 2,\n top: rect.top - 2,\n width: rect.width + 4,\n height: rect.height + 4,\n border: \"2px solid #3b82f6\",\n borderRadius: 4,\n pointerEvents: \"none\",\n zIndex: 99998,\n backgroundColor: \"rgba(59, 130, 246, 0.1)\",\n }}\n />\n\n {/* Component name label */}\n {componentName && (\n <div\n data-annotation-ui=\"true\"\n style={{\n position: \"fixed\",\n left: rect.left,\n top: rect.top - 24,\n backgroundColor: \"#3b82f6\",\n color: \"white\",\n padding: \"2px 8px\",\n borderRadius: 4,\n fontSize: 12,\n fontFamily: \"monospace\",\n pointerEvents: \"none\",\n zIndex: 99999,\n }}\n >\n {componentName}\n </div>\n )}\n\n {/* Floating tooltip following mouse */}\n {!showInput && (\n <div\n data-annotation-ui=\"true\"\n data-annotation-tooltip=\"true\"\n style={{\n position: \"fixed\",\n left: tooltipX + 16,\n top: tooltipY + 16,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n padding: 6,\n backgroundColor: isLocked ? \"rgba(0, 0, 0, 0.95)\" : \"rgba(0, 0, 0, 0.85)\",\n borderRadius: 8,\n boxShadow: isLocked\n ? \"0 4px 12px rgba(0, 0, 0, 0.4), 0 0 0 2px rgba(59, 130, 246, 0.5)\"\n : \"0 4px 12px rgba(0, 0, 0, 0.3)\",\n zIndex: 100000,\n pointerEvents: isLocked ? \"auto\" : \"none\",\n backdropFilter: \"blur(8px)\",\n transition: isLocked ? \"none\" : \"left 0.05s ease-out, top 0.05s ease-out\",\n maxWidth: showDetails ? 400 : \"auto\",\n }}\n >\n {/* Button row */}\n <div style={{ display: \"flex\", gap: 6 }}>\n {/* Screenshot button */}\n <button\n onClick={handleScreenshot}\n disabled={isCapturing || !isLocked}\n style={{\n width: 32,\n height: 32,\n borderRadius: 6,\n border: \"none\",\n backgroundColor: captureSuccess\n ? \"#22c55e\"\n : isCapturing\n ? \"#6b7280\"\n : \"#8b5cf6\",\n color: \"white\",\n cursor: isLocked ? \"pointer\" : \"default\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 16,\n transition: \"all 0.15s ease\",\n opacity: isLocked ? 1 : 0.7,\n }}\n title=\"Capture screenshot\"\n >\n {captureSuccess ? \"\u2713\" : isCapturing ? \"...\" : \"\uD83D\uDCF7\"}\n </button>\n\n {/* Add annotation button */}\n <button\n onClick={handleAddClick}\n disabled={!isLocked}\n style={{\n width: 32,\n height: 32,\n borderRadius: 6,\n border: \"none\",\n backgroundColor: \"#3b82f6\",\n color: \"white\",\n cursor: isLocked ? \"pointer\" : \"default\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 18,\n fontWeight: \"bold\",\n transition: \"all 0.15s ease\",\n opacity: isLocked ? 1 : 0.7,\n }}\n title=\"Add annotation\"\n >\n +\n </button>\n\n {/* Details toggle button */}\n <button\n onClick={handleDetailsClick}\n disabled={!isLocked}\n style={{\n width: 32,\n height: 32,\n borderRadius: 6,\n border: showDetails ? \"2px solid #10b981\" : \"none\",\n backgroundColor: showDetails ? \"#10b981\" : \"#6b7280\",\n color: \"white\",\n cursor: isLocked ? \"pointer\" : \"default\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 14,\n transition: \"all 0.15s ease\",\n opacity: isLocked ? 1 : 0.7,\n }}\n title=\"Show component details\"\n >\n \u24D8\n </button>\n </div>\n\n {/* Lock hint */}\n {!isLocked && (\n <div\n style={{\n position: \"absolute\",\n bottom: -20,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n fontSize: 10,\n color: \"rgba(255, 255, 255, 0.7)\",\n whiteSpace: \"nowrap\",\n pointerEvents: \"none\",\n }}\n >\n Click to lock\n </div>\n )}\n\n {/* Component details panel */}\n {showDetails && componentDetails && (\n <div\n style={{\n padding: \"8px 4px 4px 4px\",\n borderTop: \"1px solid rgba(255, 255, 255, 0.2)\",\n fontSize: 11,\n color: \"rgba(255, 255, 255, 0.9)\",\n maxHeight: 300,\n overflowY: \"auto\",\n }}\n >\n {/* Element info */}\n <div style={{ marginBottom: 8 }}>\n <div style={{ color: \"#60a5fa\", fontWeight: \"bold\", marginBottom: 4 }}>\n Element\n </div>\n <div style={{ fontFamily: \"monospace\", color: \"#f59e0b\" }}>\n <{componentDetails.elementInfo.tagName}\n {componentDetails.elementInfo.id && ` id=\"${componentDetails.elementInfo.id}\"`}\n {componentDetails.elementInfo.className && ` class=\"${componentDetails.elementInfo.className}\"`}\n >\n </div>\n {componentDetails.elementInfo.textContent && (\n <div style={{ color: \"rgba(255, 255, 255, 0.6)\", marginTop: 2, fontStyle: \"italic\" }}>\n \"{componentDetails.elementInfo.textContent}\"\n </div>\n )}\n <div style={{ color: \"rgba(255, 255, 255, 0.5)\", marginTop: 2 }}>\n {componentDetails.elementInfo.childElementCount} child element(s)\n </div>\n </div>\n\n {/* Parent hierarchy */}\n {componentDetails.parentHierarchy.length > 0 && (\n <div style={{ marginBottom: 8 }}>\n <div style={{ color: \"#60a5fa\", fontWeight: \"bold\", marginBottom: 4 }}>\n Parent Components\n </div>\n <div style={{ fontFamily: \"monospace\" }}>\n {componentDetails.parentHierarchy.slice(0, 5).map((parent, i) => (\n <div key={i} style={{ color: \"#a78bfa\", paddingLeft: i * 8 }}>\n {\"\u2190 \"}{parent}\n </div>\n ))}\n {componentDetails.parentHierarchy.length > 5 && (\n <div style={{ color: \"rgba(255, 255, 255, 0.5)\" }}>\n ... and {componentDetails.parentHierarchy.length - 5} more\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Child components */}\n {componentDetails.childComponents.length > 0 && (\n <div style={{ marginBottom: 8 }}>\n <div style={{ color: \"#60a5fa\", fontWeight: \"bold\", marginBottom: 4 }}>\n Child Components ({componentDetails.childComponents.length})\n </div>\n <div style={{ fontFamily: \"monospace\" }}>\n {componentDetails.childComponents.slice(0, 10).map((child, i) => (\n <div\n key={i}\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n gap: 8,\n color: \"#34d399\",\n }}\n >\n <span>\n {\"\u2192 \"}{child.name}\n {child.hasChildren && \" \u25BE\"}\n </span>\n {child.count > 1 && (\n <span style={{ color: \"rgba(255, 255, 255, 0.5)\" }}>\n \u00D7{child.count}\n </span>\n )}\n </div>\n ))}\n {componentDetails.childComponents.length > 10 && (\n <div style={{ color: \"rgba(255, 255, 255, 0.5)\" }}>\n ... and {componentDetails.childComponents.length - 10} more\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Important attributes */}\n {Object.keys(componentDetails.elementInfo.attributes).length > 0 && (\n <div>\n <div style={{ color: \"#60a5fa\", fontWeight: \"bold\", marginBottom: 4 }}>\n Attributes\n </div>\n <div style={{ fontFamily: \"monospace\" }}>\n {Object.entries(componentDetails.elementInfo.attributes).map(([key, value]) => (\n <div key={key} style={{ color: \"#fbbf24\" }}>\n {key}=\"{value}\"\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* Annotation input */}\n {showInput && (\n <AnnotationInput\n onClose={handleCloseInput}\n componentName={componentName || \"Unknown\"}\n componentDetails={componentDetails}\n />\n )}\n </>\n );\n}\n", "import React, { useState, useEffect } from 'react';\nimport { useAiAnnotation } from '../store';\nimport type { ComponentDetails } from '../store';\nimport { X } from 'lucide-react';\n\ninterface AnnotationInputProps {\n onClose: () => void;\n componentName: string;\n componentDetails?: ComponentDetails;\n}\n\n/**\n * Format component details into a readable text block for the annotation\n */\nfunction formatComponentDetails(details: ComponentDetails): string {\n const lines: string[] = [];\n\n // Element info\n lines.push('## Element');\n let elementStr = `<${details.elementInfo.tagName}`;\n if (details.elementInfo.id) elementStr += ` id=\"${details.elementInfo.id}\"`;\n if (details.elementInfo.className) elementStr += ` class=\"${details.elementInfo.className}\"`;\n elementStr += '>';\n lines.push(elementStr);\n\n if (details.elementInfo.textContent) {\n lines.push(`Text: \"${details.elementInfo.textContent}\"`);\n }\n lines.push(`Child elements: ${details.elementInfo.childElementCount}`);\n\n // Attributes\n if (Object.keys(details.elementInfo.attributes).length > 0) {\n lines.push('');\n lines.push('## Attributes');\n for (const [key, value] of Object.entries(details.elementInfo.attributes)) {\n lines.push(`${key}=\"${value}\"`);\n }\n }\n\n // Parent hierarchy\n if (details.parentHierarchy.length > 0) {\n lines.push('');\n lines.push('## Parent Components');\n lines.push(details.parentHierarchy.join(' \u2192 '));\n }\n\n // Child components\n if (details.childComponents.length > 0) {\n lines.push('');\n lines.push(`## Child Components (${details.childComponents.length})`);\n const childLines = details.childComponents.slice(0, 15).map(child => {\n let str = child.name;\n if (child.count > 1) str += ` \u00D7${child.count}`;\n if (child.hasChildren) str += ' (has children)';\n return str;\n });\n lines.push(childLines.join(', '));\n if (details.childComponents.length > 15) {\n lines.push(`... and ${details.childComponents.length - 15} more`);\n }\n }\n\n return lines.join('\\n');\n}\n\nexport function AnnotationInput({ onClose, componentName, componentDetails }: AnnotationInputProps) {\n const { dispatch } = useAiAnnotation();\n const [note, setNote] = useState('');\n const [includeDetails, setIncludeDetails] = useState(true);\n const [isVisible, setIsVisible] = useState(false);\n const [isClosing, setIsClosing] = useState(false);\n\n // Trigger entrance animation on mount\n useEffect(() => {\n requestAnimationFrame(() => {\n setIsVisible(true);\n });\n }, []);\n\n // ESC key to close\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n handleClose();\n }\n };\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, []);\n\n // Handle close with exit animation\n const handleClose = () => {\n setIsClosing(true);\n setTimeout(() => {\n onClose();\n }, 200);\n };\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (!note.trim()) return;\n\n // Build the final annotation text with component details if enabled\n let finalNote = note.trim();\n if (includeDetails && componentDetails) {\n const detailsText = formatComponentDetails(componentDetails);\n finalNote = `${note.trim()}\\n\\n---\\n${detailsText}`;\n }\n\n dispatch({\n type: 'ADD_ANNOTATION',\n payload: {\n id: Date.now().toString(),\n componentName,\n note: finalNote,\n timestamp: Date.now(),\n details: componentDetails,\n },\n });\n handleClose();\n };\n\n // Preview of what will be included\n const detailsPreview = componentDetails ? (\n <div style={{\n fontSize: '0.75rem',\n color: 'rgba(255, 255, 255, 0.6)',\n marginTop: '4px',\n }}>\n {componentDetails.parentHierarchy.length > 0 && (\n <div>Parents: {componentDetails.parentHierarchy.slice(0, 3).join(' \u2192 ')}{componentDetails.parentHierarchy.length > 3 ? '...' : ''}</div>\n )}\n {componentDetails.childComponents.length > 0 && (\n <div>Children: {componentDetails.childComponents.slice(0, 3).map(c => c.name).join(', ')}{componentDetails.childComponents.length > 3 ? '...' : ''}</div>\n )}\n <div>Element: <{componentDetails.elementInfo.tagName}> ({componentDetails.elementInfo.childElementCount} children)</div>\n </div>\n ) : null;\n\n return (\n <div\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: isVisible && !isClosing ? 'rgba(0,0,0,0.5)' : 'rgba(0,0,0,0)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 10000,\n transition: 'background-color 0.2s ease',\n }}\n data-ai-annotation-ui\n onClick={handleClose}\n >\n <div\n style={{\n backgroundColor: '#1e1e1e',\n color: '#e5e7eb',\n padding: '20px',\n borderRadius: '8px',\n width: '500px',\n maxWidth: '90%',\n maxHeight: '80vh',\n overflow: 'auto',\n boxShadow: '0 4px 6px rgba(0,0,0,0.3)',\n transform: isVisible && !isClosing ? 'scale(1) translateY(0)' : 'scale(0.95) translateY(-10px)',\n opacity: isVisible && !isClosing ? 1 : 0,\n transition: 'transform 0.2s ease, opacity 0.2s ease',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: '16px' }}>\n <h3 style={{ margin: 0, fontSize: '1.1rem' }}>Add Annotation</h3>\n <button onClick={handleClose} style={{ background: 'none', border: 'none', color: 'inherit', cursor: 'pointer' }}>\n <X size={20} />\n </button>\n </div>\n\n <div style={{ marginBottom: '12px', fontSize: '0.9rem', opacity: 0.8 }}>\n Component: <strong>{componentName}</strong>\n </div>\n\n <form onSubmit={handleSubmit}>\n <textarea\n value={note}\n onChange={(e) => setNote(e.target.value)}\n placeholder=\"Describe what this component does or what changes you need...\"\n style={{\n width: '100%',\n height: '120px',\n padding: '8px',\n borderRadius: '4px',\n backgroundColor: '#2d2d2d',\n border: '1px solid #404040',\n color: 'white',\n marginBottom: '12px',\n resize: 'vertical',\n fontFamily: 'inherit',\n }}\n autoFocus\n />\n\n {/* Include details checkbox */}\n {componentDetails && (\n <div style={{ marginBottom: '16px' }}>\n <label\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: '8px',\n cursor: 'pointer',\n fontSize: '0.85rem',\n }}\n >\n <input\n type=\"checkbox\"\n checked={includeDetails}\n onChange={(e) => setIncludeDetails(e.target.checked)}\n style={{ marginTop: '2px' }}\n />\n <div>\n <div style={{ color: '#10b981', fontWeight: 500 }}>\n Include component details in annotation\n </div>\n {includeDetails && detailsPreview}\n </div>\n </label>\n </div>\n )}\n\n <div style={{ display: 'flex', justifyContent: 'flex-end', gap: '8px' }}>\n <button\n type=\"button\"\n onClick={handleClose}\n style={{\n padding: '6px 12px',\n borderRadius: '4px',\n backgroundColor: 'transparent',\n border: '1px solid #404040',\n color: 'white',\n cursor: 'pointer',\n }}\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n style={{\n padding: '6px 12px',\n borderRadius: '4px',\n backgroundColor: '#3b82f6',\n border: 'none',\n color: 'white',\n cursor: 'pointer',\n }}\n >\n Save Annotation\n </button>\n </div>\n </form>\n </div>\n </div>\n );\n}\n", "import html2canvas from 'html2canvas';\n\nexport interface ScreenshotOptions {\n /** Scale factor for higher resolution (default: 2) */\n scale?: number;\n /** Background color (default: transparent) */\n backgroundColor?: string | null;\n /** Whether to copy to clipboard (default: true) */\n copyToClipboard?: boolean;\n /** Whether to download as file (default: false) */\n download?: boolean;\n /** Filename when downloading (default: 'screenshot.png') */\n filename?: string;\n}\n\nexport interface ScreenshotResult {\n success: boolean;\n dataUrl?: string;\n blob?: Blob;\n error?: string;\n}\n\n// Tauri internals type for checking environment\ndeclare global {\n interface Window {\n __TAURI_INTERNALS__?: unknown;\n __TAURI_CLIPBOARD_WRITE_IMAGE__?: (bytes: Uint8Array) => Promise<void>;\n }\n}\n\n/**\n * Check if running in Tauri environment\n */\nfunction isTauriEnv(): boolean {\n return typeof window !== 'undefined' && '__TAURI_INTERNALS__' in window;\n}\n\n/**\n * Copy image to clipboard using Tauri's clipboard plugin\n * Uses a global function injected by the main app to avoid bundler issues\n */\nasync function copyToClipboardTauri(blob: Blob): Promise<void> {\n // Check if the main app has injected the clipboard function\n if (typeof window.__TAURI_CLIPBOARD_WRITE_IMAGE__ === 'function') {\n const arrayBuffer = await blob.arrayBuffer();\n const bytes = new Uint8Array(arrayBuffer);\n await window.__TAURI_CLIPBOARD_WRITE_IMAGE__(bytes);\n return;\n }\n \n // Fallback: throw error so browser clipboard API is tried\n throw new Error('Tauri clipboard function not available');\n}\n\n/**\n * Copy image to clipboard using browser's Clipboard API\n */\nasync function copyToClipboardBrowser(blob: Blob, dataUrl: string): Promise<void> {\n try {\n await navigator.clipboard.write([\n new ClipboardItem({\n 'image/png': blob,\n }),\n ]);\n } catch (clipboardError) {\n console.warn('Failed to copy to clipboard:', clipboardError);\n // Fallback: try copying as text (data URL)\n try {\n await navigator.clipboard.writeText(dataUrl);\n } catch {\n // Ignore fallback failure\n }\n }\n}\n\n/**\n * Captures a screenshot of the given HTML element\n */\nexport async function captureScreenshot(\n element: HTMLElement,\n options: ScreenshotOptions = {}\n): Promise<ScreenshotResult> {\n const {\n scale = 2,\n backgroundColor = null,\n copyToClipboard = true,\n download = false,\n filename = 'screenshot.png',\n } = options;\n\n try {\n // Capture the element\n const canvas = await html2canvas(element, {\n scale,\n backgroundColor,\n logging: false,\n useCORS: true,\n allowTaint: true,\n // Capture just the element\n x: window.scrollX,\n y: window.scrollY,\n scrollX: -window.scrollX,\n scrollY: -window.scrollY,\n windowWidth: document.documentElement.scrollWidth,\n windowHeight: document.documentElement.scrollHeight,\n // Ignore annotation UI elements\n ignoreElements: (el) => {\n return el.hasAttribute('data-ai-annotation-ui');\n },\n });\n\n // Convert to blob\n const blob = await new Promise<Blob>((resolve, reject) => {\n canvas.toBlob((b) => {\n if (b) resolve(b);\n else reject(new Error('Failed to create blob'));\n }, 'image/png');\n });\n\n const dataUrl = canvas.toDataURL('image/png');\n\n // Copy to clipboard if requested\n if (copyToClipboard) {\n if (isTauriEnv()) {\n try {\n // Use Tauri's clipboard plugin for proper image clipboard support\n await copyToClipboardTauri(blob);\n } catch (tauriErr) {\n console.warn('Tauri clipboard failed, falling back to browser API:', tauriErr);\n // Fallback to browser's Clipboard API\n await copyToClipboardBrowser(blob, dataUrl);\n }\n } else {\n // Fallback to browser's Clipboard API\n await copyToClipboardBrowser(blob, dataUrl);\n }\n }\n\n // Download if requested\n if (download) {\n const link = document.createElement('a');\n link.href = dataUrl;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n\n return {\n success: true,\n dataUrl,\n blob,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n console.error('Screenshot capture failed:', message);\n return {\n success: false,\n error: message,\n };\n }\n}\n", "\nexport function getReactFiber(dom: HTMLElement): any {\n const key = Object.keys(dom).find((key) =>\n key.startsWith(\"__reactFiber$\")\n );\n // @ts-ignore\n return key ? dom[key] : null;\n}\n\nexport function getComponentDisplayName(fiber: any): string {\n let curr = fiber;\n while (curr) {\n const name = curr.type?.displayName || curr.type?.name;\n // Filter out internal components if needed, but for now take the first named one\n // Also skip styled-components or basic html tags if we want \"Component\" names\n if (name && typeof curr.type === 'function') return name;\n curr = curr.return;\n }\n return \"Unknown\";\n}\n\nexport function getElementFromFiber(fiber: any): HTMLElement | null {\n let curr = fiber;\n while (curr) {\n if (curr.stateNode instanceof HTMLElement) {\n return curr.stateNode;\n }\n curr = curr.child;\n }\n return null;\n}\n\n/**\n * Component info with hierarchy details\n */\nexport interface ComponentDetails {\n name: string;\n parentHierarchy: string[];\n childComponents: ChildComponentInfo[];\n elementInfo: ElementInfo;\n props?: Record<string, any>;\n}\n\nexport interface ChildComponentInfo {\n name: string;\n depth: number;\n count: number;\n hasChildren: boolean;\n}\n\nexport interface ElementInfo {\n tagName: string;\n id?: string;\n className?: string;\n attributes: Record<string, string>;\n childElementCount: number;\n textContent?: string;\n}\n\n/**\n * Get parent component hierarchy (from current component up to root)\n */\nexport function getParentHierarchy(fiber: any, maxDepth: number = 10): string[] {\n const hierarchy: string[] = [];\n let curr = fiber?.return;\n let depth = 0;\n\n while (curr && depth < maxDepth) {\n const name = curr.type?.displayName || curr.type?.name;\n if (name && typeof curr.type === 'function') {\n // Skip internal React components (starting with uppercase but containing $)\n if (!name.includes('$') && !name.startsWith('_')) {\n hierarchy.push(name);\n }\n }\n curr = curr.return;\n depth++;\n }\n\n return hierarchy;\n}\n\n/**\n * Get child components from a fiber node\n */\nexport function getChildComponents(fiber: any, maxDepth: number = 5): ChildComponentInfo[] {\n const children: Map<string, { count: number; depth: number; hasChildren: boolean }> = new Map();\n\n function traverse(node: any, depth: number) {\n if (!node || depth > maxDepth) return;\n\n const name = node.type?.displayName || node.type?.name;\n if (name && typeof node.type === 'function' && !name.includes('$') && !name.startsWith('_')) {\n const existing = children.get(name);\n const hasChildComponents = checkHasChildComponents(node.child);\n\n if (existing) {\n existing.count++;\n // Keep the shallowest depth\n if (depth < existing.depth) {\n existing.depth = depth;\n }\n existing.hasChildren = existing.hasChildren || hasChildComponents;\n } else {\n children.set(name, { count: 1, depth, hasChildren: hasChildComponents });\n }\n }\n\n // Traverse siblings and children\n if (node.child) traverse(node.child, depth + 1);\n if (node.sibling) traverse(node.sibling, depth);\n }\n\n // Start from the fiber's child\n if (fiber?.child) {\n traverse(fiber.child, 1);\n }\n\n return Array.from(children.entries()).map(([name, info]) => ({\n name,\n depth: info.depth,\n count: info.count,\n hasChildren: info.hasChildren,\n })).sort((a, b) => a.depth - b.depth);\n}\n\n/**\n * Check if a fiber node has child components\n */\nfunction checkHasChildComponents(fiber: any, maxDepth: number = 3): boolean {\n if (!fiber || maxDepth <= 0) return false;\n\n const name = fiber.type?.displayName || fiber.type?.name;\n if (name && typeof fiber.type === 'function' && !name.includes('$')) {\n return true;\n }\n\n if (fiber.child && checkHasChildComponents(fiber.child, maxDepth - 1)) return true;\n if (fiber.sibling && checkHasChildComponents(fiber.sibling, maxDepth - 1)) return true;\n\n return false;\n}\n\n/**\n * Get DOM element information\n */\nexport function getElementInfo(element: HTMLElement): ElementInfo {\n const importantAttributes = ['data-testid', 'role', 'aria-label', 'type', 'name', 'href', 'src'];\n const attributes: Record<string, string> = {};\n\n importantAttributes.forEach(attr => {\n const value = element.getAttribute(attr);\n if (value) {\n attributes[attr] = value;\n }\n });\n\n // Get text content (truncated)\n let textContent: string | undefined;\n const directText = Array.from(element.childNodes)\n .filter(node => node.nodeType === Node.TEXT_NODE)\n .map(node => node.textContent?.trim())\n .filter(Boolean)\n .join(' ');\n\n if (directText) {\n textContent = directText.length > 100 ? directText.substring(0, 100) + '...' : directText;\n }\n\n return {\n tagName: element.tagName.toLowerCase(),\n id: element.id || undefined,\n className: element.className && typeof element.className === 'string'\n ? element.className.split(' ').slice(0, 5).join(' ') + (element.className.split(' ').length > 5 ? '...' : '')\n : undefined,\n attributes,\n childElementCount: element.childElementCount,\n textContent,\n };\n}\n\n/**\n * Get component props (filtered for safety - removes functions and large objects)\n */\nexport function getComponentProps(fiber: any, maxProps: number = 10): Record<string, any> | undefined {\n if (!fiber?.memoizedProps) return undefined;\n\n const props = fiber.memoizedProps;\n const safeProps: Record<string, any> = {};\n let count = 0;\n\n for (const key of Object.keys(props)) {\n if (count >= maxProps) {\n safeProps['...'] = `${Object.keys(props).length - maxProps} more props`;\n break;\n }\n\n // Skip children and function props\n if (key === 'children') continue;\n\n const value = props[key];\n const type = typeof value;\n\n if (type === 'function') {\n safeProps[key] = '[Function]';\n } else if (type === 'object' && value !== null) {\n if (Array.isArray(value)) {\n safeProps[key] = `[Array(${value.length})]`;\n } else if (value.$$typeof) {\n // React element\n safeProps[key] = '[ReactElement]';\n } else {\n try {\n const json = JSON.stringify(value);\n safeProps[key] = json.length > 100 ? '[Object]' : value;\n } catch {\n safeProps[key] = '[Object]';\n }\n }\n } else {\n safeProps[key] = value;\n }\n count++;\n }\n\n return Object.keys(safeProps).length > 0 ? safeProps : undefined;\n}\n\n/**\n * Get comprehensive component details for the selected element\n */\nexport function getComponentDetails(element: HTMLElement, options?: {\n includeProps?: boolean;\n maxParentDepth?: number;\n maxChildDepth?: number;\n}): ComponentDetails {\n const { includeProps = false, maxParentDepth = 10, maxChildDepth = 5 } = options || {};\n\n const fiber = getReactFiber(element);\n const name = fiber ? getComponentDisplayName(fiber) : 'Unknown';\n\n // Find the actual component fiber (not DOM node fiber)\n let componentFiber = fiber;\n while (componentFiber && typeof componentFiber.type !== 'function') {\n componentFiber = componentFiber.return;\n }\n\n return {\n name,\n parentHierarchy: getParentHierarchy(componentFiber, maxParentDepth),\n childComponents: getChildComponents(componentFiber, maxChildDepth),\n elementInfo: getElementInfo(element),\n props: includeProps ? getComponentProps(componentFiber) : undefined,\n };\n}\n", "import React, { useState } from 'react';\nimport { useAiAnnotation } from '../store';\nimport { X, Trash2, Trash, ChevronDown, ChevronRight } from 'lucide-react';\n\nexport function AnnotationList() {\n const { state, dispatch } = useAiAnnotation();\n const [expandedId, setExpandedId] = useState<string | null>(null);\n\n if (!state.showList) return null;\n\n const toggleExpand = (id: string) => {\n setExpandedId(expandedId === id ? null : id);\n };\n\n return (\n <div\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0,0,0,0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 10000,\n }}\n data-ai-annotation-ui\n onClick={() => dispatch({ type: 'TOGGLE_LIST' })}\n >\n <div\n style={{\n backgroundColor: '#1e1e1e',\n color: '#e5e7eb',\n padding: '20px',\n borderRadius: '8px',\n width: '600px',\n maxWidth: '90%',\n maxHeight: '80vh',\n display: 'flex',\n flexDirection: 'column',\n boxShadow: '0 4px 6px rgba(0,0,0,0.3)',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: '16px', alignItems: 'center' }}>\n <h3 style={{ margin: 0 }}>Annotations ({state.annotations.length})</h3>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n {state.annotations.length > 0 && (\n <button\n onClick={() => dispatch({ type: 'CLEAR_ALL_ANNOTATIONS' })}\n style={{\n background: '#ef4444',\n border: 'none',\n color: 'white',\n cursor: 'pointer',\n padding: '6px 12px',\n borderRadius: '4px',\n fontSize: '12px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n title=\"Clear all annotations\"\n >\n <Trash size={14} />\n Clear All\n </button>\n )}\n <button\n onClick={() => dispatch({ type: 'TOGGLE_LIST' })}\n style={{ background: 'none', border: 'none', color: 'inherit', cursor: 'pointer' }}\n >\n <X size={20} />\n </button>\n </div>\n </div>\n\n <div style={{ overflowY: 'auto', flex: 1, display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {state.annotations.length === 0 ? (\n <p style={{ textAlign: 'center', opacity: 0.6, padding: '20px' }}>No annotations yet.</p>\n ) : (\n state.annotations.map((ann) => {\n const isExpanded = expandedId === ann.id;\n const hasDetails = !!ann.details;\n\n return (\n <div\n key={ann.id}\n style={{\n backgroundColor: '#2d2d2d',\n borderRadius: '4px',\n overflow: 'hidden',\n }}\n >\n {/* Main annotation row */}\n <div\n style={{\n padding: '12px',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n gap: '12px',\n }}\n >\n <div style={{ flex: 1 }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', marginBottom: '4px' }}>\n {hasDetails && (\n <button\n onClick={() => toggleExpand(ann.id)}\n style={{\n background: 'none',\n border: 'none',\n color: '#60a5fa',\n cursor: 'pointer',\n padding: 0,\n display: 'flex',\n alignItems: 'center',\n }}\n >\n {isExpanded ? <ChevronDown size={16} /> : <ChevronRight size={16} />}\n </button>\n )}\n <div style={{ fontWeight: 'bold', fontSize: '0.9rem', color: '#60a5fa' }}>\n {ann.componentName}\n </div>\n </div>\n <div style={{ fontSize: '0.9rem', whiteSpace: 'pre-wrap', marginLeft: hasDetails ? 24 : 0 }}>\n {ann.note}\n </div>\n </div>\n <button\n onClick={() => dispatch({ type: 'REMOVE_ANNOTATION', payload: ann.id })}\n style={{\n background: 'none',\n border: 'none',\n color: '#ef4444',\n cursor: 'pointer',\n padding: '4px',\n flexShrink: 0,\n }}\n title=\"Remove annotation\"\n >\n <Trash2 size={16} />\n </button>\n </div>\n\n {/* Expanded details */}\n {isExpanded && ann.details && (\n <div\n style={{\n padding: '12px',\n paddingTop: 0,\n borderTop: '1px solid #404040',\n marginTop: '8px',\n fontSize: '0.8rem',\n }}\n >\n {/* Element info */}\n <div style={{ marginBottom: '12px' }}>\n <div style={{ color: '#10b981', fontWeight: 'bold', marginBottom: '4px' }}>\n Element\n </div>\n <div style={{ fontFamily: 'monospace', color: '#f59e0b', fontSize: '0.75rem' }}>\n <{ann.details.elementInfo.tagName}\n {ann.details.elementInfo.id && ` id=\"${ann.details.elementInfo.id}\"`}\n {ann.details.elementInfo.className && ` class=\"${ann.details.elementInfo.className}\"`}\n >\n </div>\n {ann.details.elementInfo.textContent && (\n <div style={{ color: 'rgba(255, 255, 255, 0.6)', marginTop: '4px', fontStyle: 'italic' }}>\n Text: \"{ann.details.elementInfo.textContent}\"\n </div>\n )}\n </div>\n\n {/* Parent hierarchy */}\n {ann.details.parentHierarchy.length > 0 && (\n <div style={{ marginBottom: '12px' }}>\n <div style={{ color: '#10b981', fontWeight: 'bold', marginBottom: '4px' }}>\n Parent Components\n </div>\n <div style={{ fontFamily: 'monospace', fontSize: '0.75rem' }}>\n {ann.details.parentHierarchy.map((parent, i) => (\n <span key={i} style={{ color: '#a78bfa' }}>\n {i > 0 && ' \u2192 '}\n {parent}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Child components */}\n {ann.details.childComponents.length > 0 && (\n <div style={{ marginBottom: '12px' }}>\n <div style={{ color: '#10b981', fontWeight: 'bold', marginBottom: '4px' }}>\n Child Components ({ann.details.childComponents.length})\n </div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '6px' }}>\n {ann.details.childComponents.map((child, i) => (\n <span\n key={i}\n style={{\n backgroundColor: '#374151',\n padding: '2px 8px',\n borderRadius: '4px',\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n color: '#34d399',\n }}\n >\n {child.name}\n {child.count > 1 && ` \u00D7${child.count}`}\n {child.hasChildren && ' \u25BE'}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Attributes */}\n {Object.keys(ann.details.elementInfo.attributes).length > 0 && (\n <div>\n <div style={{ color: '#10b981', fontWeight: 'bold', marginBottom: '4px' }}>\n Attributes\n </div>\n <div style={{ fontFamily: 'monospace', fontSize: '0.75rem' }}>\n {Object.entries(ann.details.elementInfo.attributes).map(([key, value]) => (\n <div key={key} style={{ color: '#fbbf24' }}>\n {key}=\"{value}\"\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n })\n )}\n </div>\n </div>\n </div>\n );\n}\n", "/**\n * Platform detection utilities for cross-platform support\n */\n\n// Check if we're running in a web environment\nexport const isWeb = typeof document !== 'undefined' && typeof window !== 'undefined';\n\n// Check if we're running in React Native\n// We check for the absence of DOM and presence of native-specific globals\nexport const isNative = !isWeb && typeof global !== 'undefined';\n\n// Get the current platform\nexport type PlatformType = 'web' | 'ios' | 'android' | 'native';\n\nexport function getPlatform(): PlatformType {\n if (isWeb) return 'web';\n \n // In React Native, we need to dynamically check Platform\n try {\n // This will only work in React Native environment\n const { Platform } = require('react-native');\n if (Platform.OS === 'ios') return 'ios';\n if (Platform.OS === 'android') return 'android';\n return 'native';\n } catch {\n return 'native';\n }\n}\n\n// Check if running in Tauri environment (web only)\nexport function isTauriEnv(): boolean {\n return isWeb && typeof window !== 'undefined' && '__TAURI_INTERNALS__' in window;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["
|
|
3
|
+
"sources": ["../../src/index.tsx", "../../src/store.tsx", "../../src/components/Toolbar.tsx", "../../src/components/Draggable.tsx", "../../src/components/Highlighter.tsx", "../../src/components/AnnotationInput.tsx", "../../src/utils/screenshot.ts", "../../src/utils/fiber.ts", "../../src/components/AnnotationList.tsx", "../../src/components/ErrorBoundary.tsx", "../../src/utils/platform.ts"],
|
|
4
|
+
"sourcesContent": ["import React from 'react';\nimport { AgentAnnotationProvider as Provider } from './store';\nimport { Toolbar } from './components/Toolbar';\n\nexport interface AgentAnnotationProviderProps {\n children: React.ReactNode;\n}\n\n/**\n * Web Agent Annotation Provider\n * Wraps your app to provide annotation functionality\n */\nexport function AgentAnnotationProvider({ children }: AgentAnnotationProviderProps) {\n return (\n <Provider>\n {children}\n <Toolbar />\n </Provider>\n );\n}\n\n// Re-export store\nexport * from './store';\n\n// Export web components\nexport { Toolbar } from './components/Toolbar';\nexport { Highlighter } from './components/Highlighter';\nexport { AnnotationInput } from './components/AnnotationInput';\nexport { AnnotationList } from './components/AnnotationList';\nexport { Draggable } from './components/Draggable';\nexport { ErrorBoundary } from './components/ErrorBoundary';\nexport type { ErrorBoundaryProps, ErrorInfo, FallbackProps, ErrorButtonConfig } from './components/ErrorBoundary';\n\n// Export screenshot utility\nexport { captureScreenshot } from './utils/screenshot';\nexport type { ScreenshotOptions, ScreenshotResult } from './utils/screenshot';\n\n// Export fiber utilities\nexport { getReactFiber, getComponentDisplayName, getElementFromFiber } from './utils/fiber';\n\n// Export platform utilities\nexport { isWeb, isNative, getPlatform, isTauriEnv } from './utils/platform';\nexport type { PlatformType } from './utils/platform';\n", "import React, { createContext, useContext, useReducer, ReactNode } from 'react';\nimport type { ComponentDetails, ChildComponentInfo, ElementInfo } from './utils/fiber';\n\n// Re-export types for external use\nexport type { ComponentDetails, ChildComponentInfo, ElementInfo };\n\nexport type Annotation = {\n id: string;\n componentName: string;\n note: string;\n timestamp: number;\n /** Enhanced component details (optional for backward compatibility) */\n details?: ComponentDetails;\n};\n\nexport type Mode = 'disabled' | 'inspecting';\n\n/**\n * Platform-agnostic element type\n * - On web: HTMLElement\n * - On native: View ref or null\n */\nexport type HoveredElement = any;\n\n/**\n * Enhanced component info with full details\n */\nexport interface HoveredComponentInfo {\n name: string;\n /** Full component details including hierarchy, children, and element info */\n details?: ComponentDetails;\n}\n\ninterface State {\n mode: Mode;\n annotations: Annotation[];\n hoveredElement: HoveredElement;\n hoveredComponentInfo: HoveredComponentInfo | null;\n isMinimized: boolean;\n showList: boolean;\n}\n\ntype Action =\n | { type: 'SET_MODE'; payload: Mode }\n | { type: 'ADD_ANNOTATION'; payload: Annotation }\n | { type: 'REMOVE_ANNOTATION'; payload: string }\n | { type: 'CLEAR_ALL_ANNOTATIONS' }\n | { type: 'SET_HOVERED'; payload: { element: HoveredElement; name: string | null; details?: ComponentDetails } }\n | { type: 'TOGGLE_MINIMIZED' }\n | { type: 'TOGGLE_LIST' }\n | { type: 'RESET_HOVER' };\n\nconst initialState: State = {\n mode: 'disabled',\n annotations: [],\n hoveredElement: null,\n hoveredComponentInfo: null,\n isMinimized: false,\n showList: false,\n};\n\nconst AnnotationContext = createContext<{\n state: State;\n dispatch: React.Dispatch<Action>;\n} | undefined>(undefined);\n\nfunction reducer(state: State, action: Action): State {\n switch (action.type) {\n case 'SET_MODE':\n return { ...state, mode: action.payload };\n case 'ADD_ANNOTATION':\n return { ...state, annotations: [...state.annotations, action.payload] };\n case 'REMOVE_ANNOTATION':\n return {\n ...state,\n annotations: state.annotations.filter((a) => a.id !== action.payload),\n };\n case 'CLEAR_ALL_ANNOTATIONS':\n return {\n ...state,\n annotations: [],\n };\n case 'SET_HOVERED':\n // Avoid updates if same\n if (state.hoveredElement === action.payload.element) return state;\n return {\n ...state,\n hoveredElement: action.payload.element,\n hoveredComponentInfo: action.payload.name\n ? { name: action.payload.name, details: action.payload.details }\n : null\n };\n case 'RESET_HOVER':\n return { ...state, hoveredElement: null, hoveredComponentInfo: null };\n case 'TOGGLE_MINIMIZED':\n return { ...state, isMinimized: !state.isMinimized };\n case 'TOGGLE_LIST':\n return { ...state, showList: !state.showList };\n default:\n return state;\n }\n}\n\nexport function AgentAnnotationProvider({ children }: { children: ReactNode }) {\n const [state, dispatch] = useReducer(reducer, initialState);\n\n return (\n <AnnotationContext.Provider value={{ state, dispatch }}>\n {children}\n </AnnotationContext.Provider>\n );\n}\n\nexport function useAgentAnnotation() {\n const context = useContext(AnnotationContext);\n if (!context) {\n throw new Error('useAgentAnnotation must be used within an AgentAnnotationProvider');\n }\n return context;\n}\n", "import React, { useState, useEffect, useRef } from 'react';\nimport { useAgentAnnotation } from '../store';\nimport { Draggable } from './Draggable';\nimport { GripVertical, MousePointer2, List, Copy, Minus, Maximize2, Ban, Check } from 'lucide-react';\nimport { Highlighter } from './Highlighter';\nimport { AnnotationList } from './AnnotationList';\n\nexport function Toolbar() {\n const { state, dispatch } = useAgentAnnotation();\n const [showCopied, setShowCopied] = useState(false);\n const [isAnimating, setIsAnimating] = useState(false);\n const contentRef = useRef<HTMLDivElement>(null);\n const [contentWidth, setContentWidth] = useState<number | null>(null);\n\n // Measure content width for smooth animation\n useEffect(() => {\n if (contentRef.current && !state.isMinimized) {\n // Use requestAnimationFrame to ensure DOM is updated before measuring\n requestAnimationFrame(() => {\n if (contentRef.current) {\n setContentWidth(contentRef.current.scrollWidth);\n }\n });\n }\n }, [state.isMinimized, showCopied, state.annotations.length]);\n\n // Handle minimize toggle with animation\n const handleToggleMinimized = () => {\n setIsAnimating(true);\n dispatch({ type: 'TOGGLE_MINIMIZED' });\n setTimeout(() => setIsAnimating(false), 300);\n };\n\n const handleCopy = () => {\n if (state.annotations.length === 0) return;\n\n // Format annotations as readable text with sections\n const sections = state.annotations.map((a, index) => {\n const lines: string[] = [];\n\n // Section header\n lines.push(`${'='.repeat(50)}`);\n lines.push(`Annotation ${index + 1}`);\n\t\t\tlines.push(`Component: ${a.componentName}`);\n lines.push(`${'='.repeat(50)}`);\n lines.push('');\n\n // Instruction/Note\n lines.push('## Instruction');\n lines.push(a.note);\n\n return lines.join('\\n');\n });\n\n const text = sections.join('\\n\\n');\n navigator.clipboard.writeText(text).then(() => {\n setShowCopied(true);\n setTimeout(() => setShowCopied(false), 2000);\n });\n };\n\n const toggleMode = () => {\n dispatch({\n type: 'SET_MODE',\n payload: state.mode === 'disabled' ? 'inspecting' : 'disabled',\n });\n };\n\n return (\n <>\n <Highlighter />\n <AnnotationList />\n <Draggable>\n <div\n style={{\n backgroundColor: '#1e1e1e',\n border: '1px solid #333',\n borderRadius: '8px',\n padding: '8px',\n boxShadow: '0 4px 12px rgba(0,0,0,0.3)',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n color: '#e5e7eb',\n transition: 'width 0.2s',\n }}\n data-ai-annotation-ui\n >\n {/* Drag Handle */}\n <div style={{ cursor: 'grab', color: '#666', display: 'flex' }} title=\"Drag\">\n <GripVertical size={20} />\n </div>\n\n <div\n ref={contentRef}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n overflow: 'hidden',\n transition: 'max-width 0.3s ease, opacity 0.2s ease',\n maxWidth: state.isMinimized ? 0 : (contentWidth || 300),\n opacity: state.isMinimized ? 0 : 1,\n paddingTop: '4px',\n paddingBottom: '4px',\n marginTop: '-4px',\n marginBottom: '-4px',\n }}\n >\n <>\n <div style={{ width: '1px', height: '24px', backgroundColor: '#333' }} />\n\n <button\n onClick={toggleMode}\n title={state.mode === 'inspecting' ? \"Disable Inspection\" : \"Enable Inspection\"}\n style={{\n background: state.mode === 'inspecting' ? '#3b82f6' : 'transparent',\n border: 'none',\n borderRadius: '4px',\n padding: '6px',\n color: state.mode === 'inspecting' ? 'white' : 'inherit',\n cursor: 'pointer',\n display: 'flex'\n }}\n >\n {state.mode === 'inspecting' ? <MousePointer2 size={18} /> : <Ban size={18} />}\n </button>\n\n <button\n onClick={() => dispatch({ type: 'TOGGLE_LIST' })}\n title=\"List Annotations\"\n style={{\n background: 'transparent',\n border: 'none',\n borderRadius: '4px',\n padding: '6px',\n color: 'inherit',\n cursor: 'pointer',\n display: 'flex',\n position: 'relative'\n }}\n >\n <List size={18} />\n {state.annotations.length > 0 && (\n <span style={{\n position: 'absolute',\n top: -2,\n right: -2,\n background: '#ef4444',\n color: 'white',\n fontSize: '9px',\n width: '14px',\n height: '14px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center'\n }}>\n {state.annotations.length}\n </span>\n )}\n </button>\n\n <button\n onClick={handleCopy}\n title=\"Copy Annotations\"\n style={{\n background: showCopied ? '#22c55e' : 'transparent',\n border: 'none',\n borderRadius: '4px',\n padding: '6px',\n color: showCopied ? 'white' : 'inherit',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n transition: 'background-color 0.2s, color 0.2s',\n minWidth: showCopied ? '75px' : 'auto',\n }}\n >\n {showCopied ? (\n <>\n <Check size={18} />\n <span style={{ fontSize: '12px', whiteSpace: 'nowrap' }}>Copied!</span>\n </>\n ) : (\n <Copy size={18} />\n )}\n </button>\n </>\n </div>\n\n <div style={{ width: '1px', height: '24px', backgroundColor: '#333', marginLeft: state.isMinimized ? 0 : 'auto' }} />\n\n <button\n onClick={handleToggleMinimized}\n title={state.isMinimized ? \"Expand\" : \"Minimize\"}\n style={{\n background: 'transparent',\n border: 'none',\n borderRadius: '4px',\n padding: '6px',\n color: 'inherit',\n cursor: 'pointer',\n display: 'flex'\n }}\n >\n {state.isMinimized ? <Maximize2 size={18} /> : <Minus size={18} />}\n </button>\n </div>\n </Draggable>\n </>\n );\n}\n", "import React, { useState, useEffect, useRef } from 'react';\n\ninterface DraggableProps {\n children: React.ReactNode;\n initialPos?: { x: number; y: number };\n}\n\nexport function Draggable({ children, initialPos = { x: 20, y: 20 } }: DraggableProps) {\n const [pos, setPos] = useState(initialPos);\n const [dragging, setDragging] = useState(false);\n const [rel, setRel] = useState({ x: 0, y: 0 });\n const nodeRef = useRef<HTMLDivElement>(null);\n\n const onMouseDown = (e: React.MouseEvent) => {\n if (e.button !== 0) return;\n const node = nodeRef.current;\n if (!node) return;\n\n // Only drag if clicking the handle or the container itself, but usually we want a specific handle.\n // For now, let's assume the whole container is draggable unless propagation stopped.\n\n const rect = node.getBoundingClientRect();\n setDragging(true);\n setRel({\n x: e.pageX - rect.left - window.scrollX,\n y: e.pageY - rect.top - window.scrollY,\n });\n e.preventDefault();\n };\n\n const onMouseMove = (e: MouseEvent) => {\n if (!dragging) return;\n setPos({\n x: e.pageX - rel.x,\n y: e.pageY - rel.y,\n });\n e.preventDefault();\n };\n\n const onMouseUp = () => {\n setDragging(false);\n };\n\n useEffect(() => {\n if (dragging) {\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n } else {\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n }\n return () => {\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n }, [dragging]);\n\n return (\n <div\n ref={nodeRef}\n style={{\n position: 'fixed',\n left: pos.x,\n top: pos.y,\n zIndex: 9999,\n cursor: dragging ? 'grabbing' : 'grab',\n }}\n onMouseDown={onMouseDown}\n >\n {children}\n </div>\n );\n}\n", "import { useEffect, useState } from \"react\";\nimport { useAgentAnnotation } from \"../store\";\nimport { AnnotationInput } from \"./AnnotationInput\";\nimport { captureScreenshot } from \"../utils/screenshot\";\nimport { getComponentDetails } from \"../utils/fiber\";\n\nexport function Highlighter() {\n const { state, dispatch } = useAgentAnnotation();\n const { hoveredElement, mode, hoveredComponentInfo } = state;\n\n const [rect, setRect] = useState<DOMRect | null>(null);\n const [showInput, setShowInput] = useState(false);\n const [mousePos, setMousePos] = useState({ x: 0, y: 0 });\n const [isLocked, setIsLocked] = useState(false);\n const [lockedPos, setLockedPos] = useState({ x: 0, y: 0 });\n const [isCapturing, setIsCapturing] = useState(false);\n const [captureSuccess, setCaptureSuccess] = useState(false);\n const [showDetails, setShowDetails] = useState(false);\n\n const componentName = hoveredComponentInfo?.name || \"\";\n const componentDetails = hoveredComponentInfo?.details;\n\n // Detect hovered element when in inspecting mode\n useEffect(() => {\n if (mode !== 'inspecting') return;\n\n const handleMouseOver = (e: MouseEvent) => {\n // Don't detect if locked (user is interacting with tooltip)\n if (isLocked) return;\n\n const target = e.target as HTMLElement;\n \n // Ignore annotation UI elements\n if (target.closest('[data-ai-annotation-ui]') || target.closest('[data-annotation-tooltip]')) {\n return;\n }\n\n // Get React component info from fiber with enhanced details\n const details = getComponentDetails(target, {\n includeProps: false,\n maxParentDepth: 10,\n maxChildDepth: 5,\n });\n\n dispatch({\n type: 'SET_HOVERED',\n payload: { element: target, name: details.name, details }\n });\n };\n\n document.addEventListener('mouseover', handleMouseOver);\n \n return () => {\n document.removeEventListener('mouseover', handleMouseOver);\n };\n }, [mode, isLocked, dispatch]);\n\n // Global ESC key handler for inspecting mode - handles ESC when no element is selected\n useEffect(() => {\n if (mode !== 'inspecting') return;\n\n const handleGlobalEsc = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && !isLocked) {\n e.preventDefault();\n e.stopPropagation();\n // No highlight block selected, disable mode\n dispatch({ type: 'SET_MODE', payload: 'disabled' });\n }\n };\n\n document.addEventListener('keydown', handleGlobalEsc);\n return () => document.removeEventListener('keydown', handleGlobalEsc);\n }, [mode, isLocked, dispatch]);\n\n // Reset all state when mode changes to disabled\n useEffect(() => {\n if (mode === 'disabled') {\n setRect(null);\n setShowInput(false);\n setIsLocked(false);\n setMousePos({ x: 0, y: 0 });\n setLockedPos({ x: 0, y: 0 });\n setIsCapturing(false);\n setCaptureSuccess(false);\n setShowDetails(false);\n\n // Clear hovered element in store\n dispatch({ type: 'RESET_HOVER' });\n }\n }, [mode, dispatch]);\n\n useEffect(() => {\n if (!hoveredElement) {\n setRect(null);\n setShowInput(false);\n setIsLocked(false);\n return;\n }\n\n const updateRect = () => {\n const newRect = hoveredElement.getBoundingClientRect();\n setRect(newRect);\n };\n\n updateRect();\n\n const handleMouseMove = (e: MouseEvent) => {\n // Only update mouse position if not locked\n if (!isLocked) {\n setMousePos({ x: e.clientX, y: e.clientY });\n }\n };\n\n // Click handler to lock/unlock tooltip\n const handleClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n \n // Ignore clicks on the tooltip buttons themselves\n if (target.closest('[data-annotation-tooltip]')) {\n return;\n }\n \n // Ignore clicks on annotation input\n if (target.closest('[data-ai-annotation-ui]')) {\n return;\n }\n\n if (!isLocked) {\n // Lock the tooltip at current position\n e.preventDefault();\n e.stopPropagation();\n setIsLocked(true);\n setLockedPos({ x: e.clientX, y: e.clientY });\n } else {\n // Unlock and go back to following mode\n setIsLocked(false);\n }\n };\n\n // ESC key handler to unlock tooltip when locked\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isLocked) {\n e.preventDefault();\n e.stopPropagation();\n setIsLocked(false);\n setShowInput(false);\n }\n };\n\n window.addEventListener(\"scroll\", updateRect, true);\n window.addEventListener(\"resize\", updateRect);\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"click\", handleClick, true);\n document.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n window.removeEventListener(\"scroll\", updateRect, true);\n window.removeEventListener(\"resize\", updateRect);\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"click\", handleClick, true);\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [hoveredElement, isLocked]);\n\n const handleScreenshot = async (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!hoveredElement || isCapturing) return;\n\n setIsCapturing(true);\n try {\n const result = await captureScreenshot(hoveredElement, {\n copyToClipboard: true,\n scale: 2,\n });\n\n if (result.success) {\n setCaptureSuccess(true);\n setTimeout(() => {\n setCaptureSuccess(false);\n setIsLocked(false); // Unlock after successful capture\n }, 1500);\n }\n } catch (error) {\n console.error(\"Screenshot failed:\", error);\n } finally {\n setIsCapturing(false);\n }\n };\n\n const handleAddClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n setShowInput(true);\n setShowDetails(false);\n setIsLocked(false); // Unlock when showing input\n };\n\n const handleDetailsClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n setShowDetails(!showDetails);\n };\n\n const handleCloseInput = () => {\n setShowInput(false);\n };\n\n if (mode !== \"inspecting\" || !rect) return null;\n\n // Use locked position or current mouse position\n const tooltipX = isLocked ? lockedPos.x : mousePos.x;\n const tooltipY = isLocked ? lockedPos.y : mousePos.y;\n\n return (\n <>\n {/* Highlight overlay */}\n <div\n data-annotation-ui=\"true\"\n style={{\n position: \"fixed\",\n left: rect.left - 2,\n top: rect.top - 2,\n width: rect.width + 4,\n height: rect.height + 4,\n border: \"2px solid #3b82f6\",\n borderRadius: 4,\n pointerEvents: \"none\",\n zIndex: 99998,\n backgroundColor: \"rgba(59, 130, 246, 0.1)\",\n }}\n />\n\n {/* Component name label */}\n {componentName && (\n <div\n data-annotation-ui=\"true\"\n style={{\n position: \"fixed\",\n left: rect.left,\n top: rect.top - 24,\n backgroundColor: \"#3b82f6\",\n color: \"white\",\n padding: \"2px 8px\",\n borderRadius: 4,\n fontSize: 12,\n fontFamily: \"monospace\",\n pointerEvents: \"none\",\n zIndex: 99999,\n }}\n >\n {componentName}\n </div>\n )}\n\n {/* Floating tooltip following mouse */}\n {!showInput && (\n <div\n data-annotation-ui=\"true\"\n data-annotation-tooltip=\"true\"\n style={{\n position: \"fixed\",\n left: tooltipX + 16,\n top: tooltipY + 16,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n padding: 6,\n backgroundColor: isLocked ? \"rgba(0, 0, 0, 0.95)\" : \"rgba(0, 0, 0, 0.85)\",\n borderRadius: 8,\n boxShadow: isLocked\n ? \"0 4px 12px rgba(0, 0, 0, 0.4), 0 0 0 2px rgba(59, 130, 246, 0.5)\"\n : \"0 4px 12px rgba(0, 0, 0, 0.3)\",\n zIndex: 100000,\n pointerEvents: isLocked ? \"auto\" : \"none\",\n backdropFilter: \"blur(8px)\",\n transition: isLocked ? \"none\" : \"left 0.05s ease-out, top 0.05s ease-out\",\n maxWidth: showDetails ? 400 : \"auto\",\n }}\n >\n {/* Button row */}\n <div style={{ display: \"flex\", gap: 6 }}>\n {/* Screenshot button */}\n <button\n onClick={handleScreenshot}\n disabled={isCapturing || !isLocked}\n style={{\n width: 32,\n height: 32,\n borderRadius: 6,\n border: \"none\",\n backgroundColor: captureSuccess\n ? \"#22c55e\"\n : isCapturing\n ? \"#6b7280\"\n : \"#8b5cf6\",\n color: \"white\",\n cursor: isLocked ? \"pointer\" : \"default\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 16,\n transition: \"all 0.15s ease\",\n opacity: isLocked ? 1 : 0.7,\n }}\n title=\"Capture screenshot\"\n >\n {captureSuccess ? \"\u2713\" : isCapturing ? \"...\" : \"\uD83D\uDCF7\"}\n </button>\n\n {/* Add annotation button */}\n <button\n onClick={handleAddClick}\n disabled={!isLocked}\n style={{\n width: 32,\n height: 32,\n borderRadius: 6,\n border: \"none\",\n backgroundColor: \"#3b82f6\",\n color: \"white\",\n cursor: isLocked ? \"pointer\" : \"default\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 18,\n fontWeight: \"bold\",\n transition: \"all 0.15s ease\",\n opacity: isLocked ? 1 : 0.7,\n }}\n title=\"Add annotation\"\n >\n +\n </button>\n\n {/* Details toggle button */}\n <button\n onClick={handleDetailsClick}\n disabled={!isLocked}\n style={{\n width: 32,\n height: 32,\n borderRadius: 6,\n border: showDetails ? \"2px solid #10b981\" : \"none\",\n backgroundColor: showDetails ? \"#10b981\" : \"#6b7280\",\n color: \"white\",\n cursor: isLocked ? \"pointer\" : \"default\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 14,\n transition: \"all 0.15s ease\",\n opacity: isLocked ? 1 : 0.7,\n }}\n title=\"Show component details\"\n >\n \u24D8\n </button>\n </div>\n\n {/* Lock hint */}\n {!isLocked && (\n <div\n style={{\n position: \"absolute\",\n bottom: -20,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n fontSize: 10,\n color: \"rgba(255, 255, 255, 0.7)\",\n whiteSpace: \"nowrap\",\n pointerEvents: \"none\",\n }}\n >\n Click to lock\n </div>\n )}\n\n {/* Component details panel */}\n {showDetails && componentDetails && (\n <div\n style={{\n padding: \"8px 4px 4px 4px\",\n borderTop: \"1px solid rgba(255, 255, 255, 0.2)\",\n fontSize: 11,\n color: \"rgba(255, 255, 255, 0.9)\",\n maxHeight: 300,\n overflowY: \"auto\",\n }}\n >\n {/* Element info */}\n <div style={{ marginBottom: 8 }}>\n <div style={{ color: \"#60a5fa\", fontWeight: \"bold\", marginBottom: 4 }}>\n Element\n </div>\n <div style={{ fontFamily: \"monospace\", color: \"#f59e0b\" }}>\n <{componentDetails.elementInfo.tagName}\n {componentDetails.elementInfo.id && ` id=\"${componentDetails.elementInfo.id}\"`}\n {componentDetails.elementInfo.className && ` class=\"${componentDetails.elementInfo.className}\"`}\n >\n </div>\n {componentDetails.elementInfo.textContent && (\n <div style={{ color: \"rgba(255, 255, 255, 0.6)\", marginTop: 2, fontStyle: \"italic\" }}>\n \"{componentDetails.elementInfo.textContent}\"\n </div>\n )}\n <div style={{ color: \"rgba(255, 255, 255, 0.5)\", marginTop: 2 }}>\n {componentDetails.elementInfo.childElementCount} child element(s)\n </div>\n </div>\n\n {/* Parent hierarchy */}\n {componentDetails.parentHierarchy.length > 0 && (\n <div style={{ marginBottom: 8 }}>\n <div style={{ color: \"#60a5fa\", fontWeight: \"bold\", marginBottom: 4 }}>\n Parent Components\n </div>\n <div style={{ fontFamily: \"monospace\" }}>\n {componentDetails.parentHierarchy.slice(0, 5).map((parent, i) => (\n <div key={i} style={{ color: \"#a78bfa\", paddingLeft: i * 8 }}>\n {\"\u2190 \"}{parent}\n </div>\n ))}\n {componentDetails.parentHierarchy.length > 5 && (\n <div style={{ color: \"rgba(255, 255, 255, 0.5)\" }}>\n ... and {componentDetails.parentHierarchy.length - 5} more\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Child components */}\n {componentDetails.childComponents.length > 0 && (\n <div style={{ marginBottom: 8 }}>\n <div style={{ color: \"#60a5fa\", fontWeight: \"bold\", marginBottom: 4 }}>\n Child Components ({componentDetails.childComponents.length})\n </div>\n <div style={{ fontFamily: \"monospace\" }}>\n {componentDetails.childComponents.slice(0, 10).map((child, i) => (\n <div\n key={i}\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n gap: 8,\n color: \"#34d399\",\n }}\n >\n <span>\n {\"\u2192 \"}{child.name}\n {child.hasChildren && \" \u25BE\"}\n </span>\n {child.count > 1 && (\n <span style={{ color: \"rgba(255, 255, 255, 0.5)\" }}>\n \u00D7{child.count}\n </span>\n )}\n </div>\n ))}\n {componentDetails.childComponents.length > 10 && (\n <div style={{ color: \"rgba(255, 255, 255, 0.5)\" }}>\n ... and {componentDetails.childComponents.length - 10} more\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Important attributes */}\n {Object.keys(componentDetails.elementInfo.attributes).length > 0 && (\n <div>\n <div style={{ color: \"#60a5fa\", fontWeight: \"bold\", marginBottom: 4 }}>\n Attributes\n </div>\n <div style={{ fontFamily: \"monospace\" }}>\n {Object.entries(componentDetails.elementInfo.attributes).map(([key, value]) => (\n <div key={key} style={{ color: \"#fbbf24\" }}>\n {key}=\"{value}\"\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* Annotation input */}\n {showInput && (\n <AnnotationInput\n onClose={handleCloseInput}\n componentName={componentName || \"Unknown\"}\n componentDetails={componentDetails}\n />\n )}\n </>\n );\n}\n", "import React, { useState, useEffect } from 'react';\nimport { useAgentAnnotation } from '../store';\nimport type { ComponentDetails } from '../store';\nimport { X } from 'lucide-react';\n\ninterface AnnotationInputProps {\n onClose: () => void;\n componentName: string;\n componentDetails?: ComponentDetails;\n}\n\n/**\n * Format component details into a readable text block for the annotation\n */\nfunction formatComponentDetails(details: ComponentDetails): string {\n const lines: string[] = [];\n\n // Element info\n lines.push('## Element');\n let elementStr = `<${details.elementInfo.tagName}`;\n if (details.elementInfo.id) elementStr += ` id=\"${details.elementInfo.id}\"`;\n if (details.elementInfo.className) elementStr += ` class=\"${details.elementInfo.className}\"`;\n elementStr += '>';\n lines.push(elementStr);\n\n if (details.elementInfo.textContent) {\n lines.push(`Text: \"${details.elementInfo.textContent}\"`);\n }\n lines.push(`Child elements: ${details.elementInfo.childElementCount}`);\n\n // Attributes\n if (Object.keys(details.elementInfo.attributes).length > 0) {\n lines.push('');\n lines.push('## Attributes');\n for (const [key, value] of Object.entries(details.elementInfo.attributes)) {\n lines.push(`${key}=\"${value}\"`);\n }\n }\n\n // Parent hierarchy\n if (details.parentHierarchy.length > 0) {\n lines.push('');\n lines.push('## Parent Components');\n lines.push(details.parentHierarchy.join(' \u2192 '));\n }\n\n // Child components\n if (details.childComponents.length > 0) {\n lines.push('');\n lines.push(`## Child Components (${details.childComponents.length})`);\n const childLines = details.childComponents.slice(0, 15).map(child => {\n let str = child.name;\n if (child.count > 1) str += ` \u00D7${child.count}`;\n if (child.hasChildren) str += ' (has children)';\n return str;\n });\n lines.push(childLines.join(', '));\n if (details.childComponents.length > 15) {\n lines.push(`... and ${details.childComponents.length - 15} more`);\n }\n }\n\n return lines.join('\\n');\n}\n\nexport function AnnotationInput({ onClose, componentName, componentDetails }: AnnotationInputProps) {\n const { dispatch } = useAgentAnnotation();\n const [note, setNote] = useState('');\n const [includeDetails, setIncludeDetails] = useState(true);\n const [isVisible, setIsVisible] = useState(false);\n const [isClosing, setIsClosing] = useState(false);\n\n // Trigger entrance animation on mount\n useEffect(() => {\n requestAnimationFrame(() => {\n setIsVisible(true);\n });\n }, []);\n\n // ESC key to close\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n handleClose();\n }\n };\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, []);\n\n // Handle close with exit animation\n const handleClose = () => {\n setIsClosing(true);\n setTimeout(() => {\n onClose();\n }, 200);\n };\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (!note.trim()) return;\n\n // Build the final annotation text with component details if enabled\n let finalNote = note.trim();\n if (includeDetails && componentDetails) {\n const detailsText = formatComponentDetails(componentDetails);\n finalNote = `${note.trim()}\\n\\n---\\n${detailsText}`;\n }\n\n dispatch({\n type: 'ADD_ANNOTATION',\n payload: {\n id: Date.now().toString(),\n componentName,\n note: finalNote,\n timestamp: Date.now(),\n details: componentDetails,\n },\n });\n handleClose();\n };\n\n // Preview of what will be included\n const detailsPreview = componentDetails ? (\n <div style={{\n fontSize: '0.75rem',\n color: 'rgba(255, 255, 255, 0.6)',\n marginTop: '4px',\n }}>\n {componentDetails.parentHierarchy.length > 0 && (\n <div>Parents: {componentDetails.parentHierarchy.slice(0, 3).join(' \u2192 ')}{componentDetails.parentHierarchy.length > 3 ? '...' : ''}</div>\n )}\n {componentDetails.childComponents.length > 0 && (\n <div>Children: {componentDetails.childComponents.slice(0, 3).map(c => c.name).join(', ')}{componentDetails.childComponents.length > 3 ? '...' : ''}</div>\n )}\n <div>Element: <{componentDetails.elementInfo.tagName}> ({componentDetails.elementInfo.childElementCount} children)</div>\n </div>\n ) : null;\n\n return (\n <div\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: isVisible && !isClosing ? 'rgba(0,0,0,0.5)' : 'rgba(0,0,0,0)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 10000,\n transition: 'background-color 0.2s ease',\n }}\n data-ai-annotation-ui\n onClick={handleClose}\n >\n <div\n style={{\n backgroundColor: '#1e1e1e',\n color: '#e5e7eb',\n padding: '20px',\n borderRadius: '8px',\n width: '500px',\n maxWidth: '90%',\n maxHeight: '80vh',\n overflow: 'auto',\n boxShadow: '0 4px 6px rgba(0,0,0,0.3)',\n transform: isVisible && !isClosing ? 'scale(1) translateY(0)' : 'scale(0.95) translateY(-10px)',\n opacity: isVisible && !isClosing ? 1 : 0,\n transition: 'transform 0.2s ease, opacity 0.2s ease',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: '16px' }}>\n <h3 style={{ margin: 0, fontSize: '1.1rem' }}>Add Annotation</h3>\n <button onClick={handleClose} style={{ background: 'none', border: 'none', color: 'inherit', cursor: 'pointer' }}>\n <X size={20} />\n </button>\n </div>\n\n <div style={{ marginBottom: '12px', fontSize: '0.9rem', opacity: 0.8 }}>\n Component: <strong>{componentName}</strong>\n </div>\n\n <form onSubmit={handleSubmit}>\n <textarea\n value={note}\n onChange={(e) => setNote(e.target.value)}\n placeholder=\"Describe what this component does or what changes you need...\"\n style={{\n width: '100%',\n height: '120px',\n padding: '8px',\n borderRadius: '4px',\n backgroundColor: '#2d2d2d',\n border: '1px solid #404040',\n color: 'white',\n marginBottom: '12px',\n resize: 'vertical',\n fontFamily: 'inherit',\n }}\n autoFocus\n />\n\n {/* Include details checkbox */}\n {componentDetails && (\n <div style={{ marginBottom: '16px' }}>\n <label\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: '8px',\n cursor: 'pointer',\n fontSize: '0.85rem',\n }}\n >\n <input\n type=\"checkbox\"\n checked={includeDetails}\n onChange={(e) => setIncludeDetails(e.target.checked)}\n style={{ marginTop: '2px' }}\n />\n <div>\n <div style={{ color: '#10b981', fontWeight: 500 }}>\n Include component details in annotation\n </div>\n {includeDetails && detailsPreview}\n </div>\n </label>\n </div>\n )}\n\n <div style={{ display: 'flex', justifyContent: 'flex-end', gap: '8px' }}>\n <button\n type=\"button\"\n onClick={handleClose}\n style={{\n padding: '6px 12px',\n borderRadius: '4px',\n backgroundColor: 'transparent',\n border: '1px solid #404040',\n color: 'white',\n cursor: 'pointer',\n }}\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n style={{\n padding: '6px 12px',\n borderRadius: '4px',\n backgroundColor: '#3b82f6',\n border: 'none',\n color: 'white',\n cursor: 'pointer',\n }}\n >\n Save Annotation\n </button>\n </div>\n </form>\n </div>\n </div>\n );\n}\n", "import html2canvas from 'html2canvas';\n\nexport interface ScreenshotOptions {\n /** Scale factor for higher resolution (default: 2) */\n scale?: number;\n /** Background color (default: transparent) */\n backgroundColor?: string | null;\n /** Whether to copy to clipboard (default: true) */\n copyToClipboard?: boolean;\n /** Whether to download as file (default: false) */\n download?: boolean;\n /** Filename when downloading (default: 'screenshot.png') */\n filename?: string;\n}\n\nexport interface ScreenshotResult {\n success: boolean;\n dataUrl?: string;\n blob?: Blob;\n error?: string;\n}\n\n// Tauri internals type for checking environment\ndeclare global {\n interface Window {\n __TAURI_INTERNALS__?: unknown;\n __TAURI_CLIPBOARD_WRITE_IMAGE__?: (bytes: Uint8Array) => Promise<void>;\n }\n}\n\n/**\n * Check if running in Tauri environment\n */\nfunction isTauriEnv(): boolean {\n return typeof window !== 'undefined' && '__TAURI_INTERNALS__' in window;\n}\n\n/**\n * Copy image to clipboard using Tauri's clipboard plugin\n * Uses a global function injected by the main app to avoid bundler issues\n */\nasync function copyToClipboardTauri(blob: Blob): Promise<void> {\n // Check if the main app has injected the clipboard function\n if (typeof window.__TAURI_CLIPBOARD_WRITE_IMAGE__ === 'function') {\n const arrayBuffer = await blob.arrayBuffer();\n const bytes = new Uint8Array(arrayBuffer);\n await window.__TAURI_CLIPBOARD_WRITE_IMAGE__(bytes);\n return;\n }\n \n // Fallback: throw error so browser clipboard API is tried\n throw new Error('Tauri clipboard function not available');\n}\n\n/**\n * Copy image to clipboard using browser's Clipboard API\n */\nasync function copyToClipboardBrowser(blob: Blob, dataUrl: string): Promise<void> {\n try {\n await navigator.clipboard.write([\n new ClipboardItem({\n 'image/png': blob,\n }),\n ]);\n } catch (clipboardError) {\n console.warn('Failed to copy to clipboard:', clipboardError);\n // Fallback: try copying as text (data URL)\n try {\n await navigator.clipboard.writeText(dataUrl);\n } catch {\n // Ignore fallback failure\n }\n }\n}\n\n/**\n * Captures a screenshot of the given HTML element\n */\nexport async function captureScreenshot(\n element: HTMLElement,\n options: ScreenshotOptions = {}\n): Promise<ScreenshotResult> {\n const {\n scale = 2,\n backgroundColor = null,\n copyToClipboard = true,\n download = false,\n filename = 'screenshot.png',\n } = options;\n\n try {\n // Capture the element\n const canvas = await html2canvas(element, {\n scale,\n backgroundColor,\n logging: false,\n useCORS: true,\n allowTaint: true,\n // Capture just the element\n x: window.scrollX,\n y: window.scrollY,\n scrollX: -window.scrollX,\n scrollY: -window.scrollY,\n windowWidth: document.documentElement.scrollWidth,\n windowHeight: document.documentElement.scrollHeight,\n // Ignore annotation UI elements\n ignoreElements: (el) => {\n return el.hasAttribute('data-ai-annotation-ui');\n },\n });\n\n // Convert to blob\n const blob = await new Promise<Blob>((resolve, reject) => {\n canvas.toBlob((b) => {\n if (b) resolve(b);\n else reject(new Error('Failed to create blob'));\n }, 'image/png');\n });\n\n const dataUrl = canvas.toDataURL('image/png');\n\n // Copy to clipboard if requested\n if (copyToClipboard) {\n if (isTauriEnv()) {\n try {\n // Use Tauri's clipboard plugin for proper image clipboard support\n await copyToClipboardTauri(blob);\n } catch (tauriErr) {\n console.warn('Tauri clipboard failed, falling back to browser API:', tauriErr);\n // Fallback to browser's Clipboard API\n await copyToClipboardBrowser(blob, dataUrl);\n }\n } else {\n // Fallback to browser's Clipboard API\n await copyToClipboardBrowser(blob, dataUrl);\n }\n }\n\n // Download if requested\n if (download) {\n const link = document.createElement('a');\n link.href = dataUrl;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n\n return {\n success: true,\n dataUrl,\n blob,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n console.error('Screenshot capture failed:', message);\n return {\n success: false,\n error: message,\n };\n }\n}\n", "\nexport function getReactFiber(dom: HTMLElement): any {\n const key = Object.keys(dom).find((key) =>\n key.startsWith(\"__reactFiber$\")\n );\n // @ts-ignore\n return key ? dom[key] : null;\n}\n\nexport function getComponentDisplayName(fiber: any): string {\n let curr = fiber;\n while (curr) {\n const name = curr.type?.displayName || curr.type?.name;\n // Filter out internal components if needed, but for now take the first named one\n // Also skip styled-components or basic html tags if we want \"Component\" names\n if (name && typeof curr.type === 'function') return name;\n curr = curr.return;\n }\n return \"Unknown\";\n}\n\nexport function getElementFromFiber(fiber: any): HTMLElement | null {\n let curr = fiber;\n while (curr) {\n if (curr.stateNode instanceof HTMLElement) {\n return curr.stateNode;\n }\n curr = curr.child;\n }\n return null;\n}\n\n/**\n * Component info with hierarchy details\n */\nexport interface ComponentDetails {\n name: string;\n parentHierarchy: string[];\n childComponents: ChildComponentInfo[];\n elementInfo: ElementInfo;\n props?: Record<string, any>;\n}\n\nexport interface ChildComponentInfo {\n name: string;\n depth: number;\n count: number;\n hasChildren: boolean;\n}\n\nexport interface ElementInfo {\n tagName: string;\n id?: string;\n className?: string;\n attributes: Record<string, string>;\n childElementCount: number;\n textContent?: string;\n}\n\n/**\n * Get parent component hierarchy (from current component up to root)\n */\nexport function getParentHierarchy(fiber: any, maxDepth: number = 10): string[] {\n const hierarchy: string[] = [];\n let curr = fiber?.return;\n let depth = 0;\n\n while (curr && depth < maxDepth) {\n const name = curr.type?.displayName || curr.type?.name;\n if (name && typeof curr.type === 'function') {\n // Skip internal React components (starting with uppercase but containing $)\n if (!name.includes('$') && !name.startsWith('_')) {\n hierarchy.push(name);\n }\n }\n curr = curr.return;\n depth++;\n }\n\n return hierarchy;\n}\n\n/**\n * Get child components from a fiber node\n */\nexport function getChildComponents(fiber: any, maxDepth: number = 5): ChildComponentInfo[] {\n const children: Map<string, { count: number; depth: number; hasChildren: boolean }> = new Map();\n\n function traverse(node: any, depth: number) {\n if (!node || depth > maxDepth) return;\n\n const name = node.type?.displayName || node.type?.name;\n if (name && typeof node.type === 'function' && !name.includes('$') && !name.startsWith('_')) {\n const existing = children.get(name);\n const hasChildComponents = checkHasChildComponents(node.child);\n\n if (existing) {\n existing.count++;\n // Keep the shallowest depth\n if (depth < existing.depth) {\n existing.depth = depth;\n }\n existing.hasChildren = existing.hasChildren || hasChildComponents;\n } else {\n children.set(name, { count: 1, depth, hasChildren: hasChildComponents });\n }\n }\n\n // Traverse siblings and children\n if (node.child) traverse(node.child, depth + 1);\n if (node.sibling) traverse(node.sibling, depth);\n }\n\n // Start from the fiber's child\n if (fiber?.child) {\n traverse(fiber.child, 1);\n }\n\n return Array.from(children.entries()).map(([name, info]) => ({\n name,\n depth: info.depth,\n count: info.count,\n hasChildren: info.hasChildren,\n })).sort((a, b) => a.depth - b.depth);\n}\n\n/**\n * Check if a fiber node has child components\n */\nfunction checkHasChildComponents(fiber: any, maxDepth: number = 3): boolean {\n if (!fiber || maxDepth <= 0) return false;\n\n const name = fiber.type?.displayName || fiber.type?.name;\n if (name && typeof fiber.type === 'function' && !name.includes('$')) {\n return true;\n }\n\n if (fiber.child && checkHasChildComponents(fiber.child, maxDepth - 1)) return true;\n if (fiber.sibling && checkHasChildComponents(fiber.sibling, maxDepth - 1)) return true;\n\n return false;\n}\n\n/**\n * Get DOM element information\n */\nexport function getElementInfo(element: HTMLElement): ElementInfo {\n const importantAttributes = ['data-testid', 'role', 'aria-label', 'type', 'name', 'href', 'src'];\n const attributes: Record<string, string> = {};\n\n importantAttributes.forEach(attr => {\n const value = element.getAttribute(attr);\n if (value) {\n attributes[attr] = value;\n }\n });\n\n // Get text content (truncated)\n let textContent: string | undefined;\n const directText = Array.from(element.childNodes)\n .filter(node => node.nodeType === Node.TEXT_NODE)\n .map(node => node.textContent?.trim())\n .filter(Boolean)\n .join(' ');\n\n if (directText) {\n textContent = directText.length > 100 ? directText.substring(0, 100) + '...' : directText;\n }\n\n return {\n tagName: element.tagName.toLowerCase(),\n id: element.id || undefined,\n className: element.className && typeof element.className === 'string'\n ? element.className.split(' ').slice(0, 5).join(' ') + (element.className.split(' ').length > 5 ? '...' : '')\n : undefined,\n attributes,\n childElementCount: element.childElementCount,\n textContent,\n };\n}\n\n/**\n * Get component props (filtered for safety - removes functions and large objects)\n */\nexport function getComponentProps(fiber: any, maxProps: number = 10): Record<string, any> | undefined {\n if (!fiber?.memoizedProps) return undefined;\n\n const props = fiber.memoizedProps;\n const safeProps: Record<string, any> = {};\n let count = 0;\n\n for (const key of Object.keys(props)) {\n if (count >= maxProps) {\n safeProps['...'] = `${Object.keys(props).length - maxProps} more props`;\n break;\n }\n\n // Skip children and function props\n if (key === 'children') continue;\n\n const value = props[key];\n const type = typeof value;\n\n if (type === 'function') {\n safeProps[key] = '[Function]';\n } else if (type === 'object' && value !== null) {\n if (Array.isArray(value)) {\n safeProps[key] = `[Array(${value.length})]`;\n } else if (value.$$typeof) {\n // React element\n safeProps[key] = '[ReactElement]';\n } else {\n try {\n const json = JSON.stringify(value);\n safeProps[key] = json.length > 100 ? '[Object]' : value;\n } catch {\n safeProps[key] = '[Object]';\n }\n }\n } else {\n safeProps[key] = value;\n }\n count++;\n }\n\n return Object.keys(safeProps).length > 0 ? safeProps : undefined;\n}\n\n/**\n * Get comprehensive component details for the selected element\n */\nexport function getComponentDetails(element: HTMLElement, options?: {\n includeProps?: boolean;\n maxParentDepth?: number;\n maxChildDepth?: number;\n}): ComponentDetails {\n const { includeProps = false, maxParentDepth = 10, maxChildDepth = 5 } = options || {};\n\n const fiber = getReactFiber(element);\n const name = fiber ? getComponentDisplayName(fiber) : 'Unknown';\n\n // Find the actual component fiber (not DOM node fiber)\n let componentFiber = fiber;\n while (componentFiber && typeof componentFiber.type !== 'function') {\n componentFiber = componentFiber.return;\n }\n\n return {\n name,\n parentHierarchy: getParentHierarchy(componentFiber, maxParentDepth),\n childComponents: getChildComponents(componentFiber, maxChildDepth),\n elementInfo: getElementInfo(element),\n props: includeProps ? getComponentProps(componentFiber) : undefined,\n };\n}\n", "import React, { useState } from 'react';\nimport { useAgentAnnotation } from '../store';\nimport { X, Trash2, Trash, ChevronDown, ChevronRight } from 'lucide-react';\n\nexport function AnnotationList() {\n const { state, dispatch } = useAgentAnnotation();\n const [expandedId, setExpandedId] = useState<string | null>(null);\n\n if (!state.showList) return null;\n\n const toggleExpand = (id: string) => {\n setExpandedId(expandedId === id ? null : id);\n };\n\n return (\n <div\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0,0,0,0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 10000,\n }}\n data-ai-annotation-ui\n onClick={() => dispatch({ type: 'TOGGLE_LIST' })}\n >\n <div\n style={{\n backgroundColor: '#1e1e1e',\n color: '#e5e7eb',\n padding: '20px',\n borderRadius: '8px',\n width: '600px',\n maxWidth: '90%',\n maxHeight: '80vh',\n display: 'flex',\n flexDirection: 'column',\n boxShadow: '0 4px 6px rgba(0,0,0,0.3)',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: '16px', alignItems: 'center' }}>\n <h3 style={{ margin: 0 }}>Annotations ({state.annotations.length})</h3>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n {state.annotations.length > 0 && (\n <button\n onClick={() => dispatch({ type: 'CLEAR_ALL_ANNOTATIONS' })}\n style={{\n background: '#ef4444',\n border: 'none',\n color: 'white',\n cursor: 'pointer',\n padding: '6px 12px',\n borderRadius: '4px',\n fontSize: '12px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n title=\"Clear all annotations\"\n >\n <Trash size={14} />\n Clear All\n </button>\n )}\n <button\n onClick={() => dispatch({ type: 'TOGGLE_LIST' })}\n style={{ background: 'none', border: 'none', color: 'inherit', cursor: 'pointer' }}\n >\n <X size={20} />\n </button>\n </div>\n </div>\n\n <div style={{ overflowY: 'auto', flex: 1, display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {state.annotations.length === 0 ? (\n <p style={{ textAlign: 'center', opacity: 0.6, padding: '20px' }}>No annotations yet.</p>\n ) : (\n state.annotations.map((ann) => {\n const isExpanded = expandedId === ann.id;\n const hasDetails = !!ann.details;\n\n return (\n <div\n key={ann.id}\n style={{\n backgroundColor: '#2d2d2d',\n borderRadius: '4px',\n overflow: 'hidden',\n }}\n >\n {/* Main annotation row */}\n <div\n style={{\n padding: '12px',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n gap: '12px',\n }}\n >\n <div style={{ flex: 1 }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', marginBottom: '4px' }}>\n {hasDetails && (\n <button\n onClick={() => toggleExpand(ann.id)}\n style={{\n background: 'none',\n border: 'none',\n color: '#60a5fa',\n cursor: 'pointer',\n padding: 0,\n display: 'flex',\n alignItems: 'center',\n }}\n >\n {isExpanded ? <ChevronDown size={16} /> : <ChevronRight size={16} />}\n </button>\n )}\n <div style={{ fontWeight: 'bold', fontSize: '0.9rem', color: '#60a5fa' }}>\n {ann.componentName}\n </div>\n </div>\n <div style={{ fontSize: '0.9rem', whiteSpace: 'pre-wrap', marginLeft: hasDetails ? 24 : 0 }}>\n {ann.note}\n </div>\n </div>\n <button\n onClick={() => dispatch({ type: 'REMOVE_ANNOTATION', payload: ann.id })}\n style={{\n background: 'none',\n border: 'none',\n color: '#ef4444',\n cursor: 'pointer',\n padding: '4px',\n flexShrink: 0,\n }}\n title=\"Remove annotation\"\n >\n <Trash2 size={16} />\n </button>\n </div>\n\n {/* Expanded details */}\n {isExpanded && ann.details && (\n <div\n style={{\n padding: '12px',\n paddingTop: 0,\n borderTop: '1px solid #404040',\n marginTop: '8px',\n fontSize: '0.8rem',\n }}\n >\n {/* Element info */}\n <div style={{ marginBottom: '12px' }}>\n <div style={{ color: '#10b981', fontWeight: 'bold', marginBottom: '4px' }}>\n Element\n </div>\n <div style={{ fontFamily: 'monospace', color: '#f59e0b', fontSize: '0.75rem' }}>\n <{ann.details.elementInfo.tagName}\n {ann.details.elementInfo.id && ` id=\"${ann.details.elementInfo.id}\"`}\n {ann.details.elementInfo.className && ` class=\"${ann.details.elementInfo.className}\"`}\n >\n </div>\n {ann.details.elementInfo.textContent && (\n <div style={{ color: 'rgba(255, 255, 255, 0.6)', marginTop: '4px', fontStyle: 'italic' }}>\n Text: \"{ann.details.elementInfo.textContent}\"\n </div>\n )}\n </div>\n\n {/* Parent hierarchy */}\n {ann.details.parentHierarchy.length > 0 && (\n <div style={{ marginBottom: '12px' }}>\n <div style={{ color: '#10b981', fontWeight: 'bold', marginBottom: '4px' }}>\n Parent Components\n </div>\n <div style={{ fontFamily: 'monospace', fontSize: '0.75rem' }}>\n {ann.details.parentHierarchy.map((parent, i) => (\n <span key={i} style={{ color: '#a78bfa' }}>\n {i > 0 && ' \u2192 '}\n {parent}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Child components */}\n {ann.details.childComponents.length > 0 && (\n <div style={{ marginBottom: '12px' }}>\n <div style={{ color: '#10b981', fontWeight: 'bold', marginBottom: '4px' }}>\n Child Components ({ann.details.childComponents.length})\n </div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '6px' }}>\n {ann.details.childComponents.map((child, i) => (\n <span\n key={i}\n style={{\n backgroundColor: '#374151',\n padding: '2px 8px',\n borderRadius: '4px',\n fontFamily: 'monospace',\n fontSize: '0.75rem',\n color: '#34d399',\n }}\n >\n {child.name}\n {child.count > 1 && ` \u00D7${child.count}`}\n {child.hasChildren && ' \u25BE'}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Attributes */}\n {Object.keys(ann.details.elementInfo.attributes).length > 0 && (\n <div>\n <div style={{ color: '#10b981', fontWeight: 'bold', marginBottom: '4px' }}>\n Attributes\n </div>\n <div style={{ fontFamily: 'monospace', fontSize: '0.75rem' }}>\n {Object.entries(ann.details.elementInfo.attributes).map(([key, value]) => (\n <div key={key} style={{ color: '#fbbf24' }}>\n {key}=\"{value}\"\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n })\n )}\n </div>\n </div>\n </div>\n );\n}\n", "import React, { Component, ReactNode } from 'react';\n\n/**\n * Error information passed to fallback components\n */\nexport interface ErrorInfo {\n error: Error;\n errorInfo: React.ErrorInfo;\n /** Formatted error message for copying/display */\n formattedError: string;\n /** Reset the error state and retry rendering */\n reset: () => void;\n}\n\n/**\n * Props for custom fallback component\n */\nexport interface FallbackProps extends ErrorInfo {\n /** Copy error details to clipboard */\n copyToClipboard: () => Promise<void>;\n}\n\n/**\n * Button configuration for default error UI\n */\nexport interface ErrorButtonConfig {\n /** Button label text */\n label: string;\n /** Click handler */\n onClick: (errorInfo: ErrorInfo) => void;\n /** Optional button style override */\n style?: React.CSSProperties;\n /** Optional className */\n className?: string;\n}\n\n/**\n * Props for ErrorBoundary component\n */\nexport interface ErrorBoundaryProps {\n children: ReactNode;\n \n /**\n * Custom fallback component to render when error occurs.\n * Takes full control of error UI.\n */\n fallback?: React.ComponentType<FallbackProps>;\n \n /**\n * Fallback element (simpler alternative to fallback component)\n */\n fallbackElement?: ReactNode;\n \n /**\n * Custom title for default error page\n * @default \"Something went wrong\"\n */\n title?: string;\n \n /**\n * Custom subtitle/description for default error page\n * @default \"An unexpected error occurred\"\n */\n subtitle?: string;\n \n /**\n * Whether to show error details in default UI\n * @default true\n */\n showErrorDetails?: boolean;\n \n /**\n * Whether to show the \"Copy Error\" button in default UI\n * @default true\n */\n showCopyButton?: boolean;\n \n /**\n * Whether to show the \"Try Again\" button in default UI\n * @default true\n */\n showRetryButton?: boolean;\n \n /**\n * Custom retry button label\n * @default \"Try Again\"\n */\n retryButtonLabel?: string;\n \n /**\n * Custom copy button label\n * @default \"Copy Error Details\"\n */\n copyButtonLabel?: string;\n \n /**\n * Additional custom buttons to show in default UI\n */\n customButtons?: ErrorButtonConfig[];\n \n /**\n * Custom styles for the default error container\n */\n containerStyle?: React.CSSProperties;\n \n /**\n * Custom styles for the error details section\n */\n errorDetailsStyle?: React.CSSProperties;\n \n /**\n * Callback when an error is caught\n */\n onError?: (error: Error, errorInfo: React.ErrorInfo) => void;\n \n /**\n * Callback when reset/retry is triggered\n */\n onReset?: () => void;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n errorInfo: React.ErrorInfo | null;\n copied: boolean;\n}\n\n/**\n * Default styles for the error boundary UI\n */\nconst defaultStyles = {\n container: {\n display: 'flex',\n flexDirection: 'column' as const,\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '100vh',\n padding: '24px',\n backgroundColor: '#1e1e1e',\n color: '#e5e7eb',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n },\n content: {\n maxWidth: '600px',\n width: '100%',\n textAlign: 'center' as const,\n },\n icon: {\n fontSize: '48px',\n marginBottom: '16px',\n },\n title: {\n fontSize: '24px',\n fontWeight: 600,\n marginBottom: '8px',\n color: '#f87171',\n },\n subtitle: {\n fontSize: '16px',\n color: '#9ca3af',\n marginBottom: '24px',\n },\n errorBox: {\n backgroundColor: '#2d2d2d',\n border: '1px solid #404040',\n borderRadius: '8px',\n padding: '16px',\n marginBottom: '24px',\n textAlign: 'left' as const,\n maxHeight: '200px',\n overflow: 'auto',\n },\n errorText: {\n fontFamily: 'monospace',\n fontSize: '12px',\n color: '#f87171',\n whiteSpace: 'pre-wrap' as const,\n wordBreak: 'break-word' as const,\n margin: 0,\n },\n buttonContainer: {\n display: 'flex',\n gap: '12px',\n justifyContent: 'center',\n flexWrap: 'wrap' as const,\n },\n button: {\n padding: '10px 20px',\n borderRadius: '6px',\n border: 'none',\n fontSize: '14px',\n fontWeight: 500,\n cursor: 'pointer',\n transition: 'all 0.2s',\n },\n primaryButton: {\n backgroundColor: '#3b82f6',\n color: 'white',\n },\n secondaryButton: {\n backgroundColor: '#404040',\n color: '#e5e7eb',\n },\n successButton: {\n backgroundColor: '#22c55e',\n color: 'white',\n },\n};\n\n/**\n * ErrorBoundary component with customizable error UI\n * \n * @example Basic usage\n * ```tsx\n * <ErrorBoundary>\n * <App />\n * </ErrorBoundary>\n * ```\n * \n * @example Custom title and buttons\n * ```tsx\n * <ErrorBoundary\n * title=\"Oops! Something broke\"\n * subtitle=\"Please try again or contact support\"\n * showCopyButton={true}\n * customButtons={[\n * { label: \"Go Home\", onClick: () => window.location.href = \"/\" }\n * ]}\n * >\n * <App />\n * </ErrorBoundary>\n * ```\n * \n * @example Fully custom fallback\n * ```tsx\n * <ErrorBoundary\n * fallback={({ error, reset, copyToClipboard }) => (\n * <div>\n * <h1>Error: {error.message}</h1>\n * <button onClick={reset}>Retry</button>\n * <button onClick={copyToClipboard}>Copy</button>\n * </div>\n * )}\n * >\n * <App />\n * </ErrorBoundary>\n * ```\n */\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {\n hasError: false,\n error: null,\n errorInfo: null,\n copied: false,\n };\n }\n\n static getDerivedStateFromError(error: Error): Partial<ErrorBoundaryState> {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n this.setState({ errorInfo });\n this.props.onError?.(error, errorInfo);\n }\n\n private formatError(): string {\n const { error, errorInfo } = this.state;\n if (!error) return '';\n\n const lines: string[] = [\n '='.repeat(50),\n 'ERROR REPORT',\n '='.repeat(50),\n '',\n `Error: ${error.name}`,\n `Message: ${error.message}`,\n '',\n 'Stack Trace:',\n error.stack || 'No stack trace available',\n ];\n\n if (errorInfo?.componentStack) {\n lines.push('', 'Component Stack:', errorInfo.componentStack);\n }\n\n lines.push('', `Timestamp: ${new Date().toISOString()}`);\n lines.push(`User Agent: ${typeof navigator !== 'undefined' ? navigator.userAgent : 'N/A'}`);\n\n return lines.join('\\n');\n }\n\n private handleReset = () => {\n this.props.onReset?.();\n this.setState({\n hasError: false,\n error: null,\n errorInfo: null,\n copied: false,\n });\n };\n\n private handleCopyToClipboard = async () => {\n const text = this.formatError();\n try {\n await navigator.clipboard.writeText(text);\n this.setState({ copied: true });\n setTimeout(() => this.setState({ copied: false }), 2000);\n } catch (err) {\n console.error('Failed to copy error details:', err);\n }\n };\n\n private getErrorInfo(): ErrorInfo {\n return {\n error: this.state.error!,\n errorInfo: this.state.errorInfo!,\n formattedError: this.formatError(),\n reset: this.handleReset,\n };\n }\n\n private renderDefaultFallback() {\n const {\n title = 'Something went wrong',\n subtitle = 'An unexpected error occurred',\n showErrorDetails = true,\n showCopyButton = true,\n showRetryButton = true,\n retryButtonLabel = 'Try Again',\n copyButtonLabel = 'Copy Error Details',\n customButtons = [],\n containerStyle,\n errorDetailsStyle,\n } = this.props;\n\n const { error, copied } = this.state;\n const errorInfo = this.getErrorInfo();\n\n return (\n <div style={{ ...defaultStyles.container, ...containerStyle }}>\n <div style={defaultStyles.content}>\n <div style={defaultStyles.icon}>\u26A0\uFE0F</div>\n <h1 style={defaultStyles.title}>{title}</h1>\n <p style={defaultStyles.subtitle}>{subtitle}</p>\n\n {showErrorDetails && error && (\n <div style={{ ...defaultStyles.errorBox, ...errorDetailsStyle }}>\n <pre style={defaultStyles.errorText}>\n {error.name}: {error.message}\n {error.stack && `\\n\\n${error.stack.split('\\n').slice(1, 5).join('\\n')}`}\n </pre>\n </div>\n )}\n\n <div style={defaultStyles.buttonContainer}>\n {showRetryButton && (\n <button\n onClick={this.handleReset}\n style={{ ...defaultStyles.button, ...defaultStyles.primaryButton }}\n >\n {retryButtonLabel}\n </button>\n )}\n\n {showCopyButton && (\n <button\n onClick={this.handleCopyToClipboard}\n style={{\n ...defaultStyles.button,\n ...(copied ? defaultStyles.successButton : defaultStyles.secondaryButton),\n }}\n >\n {copied ? '\u2713 Copied!' : copyButtonLabel}\n </button>\n )}\n\n {customButtons.map((btn, index) => (\n <button\n key={index}\n onClick={() => btn.onClick(errorInfo)}\n style={{ ...defaultStyles.button, ...defaultStyles.secondaryButton, ...btn.style }}\n className={btn.className}\n >\n {btn.label}\n </button>\n ))}\n </div>\n </div>\n </div>\n );\n }\n\n render() {\n const { hasError } = this.state;\n const { children, fallback: FallbackComponent, fallbackElement } = this.props;\n\n if (hasError) {\n // Custom fallback component takes priority\n if (FallbackComponent) {\n const errorInfo = this.getErrorInfo();\n return (\n <FallbackComponent\n {...errorInfo}\n copyToClipboard={this.handleCopyToClipboard}\n />\n );\n }\n\n // Simple fallback element\n if (fallbackElement) {\n return <>{fallbackElement}</>;\n }\n\n // Default error UI\n return this.renderDefaultFallback();\n }\n\n return children;\n }\n}\n\nexport default ErrorBoundary;\n", "/**\n * Platform detection utilities for cross-platform support\n */\n\n// Check if we're running in a web environment\nexport const isWeb = typeof document !== 'undefined' && typeof window !== 'undefined';\n\n// Check if we're running in React Native\n// We check for the absence of DOM and presence of native-specific globals\nexport const isNative = !isWeb && typeof global !== 'undefined';\n\n// Get the current platform\nexport type PlatformType = 'web' | 'ios' | 'android' | 'native';\n\nexport function getPlatform(): PlatformType {\n if (isWeb) return 'web';\n \n // In React Native, we need to dynamically check Platform\n try {\n // This will only work in React Native environment\n const { Platform } = require('react-native');\n if (Platform.OS === 'ios') return 'ios';\n if (Platform.OS === 'android') return 'android';\n return 'native';\n } catch {\n return 'native';\n }\n}\n\n// Check if running in Tauri environment (web only)\nexport function isTauriEnv(): boolean {\n return isWeb && typeof window !== 'undefined' && '__TAURI_INTERNALS__' in window;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["AgentAnnotationProvider", "isTauriEnv", "import_react", "import_react", "import_jsx_runtime", "import_lucide_react", "import_react", "import_react", "import_jsx_runtime", "html2canvas", "key", "import_jsx_runtime", "import_react", "import_lucide_react", "import_jsx_runtime", "import_jsx_runtime", "import_react", "import_jsx_runtime", "isTauriEnv", "import_jsx_runtime", "AgentAnnotationProvider"]
|
|
7
7
|
}
|