skema-core 2.1.1 → 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tools/LassoSelectTool.ts","../src/hooks/useDaemon.ts","../src/utils/coordinates.ts","../src/utils/element-identification.ts","../src/lib/utils.ts","../src/components/toolbar/ToolbarIcons.tsx","../src/components/toolbar/ShapePicker.tsx","../src/components/toolbar/SkemaToolbar.tsx","../src/components/annotations/AnnotationMarker.tsx","../src/components/annotations/AnnotationsSidebar.tsx","../src/components/overlays/SelectionOverlay.tsx","../src/components/overlays/ProcessingOverlay.tsx","../src/components/AnnotationPopup.tsx","../src/assets/logo-dark.ts","../src/assets/logo-light.ts","../src/components/settings/SettingsPanel.tsx","../src/hooks/useKeyboardShortcuts.ts","../src/hooks/useScrollSync.ts","../src/hooks/useShapePersistence.ts","../src/utils/gesture-recognizer.ts","../src/hooks/useScribbleDelete.ts","../src/components/overlays/LassoOverlay.tsx","../src/lib/tldrawConfig.ts","../src/components/Skema.tsx"],"names":["StateNode","atom","Box","useState","useRef","useCallback","options","useEffect","jsxs","jsx","useEditor","GeoShapeGeoStyle","motion","AnimatePresence","useTools","useIsToolSelected","Fragment","forwardRef","AnnotationPopup","useImperativeHandle","svg","useValue","useMemo","TldrawOverlays","DefaultColorThemePalette","domElement","ArrowShapeKindStyle","Tldraw"],"mappings":"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","file":"index.js","sourcesContent":["// =============================================================================\n// Lasso Select Tool - Freehand selection for DOM elements\n// Based on https://tldraw.dev/examples/lasso-select-tool\n// =============================================================================\n\nimport {\n StateNode,\n TLEventHandlers,\n TLPointerEventInfo,\n TLShapeId,\n atom,\n Atom,\n VecModel,\n Box,\n} from 'tldraw';\n\n/**\n * Idle state - waiting for user to start drawing lasso\n */\nclass IdleState extends StateNode {\n static override id = 'idle';\n\n override onPointerDown: TLEventHandlers['onPointerDown'] = (info) => {\n this.parent.transition('lassoing', info);\n };\n\n override onCancel: TLEventHandlers['onCancel'] = () => {\n this.editor.setCurrentTool('select');\n };\n}\n\n// Callback types\ntype OnClearSelectionsCallback = () => void;\ntype OnLassoCompleteCallback = (points: VecModel[]) => void;\n\n/**\n * Lassoing state - user is actively drawing the lasso\n */\nexport class LassoingState extends StateNode {\n static override id = 'lassoing';\n\n // Reactive atom to store lasso points for rendering\n points: Atom<VecModel[]> = atom('lasso points', []);\n \n // Track starting point to detect clicks vs drags\n startPoint: VecModel | null = null;\n\n override onEnter = (info: TLPointerEventInfo) => {\n const { currentPagePoint } = this.editor.inputs;\n this.startPoint = { x: currentPagePoint.x, y: currentPagePoint.y };\n this.points.set([{ x: currentPagePoint.x, y: currentPagePoint.y }]);\n };\n\n override onPointerMove: TLEventHandlers['onPointerMove'] = () => {\n const { currentPagePoint } = this.editor.inputs;\n const currentPoints = this.points.get();\n \n // Add point if it's far enough from the last point\n const lastPoint = currentPoints[currentPoints.length - 1];\n if (lastPoint) {\n const dx = currentPagePoint.x - lastPoint.x;\n const dy = currentPagePoint.y - lastPoint.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n \n // Only add point if moved at least 3 pixels\n if (dist > 3) {\n this.points.set([...currentPoints, { x: currentPagePoint.x, y: currentPagePoint.y }]);\n }\n }\n };\n\n override onPointerUp: TLEventHandlers['onPointerUp'] = () => {\n this.complete();\n };\n\n override onCancel: TLEventHandlers['onCancel'] = () => {\n this.cancel();\n };\n\n override onComplete: TLEventHandlers['onComplete'] = () => {\n this.complete();\n };\n\n private complete() {\n const points = this.points.get();\n const { currentPagePoint } = this.editor.inputs;\n \n // Check if this was a click (minimal movement from start)\n if (this.startPoint) {\n const dx = currentPagePoint.x - this.startPoint.x;\n const dy = currentPagePoint.y - this.startPoint.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n \n // If moved less than 10 pixels, treat as a click to deselect\n if (dist < 10 || points.length < 3) {\n // Clear tldraw selections\n this.editor.setSelectedShapes([]);\n // Signal to clear DOM selections via the tool's callback\n const tool = this.parent as LassoSelectTool;\n tool.onClearSelections?.();\n \n this.points.set([]);\n this.startPoint = null;\n this.parent.transition('idle');\n return;\n }\n }\n \n if (points.length > 2) {\n // Find shapes that intersect with the lasso\n this.selectShapesInLasso(points);\n \n // Signal to select DOM elements via the tool's callback\n const tool = this.parent as LassoSelectTool;\n tool.onLassoComplete?.(points);\n }\n \n this.points.set([]);\n this.startPoint = null;\n this.parent.transition('idle');\n }\n\n private cancel() {\n this.points.set([]);\n this.startPoint = null;\n this.parent.transition('idle');\n }\n\n /**\n * Select shapes that intersect with the lasso area (any overlap counts)\n */\n private selectShapesInLasso(points: VecModel[]) {\n // Get all shapes on the page\n const allShapes = this.editor.getCurrentPageShapes();\n \n if (allShapes.length === 0) {\n return;\n }\n\n // Get the bounding box of the lasso\n let minX = Infinity, minY = Infinity;\n let maxX = -Infinity, maxY = -Infinity;\n for (const p of points) {\n minX = Math.min(minX, p.x);\n minY = Math.min(minY, p.y);\n maxX = Math.max(maxX, p.x);\n maxY = Math.max(maxY, p.y);\n }\n\n const selectedIds: TLShapeId[] = [];\n\n for (const shape of allShapes) {\n const shapeBounds = this.editor.getShapePageBounds(shape.id);\n if (!shapeBounds) continue;\n \n // Select if bounding boxes overlap at all (any intersection)\n const boundsOverlap = !(\n shapeBounds.x > maxX ||\n shapeBounds.x + shapeBounds.width < minX ||\n shapeBounds.y > maxY ||\n shapeBounds.y + shapeBounds.height < minY\n );\n \n if (boundsOverlap) {\n selectedIds.push(shape.id);\n }\n }\n \n if (selectedIds.length > 0) {\n this.editor.setSelectedShapes(selectedIds);\n }\n }\n\n /**\n * Ray casting algorithm to check if a point is inside a polygon\n */\n private isPointInPolygon(point: VecModel, polygon: VecModel[]): boolean {\n let inside = false;\n const n = polygon.length;\n\n for (let i = 0, j = n - 1; i < n; j = i++) {\n const xi = polygon[i].x;\n const yi = polygon[i].y;\n const xj = polygon[j].x;\n const yj = polygon[j].y;\n\n const intersect =\n yi > point.y !== yj > point.y &&\n point.x < ((xj - xi) * (point.y - yi)) / (yj - yi) + xi;\n\n if (intersect) {\n inside = !inside;\n }\n }\n\n return inside;\n }\n\n /**\n * Get the bounding box of the lasso in page coordinates\n */\n getLassoBounds(): Box | null {\n const points = this.points.get();\n if (points.length < 2) return null;\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for (const point of points) {\n minX = Math.min(minX, point.x);\n minY = Math.min(minY, point.y);\n maxX = Math.max(maxX, point.x);\n maxY = Math.max(maxY, point.y);\n }\n\n return new Box(minX, minY, maxX - minX, maxY - minY);\n }\n}\n\n/**\n * Lasso Select Tool - allows freehand drawing to select shapes\n */\nexport class LassoSelectTool extends StateNode {\n static override id = 'lasso-select';\n static override initial = 'idle';\n static override children = () => [IdleState, LassoingState];\n \n // Callback to clear DOM selections (set by Skema component)\n onClearSelections: OnClearSelectionsCallback | null = null;\n \n // Callback when lasso selection completes (set by Skema component)\n onLassoComplete: OnLassoCompleteCallback | null = null;\n \n /**\n * Set callback for clearing DOM selections\n */\n setOnClearSelections(callback: OnClearSelectionsCallback) {\n this.onClearSelections = callback;\n }\n \n /**\n * Set callback for when lasso selection completes\n */\n setOnLassoComplete(callback: OnLassoCompleteCallback) {\n this.onLassoComplete = callback;\n }\n}\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport type { Annotation } from '../types';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type ProviderName = 'gemini' | 'claude';\nexport type ExecutionMode = 'direct-cli' | 'mcp';\n\nexport interface ProviderStatus {\n installed: boolean;\n authorized: boolean;\n message: string;\n}\n\nexport interface AnnotationCounts {\n pending: number;\n acknowledged: number;\n resolved: number;\n dismissed: number;\n}\n\nexport interface DaemonState {\n connected: boolean;\n provider: ProviderName;\n mode: ExecutionMode;\n availableProviders: ProviderName[];\n availableModes: ExecutionMode[];\n providerStatus: Record<ProviderName, ProviderStatus>;\n cwd: string;\n mcpServerConnected: boolean;\n mcpClientName: string | null;\n annotationCounts: AnnotationCounts;\n}\n\nexport interface AIStreamEvent {\n type: 'init' | 'text' | 'tool_use' | 'tool_result' | 'error' | 'done' | 'debug';\n content?: string;\n timestamp: string;\n provider: ProviderName;\n raw?: unknown;\n}\n\nexport interface GenerateOptions {\n /** Override execution mode for this request */\n mode?: ExecutionMode;\n /** Override provider for this request */\n provider?: ProviderName;\n}\n\nexport interface UseDaemonOptions {\n /** WebSocket URL (default: ws://localhost:9999) */\n url?: string;\n /** Auto-connect on mount (default: true) */\n autoConnect?: boolean;\n /** Reconnect on disconnect (default: true) */\n autoReconnect?: boolean;\n /** Reconnect delay in ms (default: 2000) */\n reconnectDelay?: number;\n}\n\nexport interface UseDaemonReturn {\n /** Current daemon state */\n state: DaemonState;\n /** Whether currently generating */\n isGenerating: boolean;\n /** Last error message */\n error: string | null;\n /** Connect to daemon */\n connect: () => void;\n /** Disconnect from daemon */\n disconnect: () => void;\n /** Switch AI provider */\n setProvider: (provider: ProviderName) => Promise<boolean>;\n /** Switch execution mode */\n setMode: (mode: ExecutionMode) => Promise<boolean>;\n /** Refresh provider status from daemon */\n refreshProviderStatus: () => Promise<void>;\n /** Generate code from annotation (streaming) */\n generate: (\n annotation: Partial<Annotation> & { comment?: string },\n onEvent?: (event: AIStreamEvent) => void,\n options?: GenerateOptions\n ) => Promise<{ success: boolean; annotationId: string }>;\n /** Revert changes for an annotation */\n revert: (annotationId: string) => Promise<{ success: boolean; message: string }>;\n /** Read a file */\n readFile: (path: string) => Promise<string>;\n /** Write a file */\n writeFile: (path: string, content: string) => Promise<boolean>;\n /** Run a command */\n runCommand: (command: string) => Promise<{ stdout: string; stderr: string; exitCode: number }>;\n}\n\n// =============================================================================\n// Hook Implementation\n// =============================================================================\n\nexport function useDaemon(options: UseDaemonOptions = {}): UseDaemonReturn {\n const {\n url = 'ws://localhost:9999',\n autoConnect = true,\n autoReconnect = true,\n reconnectDelay = 2000,\n } = options;\n\n const defaultProviderStatus: Record<ProviderName, ProviderStatus> = {\n gemini: { installed: false, authorized: false, message: 'Checking...' },\n claude: { installed: false, authorized: false, message: 'Checking...' },\n };\n\n const [state, setState] = useState<DaemonState>({\n connected: false,\n provider: 'gemini',\n mode: 'direct-cli',\n availableProviders: [],\n availableModes: ['direct-cli', 'mcp'],\n providerStatus: defaultProviderStatus,\n cwd: '',\n mcpServerConnected: false,\n mcpClientName: null,\n annotationCounts: { pending: 0, acknowledged: 0, resolved: 0, dismissed: 0 },\n });\n const [isGenerating, setIsGenerating] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const wsRef = useRef<WebSocket | null>(null);\n const pendingRequests = useRef<Map<string, { resolve: (value: any) => void; reject: (error: any) => void }>>(new Map());\n const eventCallbacks = useRef<Map<string, (event: AIStreamEvent) => void>>(new Map());\n const reconnectTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const messageIdRef = useRef(0);\n\n // Generate unique message ID\n const nextId = useCallback(() => {\n messageIdRef.current += 1;\n return `msg-${messageIdRef.current}-${Date.now()}`;\n }, []);\n\n // Send message and wait for response\n const sendRequest = useCallback(<T>(type: string, payload: Record<string, unknown> = {}): Promise<T> => {\n return new Promise((resolve, reject) => {\n if (!wsRef.current || wsRef.current.readyState !== WebSocket.OPEN) {\n reject(new Error('Not connected to daemon'));\n return;\n }\n\n const id = nextId();\n pendingRequests.current.set(id, { resolve, reject });\n\n wsRef.current.send(JSON.stringify({ id, type, ...payload }));\n\n // Timeout after 30 seconds\n setTimeout(() => {\n if (pendingRequests.current.has(id)) {\n pendingRequests.current.delete(id);\n reject(new Error('Request timeout'));\n }\n }, 30000);\n });\n }, [nextId]);\n\n // Handle incoming messages\n const handleMessage = useCallback((event: MessageEvent) => {\n try {\n const msg = JSON.parse(event.data);\n\n // Handle initial connection state\n if (msg.type === 'connected') {\n setState((prev) => ({\n ...prev,\n connected: true,\n provider: msg.provider || prev.provider,\n mode: msg.mode || prev.mode,\n availableProviders: msg.availableProviders || prev.availableProviders,\n availableModes: msg.availableModes || prev.availableModes,\n providerStatus: msg.providerStatus || prev.providerStatus,\n cwd: msg.cwd || prev.cwd,\n mcpServerConnected: msg.mcpServerConnected ?? prev.mcpServerConnected,\n mcpClientName: msg.mcpClientName !== undefined ? msg.mcpClientName : prev.mcpClientName,\n }));\n setError(null);\n return;\n }\n\n // Handle provider status update\n if (msg.type === 'provider-statuses') {\n setState((prev) => ({\n ...prev,\n providerStatus: msg.providerStatus || prev.providerStatus,\n }));\n return;\n }\n\n // Handle streaming AI events\n if (msg.type === 'ai-event' && msg.id) {\n const callback = eventCallbacks.current.get(msg.id);\n if (callback) {\n callback(msg.event);\n }\n return;\n }\n\n // Handle generate complete\n if (msg.type === 'generate-complete' && msg.id) {\n const pending = pendingRequests.current.get(msg.id);\n if (pending) {\n pendingRequests.current.delete(msg.id);\n eventCallbacks.current.delete(msg.id);\n pending.resolve({ success: msg.success, annotationId: msg.annotationId });\n }\n setIsGenerating(false);\n return;\n }\n\n // Handle MCP mode: annotation queued (not processed immediately)\n if (msg.type === 'annotation-queued' && msg.id) {\n const pending = pendingRequests.current.get(msg.id);\n if (pending) {\n pendingRequests.current.delete(msg.id);\n eventCallbacks.current.delete(msg.id);\n pending.resolve({ success: true, annotationId: msg.annotationId, queued: true });\n }\n setIsGenerating(false);\n return;\n }\n\n // Handle MCP annotation status changes (broadcast from daemon)\n if (msg.type === 'annotation-status-changed') {\n // This is a broadcast - no pending request to resolve\n // Components can listen for this via state updates\n return;\n }\n\n // Handle MCP server connection status\n if (msg.type === 'mcp-server-status') {\n setState((prev) => ({\n ...prev,\n mcpServerConnected: msg.connected,\n mcpClientName: msg.clientName !== undefined ? msg.clientName : prev.mcpClientName,\n }));\n return;\n }\n\n // Handle MCP annotation count updates\n if (msg.type === 'mcp-annotation-counts') {\n setState((prev) => ({\n ...prev,\n annotationCounts: msg.counts,\n }));\n return;\n }\n\n // Handle provider change\n if (msg.type === 'provider-changed') {\n setState((prev) => ({ ...prev, provider: msg.provider }));\n }\n\n // Handle mode change\n if (msg.type === 'mode-changed') {\n setState((prev) => ({ ...prev, mode: msg.mode }));\n }\n\n // Handle errors\n if (msg.type === 'error' && msg.id) {\n const pending = pendingRequests.current.get(msg.id);\n if (pending) {\n pendingRequests.current.delete(msg.id);\n eventCallbacks.current.delete(msg.id);\n pending.reject(new Error(msg.error));\n }\n setIsGenerating(false);\n return;\n }\n\n // Handle other responses with ID\n if (msg.id) {\n const pending = pendingRequests.current.get(msg.id);\n if (pending) {\n pendingRequests.current.delete(msg.id);\n pending.resolve(msg);\n }\n }\n } catch (e) {\n console.error('[useDaemon] Failed to parse message:', e);\n }\n }, []);\n\n // Connect to daemon\n const connect = useCallback(() => {\n if (wsRef.current?.readyState === WebSocket.OPEN) return;\n\n // Clear any pending reconnect\n if (reconnectTimeoutRef.current) {\n clearTimeout(reconnectTimeoutRef.current);\n reconnectTimeoutRef.current = null;\n }\n\n try {\n const ws = new WebSocket(url);\n\n ws.onopen = () => {\n console.log('[useDaemon] Connected to daemon');\n };\n\n ws.onmessage = handleMessage;\n\n ws.onclose = () => {\n console.log('[useDaemon] Disconnected from daemon');\n setState((prev) => ({ ...prev, connected: false }));\n wsRef.current = null;\n\n // Auto-reconnect\n if (autoReconnect) {\n reconnectTimeoutRef.current = setTimeout(() => {\n console.log('[useDaemon] Attempting to reconnect...');\n connect();\n }, reconnectDelay);\n }\n };\n\n ws.onerror = (e) => {\n console.error('[useDaemon] WebSocket error:', e);\n setError('Failed to connect to Skema daemon. Is it running?');\n };\n\n wsRef.current = ws;\n } catch (e) {\n console.error('[useDaemon] Failed to create WebSocket:', e);\n setError('Failed to connect to Skema daemon');\n }\n }, [url, autoReconnect, reconnectDelay, handleMessage]);\n\n // Disconnect from daemon\n const disconnect = useCallback(() => {\n if (reconnectTimeoutRef.current) {\n clearTimeout(reconnectTimeoutRef.current);\n reconnectTimeoutRef.current = null;\n }\n\n if (wsRef.current) {\n wsRef.current.close();\n wsRef.current = null;\n }\n\n setState((prev) => ({ ...prev, connected: false }));\n }, []);\n\n // Switch AI provider\n const setProvider = useCallback(async (provider: ProviderName): Promise<boolean> => {\n try {\n const response = await sendRequest<{ type: string; provider: ProviderName }>('set-provider', { provider });\n return response.type === 'provider-changed';\n } catch (e) {\n console.error('[useDaemon] Failed to set provider:', e);\n return false;\n }\n }, [sendRequest]);\n\n // Switch execution mode\n const setMode = useCallback(async (mode: ExecutionMode): Promise<boolean> => {\n try {\n const response = await sendRequest<{ type: string; mode: ExecutionMode }>('set-mode', { mode });\n return response.type === 'mode-changed';\n } catch (e) {\n console.error('[useDaemon] Failed to set mode:', e);\n return false;\n }\n }, [sendRequest]);\n\n // Refresh provider status from daemon\n const refreshProviderStatus = useCallback(async () => {\n try {\n await sendRequest('check-providers', {});\n } catch (e) {\n console.error('[useDaemon] Failed to refresh provider status:', e);\n }\n }, [sendRequest]);\n\n // Generate code from annotation\n const generate = useCallback(async (\n annotation: Partial<Annotation> & { comment?: string },\n onEvent?: (event: AIStreamEvent) => void,\n options?: GenerateOptions\n ): Promise<{ success: boolean; annotationId: string }> => {\n const id = nextId();\n\n if (onEvent) {\n eventCallbacks.current.set(id, onEvent);\n }\n\n setIsGenerating(true);\n\n return new Promise((resolve, reject) => {\n if (!wsRef.current || wsRef.current.readyState !== WebSocket.OPEN) {\n setIsGenerating(false);\n reject(new Error('Not connected to daemon'));\n return;\n }\n\n pendingRequests.current.set(id, { resolve, reject });\n\n wsRef.current.send(JSON.stringify({\n id,\n type: 'generate',\n annotation,\n // Include optional overrides\n ...(options?.mode && { mode: options.mode }),\n ...(options?.provider && { provider: options.provider }),\n }));\n });\n }, [nextId]);\n\n // Revert changes\n const revert = useCallback(async (annotationId: string): Promise<{ success: boolean; message: string }> => {\n const response = await sendRequest<{ success: boolean; message: string }>('revert', { annotationId });\n return { success: response.success, message: response.message || '' };\n }, [sendRequest]);\n\n // Read file\n const readFile = useCallback(async (path: string): Promise<string> => {\n const response = await sendRequest<{ content: string }>('read-file', { path });\n return response.content;\n }, [sendRequest]);\n\n // Write file\n const writeFile = useCallback(async (path: string, content: string): Promise<boolean> => {\n const response = await sendRequest<{ type: string }>('write-file', { path, content });\n return response.type === 'write-success';\n }, [sendRequest]);\n\n // Run command\n const runCommand = useCallback(async (command: string): Promise<{ stdout: string; stderr: string; exitCode: number }> => {\n const response = await sendRequest<{ stdout: string; stderr: string; exitCode: number }>('run-command', { command });\n return {\n stdout: response.stdout || '',\n stderr: response.stderr || '',\n exitCode: response.exitCode ?? 0,\n };\n }, [sendRequest]);\n\n // Auto-connect on mount\n useEffect(() => {\n if (autoConnect) {\n connect();\n }\n\n return () => {\n disconnect();\n };\n }, [autoConnect, connect, disconnect]);\n\n return {\n state,\n isGenerating,\n error,\n connect,\n disconnect,\n setProvider,\n setMode,\n refreshProviderStatus,\n generate,\n revert,\n readFile,\n writeFile,\n runCommand,\n };\n}\n","// =============================================================================\n// Coordinate System Utilities\n// =============================================================================\n\nimport type { BoundingBox, ViewportInfo } from '../types';\n\n/**\n * Gets current viewport information\n */\nexport function getViewportInfo(): ViewportInfo {\n if (typeof window === 'undefined') {\n return { width: 0, height: 0, scrollX: 0, scrollY: 0 };\n }\n \n return {\n width: window.innerWidth,\n height: window.innerHeight,\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n };\n}\n\n/**\n * Converts viewport-relative coordinates to document coordinates\n */\nexport function viewportToDocument(\n x: number,\n y: number,\n viewport: ViewportInfo = getViewportInfo()\n): { x: number; y: number } {\n return {\n x: x + viewport.scrollX,\n y: y + viewport.scrollY,\n };\n}\n\n/**\n * Converts document coordinates to viewport-relative coordinates\n */\nexport function documentToViewport(\n x: number,\n y: number,\n viewport: ViewportInfo = getViewportInfo()\n): { x: number; y: number } {\n return {\n x: x - viewport.scrollX,\n y: y - viewport.scrollY,\n };\n}\n\n/**\n * Converts a bounding box from viewport to document coordinates\n */\nexport function bboxViewportToDocument(\n bbox: BoundingBox,\n viewport: ViewportInfo = getViewportInfo()\n): BoundingBox {\n const { x, y } = viewportToDocument(bbox.x, bbox.y, viewport);\n return {\n x,\n y,\n width: bbox.width,\n height: bbox.height,\n };\n}\n\n/**\n * Converts a bounding box from document to viewport coordinates\n */\nexport function bboxDocumentToViewport(\n bbox: BoundingBox,\n viewport: ViewportInfo = getViewportInfo()\n): BoundingBox {\n const { x, y } = documentToViewport(bbox.x, bbox.y, viewport);\n return {\n x,\n y,\n width: bbox.width,\n height: bbox.height,\n };\n}\n\n/**\n * Checks if two bounding boxes intersect\n */\nexport function bboxIntersects(a: BoundingBox, b: BoundingBox): boolean {\n return !(\n a.x + a.width < b.x ||\n b.x + b.width < a.x ||\n a.y + a.height < b.y ||\n b.y + b.height < a.y\n );\n}\n\n/**\n * Checks if point is inside bounding box\n */\nexport function pointInBbox(x: number, y: number, bbox: BoundingBox): boolean {\n return (\n x >= bbox.x &&\n x <= bbox.x + bbox.width &&\n y >= bbox.y &&\n y <= bbox.y + bbox.height\n );\n}\n\n/**\n * Gets the center point of a bounding box\n */\nexport function bboxCenter(bbox: BoundingBox): { x: number; y: number } {\n return {\n x: bbox.x + bbox.width / 2,\n y: bbox.y + bbox.height / 2,\n };\n}\n\n/**\n * Expands a bounding box by a padding amount\n */\nexport function expandBbox(bbox: BoundingBox, padding: number): BoundingBox {\n return {\n x: bbox.x - padding,\n y: bbox.y - padding,\n width: bbox.width + padding * 2,\n height: bbox.height + padding * 2,\n };\n}\n\n/**\n * Creates a bounding box from two points\n */\nexport function bboxFromPoints(\n x1: number,\n y1: number,\n x2: number,\n y2: number\n): BoundingBox {\n return {\n x: Math.min(x1, x2),\n y: Math.min(y1, y2),\n width: Math.abs(x2 - x1),\n height: Math.abs(y2 - y1),\n };\n}\n","// =============================================================================\n// Element Identification Utilities\n// =============================================================================\n\nimport type { BoundingBox, DOMSelection, ElementStyles, NearbyElement, ProjectStyleContext } from '../types';\n\n/**\n * Generates a unique CSS selector for an element\n */\nexport function generateSelector(element: HTMLElement): string {\n // If element has an ID, use it\n if (element.id) {\n return `#${element.id}`;\n }\n\n // Build selector path\n const path: string[] = [];\n let current: HTMLElement | null = element;\n\n while (current && current !== document.body && current !== document.documentElement) {\n let selector = current.tagName.toLowerCase();\n\n // Add ID if present\n if (current.id) {\n selector = `#${current.id}`;\n path.unshift(selector);\n break;\n }\n\n // Add meaningful class names (filter out CSS module hashes)\n if (current.className && typeof current.className === 'string') {\n const meaningfulClasses = current.className\n .split(/\\s+/)\n .filter(c => c.length > 2 && !c.match(/^[a-z]{1,2}$/) && !c.match(/[A-Z0-9]{5,}/))\n .slice(0, 2);\n \n if (meaningfulClasses.length > 0) {\n selector += '.' + meaningfulClasses.join('.');\n }\n }\n\n // Add nth-child if needed for uniqueness\n const parent = current.parentElement;\n if (parent) {\n const siblings = Array.from(parent.children).filter(\n child => child.tagName === current!.tagName\n );\n if (siblings.length > 1) {\n const index = siblings.indexOf(current) + 1;\n selector += `:nth-child(${index})`;\n }\n }\n\n path.unshift(selector);\n current = current.parentElement;\n }\n\n return path.join(' > ');\n}\n\n/**\n * Gets a readable path for an element (e.g., \"article > section > p\")\n */\nexport function getElementPath(target: HTMLElement, maxDepth = 4): string {\n const parts: string[] = [];\n let current: HTMLElement | null = target;\n let depth = 0;\n\n while (current && depth < maxDepth) {\n const tag = current.tagName.toLowerCase();\n\n // Skip generic wrappers\n if (tag === 'html' || tag === 'body') break;\n\n // Get identifier\n let identifier = tag;\n if (current.id) {\n identifier = `#${current.id}`;\n } else if (current.className && typeof current.className === 'string') {\n const meaningfulClass = current.className\n .split(/\\s+/)\n .find(c => c.length > 2 && !c.match(/^[a-z]{1,2}$/) && !c.match(/[A-Z0-9]{5,}/));\n if (meaningfulClass) {\n identifier = `.${meaningfulClass.split('_')[0]}`;\n }\n }\n\n parts.unshift(identifier);\n current = current.parentElement;\n depth++;\n }\n\n return parts.join(' > ');\n}\n\n/**\n * Identifies an element and returns a human-readable name\n */\nexport function identifyElement(target: HTMLElement): string {\n const tag = target.tagName.toLowerCase();\n\n // Interactive elements\n if (tag === 'button') {\n const text = target.textContent?.trim();\n const ariaLabel = target.getAttribute('aria-label');\n if (ariaLabel) return `button [${ariaLabel}]`;\n return text ? `button \"${text.slice(0, 25)}\"` : 'button';\n }\n \n if (tag === 'a') {\n const text = target.textContent?.trim();\n const href = target.getAttribute('href');\n if (text) return `link \"${text.slice(0, 25)}\"`;\n if (href) return `link to ${href.slice(0, 30)}`;\n return 'link';\n }\n \n if (tag === 'input') {\n const type = target.getAttribute('type') || 'text';\n const placeholder = target.getAttribute('placeholder');\n const name = target.getAttribute('name');\n if (placeholder) return `input \"${placeholder}\"`;\n if (name) return `input [${name}]`;\n return `${type} input`;\n }\n\n // Headings\n if (['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(tag)) {\n const text = target.textContent?.trim();\n return text ? `${tag} \"${text.slice(0, 35)}\"` : tag;\n }\n\n // Text elements\n if (tag === 'p') {\n const text = target.textContent?.trim();\n if (text) return `paragraph: \"${text.slice(0, 40)}${text.length > 40 ? '...' : ''}\"`;\n return 'paragraph';\n }\n\n // Media\n if (tag === 'img') {\n const alt = target.getAttribute('alt');\n return alt ? `image \"${alt.slice(0, 30)}\"` : 'image';\n }\n\n // Containers\n if (['div', 'section', 'article', 'nav', 'header', 'footer', 'aside', 'main'].includes(tag)) {\n const className = target.className;\n const role = target.getAttribute('role');\n const ariaLabel = target.getAttribute('aria-label');\n\n if (ariaLabel) return `${tag} [${ariaLabel}]`;\n if (role) return role;\n\n if (typeof className === 'string' && className) {\n const words = className\n .split(/[\\s_-]+/)\n .map(c => c.replace(/[A-Z0-9]{5,}.*$/, ''))\n .filter(c => c.length > 2 && !/^[a-z]{1,2}$/.test(c))\n .slice(0, 2);\n if (words.length > 0) return words.join(' ');\n }\n\n return tag === 'div' ? 'container' : tag;\n }\n\n return tag;\n}\n\n/**\n * Gets bounding box for an element in document coordinates (includes scroll offset)\n */\nexport function getBoundingBox(element: HTMLElement): BoundingBox {\n const rect = element.getBoundingClientRect();\n return {\n x: rect.left + window.scrollX,\n y: rect.top + window.scrollY,\n width: rect.width,\n height: rect.height,\n };\n}\n\n/**\n * Gets CSS class names from an element (cleaned of module hashes)\n */\nexport function getElementClasses(target: HTMLElement): string {\n const className = target.className;\n if (typeof className !== 'string' || !className) return '';\n\n const classes = className\n .split(/\\s+/)\n .filter(c => c.length > 0)\n .map(c => {\n const match = c.match(/^([a-zA-Z][a-zA-Z0-9_-]*?)(?:_[a-zA-Z0-9]{5,})?$/);\n return match ? match[1] : c;\n })\n .filter((c, i, arr) => arr.indexOf(c) === i);\n\n return classes.join(', ');\n}\n\n/**\n * Creates a DOMSelection from an element\n */\nexport function createDOMSelection(element: HTMLElement): DOMSelection {\n return {\n id: `dom-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n selector: generateSelector(element),\n tagName: element.tagName.toLowerCase(),\n elementPath: getElementPath(element),\n text: element.textContent?.trim().slice(0, 100) || '',\n boundingBox: getBoundingBox(element),\n timestamp: Date.now(),\n pathname: typeof window !== 'undefined' ? window.location.pathname : '',\n cssClasses: getElementClasses(element) || undefined,\n attributes: getElementAttributes(element),\n };\n}\n\n/**\n * Gets relevant attributes from an element\n */\nfunction getElementAttributes(element: HTMLElement): Record<string, string> | undefined {\n const attrs: Record<string, string> = {};\n const relevantAttrs = ['id', 'href', 'src', 'alt', 'type', 'name', 'placeholder', 'role', 'aria-label'];\n \n for (const attr of relevantAttrs) {\n const value = element.getAttribute(attr);\n if (value) {\n attrs[attr] = value;\n }\n }\n \n return Object.keys(attrs).length > 0 ? attrs : undefined;\n}\n\n/**\n * Checks if an element should be ignored for DOM picking\n */\nexport function shouldIgnoreElement(element: HTMLElement): boolean {\n // Ignore Skema's own elements\n if (element.closest('[data-skema]')) return true;\n if (element.closest('.tl-container')) return true;\n\n // Ignore script and style tags\n const tag = element.tagName.toLowerCase();\n if (['script', 'style', 'noscript', 'meta', 'link'].includes(tag)) return true;\n\n // Ignore broad container elements (too broad for annotation)\n if (tag === 'section' || tag === 'main' || tag === 'body' || tag === 'html') return true;\n\n return false;\n}\n\n// =============================================================================\n// Style Extraction Utilities\n// =============================================================================\n\n/**\n * Extract computed styles from an element for style matching\n */\nexport function getComputedElementStyles(element: HTMLElement): ElementStyles {\n const computed = window.getComputedStyle(element);\n\n return {\n // Typography\n fontFamily: computed.fontFamily,\n fontSize: computed.fontSize,\n fontWeight: computed.fontWeight,\n lineHeight: computed.lineHeight,\n letterSpacing: computed.letterSpacing !== 'normal' ? computed.letterSpacing : undefined,\n textAlign: computed.textAlign !== 'start' ? computed.textAlign : undefined,\n color: computed.color,\n // Spacing\n padding: computed.padding !== '0px' ? computed.padding : undefined,\n margin: computed.margin !== '0px' ? computed.margin : undefined,\n gap: computed.gap !== 'normal' ? computed.gap : undefined,\n // Layout\n display: computed.display,\n flexDirection: computed.flexDirection !== 'row' ? computed.flexDirection : undefined,\n alignItems: computed.alignItems !== 'normal' ? computed.alignItems : undefined,\n justifyContent: computed.justifyContent !== 'normal' ? computed.justifyContent : undefined,\n // Visual\n backgroundColor: computed.backgroundColor !== 'rgba(0, 0, 0, 0)' ? computed.backgroundColor : undefined,\n borderRadius: computed.borderRadius !== '0px' ? computed.borderRadius : undefined,\n border: computed.border !== 'none' && computed.borderWidth !== '0px' ? computed.border : undefined,\n boxShadow: computed.boxShadow !== 'none' ? computed.boxShadow : undefined,\n // Sizing\n width: computed.width,\n height: computed.height,\n maxWidth: computed.maxWidth !== 'none' ? computed.maxWidth : undefined,\n };\n}\n\n/**\n * Extract Tailwind classes from an element's className\n */\nexport function extractTailwindClasses(element: HTMLElement): string[] | undefined {\n const className = element.className;\n if (typeof className !== 'string' || !className) return undefined;\n\n // Common Tailwind class patterns\n const tailwindPatterns = [\n /^(flex|grid|block|inline|hidden)$/,\n /^(flex|grid|items|justify|gap|space|p|m|px|py|mx|my|pt|pb|pl|pr|mt|mb|ml|mr)-/,\n /^(w|h|min-w|min-h|max-w|max-h)-/,\n /^(text|font|leading|tracking|bg|border|rounded|shadow|opacity)-/,\n /^(sm|md|lg|xl|2xl):/,\n /^(hover|focus|active|disabled):/,\n /^(dark|light):/,\n ];\n\n const classes = className.split(/\\s+/).filter(c =>\n tailwindPatterns.some(pattern => pattern.test(c))\n );\n\n return classes.length > 0 ? classes : undefined;\n}\n\n/**\n * Create a NearbyElement with computed styles\n */\nexport function createNearbyElement(element: HTMLElement): NearbyElement {\n return {\n selector: generateSelector(element),\n tagName: element.tagName.toLowerCase(),\n text: element.textContent?.trim().slice(0, 100),\n styles: getComputedElementStyles(element),\n tailwindClasses: extractTailwindClasses(element),\n };\n}\n\n/**\n * Detect which CSS framework is being used in the project\n */\nexport function detectCSSFramework(): ProjectStyleContext['cssFramework'] {\n // Check for Tailwind\n const hasTailwind = document.querySelector('[class*=\"flex\"]') !== null ||\n document.querySelector('[class*=\"grid-\"]') !== null ||\n document.querySelector('[class*=\"text-\"]') !== null ||\n document.querySelector('[class*=\"bg-\"]') !== null ||\n // Check for Tailwind's reset stylesheet\n document.querySelector('style[data-precedence]') !== null;\n\n if (hasTailwind) {\n // Double check with more specific Tailwind patterns\n const allClasses = Array.from(document.querySelectorAll('[class]'))\n .slice(0, 50)\n .flatMap(el => {\n const className = el.className;\n if (typeof className !== 'string') return [];\n return className.split(/\\s+/);\n });\n\n const tailwindIndicators = allClasses.filter(c =>\n /^(flex|grid|block|inline-block|hidden|p-|m-|px-|py-|mx-|my-|w-|h-|text-|bg-|border-|rounded-|shadow-|gap-)/.test(c)\n );\n\n if (tailwindIndicators.length > 5) {\n return 'tailwind';\n }\n }\n\n // Check for CSS Modules (classes with hash suffixes)\n const hasModuleClasses = Array.from(document.querySelectorAll('[class]'))\n .slice(0, 20)\n .some(el => {\n const className = el.className;\n if (typeof className !== 'string') return false;\n return /[a-zA-Z]+_[a-zA-Z0-9]{5,}/.test(className);\n });\n\n if (hasModuleClasses) {\n return 'css-modules';\n }\n\n // Check for styled-components (data-styled attribute)\n if (document.querySelector('[data-styled]') !== null ||\n document.querySelector('style[data-styled-components]') !== null) {\n return 'styled-components';\n }\n\n return 'vanilla';\n}\n\n/**\n * Extract CSS custom properties (design tokens) from :root\n */\nexport function extractCSSVariables(): Record<string, string> | undefined {\n const variables: Record<string, string> = {};\n\n try {\n const rootStyles = getComputedStyle(document.documentElement);\n\n // Get all stylesheets and look for :root rules\n for (const sheet of document.styleSheets) {\n try {\n const rules = sheet.cssRules || sheet.rules;\n for (const rule of rules) {\n if (rule instanceof CSSStyleRule && rule.selectorText === ':root') {\n for (let i = 0; i < rule.style.length; i++) {\n const prop = rule.style[i];\n if (prop.startsWith('--')) {\n variables[prop] = rule.style.getPropertyValue(prop).trim();\n }\n }\n }\n }\n } catch {\n // Cross-origin stylesheets will throw\n }\n }\n\n // Also check inline styles on html element\n const htmlStyle = document.documentElement.getAttribute('style');\n if (htmlStyle) {\n const matches = htmlStyle.matchAll(/--([a-zA-Z0-9-]+)\\s*:\\s*([^;]+)/g);\n for (const match of matches) {\n variables[`--${match[1]}`] = match[2].trim();\n }\n }\n } catch {\n // Ignore errors\n }\n\n return Object.keys(variables).length > 0 ? variables : undefined;\n}\n\n/**\n * Extract common colors used on the page\n */\nexport function extractColorPalette(): string[] | undefined {\n const colors = new Set<string>();\n const elements = document.querySelectorAll('*');\n\n // Sample first 100 elements to avoid performance issues\n const sampleSize = Math.min(elements.length, 100);\n\n for (let i = 0; i < sampleSize; i++) {\n const el = elements[i] as HTMLElement;\n if (shouldIgnoreElement(el)) continue;\n\n const computed = window.getComputedStyle(el);\n\n // Collect background colors (skip transparent)\n if (computed.backgroundColor && computed.backgroundColor !== 'rgba(0, 0, 0, 0)') {\n colors.add(computed.backgroundColor);\n }\n\n // Collect text colors\n if (computed.color) {\n colors.add(computed.color);\n }\n\n // Collect border colors\n if (computed.borderColor && computed.borderColor !== 'rgb(0, 0, 0)') {\n colors.add(computed.borderColor);\n }\n }\n\n // Return unique colors (limit to 20)\n const uniqueColors = Array.from(colors).slice(0, 20);\n return uniqueColors.length > 0 ? uniqueColors : undefined;\n}\n\n/**\n * Extract comprehensive project style context\n */\nexport function extractProjectStyleContext(): ProjectStyleContext {\n const bodyStyles = window.getComputedStyle(document.body);\n const htmlStyles = window.getComputedStyle(document.documentElement);\n\n return {\n cssFramework: detectCSSFramework(),\n cssVariables: extractCSSVariables(),\n colorPalette: extractColorPalette(),\n baseFontFamily: bodyStyles.fontFamily,\n baseFontSize: htmlStyles.fontSize,\n };\n}\n\n/**\n * Find DOM elements near a bounding box and extract their style context\n */\nexport function findNearbyElementsWithStyles(\n bounds: BoundingBox,\n maxElements: number = 5\n): NearbyElement[] {\n const elements: Array<{ element: HTMLElement; distance: number }> = [];\n const allElements = document.querySelectorAll('*');\n\n const boundsCenter = {\n x: bounds.x + bounds.width / 2,\n y: bounds.y + bounds.height / 2,\n };\n\n allElements.forEach((el) => {\n if (!(el instanceof HTMLElement)) return;\n if (shouldIgnoreElement(el)) return;\n\n const rect = el.getBoundingClientRect();\n // Skip very small elements\n if (rect.width < 10 || rect.height < 10) return;\n\n const elCenter = {\n x: rect.left + window.scrollX + rect.width / 2,\n y: rect.top + window.scrollY + rect.height / 2,\n };\n\n // Calculate distance from bounds center to element center\n const distance = Math.sqrt(\n Math.pow(boundsCenter.x - elCenter.x, 2) +\n Math.pow(boundsCenter.y - elCenter.y, 2)\n );\n\n // Only include elements within reasonable distance (500px)\n if (distance < 500) {\n elements.push({ element: el, distance });\n }\n });\n\n // Sort by distance and take closest elements\n elements.sort((a, b) => a.distance - b.distance);\n\n // Filter to get diverse elements (different types)\n const seen = new Set<string>();\n const diverse: HTMLElement[] = [];\n\n for (const { element } of elements) {\n const key = `${element.tagName}-${element.className}`;\n if (!seen.has(key)) {\n seen.add(key);\n diverse.push(element);\n if (diverse.length >= maxElements) break;\n }\n }\n\n return diverse.map(createNearbyElement);\n}","// =============================================================================\n// Skema Utility Functions\n// =============================================================================\n\n/**\n * Convert a Blob to a base64 string\n */\nexport async function blobToBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result as string;\n resolve(result);\n };\n reader.onerror = () => reject(reader.error);\n reader.readAsDataURL(blob);\n });\n}\n\n/**\n * Add a labeled grid overlay to an SVG string\n * Grid uses A/B/C column labels and 0/1/2 row numbers for positioning reference\n * @param svgString - The SVG markup to add grid to\n * @param opts - Grid options (color, cell size, whether to show labels)\n * @returns SVG string with grid overlay added\n */\nexport function addGridToSvg(\n svgString: string,\n opts: { color?: string; size?: number; labels?: boolean } = {}\n): string {\n const { color = '#0066FF', size = 100, labels = true } = opts;\n\n // Parse SVG to get dimensions\n const viewBoxMatch = svgString.match(/viewBox=\"([^\"]+)\"/);\n if (!viewBoxMatch) return svgString;\n\n const [x, y, w, h] = viewBoxMatch[1].split(' ').map(Number);\n\n // Build grid lines and labels\n const gridElements: string[] = [];\n\n // Vertical lines\n for (let i = 0; i <= Math.ceil(w / size); i++) {\n const xPos = i * size;\n if (i > 0) {\n gridElements.push(\n `<line x1=\"${xPos}\" y1=\"0\" x2=\"${xPos}\" y2=\"${h}\" stroke=\"${color}\" stroke-width=\"1\" stroke-opacity=\"0.5\"/>`\n );\n }\n if (labels) {\n // Column labels (A, B, C, ...)\n const colLabel = String.fromCharCode(65 + i); // 65 = 'A'\n gridElements.push(\n `<text x=\"${xPos + size / 2}\" y=\"16\" fill=\"${color}\" font-size=\"12\" font-family=\"sans-serif\" text-anchor=\"middle\">${colLabel}</text>`\n );\n }\n }\n\n // Horizontal lines\n for (let i = 0; i <= Math.ceil(h / size); i++) {\n const yPos = i * size;\n gridElements.push(\n `<line x1=\"0\" y1=\"${yPos}\" x2=\"${w}\" y2=\"${yPos}\" stroke=\"${color}\" stroke-width=\"1\" stroke-opacity=\"0.5\"/>`\n );\n if (labels && i < Math.ceil(h / size)) {\n // Row labels (0, 1, 2, ...)\n gridElements.push(\n `<text x=\"8\" y=\"${yPos + size / 2 + 4}\" fill=\"${color}\" font-size=\"12\" font-family=\"sans-serif\">${i}</text>`\n );\n }\n }\n\n // Create grid group\n const gridGroup = `<g id=\"skema-grid\" transform=\"translate(${x}, ${y})\">${gridElements.join('')}</g>`;\n\n // Insert grid before closing </svg> tag\n return svgString.replace('</svg>', `${gridGroup}</svg>`);\n}\n\n/**\n * Get the grid cell reference (e.g., \"B2\") for a given position\n * @param x - X coordinate in pixels\n * @param y - Y coordinate in pixels\n * @param gridSize - Size of each grid cell (default 100px)\n * @returns Grid cell reference string (e.g., \"B2\")\n */\nexport function getGridCellReference(x: number, y: number, gridSize: number = 100): string {\n const col = Math.floor(x / gridSize);\n const row = Math.floor(y / gridSize);\n const colLabel = String.fromCharCode(65 + col); // 65 = 'A'\n return `${colLabel}${row}`;\n}\n\n/**\n * Extract text content from tldraw shapes\n * @param shapes - Array of tldraw shapes\n * @returns Combined text content from text and note shapes\n */\nexport function extractTextFromShapes(shapes: unknown[]): string {\n const textContent: string[] = [];\n\n for (const shape of shapes) {\n const s = shape as { type?: string; props?: { text?: string; richText?: unknown } };\n\n if (s.type === 'text' || s.type === 'note') {\n // Handle plain text\n if (s.props?.text) {\n textContent.push(s.props.text);\n }\n // Handle rich text (newer tldraw versions)\n if (s.props?.richText && typeof s.props.richText === 'object') {\n const rt = s.props.richText as { content?: Array<{ content?: Array<{ text?: string }> }> };\n if (rt.content) {\n for (const block of rt.content) {\n if (block.content) {\n for (const inline of block.content) {\n if (inline.text) {\n textContent.push(inline.text);\n }\n }\n }\n }\n }\n }\n }\n }\n\n return textContent.filter(Boolean).join('\\n');\n}\n","// =============================================================================\n// Toolbar Icon Components for Skema\n// =============================================================================\n\nimport React from 'react';\n\n// =============================================================================\n// Simple Colored Shape Icons (for collapsible toolbar)\n// =============================================================================\n\n/** Orange S Logo - shown when collapsed or as default in expanded state */\nexport const SLogoIcon: React.FC<{ size?: number }> = ({ size = 32 }) => (\n <svg width={size} height={size} viewBox=\"0 0 166 161\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n {/* Orange star burst background */}\n <path\n d=\"M77.0782 5.17419C80.4699 2.21068 85.5301 2.21067 88.9218 5.17419L109.929 23.529C111.161 24.6057 112.663 25.3261 114.274 25.6126L141.769 30.5023C146.225 31.2947 149.399 35.2725 149.183 39.7929L147.86 67.4755C147.782 69.1226 148.157 70.7596 148.945 72.2079L162.203 96.5644C164.372 100.55 163.236 105.527 159.551 108.175L136.957 124.416C135.623 125.375 134.577 126.681 133.932 128.193L123.03 153.753C121.26 157.902 116.692 160.1 112.346 158.894L85.4054 151.422C83.8315 150.985 82.1685 150.985 80.5946 151.422L53.6541 158.894C49.3075 160.1 44.7399 157.902 42.9702 153.753L32.0681 128.193C31.4234 126.681 30.3771 125.375 29.0427 124.416L6.4487 108.175C2.76426 105.527 1.62755 100.55 3.79688 96.5644L17.0547 72.2079C17.8431 70.7596 18.2184 69.1226 18.1397 67.4755L16.8169 39.7929C16.6009 35.2725 19.7752 31.2947 24.2308 30.5023L51.7255 25.6126C53.3366 25.3261 54.8392 24.6057 56.0714 23.529L77.0782 5.17419Z\"\n fill=\"#FF6800\"\n />\n {/* White S letter */}\n <path\n d=\"M65.0888 64.1092C65.0888 68.461 73.1316 69.0511 83.5428 69.7887C102.046 71.1901 128.049 73.1078 128 97.9645C128 126.288 106.289 133 83 133C59.7599 132.926 40.4672 128.722 38.0001 97.9645H65.0888C68.0494 105.635 74.9079 107.627 83 107.627C91.0428 107.627 100.911 105.635 100.911 97.9645C100.911 93.6128 92.8684 92.9489 82.4572 92.2113C63.954 90.8099 37.9507 88.8922 38.0001 64.1092C38.0001 35.7858 59.7106 29 83 29C106.24 29.2213 125.533 33.1305 128 64.1092H100.911C97.9506 56.2908 91.0921 54.4468 83 54.4468C74.9572 54.4468 65.0888 56.217 65.0888 64.1092Z\"\n fill=\"white\"\n />\n </svg>\n);\n\n/** Orange Star - shown on hover over the S logo */\nexport const OrangeStarIcon: React.FC<{ size?: number }> = ({ size = 42 }) => (\n <svg width={size} height={size} viewBox=\"0 0 25 25\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12.253 0.8403C12.65 0.393 13.35 0.393 13.747 0.8403L16.628 4.0796C16.805 4.2791 17.055 4.3993 17.321 4.4136L21.65 4.6461C22.248 4.6782 22.684 5.2247 22.582 5.8146L21.845 10.0863C21.8 10.3493 21.862 10.6196 22.017 10.8369L24.534 14.366C24.881 14.8533 24.726 15.5348 24.201 15.8231L20.402 17.9105C20.168 18.0391 19.995 18.2558 19.922 18.5125L18.732 22.6808C18.568 23.2564 17.938 23.5596 17.386 23.3292L13.385 21.6606C13.139 21.5578 12.861 21.5578 12.615 21.6606L8.614 23.3292C8.062 23.5596 7.432 23.2564 7.268 22.6808L6.078 18.5125C6.005 18.2558 5.832 18.0391 5.598 17.9105L1.799 15.8231C1.274 15.5348 1.119 14.8533 1.466 14.366L3.983 10.8369C4.138 10.6196 4.2 10.3493 4.155 10.0863L3.418 5.8146C3.316 5.2247 3.752 4.6782 4.35 4.6461L8.679 4.4136C8.945 4.3993 9.195 4.2791 9.372 4.0796L12.253 0.8403Z\"\n fill=\"#FF6B00\"\n />\n </svg>\n);\n\n/** Green Square - Draw tool */\nexport const GreenSquareIcon: React.FC<{ size?: number }> = ({ size = 42 }) => (\n <svg width={size} height={size} viewBox=\"0 0 42 42\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"3\" y=\"3\" width=\"36\" height=\"36\" rx=\"4\" fill=\"#22C55E\" />\n </svg>\n);\n\n/** Yellow Parallelogram - Erase tool */\nexport const YellowParallelogramIcon: React.FC<{ size?: number }> = ({ size = 42 }) => (\n <svg width={size} height={size} viewBox=\"0 0 50 42\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M8 38L18 4H42L32 38H8Z\"\n fill=\"#EAB308\"\n />\n </svg>\n);\n\n/** Red/Orange Triangle - Select tool */\nexport const RedTriangleIcon: React.FC<{ size?: number }> = ({ size = 42 }) => (\n <svg width={size} height={size} viewBox=\"0 0 42 42\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M21 4L38 38H4L21 4Z\"\n fill=\"#F97316\"\n />\n </svg>\n);\n\n/** Blue Circle - Lasso tool */\nexport const BlueCircleIcon: React.FC<{ size?: number }> = ({ size = 42 }) => (\n <svg width={size} height={size} viewBox=\"0 0 42 42\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"21\" cy=\"21\" r=\"18\" fill=\"#3B82F6\" />\n </svg>\n);\n\n/** Chevron Left - Collapse button */\nexport const ChevronLeftIcon: React.FC<{ size?: number }> = ({ size = 24 }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M15 18L9 12L15 6\"\n stroke=\"#9CA3AF\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n/** Chevron Right - Expand indicator (shown on S logo hover) */\nexport const ChevronRightIcon: React.FC<{ size?: number }> = ({ size = 24 }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M9 6L15 12L9 18\"\n stroke=\"#9CA3AF\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n/** Settings Icon - Gear/cog for style panel toggle */\nexport const SettingsIcon: React.FC<{ size?: number; isActive?: boolean }> = ({ size = 20, isActive }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15Z\"\n stroke={isActive ? \"#FF6800\" : \"#6B7280\"}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M19.4 15C19.2669 15.3016 19.2272 15.6362 19.286 15.9606C19.3448 16.285 19.4995 16.5843 19.73 16.82L19.79 16.88C19.976 17.0657 20.1235 17.2863 20.2241 17.5291C20.3248 17.7719 20.3766 18.0322 20.3766 18.295C20.3766 18.5578 20.3248 18.8181 20.2241 19.0609C20.1235 19.3037 19.976 19.5243 19.79 19.71C19.6043 19.896 19.3837 20.0435 19.1409 20.1441C18.8981 20.2448 18.6378 20.2966 18.375 20.2966C18.1122 20.2966 17.8519 20.2448 17.6091 20.1441C17.3663 20.0435 17.1457 19.896 16.96 19.71L16.9 19.65C16.6643 19.4195 16.365 19.2648 16.0406 19.206C15.7162 19.1472 15.3816 19.1869 15.08 19.32C14.7842 19.4468 14.532 19.6572 14.3543 19.9255C14.1766 20.1938 14.0813 20.5082 14.08 20.83V21C14.08 21.5304 13.8693 22.0391 13.4942 22.4142C13.1191 22.7893 12.6104 23 12.08 23C11.5496 23 11.0409 22.7893 10.6658 22.4142C10.2907 22.0391 10.08 21.5304 10.08 21V20.91C10.0723 20.579 9.96512 20.258 9.77251 19.9887C9.5799 19.7194 9.31074 19.5143 9 19.4C8.69838 19.2669 8.36381 19.2272 8.03941 19.286C7.71502 19.3448 7.41568 19.4995 7.18 19.73L7.12 19.79C6.93425 19.976 6.71368 20.1235 6.47088 20.2241C6.22808 20.3248 5.96783 20.3766 5.705 20.3766C5.44217 20.3766 5.18192 20.3248 4.93912 20.2241C4.69632 20.1235 4.47575 19.976 4.29 19.79C4.10405 19.6043 3.95653 19.3837 3.85588 19.1409C3.75523 18.8981 3.70343 18.6378 3.70343 18.375C3.70343 18.1122 3.75523 17.8519 3.85588 17.6091C3.95653 17.3663 4.10405 17.1457 4.29 16.96L4.35 16.9C4.58054 16.6643 4.73519 16.365 4.794 16.0406C4.85282 15.7162 4.81312 15.3816 4.68 15.08C4.55324 14.7842 4.34276 14.532 4.07447 14.3543C3.80618 14.1766 3.49179 14.0813 3.17 14.08H3C2.46957 14.08 1.96086 13.8693 1.58579 13.4942C1.21071 13.1191 1 12.6104 1 12.08C1 11.5496 1.21071 11.0409 1.58579 10.6658C1.96086 10.2907 2.46957 10.08 3 10.08H3.09C3.42099 10.0723 3.742 9.96512 4.0113 9.77251C4.28059 9.5799 4.48572 9.31074 4.6 9C4.73312 8.69838 4.77282 8.36381 4.714 8.03941C4.65519 7.71502 4.50054 7.41568 4.27 7.18L4.21 7.12C4.02405 6.93425 3.87653 6.71368 3.77588 6.47088C3.67523 6.22808 3.62343 5.96783 3.62343 5.705C3.62343 5.44217 3.67523 5.18192 3.77588 4.93912C3.87653 4.69632 4.02405 4.47575 4.21 4.29C4.39575 4.10405 4.61632 3.95653 4.85912 3.85588C5.10192 3.75523 5.36217 3.70343 5.625 3.70343C5.88783 3.70343 6.14808 3.75523 6.39088 3.85588C6.63368 3.95653 6.85425 4.10405 7.04 4.29L7.1 4.35C7.33568 4.58054 7.63502 4.73519 7.95941 4.794C8.28381 4.85282 8.61838 4.81312 8.92 4.68H9C9.29577 4.55324 9.54802 4.34276 9.72569 4.07447C9.90337 3.80618 9.99872 3.49179 10 3.17V3C10 2.46957 10.2107 1.96086 10.5858 1.58579C10.9609 1.21071 11.4696 1 12 1C12.5304 1 13.0391 1.21071 13.4142 1.58579C13.7893 1.96086 14 2.46957 14 3V3.09C14.0013 3.41179 14.0966 3.72618 14.2743 3.99447C14.452 4.26276 14.7042 4.47324 15 4.6C15.3016 4.73312 15.6362 4.77282 15.9606 4.714C16.285 4.65519 16.5843 4.50054 16.82 4.27L16.88 4.21C17.0657 4.02405 17.2863 3.87653 17.5291 3.77588C17.7719 3.67523 18.0322 3.62343 18.295 3.62343C18.5578 3.62343 18.8181 3.67523 19.0609 3.77588C19.3037 3.87653 19.5243 4.02405 19.71 4.21C19.896 4.39575 20.0435 4.61632 20.1441 4.85912C20.2448 5.10192 20.2966 5.36217 20.2966 5.625C20.2966 5.88783 20.2448 6.14808 20.1441 6.39088C20.0435 6.63368 19.896 6.85425 19.71 7.04L19.65 7.1C19.4195 7.33568 19.2648 7.63502 19.206 7.95941C19.1472 8.28381 19.1869 8.61838 19.32 8.92V9C19.4468 9.29577 19.6572 9.54802 19.9255 9.72569C20.1938 9.90337 20.5082 9.99872 20.83 10H21C21.5304 10 22.0391 10.2107 22.4142 10.5858C22.7893 10.9609 23 11.4696 23 12C23 12.5304 22.7893 13.0391 22.4142 13.4142C22.0391 13.7893 21.5304 14 21 14H20.91C20.5882 14.0013 20.2738 14.0966 20.0055 14.2743C19.7372 14.452 19.5268 14.7042 19.4 15Z\"\n stroke={isActive ? \"#FF6800\" : \"#6B7280\"}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// =============================================================================\n// Original Detailed Icons (with inner tool graphics)\n// =============================================================================\n\nexport const SelectIcon: React.FC<{ isSelected?: boolean }> = ({ isSelected }) => (\n <svg width=\"30\" height=\"30\" viewBox=\"0 0 25 25\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n {/* Red/Orange triangle background */}\n <path\n d=\"M11.268 3C12.0378 1.6667 13.9623 1.6667 14.7321 3L25.1244 21C25.8942 22.3333 24.9319 24 23.3923 24H2.6077C1.0681 24 0.1058 22.3333 0.8756 21L11.268 3Z\"\n fill=\"#F24E1E\"\n opacity={isSelected ? 1 : 0.7}\n />\n {/* Cursor/pointer icon */}\n <path\n d=\"M9 10L9 18.5L11.5 16L14 20L15.5 19L13 15L16 14.5L9 10Z\"\n fill=\"white\"\n />\n </svg>\n);\n\nexport const DrawIcon: React.FC<{ isSelected?: boolean }> = ({ isSelected }) => (\n <svg width=\"30\" height=\"30\" viewBox=\"0 0 25 25\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"25\" height=\"25\" rx=\"2\" fill={isSelected ? '#00C851' : '#00C851'} opacity={isSelected ? 1 : 0.7} />\n <g transform=\"translate(12.5, 12.5) scale(1.4) translate(-12.5, -12.5)\">\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M13.6919 10.2852L14.2593 9.6908L14.8282 10.2864L14.2605 10.8808L13.6919 10.2852ZM9.5682 15.7944L8.9992 15.1988L13.1233 10.8808L13.6919 11.476L9.5682 15.7944ZM14.3284 8.5L8 15.1988V16.5H9.5682L16 10.0436L14.3284 8.5Z\"\n fill=\"white\"\n />\n </g>\n </svg>\n);\n\nexport const LassoIcon: React.FC<{ isSelected?: boolean }> = ({ isSelected }) => (\n <svg width=\"30\" height=\"30\" viewBox=\"0 0 25 25\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"25\" height=\"25\" rx=\"12.5\" fill={isSelected ? '#2C7FFF' : '#2C7FFF'} opacity={isSelected ? 1 : 0.7} />\n <g transform=\"translate(12.5, 12.5) scale(1.4) translate(-12.5, -12.5)\">\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9.219 11.3C9.219 10.8021 9.504 10.3117 10.043 9.9297C10.582 9.5484 11.347 9.3 12.211 9.3C13.074 9.3 13.839 9.5484 14.378 9.9297C14.918 10.3117 15.202 10.8021 15.202 11.3C15.202 11.7979 14.918 12.2882 14.378 12.6702C13.839 13.0515 13.074 13.2999 12.211 13.2999C12.005 13.2999 11.805 13.2859 11.612 13.2591C11.586 12.5417 10.887 12.0999 10.216 12.0999C9.988 12.0999 9.768 12.147 9.572 12.234C9.339 11.9444 9.219 11.625 9.219 11.3ZM12.211 14.0999C11.908 14.0999 11.614 14.074 11.331 14.0249C11.298 14.0629 11.262 14.0988 11.224 14.1325C11.226 14.154 11.228 14.1774 11.229 14.2026C11.232 14.3182 11.216 14.4769 11.137 14.6456C10.97 15.0066 10.586 15.2824 9.919 15.3874C9.091 15.5175 8.878 15.7607 8.827 15.8497C8.8 15.8961 8.797 15.9328 8.798 15.9542C8.798 15.9629 8.799 15.9695 8.8 15.973C8.805 15.9901 8.81 16.0079 8.813 16.026C8.833 16.1321 8.809 16.2395 8.751 16.3254C8.718 16.3733 8.675 16.4145 8.623 16.445C8.584 16.4681 8.54 16.4847 8.494 16.4932C8.447 16.502 8.4 16.5021 8.355 16.4944C8.296 16.4846 8.242 16.4619 8.195 16.4294C8.148 16.3972 8.108 16.3549 8.078 16.304C8.063 16.278 8.05 16.2501 8.041 16.2208C8.04 16.217 8.038 16.2128 8.037 16.2083C8.032 16.1931 8.027 16.1741 8.022 16.1517C8.012 16.1071 8.002 16.0477 8 15.977C7.996 15.8338 8.023 15.6452 8.136 15.4492C8.365 15.0533 8.87 14.7426 9.795 14.5971C9.958 14.5714 10.079 14.5362 10.167 14.4992C9.499 14.478 8.82 14.0237 8.82 13.2999C8.82 13.0999 8.876 12.9166 8.969 12.758C8.629 12.344 8.421 11.8466 8.421 11.3C8.421 10.4724 8.896 9.7627 9.583 9.2761C10.272 8.7888 11.202 8.5 12.211 8.5C13.219 8.5 14.15 8.7888 14.838 9.2761C15.526 9.7627 16 10.4724 16 11.3C16 12.1275 15.526 12.8372 14.838 13.3238C14.15 13.8111 13.219 14.0999 12.211 14.0999ZM9.754 13.0514C9.859 12.9649 10.021 12.8999 10.216 12.8999C10.634 12.8999 10.815 13.1577 10.815 13.2999C10.815 13.3371 10.806 13.3739 10.789 13.4108C10.757 13.4794 10.69 13.5552 10.58 13.6136C10.482 13.666 10.357 13.6999 10.216 13.6999C9.798 13.6999 9.618 13.4422 9.618 13.2999C9.618 13.2236 9.655 13.1338 9.754 13.0514Z\"\n fill=\"white\"\n />\n </g>\n </svg>\n);\n\nexport const EraseIcon: React.FC<{ isSelected?: boolean }> = ({ isSelected }) => (\n <svg width=\"36\" height=\"30\" viewBox=\"0 0 30 25\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n {/* Yellow parallelogram background */}\n <path\n d=\"M0.308 1.2407C0.151 0.61 0.628 0 1.278 0H23.664C24.118 0 24.516 0.3065 24.631 0.746L30.671 23.746C30.837 24.38 30.359 25 29.704 25H6.982C6.523 25 6.122 24.6868 6.012 24.2407L0.308 1.2407Z\"\n fill=\"#FFBA00\"\n opacity={isSelected ? 1 : 0.7}\n />\n {/* Eraser icon - proper diagonal orientation (down-left to up-right) */}\n <g transform=\"translate(15, 12.5)\">\n <g transform=\"rotate(-45)\">\n <rect x=\"-6\" y=\"-3\" width=\"12\" height=\"6\" rx=\"1\" fill=\"none\" stroke=\"white\" strokeWidth=\"1.5\" />\n <line x1=\"-2\" y1=\"-3\" x2=\"-2\" y2=\"3\" stroke=\"white\" strokeWidth=\"1.5\" />\n </g>\n </g>\n </svg>\n);\n\nexport const ShapesIcon: React.FC<{ isSelected?: boolean }> = ({ isSelected }) => (\n <svg width=\"30\" height=\"30\" viewBox=\"0 0 25 25\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n {/* Orange star */}\n <path\n d=\"M12.253 0.8403C12.65 0.393 13.35 0.393 13.747 0.8403L16.628 4.0796C16.805 4.2791 17.055 4.3993 17.321 4.4136L21.65 4.6461C22.248 4.6782 22.684 5.2247 22.582 5.8146L21.845 10.0863C21.8 10.3493 21.862 10.6196 22.017 10.8369L24.534 14.366C24.881 14.8533 24.726 15.5348 24.201 15.8231L20.402 17.9105C20.168 18.0391 19.995 18.2558 19.922 18.5125L18.732 22.6808C18.568 23.2564 17.938 23.5596 17.386 23.3292L13.385 21.6606C13.139 21.5578 12.861 21.5578 12.615 21.6606L8.614 23.3292C8.062 23.5596 7.432 23.2564 7.268 22.6808L6.078 18.5125C6.005 18.2558 5.832 18.0391 5.598 17.9105L1.799 15.8231C1.274 15.5348 1.119 14.8533 1.466 14.366L3.983 10.8369C4.138 10.6196 4.2 10.3493 4.155 10.0863L3.418 5.8146C3.316 5.2247 3.752 4.6782 4.35 4.6461L8.679 4.4136C8.945 4.3993 9.195 4.2791 9.372 4.0796L12.253 0.8403Z\"\n fill=\"#FF6800\"\n opacity={isSelected ? 1 : 0.7}\n />\n {/* Shapes: rectangle, circle, triangle (white) */}\n <g transform=\"translate(5.5, 7)\">\n {/* Small rectangle */}\n <rect x=\"0\" y=\"6\" width=\"4\" height=\"4\" rx=\"0.5\" fill=\"white\" />\n {/* Circle */}\n <circle cx=\"10\" cy=\"4\" r=\"3\" fill=\"white\" />\n {/* Triangle */}\n <path d=\"M5 11L7.5 6.5L10 11H5Z\" fill=\"white\" />\n </g>\n </svg>\n);\n","// =============================================================================\n// Shape Picker Popup Component\n// =============================================================================\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport { useEditor, GeoShapeGeoStyle } from 'tldraw';\n\n// All available geo shapes in tldraw\nconst GEO_SHAPES = [\n 'rectangle',\n 'ellipse',\n 'triangle',\n 'diamond',\n 'pentagon',\n 'hexagon',\n 'octagon',\n 'star',\n 'rhombus',\n 'rhombus-2',\n 'oval',\n 'trapezoid',\n 'arrow-right',\n 'arrow-left',\n 'arrow-up',\n 'arrow-down',\n 'x-box',\n 'check-box',\n 'cloud',\n 'heart',\n] as const;\n\ntype GeoShape = (typeof GEO_SHAPES)[number];\n\n// SVG icons for each shape\nconst ShapeIcon: React.FC<{ shape: GeoShape; size?: number }> = ({ shape, size = 20 }) => {\n const stroke = 'currentColor';\n const strokeWidth = 1.5;\n const fill = 'none';\n\n switch (shape) {\n case 'rectangle':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"1\" />\n </svg>\n );\n case 'ellipse':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <ellipse cx=\"12\" cy=\"12\" rx=\"9\" ry=\"7\" />\n </svg>\n );\n case 'triangle':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M12 4L21 20H3L12 4Z\" />\n </svg>\n );\n case 'diamond':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M12 2L22 12L12 22L2 12L12 2Z\" />\n </svg>\n );\n case 'pentagon':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M12 2L22 9L18 21H6L2 9L12 2Z\" />\n </svg>\n );\n case 'hexagon':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M12 2L21 7V17L12 22L3 17V7L12 2Z\" />\n </svg>\n );\n case 'octagon':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M8 2H16L22 8V16L16 22H8L2 16V8L8 2Z\" />\n </svg>\n );\n case 'star':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M12 2L14.5 9H22L16 13.5L18.5 21L12 16.5L5.5 21L8 13.5L2 9H9.5L12 2Z\" />\n </svg>\n );\n case 'rhombus':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M12 3L20 12L12 21L4 12L12 3Z\" />\n </svg>\n );\n case 'rhombus-2':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M2 12L12 4L22 12L12 20L2 12Z\" />\n </svg>\n );\n case 'oval':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <ellipse cx=\"12\" cy=\"12\" rx=\"6\" ry=\"9\" />\n </svg>\n );\n case 'trapezoid':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M6 6H18L21 18H3L6 6Z\" />\n </svg>\n );\n case 'arrow-right':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M4 8V16H12V20L20 12L12 4V8H4Z\" />\n </svg>\n );\n case 'arrow-left':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M20 8V16H12V20L4 12L12 4V8H20Z\" />\n </svg>\n );\n case 'arrow-up':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M8 22V10L4 10L12 2L20 10H16V22H8Z\" />\n </svg>\n );\n case 'arrow-down':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M8 2V14L4 14L12 22L20 14H16V2H8Z\" />\n </svg>\n );\n case 'x-box':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"1\" />\n <path d=\"M8 8L16 16M16 8L8 16\" />\n </svg>\n );\n case 'check-box':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"1\" />\n <path d=\"M7 12L10 15L17 8\" />\n </svg>\n );\n case 'cloud':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M6.5 19C4 19 2 17 2 14.5C2 12.5 3.5 10.5 5.5 10C5.5 7 8 4 12 4C15.5 4 18 6.5 18.5 9.5C20.5 10 22 11.5 22 14C22 16.5 20 19 17.5 19H6.5Z\" />\n </svg>\n );\n case 'heart':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M12 21C12 21 3 15 3 9C3 6 5.5 3 8.5 3C10.5 3 12 4.5 12 4.5C12 4.5 13.5 3 15.5 3C18.5 3 21 6 21 9C21 15 12 21 12 21Z\" />\n </svg>\n );\n default:\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"1\" />\n </svg>\n );\n }\n};\n\ninterface ShapePickerProps {\n isOpen: boolean;\n onClose: () => void;\n onSelectShape: (shape: GeoShape) => void;\n anchorRef: React.RefObject<HTMLButtonElement | null>;\n}\n\nexport const ShapePicker: React.FC<ShapePickerProps> = ({ isOpen, onClose, onSelectShape, anchorRef }) => {\n const editor = useEditor();\n const pickerRef = useRef<HTMLDivElement>(null);\n const [selectedShape, setSelectedShape] = useState<GeoShape>('rectangle');\n\n // Get the current geo style from the editor\n useEffect(() => {\n const currentGeo = editor.getStyleForNextShape(GeoShapeGeoStyle);\n if (currentGeo && GEO_SHAPES.includes(currentGeo as GeoShape)) {\n setSelectedShape(currentGeo as GeoShape);\n }\n }, [editor, isOpen]);\n\n // Close on click outside\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n if (\n pickerRef.current &&\n !pickerRef.current.contains(e.target as Node) &&\n anchorRef.current &&\n !anchorRef.current.contains(e.target as Node)\n ) {\n onClose();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen, onClose, anchorRef]);\n\n // Close on escape\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, onClose]);\n\n if (!isOpen) return null;\n\n const handleShapeClick = (e: React.MouseEvent, shape: GeoShape) => {\n e.preventDefault();\n e.stopPropagation();\n setSelectedShape(shape);\n onSelectShape(shape);\n };\n\n // Prevent all pointer events from reaching tldraw\n const stopAllEvents = (e: React.SyntheticEvent) => {\n e.preventDefault();\n e.stopPropagation();\n };\n\n // Calculate position above the anchor button\n const anchorRect = anchorRef.current?.getBoundingClientRect();\n const pickerStyle: React.CSSProperties = anchorRect\n ? {\n position: 'fixed',\n bottom: window.innerHeight - anchorRect.top + 8,\n left: anchorRect.left + anchorRect.width / 2,\n transform: 'translateX(-50%)',\n }\n : {};\n\n return (\n <div\n ref={pickerRef}\n style={{\n ...pickerStyle,\n backgroundColor: 'white',\n borderRadius: 8,\n boxShadow: '0 4px 20px rgba(0,0,0,0.15)',\n padding: 8,\n zIndex: 100000,\n pointerEvents: 'auto',\n }}\n onClick={stopAllEvents}\n onPointerDown={stopAllEvents}\n onMouseDown={stopAllEvents}\n >\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(4, 1fr)',\n gap: 2,\n }}\n >\n {GEO_SHAPES.map((shape) => (\n <button\n key={shape}\n onClick={(e) => handleShapeClick(e, shape)}\n onPointerDown={stopAllEvents}\n onMouseDown={stopAllEvents}\n title={shape.replace(/-/g, ' ')}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 32,\n height: 32,\n border: 'none',\n borderRadius: 4,\n backgroundColor: selectedShape === shape ? '#e8f4ff' : 'transparent',\n color: selectedShape === shape ? '#2c7fff' : '#333',\n cursor: 'pointer',\n transition: 'background-color 0.1s',\n }}\n onMouseEnter={(e) => {\n if (selectedShape !== shape) {\n e.currentTarget.style.backgroundColor = '#f5f5f5';\n }\n }}\n onMouseLeave={(e) => {\n if (selectedShape !== shape) {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }}\n >\n <ShapeIcon shape={shape} size={18} />\n </button>\n ))}\n </div>\n </div>\n );\n};\n\nexport { GEO_SHAPES, type GeoShape };\n","// =============================================================================\n// Skema Toolbar Component - Collapsible with Framer Motion Animations\n// =============================================================================\n\nimport React, { useState, useRef } from 'react';\nimport { useEditor, useTools, useIsToolSelected, GeoShapeGeoStyle } from 'tldraw';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { SelectIcon, DrawIcon, LassoIcon, EraseIcon, ShapesIcon } from './ToolbarIcons';\nimport { SLogoIcon, ChevronLeftIcon, ChevronRightIcon, SettingsIcon } from './ToolbarIcons';\nimport { ShapePicker, type GeoShape } from './ShapePicker';\n\n// =============================================================================\n// Animation Variants\n// =============================================================================\n\n// Total number of tools (for reverse stagger calculation)\nconst TOOL_COUNT = 4;\n\n// Smooth exit duration for coordinated collapse\nconst EXIT_DURATION = 0.12;\nconst EXIT_STAGGER = 0.01;\n\n// Cubic bezier easing for smooth deceleration\nconst smoothEasing: [number, number, number, number] = [0.4, 0, 0.2, 1];\n\nconst toolVariants = {\n hidden: {\n opacity: 0,\n scale: 0.8,\n width: 0,\n marginRight: -6,\n },\n visible: (i: number) => ({\n opacity: 1,\n scale: 1,\n width: 40,\n marginRight: 0,\n transition: {\n opacity: { duration: 0.15, delay: i * 0.04 },\n scale: { type: 'spring' as const, stiffness: 400, damping: 25, delay: i * 0.04 },\n width: { type: 'spring' as const, stiffness: 400, damping: 30, delay: i * 0.03 },\n marginRight: { duration: 0.1, delay: i * 0.03 },\n },\n }),\n exit: (i: number) => ({\n opacity: 0,\n scale: 0.8,\n width: 0,\n marginRight: -6,\n transition: {\n opacity: { duration: 0.06, ease: 'easeOut' as const },\n scale: { duration: EXIT_DURATION, ease: smoothEasing },\n width: { duration: EXIT_DURATION, ease: smoothEasing, delay: EXIT_STAGGER * (TOOL_COUNT - 1 - i) },\n marginRight: { duration: EXIT_DURATION, ease: smoothEasing, delay: EXIT_STAGGER * (TOOL_COUNT - 1 - i) },\n },\n }),\n};\n\nconst chevronVariants = {\n hidden: { \n opacity: 0, \n scale: 0.8,\n width: 0,\n },\n visible: {\n opacity: 0.6,\n scale: 1,\n width: 28,\n transition: { \n opacity: { delay: 0.1, duration: 0.1 },\n scale: { delay: 0.1, type: 'spring' as const, stiffness: 500, damping: 30 },\n width: { delay: 0.08, duration: 0.12, ease: 'easeOut' as const },\n },\n },\n exit: { \n opacity: 0, \n scale: 0.8,\n width: 0,\n transition: { \n opacity: { duration: 0.06 },\n scale: { duration: 0.08 },\n width: { duration: 0.1, ease: smoothEasing },\n } \n },\n};\n\n// =============================================================================\n// Toolbar Button Component (original style)\n// =============================================================================\n\ninterface ToolbarButtonProps {\n onClick: () => void;\n isSelected: boolean;\n icon: React.ReactNode;\n label: string;\n buttonRef?: React.RefObject<HTMLButtonElement | null>;\n index?: number;\n}\n\nconst ToolbarButton: React.FC<ToolbarButtonProps> = ({ \n onClick, \n isSelected, \n icon, \n label, \n buttonRef,\n index = 0,\n}) => {\n const handleClick = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onClick();\n };\n\n return (\n <motion.button\n ref={buttonRef}\n custom={index}\n variants={toolVariants}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"exit\"\n onClick={handleClick}\n title={label}\n type=\"button\"\n whileHover={{ scale: 1.05 }}\n whileTap={{ scale: 0.95 }}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: 40,\n minWidth: 0,\n border: 'none',\n borderRadius: 8,\n backgroundColor: isSelected ? 'rgba(255,255,255,0.15)' : 'transparent',\n cursor: 'pointer',\n pointerEvents: 'auto',\n overflow: 'hidden',\n flexShrink: 0,\n }}\n >\n <motion.span\n style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.8 }}\n transition={{ duration: 0.12 }}\n >\n {icon}\n </motion.span>\n </motion.button>\n );\n};\n\n// =============================================================================\n// Logo/Shapes Button Component (S logo when collapsed, ShapesIcon when expanded)\n// =============================================================================\n\ninterface LogoShapesButtonProps {\n isExpanded: boolean;\n isHovered: boolean;\n isSelected: boolean;\n onClick: () => void;\n onShapesClick: () => void;\n onMouseEnter: () => void;\n onMouseLeave: () => void;\n buttonRef?: React.RefObject<HTMLButtonElement | null>;\n}\n\nconst LogoShapesButton: React.FC<LogoShapesButtonProps> = ({\n isExpanded,\n isHovered,\n isSelected,\n onClick,\n onShapesClick,\n onMouseEnter,\n onMouseLeave,\n buttonRef,\n}) => {\n const handleClick = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (isExpanded) {\n onShapesClick();\n } else {\n onClick();\n }\n };\n\n return (\n <motion.button\n ref={buttonRef}\n onClick={handleClick}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n title={isExpanded ? \"Shapes (G)\" : \"Expand toolbar\"}\n type=\"button\"\n whileHover={{ scale: 1.08 }}\n whileTap={{ scale: 0.95 }}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 40,\n height: 40,\n border: 'none',\n borderRadius: 8,\n backgroundColor: isSelected ? 'rgba(255,255,255,0.15)' : 'transparent',\n cursor: 'pointer',\n pointerEvents: 'auto',\n position: 'relative',\n }}\n >\n <AnimatePresence mode=\"popLayout\">\n {isExpanded ? (\n <motion.div\n key=\"shapes\"\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.85 }}\n transition={{ \n type: 'spring',\n stiffness: 500,\n damping: 30,\n opacity: { duration: 0.08 }\n }}\n >\n <ShapesIcon isSelected={isSelected} />\n </motion.div>\n ) : isHovered ? (\n <motion.div\n key=\"chevron\"\n initial={{ opacity: 0, x: -3 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: 3 }}\n transition={{ duration: 0.08, ease: 'easeOut' }}\n >\n <ChevronRightIcon size={20} />\n </motion.div>\n ) : (\n <motion.div\n key=\"s\"\n initial={{ opacity: 0, scale: 0.9 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.85 }}\n transition={{ \n type: 'spring',\n stiffness: 500,\n damping: 30,\n opacity: { duration: 0.06 }\n }}\n >\n <SLogoIcon size={32} />\n </motion.div>\n )}\n </AnimatePresence>\n </motion.button>\n );\n};\n\n// =============================================================================\n// Collapse Button Component\n// =============================================================================\n\nconst CollapseButton: React.FC<{ onClick: () => void }> = ({ onClick }) => {\n return (\n <motion.button\n variants={chevronVariants}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"exit\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onClick();\n }}\n title=\"Collapse toolbar\"\n type=\"button\"\n whileHover={{ opacity: 1, scale: 1.1 }}\n whileTap={{ scale: 0.9 }}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: 40,\n minWidth: 0,\n border: 'none',\n borderRadius: 6,\n backgroundColor: 'transparent',\n cursor: 'pointer',\n pointerEvents: 'auto',\n marginLeft: 2,\n overflow: 'hidden',\n flexShrink: 0,\n }}\n >\n <motion.span\n style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.1 }}\n >\n <ChevronLeftIcon size={20} />\n </motion.span>\n </motion.button>\n );\n};\n\n// =============================================================================\n// Settings Button Component\n// =============================================================================\n\ninterface SettingsButtonProps {\n isActive: boolean;\n onClick: () => void;\n index: number;\n}\n\nconst SettingsButton: React.FC<SettingsButtonProps> = ({ isActive, onClick, index }) => {\n return (\n <motion.button\n custom={index}\n variants={toolVariants}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"exit\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onClick();\n }}\n title=\"Style settings\"\n type=\"button\"\n whileHover={{ scale: 1.05 }}\n whileTap={{ scale: 0.95 }}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 36,\n height: 40,\n border: 'none',\n borderRadius: 8,\n backgroundColor: isActive ? 'rgba(255, 104, 0, 0.1)' : 'transparent',\n cursor: 'pointer',\n pointerEvents: 'auto',\n }}\n >\n <SettingsIcon size={20} isActive={isActive} />\n </motion.button>\n );\n};\n\n// =============================================================================\n// Main Skema Toolbar\n// =============================================================================\n\nexport interface SkemaToolbarProps {\n isExpanded?: boolean;\n onExpandedChange?: (expanded: boolean) => void;\n onStylePanelChange?: (open: boolean) => void;\n isDark?: boolean;\n}\n\nexport const SkemaToolbar: React.FC<SkemaToolbarProps> = ({ isExpanded: controlledExpanded, onExpandedChange, onStylePanelChange, isDark = false }) => {\n const editor = useEditor();\n const tools = useTools();\n const shapesButtonRef = useRef<HTMLButtonElement>(null);\n\n // Collapse/expand state (use controlled prop if provided)\n const [internalExpanded, setInternalExpanded] = useState(false);\n const isExpanded = controlledExpanded !== undefined ? controlledExpanded : internalExpanded;\n const [isLogoHovered, setIsLogoHovered] = useState(false);\n const [isShapePickerOpen, setIsShapePickerOpen] = useState(false);\n const [isStylePanelOpen, setIsStylePanelOpen] = useState(false);\n\n // Tool selection states\n const isSelectSelected = useIsToolSelected(tools['select']);\n const isDrawSelected = useIsToolSelected(tools['draw']);\n const isLassoSelected = useIsToolSelected(tools['lasso-select']);\n const isEraseSelected = useIsToolSelected(tools['eraser']);\n const isGeoSelected = useIsToolSelected(tools['geo']);\n\n const handleExpand = (expanded: boolean) => {\n setInternalExpanded(expanded);\n onExpandedChange?.(expanded);\n // Close style panel when collapsing\n if (!expanded) {\n setIsStylePanelOpen(false);\n onStylePanelChange?.(false);\n }\n };\n\n const handleStylePanelToggle = () => {\n const newState = !isStylePanelOpen;\n setIsStylePanelOpen(newState);\n onStylePanelChange?.(newState);\n };\n\n const handleLogoClick = () => {\n handleExpand(true);\n };\n\n const handleCollapse = () => {\n handleExpand(false);\n setIsShapePickerOpen(false);\n };\n\n const handleShapesClick = () => {\n setIsShapePickerOpen((prev) => !prev);\n };\n\n const handleSelectShape = (shape: GeoShape) => {\n editor.setStyleForNextShapes(GeoShapeGeoStyle, shape);\n editor.setCurrentTool('geo');\n setIsShapePickerOpen(false);\n };\n\n return (\n <>\n {/* Centering wrapper */}\n <div\n style={{\n position: 'absolute',\n bottom: 16,\n left: 0,\n right: 0,\n display: 'flex',\n justifyContent: 'center',\n pointerEvents: 'none',\n zIndex: 99999,\n }}\n >\n <motion.div\n data-skema=\"toolbar\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '6px 12px',\n backgroundColor: isDark ? '#1a1a1a' : 'white',\n borderRadius: 28,\n boxShadow: isDark\n ? '0 2px 10px rgba(0,0,0,0.4), 0 0 0 1px rgba(255,255,255,0.08)'\n : '0 2px 10px rgba(0,0,0,0.15)',\n pointerEvents: 'auto',\n }}\n >\n {/* Logo/Shapes button - always first, transforms from S to Shapes when expanded */}\n <LogoShapesButton\n isExpanded={isExpanded}\n isHovered={isLogoHovered}\n isSelected={isGeoSelected || isShapePickerOpen}\n onClick={handleLogoClick}\n onShapesClick={handleShapesClick}\n onMouseEnter={() => setIsLogoHovered(true)}\n onMouseLeave={() => setIsLogoHovered(false)}\n buttonRef={shapesButtonRef}\n />\n\n {/* Other toolbar buttons - show when expanded */}\n <AnimatePresence mode=\"popLayout\">\n {isExpanded && (\n <>\n <ToolbarButton\n key=\"select\"\n onClick={() => editor.setCurrentTool('select')}\n isSelected={isSelectSelected}\n icon={<SelectIcon isSelected={isSelectSelected} />}\n label=\"Select (S)\"\n index={0}\n />\n <ToolbarButton\n key=\"draw\"\n onClick={() => editor.setCurrentTool('draw')}\n isSelected={isDrawSelected}\n icon={<DrawIcon isSelected={isDrawSelected} />}\n label=\"Draw (D)\"\n index={1}\n />\n <ToolbarButton\n key=\"lasso\"\n onClick={() => editor.setCurrentTool('lasso-select')}\n isSelected={isLassoSelected}\n icon={<LassoIcon isSelected={isLassoSelected} />}\n label=\"Lasso Select (L)\"\n index={2}\n />\n <ToolbarButton\n key=\"erase\"\n onClick={() => editor.setCurrentTool('eraser')}\n isSelected={isEraseSelected}\n icon={<EraseIcon isSelected={isEraseSelected} />}\n label=\"Eraser (E)\"\n index={3}\n />\n\n {/* Collapse Chevron */}\n <CollapseButton\n key=\"collapse\"\n onClick={handleCollapse}\n />\n </>\n )}\n </AnimatePresence>\n </motion.div>\n </div>\n\n {/* Shape Picker (for geo tool sub-shapes) */}\n <ShapePicker\n isOpen={isShapePickerOpen}\n onClose={() => setIsShapePickerOpen(false)}\n onSelectShape={handleSelectShape}\n anchorRef={shapesButtonRef}\n />\n </>\n );\n};\n","// =============================================================================\n// Annotation Marker Component - Shows numbered markers for each annotation\n// =============================================================================\n\nimport React from 'react';\nimport type { Annotation, DOMSelection } from '../../types';\n\n// =============================================================================\n// Single Annotation Marker\n// =============================================================================\n\ninterface AnnotationMarkerProps {\n annotation: Annotation;\n index: number;\n scrollOffset: { x: number; y: number };\n onHover: (id: string | null) => void;\n onClick: (annotation: Annotation) => void;\n isHovered: boolean;\n accentColor?: string;\n}\n\nconst AnnotationMarker: React.FC<AnnotationMarkerProps> = ({\n annotation,\n index,\n scrollOffset,\n onHover,\n onClick,\n isHovered,\n accentColor = '#3b82f6',\n}) => {\n // Get position based on annotation type\n let markerX: number;\n let markerY: number;\n\n if (annotation.type === 'dom_selection') {\n const sel = annotation as DOMSelection;\n markerX = sel.boundingBox.x + sel.boundingBox.width / 2;\n markerY = sel.boundingBox.y;\n } else if (annotation.type === 'drawing') {\n markerX = annotation.boundingBox.x + annotation.boundingBox.width / 2;\n markerY = annotation.boundingBox.y;\n } else {\n markerX = annotation.boundingBox.x + annotation.boundingBox.width / 2;\n markerY = annotation.boundingBox.y;\n }\n\n // Convert to viewport coordinates\n const viewportX = markerX - scrollOffset.x;\n const viewportY = markerY - scrollOffset.y - 12; // Position above the element\n\n const isDrawing = annotation.type === 'drawing';\n const markerColor = isDrawing ? '#8B5CF6' : accentColor; // Purple for drawings\n\n // Get comment for tooltip\n const comment = annotation.type === 'dom_selection'\n ? (annotation as DOMSelection).comment\n : undefined;\n const elementName = annotation.type === 'dom_selection'\n ? (annotation as DOMSelection).tagName\n : 'Drawing';\n\n return (\n <div\n data-skema=\"annotation-marker\"\n style={{\n position: 'fixed',\n left: viewportX,\n top: viewportY,\n transform: 'translate(-50%, -100%)',\n zIndex: 999998,\n pointerEvents: 'auto',\n }}\n >\n {/* Marker circle */}\n <div\n style={{\n width: isHovered ? 26 : 22,\n height: isHovered ? 26 : 22,\n borderRadius: '50%',\n backgroundColor: isHovered ? '#ef4444' : markerColor,\n color: 'white',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 11,\n fontWeight: 600,\n fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n cursor: 'pointer',\n boxShadow: '0 2px 8px rgba(0,0,0,0.2)',\n transition: 'all 0.15s ease',\n userSelect: 'none',\n }}\n onMouseEnter={() => onHover(annotation.id)}\n onMouseLeave={() => onHover(null)}\n onClick={(e) => {\n e.stopPropagation();\n onClick(annotation);\n }}\n >\n {isHovered ? '×' : index + 1}\n </div>\n\n {/* Tooltip on hover */}\n {isHovered && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n bottom: '100%',\n transform: 'translateX(-50%)',\n marginBottom: 8,\n padding: '8px 12px',\n backgroundColor: '#1a1a1a',\n borderRadius: 8,\n boxShadow: '0 4px 12px rgba(0,0,0,0.3)',\n whiteSpace: 'nowrap',\n maxWidth: 200,\n zIndex: 999999,\n }}\n >\n <div style={{\n fontSize: 11,\n color: 'rgba(255,255,255,0.6)',\n marginBottom: comment ? 4 : 0,\n }}>\n {elementName}\n </div>\n {comment && (\n <div style={{\n fontSize: 12,\n color: 'white',\n whiteSpace: 'normal',\n wordBreak: 'break-word',\n }}>\n {comment.length > 50 ? comment.slice(0, 50) + '...' : comment}\n </div>\n )}\n <div style={{\n fontSize: 10,\n color: 'rgba(255,255,255,0.4)',\n marginTop: 4,\n }}>\n Click to delete\n </div>\n </div>\n )}\n </div>\n );\n};\n\n// =============================================================================\n// Annotation Markers Layer - Container for all markers\n// =============================================================================\n\ninterface AnnotationMarkersLayerProps {\n annotations: Annotation[];\n scrollOffset: { x: number; y: number };\n hoveredMarkerId: string | null;\n onHover: (id: string | null) => void;\n onDelete: (annotation: Annotation) => void;\n}\n\nexport const AnnotationMarkersLayer: React.FC<AnnotationMarkersLayerProps> = ({\n annotations,\n scrollOffset,\n hoveredMarkerId,\n onHover,\n onDelete,\n}) => {\n return (\n <>\n {annotations.map((annotation, index) => (\n <AnnotationMarker\n key={annotation.id}\n annotation={annotation}\n index={index}\n scrollOffset={scrollOffset}\n onHover={onHover}\n onClick={onDelete}\n isHovered={hoveredMarkerId === annotation.id}\n />\n ))}\n </>\n );\n};\n","// =============================================================================\n// Annotations Sidebar - Collapsible panel showing annotation list\n// =============================================================================\n\nimport React, { useState } from 'react';\nimport type { Annotation, DOMSelection, DrawingAnnotation } from '../../types';\n\ninterface AnnotationsSidebarProps {\n annotations: Annotation[];\n onClear: () => void;\n onExport: () => void;\n}\n\nexport const AnnotationsSidebar: React.FC<AnnotationsSidebarProps> = ({\n annotations,\n onClear,\n onExport,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n\n return (\n <div\n data-skema=\"sidebar\"\n style={{\n position: 'fixed',\n right: isOpen ? 0 : -280,\n top: 60,\n width: 280,\n maxHeight: 'calc(100vh - 120px)',\n backgroundColor: 'white',\n borderRadius: '8px 0 0 8px',\n boxShadow: '-2px 0 10px rgba(0,0,0,0.1)',\n transition: 'right 0.2s ease-out',\n zIndex: 999996,\n overflow: 'hidden',\n }}\n >\n {/* Toggle button */}\n <button\n onClick={() => setIsOpen(!isOpen)}\n style={{\n position: 'absolute',\n left: -32,\n top: 10,\n width: 32,\n height: 32,\n backgroundColor: '#3b82f6',\n border: 'none',\n borderRadius: '8px 0 0 8px',\n color: 'white',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {isOpen ? '→' : '←'}\n </button>\n\n {/* Header */}\n <div\n style={{\n padding: '12px 16px',\n borderBottom: '1px solid #e5e7eb',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <span style={{ fontWeight: 600, fontSize: '14px' }}>\n Annotations ({annotations.length})\n </span>\n <div style={{ display: 'flex', gap: '8px' }}>\n <button\n onClick={onExport}\n style={{\n padding: '4px 8px',\n fontSize: '12px',\n backgroundColor: '#3b82f6',\n color: 'white',\n border: 'none',\n borderRadius: '4px',\n cursor: 'pointer',\n }}\n >\n Export\n </button>\n <button\n onClick={onClear}\n style={{\n padding: '4px 8px',\n fontSize: '12px',\n backgroundColor: '#ef4444',\n color: 'white',\n border: 'none',\n borderRadius: '4px',\n cursor: 'pointer',\n }}\n >\n Clear\n </button>\n </div>\n </div>\n\n {/* Annotations list */}\n <div style={{ overflowY: 'auto', maxHeight: 'calc(100vh - 200px)' }}>\n {annotations.length === 0 ? (\n <div style={{ padding: '16px', color: '#6b7280', fontSize: '13px' }}>\n No annotations yet. Double-click to select an element, or use draw/lasso to annotate.\n </div>\n ) : (\n annotations.map((annotation) => (\n <div\n key={annotation.id}\n style={{\n padding: '12px 16px',\n borderBottom: '1px solid #f3f4f6',\n fontSize: '13px',\n }}\n >\n <div style={{ fontWeight: 500, marginBottom: '4px' }}>\n {annotation.type === 'dom_selection' && `[DOM] ${(annotation as DOMSelection).tagName}`}\n {annotation.type === 'drawing' && `[Draw] ${(annotation as DrawingAnnotation).comment || 'Drawing'}`}\n {annotation.type === 'gesture' && `[Gesture] ${annotation.gesture}`}\n </div>\n {annotation.type === 'dom_selection' && (\n <>\n {(annotation as DOMSelection).comment && (\n <div style={{ color: '#374151', fontSize: '12px', marginBottom: '4px' }}>\n {(annotation as DOMSelection).comment}\n </div>\n )}\n <div style={{ color: '#6b7280', fontSize: '11px' }}>\n {(annotation as DOMSelection).selector.slice(0, 50)}\n </div>\n </>\n )}\n </div>\n ))\n )}\n </div>\n </div>\n );\n};\n","// =============================================================================\n// Selection Overlay - Highlights selected DOM elements\n// =============================================================================\n\nimport React, { useEffect, useState } from 'react';\nimport type { DOMSelection } from '../../types';\n\ninterface SelectionOverlayProps {\n selections: DOMSelection[];\n}\n\nexport const SelectionOverlay: React.FC<SelectionOverlayProps> = ({ selections }) => {\n // Track scroll position to trigger re-renders\n const [scrollPos, setScrollPos] = useState({ x: 0, y: 0 });\n\n useEffect(() => {\n const handleScrollOrResize = () => {\n setScrollPos({ x: window.scrollX, y: window.scrollY });\n };\n // Initial position\n handleScrollOrResize();\n window.addEventListener('scroll', handleScrollOrResize, { passive: true });\n window.addEventListener('resize', handleScrollOrResize);\n return () => {\n window.removeEventListener('scroll', handleScrollOrResize);\n window.removeEventListener('resize', handleScrollOrResize);\n };\n }, []);\n\n return (\n <>\n {selections.map((selection) => {\n // boundingBox is stored in document coordinates\n // Convert to viewport coordinates by subtracting current scroll\n const viewportX = selection.boundingBox.x - scrollPos.x;\n const viewportY = selection.boundingBox.y - scrollPos.y;\n\n return (\n <div\n key={selection.id}\n data-skema=\"selection\"\n style={{\n position: 'fixed',\n left: viewportX,\n top: viewportY,\n width: selection.boundingBox.width,\n height: selection.boundingBox.height,\n border: '2px solid #10b981',\n backgroundColor: 'rgba(16, 185, 129, 0.1)',\n pointerEvents: 'none',\n zIndex: 999997,\n }}\n >\n <span\n style={{\n position: 'absolute',\n top: -20,\n left: 0,\n backgroundColor: '#10b981',\n color: 'white',\n padding: '2px 6px',\n fontSize: '11px',\n borderRadius: '3px',\n whiteSpace: 'nowrap',\n }}\n >\n {selection.tagName}\n </span>\n </div>\n );\n })}\n </>\n );\n};\n","// =============================================================================\n// Processing Overlay - Shows animation when changes are being made\n// =============================================================================\n\nimport React from 'react';\nimport type { BoundingBox } from '../../types';\n\n// =============================================================================\n// Animated Shape Loader - Cycles through colorful shapes\n// =============================================================================\n\nconst ShapeLoader: React.FC = () => {\n return (\n <div\n style={{\n position: 'relative',\n width: 28,\n height: 28,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {/* Orange Star */}\n <svg\n className=\"skema-shape skema-shape-1\"\n viewBox=\"0 0 24 24\"\n style={{\n position: 'absolute',\n width: 24,\n height: 24,\n }}\n >\n <polygon\n points=\"12,2 15,9 22,9 16,14 18,22 12,17 6,22 8,14 2,9 9,9\"\n fill=\"#F97316\"\n />\n </svg>\n {/* Yellow Parallelogram */}\n <svg\n className=\"skema-shape skema-shape-2\"\n viewBox=\"0 0 24 24\"\n style={{\n position: 'absolute',\n width: 24,\n height: 24,\n }}\n >\n <polygon\n points=\"6,4 22,4 18,20 2,20\"\n fill=\"#FACC15\"\n />\n </svg>\n {/* Red Triangle */}\n <svg\n className=\"skema-shape skema-shape-3\"\n viewBox=\"0 0 24 24\"\n style={{\n position: 'absolute',\n width: 24,\n height: 24,\n }}\n >\n <polygon\n points=\"12,3 22,21 2,21\"\n fill=\"#EF4444\"\n />\n </svg>\n {/* Blue Circle */}\n <svg\n className=\"skema-shape skema-shape-4\"\n viewBox=\"0 0 24 24\"\n style={{\n position: 'absolute',\n width: 24,\n height: 24,\n }}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"#3B82F6\" />\n </svg>\n {/* Green Square */}\n <svg\n className=\"skema-shape skema-shape-5\"\n viewBox=\"0 0 24 24\"\n style={{\n position: 'absolute',\n width: 24,\n height: 24,\n }}\n >\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" fill=\"#22C55E\" />\n </svg>\n </div>\n );\n};\n\n// =============================================================================\n// Processing Overlay Styles (CSS Keyframes)\n// =============================================================================\n\nexport const ProcessingOverlayStyles = `\n @keyframes skema-processing-pulse {\n 0%, 100% {\n opacity: 0.7;\n transform: scale(1);\n }\n 50% {\n opacity: 0.95;\n transform: scale(1.02);\n }\n }\n @keyframes skema-processing-shimmer {\n 0% {\n background-position: -200% 0;\n }\n 100% {\n background-position: 200% 0;\n }\n }\n @keyframes skema-processing-border {\n 0%, 100% {\n border-color: rgba(139, 92, 246, 0.85);\n }\n 50% {\n border-color: rgba(139, 92, 246, 1);\n }\n }\n \n /* Shape loader animations */\n .skema-shape {\n opacity: 0;\n transform: scale(0.5) rotate(-180deg);\n animation: skema-shape-cycle 2.5s ease-in-out infinite;\n }\n .skema-shape-1 { animation-delay: 0s; }\n .skema-shape-2 { animation-delay: 0.5s; }\n .skema-shape-3 { animation-delay: 1s; }\n .skema-shape-4 { animation-delay: 1.5s; }\n .skema-shape-5 { animation-delay: 2s; }\n \n @keyframes skema-shape-cycle {\n 0%, 100% {\n opacity: 0;\n transform: scale(0.5) rotate(-180deg);\n }\n 10%, 30% {\n opacity: 1;\n transform: scale(1) rotate(0deg);\n }\n 40% {\n opacity: 0;\n transform: scale(0.5) rotate(180deg);\n }\n }\n`;\n\n// =============================================================================\n// Main Processing Overlay Component\n// =============================================================================\n\ninterface ProcessingOverlayProps {\n boundingBox: BoundingBox;\n scrollOffset: { x: number; y: number };\n}\n\nexport const ProcessingOverlay: React.FC<ProcessingOverlayProps> = ({ boundingBox, scrollOffset }) => {\n // Convert to viewport coordinates\n const viewportX = boundingBox.x - scrollOffset.x;\n const viewportY = boundingBox.y - scrollOffset.y;\n\n return (\n <>\n <style>{ProcessingOverlayStyles}</style>\n <div\n data-skema=\"processing-overlay\"\n style={{\n position: 'fixed',\n left: viewportX,\n top: viewportY,\n width: boundingBox.width,\n height: boundingBox.height,\n border: '3px solid rgba(139, 92, 246, 0.95)',\n borderRadius: 4,\n pointerEvents: 'none',\n zIndex: 999998,\n animation: 'skema-processing-pulse 1.5s ease-in-out infinite, skema-processing-border 1.5s ease-in-out infinite',\n background: 'linear-gradient(90deg, rgba(139, 92, 246, 0.15) 0%, rgba(139, 92, 246, 0.35) 50%, rgba(139, 92, 246, 0.15) 100%)',\n backgroundSize: '200% 100%',\n }}\n >\n {/* Shimmer effect */}\n <div\n style={{\n position: 'absolute',\n inset: 0,\n background: 'linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.25) 50%, transparent 100%)',\n backgroundSize: '200% 100%',\n animation: 'skema-processing-shimmer 2s linear infinite',\n borderRadius: 2,\n }}\n />\n {/* Loading indicator badge with animated shapes */}\n <div\n style={{\n position: 'absolute',\n top: -18,\n left: '50%',\n transform: 'translateX(-50%)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '8px 14px',\n backgroundColor: '#FFFFFF',\n borderRadius: 20,\n boxShadow: '0 4px 16px rgba(0, 0, 0, 0.2), 0 0 0 1px rgba(0, 0, 0, 0.08)',\n }}\n >\n <ShapeLoader />\n </div>\n </div>\n </>\n );\n};\n","// =============================================================================\n// Annotation Popup Component\n// =============================================================================\n// A popup that appears when selecting DOM elements or drawings, allowing users\n// to add comments to their annotations. Matches Skema's white floating card\n// design language with playful geometric accent shapes.\n\nimport React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n forwardRef,\n useImperativeHandle,\n} from 'react';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface AnnotationPopupProps {\n /** Element name/description to display in header */\n element: string;\n /** Optional selected/highlighted text */\n selectedText?: string;\n /** Placeholder text for the textarea */\n placeholder?: string;\n /** Initial value for textarea (for edit mode) */\n initialValue?: string;\n /** Label for submit button (default: \"Add\") */\n submitLabel?: string;\n /** Called when annotation is submitted with text */\n onSubmit: (text: string) => void;\n /** Called when popup is cancelled/dismissed */\n onCancel: () => void;\n /** Position styles (left, top) */\n style?: React.CSSProperties;\n /** Custom accent color (hex) */\n accentColor?: string;\n /** External exit state (parent controls exit animation) */\n isExiting?: boolean;\n /** Whether this is a multi-select annotation */\n isMultiSelect?: boolean;\n /** Dark mode */\n isDark?: boolean;\n}\n\nexport interface AnnotationPopupHandle {\n /** Shake the popup (e.g., when user clicks outside) */\n shake: () => void;\n}\n\n// =============================================================================\n// Geometric Accent Shape\n// =============================================================================\n\n/** Small decorative shape that indicates annotation type via color */\nconst AccentShape: React.FC<{ color: string; isMultiSelect: boolean }> = ({ color, isMultiSelect }) => {\n // Green (#34C759) = multi-select → square\n // Purple (#8B5CF6) = drawing → star\n // Blue (#3b82f6) = single DOM → circle (default)\n const isDrawing = color === '#8B5CF6';\n\n if (isMultiSelect && !isDrawing) {\n // Green square for multi-select\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" style={{ flexShrink: 0 }}>\n <rect x=\"1\" y=\"1\" width=\"8\" height=\"8\" rx=\"1.5\" fill={color} />\n </svg>\n );\n }\n\n if (isDrawing) {\n // Star for drawing annotations\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" style={{ flexShrink: 0 }}>\n <path\n d=\"M6 1L7.4 4.2L10.8 4.6L8.2 7L8.9 10.4L6 8.7L3.1 10.4L3.8 7L1.2 4.6L4.6 4.2L6 1Z\"\n fill={color}\n />\n </svg>\n );\n }\n\n // Circle for single DOM selection\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" style={{ flexShrink: 0 }}>\n <circle cx=\"5\" cy=\"5\" r=\"4\" fill={color} />\n </svg>\n );\n};\n\n// =============================================================================\n// Styles — White floating card matching Skema toolbar aesthetic\n// =============================================================================\n\nconst styles = {\n popup: {\n position: 'fixed' as const,\n transform: 'translateX(-50%)',\n width: 280,\n padding: '14px 16px 14px',\n background: '#FFFFFF',\n borderRadius: 16,\n boxShadow: '0 4px 24px rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(0, 0, 0, 0.06)',\n cursor: 'default',\n zIndex: 100001,\n fontFamily: '\"Clash Display\", system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n opacity: 0,\n transition: 'opacity 0.2s ease, transform 0.2s ease',\n },\n popupEnter: {\n opacity: 1,\n transform: 'translateX(-50%) scale(1) translateY(0)',\n },\n popupExit: {\n opacity: 0,\n transform: 'translateX(-50%) scale(0.96) translateY(4px)',\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n gap: 7,\n marginBottom: 10,\n },\n element: {\n fontSize: 12,\n fontWeight: 500,\n color: '#9CA3AF',\n maxWidth: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap' as const,\n flex: 1,\n letterSpacing: '0.01em',\n },\n quote: {\n fontSize: 12,\n fontStyle: 'italic' as const,\n color: '#6B7280',\n marginBottom: 8,\n padding: '6px 9px',\n background: '#F9FAFB',\n borderRadius: 6,\n lineHeight: 1.45,\n borderLeft: '2px solid',\n },\n textarea: {\n width: '100%',\n padding: '9px 11px',\n fontSize: 13,\n fontFamily: 'inherit',\n background: '#F9FAFB',\n color: '#1a1a1a',\n border: '1px solid #E5E7EB',\n borderRadius: 10,\n resize: 'none' as const,\n outline: 'none',\n transition: 'border-color 0.15s ease, box-shadow 0.15s ease',\n boxSizing: 'border-box' as const,\n lineHeight: 1.5,\n },\n actions: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginTop: 10,\n },\n hint: {\n fontSize: 11,\n color: '#C0C5CE',\n fontWeight: 400,\n letterSpacing: '0.01em',\n userSelect: 'none' as const,\n },\n buttonGroup: {\n display: 'flex',\n gap: 6,\n },\n button: {\n padding: '6px 14px',\n fontSize: 12,\n fontWeight: 500,\n borderRadius: 16,\n border: 'none',\n cursor: 'pointer',\n transition: 'background-color 0.15s ease, color 0.15s ease, opacity 0.15s ease, transform 0.1s ease',\n },\n cancelButton: {\n background: 'transparent',\n color: '#9CA3AF',\n },\n submitButton: {\n color: 'white',\n },\n};\n\n// =============================================================================\n// Component\n// =============================================================================\n\nexport const AnnotationPopup = forwardRef<AnnotationPopupHandle, AnnotationPopupProps>(\n function AnnotationPopup(\n {\n element,\n selectedText,\n placeholder = 'Write your changes?',\n initialValue = '',\n submitLabel = 'Add',\n onSubmit,\n onCancel,\n style,\n accentColor = '#3c82f7',\n isExiting = false,\n isMultiSelect = false,\n isDark = false,\n },\n ref\n ) {\n const [text, setText] = useState(initialValue);\n const [isShaking, setIsShaking] = useState(false);\n const [animState, setAnimState] = useState<'initial' | 'enter' | 'entered' | 'exit'>('initial');\n const [isFocused, setIsFocused] = useState(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const popupRef = useRef<HTMLDivElement>(null);\n\n // Sync with parent exit state\n useEffect(() => {\n if (isExiting && animState !== 'exit') {\n setAnimState('exit');\n }\n }, [isExiting, animState]);\n\n // Animate in on mount and focus textarea\n useEffect(() => {\n // Start enter animation\n requestAnimationFrame(() => {\n setAnimState('enter');\n });\n // Transition to entered state after animation completes\n const enterTimer = setTimeout(() => {\n setAnimState('entered');\n }, 200);\n const focusTimer = setTimeout(() => {\n const textarea = textareaRef.current;\n if (textarea) {\n textarea.focus();\n textarea.selectionStart = textarea.selectionEnd = textarea.value.length;\n textarea.scrollTop = textarea.scrollHeight;\n }\n }, 50);\n return () => {\n clearTimeout(enterTimer);\n clearTimeout(focusTimer);\n };\n }, []);\n\n // Shake animation\n const shake = useCallback(() => {\n setIsShaking(true);\n setTimeout(() => {\n setIsShaking(false);\n textareaRef.current?.focus();\n }, 250);\n }, []);\n\n // Expose shake to parent via ref\n useImperativeHandle(ref, () => ({\n shake,\n }), [shake]);\n\n // Handle cancel with exit animation\n const handleCancel = useCallback(() => {\n setAnimState('exit');\n setTimeout(() => {\n onCancel();\n }, 150);\n }, [onCancel]);\n\n // Handle submit\n const handleSubmit = useCallback(() => {\n if (!text.trim()) return;\n onSubmit(text.trim());\n }, [text, onSubmit]);\n\n // Handle keyboard\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if ((e.nativeEvent as any).isComposing) return;\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n if (e.key === 'Escape') {\n handleCancel();\n }\n },\n [handleSubmit, handleCancel]\n );\n\n // Dark mode color overrides\n const popupBg = isDark ? '#1a1a1a' : '#FFFFFF';\n const popupBorder = isDark ? 'rgba(255,255,255,0.08)' : 'rgba(0, 0, 0, 0.06)';\n const elementColor = isDark ? '#9CA3AF' : '#9CA3AF';\n const quoteBg = isDark ? '#2a2a2a' : '#F9FAFB';\n const quoteColor = isDark ? '#a1a1aa' : '#6B7280';\n const textareaBg = isDark ? '#2a2a2a' : '#F9FAFB';\n const textareaColor = isDark ? '#f0f0f0' : '#1a1a1a';\n const textareaBorder = isDark ? '#444444' : '#E5E7EB';\n const hintColor = isDark ? '#666666' : '#C0C5CE';\n const kbdBg = isDark ? '#333333' : '#F3F4F6';\n const kbdBorder = isDark ? '#555555' : '#E5E7EB';\n const cancelColor = isDark ? '#888888' : '#9CA3AF';\n const cancelHoverBg = isDark ? '#333333' : '#F3F4F6';\n const cancelHoverColor = isDark ? '#cccccc' : '#6B7280';\n\n // Compute popup style based on animation state\n const popupStyle: React.CSSProperties = {\n ...styles.popup,\n background: popupBg,\n boxShadow: isDark\n ? `0 4px 24px rgba(0, 0, 0, 0.4), 0 0 0 1px ${popupBorder}`\n : `0 4px 24px rgba(0, 0, 0, 0.12), 0 0 0 1px ${popupBorder}`,\n ...(animState === 'enter' || animState === 'entered' ? styles.popupEnter : {}),\n ...(animState === 'exit' ? styles.popupExit : {}),\n ...(isShaking ? {\n animation: 'skema-shake 0.25s ease-out',\n } : {}),\n ...style,\n };\n\n // Multi-select uses green accent\n const effectiveAccentColor = isMultiSelect ? '#34C759' : accentColor;\n\n // Compute textarea style with accent-colored focus ring\n const textareaStyle: React.CSSProperties = {\n ...styles.textarea,\n background: textareaBg,\n color: textareaColor,\n border: `1px solid ${textareaBorder}`,\n ...(isFocused ? {\n borderColor: effectiveAccentColor,\n boxShadow: `0 0 0 2px ${effectiveAccentColor}18`,\n } : {}),\n };\n\n return (\n <>\n {/* Inject keyframe animation */}\n <style>{`\n @keyframes skema-shake {\n 0%, 100% { transform: translateX(-50%) scale(1) translateY(0) translateX(0); }\n 20% { transform: translateX(-50%) scale(1) translateY(0) translateX(-3px); }\n 40% { transform: translateX(-50%) scale(1) translateY(0) translateX(3px); }\n 60% { transform: translateX(-50%) scale(1) translateY(0) translateX(-2px); }\n 80% { transform: translateX(-50%) scale(1) translateY(0) translateX(2px); }\n }\n `}</style>\n <div\n ref={popupRef}\n data-skema=\"annotation-popup\"\n style={popupStyle}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n >\n {/* Header with geometric accent shape */}\n <div style={styles.header}>\n <AccentShape color={effectiveAccentColor} isMultiSelect={isMultiSelect} />\n <span style={{ ...styles.element, color: elementColor }}>{element}</span>\n </div>\n\n {/* Quoted selected text */}\n {selectedText && (\n <div style={{ ...styles.quote, borderLeftColor: effectiveAccentColor, background: quoteBg, color: quoteColor }}>\n &ldquo;{selectedText.slice(0, 80)}\n {selectedText.length > 80 ? '...' : ''}&rdquo;\n </div>\n )}\n\n {/* Input area */}\n <textarea\n ref={textareaRef}\n style={textareaStyle}\n placeholder={placeholder}\n value={text}\n onChange={(e) => setText(e.target.value)}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n rows={2}\n onKeyDown={handleKeyDown}\n />\n\n {/* Actions row */}\n <div style={styles.actions}>\n <span style={{ ...styles.hint, color: hintColor }}>\n <kbd style={{\n fontFamily: 'inherit',\n fontSize: 10,\n padding: '1px 4px',\n background: kbdBg,\n borderRadius: 3,\n border: `1px solid ${kbdBorder}`,\n }}>↵</kbd> to send\n </span>\n <div style={styles.buttonGroup}>\n <button\n style={{ ...styles.button, ...styles.cancelButton, color: cancelColor }}\n onClick={handleCancel}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = cancelHoverBg;\n e.currentTarget.style.color = cancelHoverColor;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n e.currentTarget.style.color = cancelColor;\n }}\n >\n Cancel\n </button>\n <button\n style={{\n ...styles.button,\n ...styles.submitButton,\n backgroundColor: effectiveAccentColor,\n opacity: text.trim() ? 1 : 0.4,\n }}\n onClick={handleSubmit}\n disabled={!text.trim()}\n onMouseEnter={(e) => {\n if (text.trim()) {\n e.currentTarget.style.filter = 'brightness(0.92)';\n e.currentTarget.style.transform = 'scale(1.02)';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.filter = 'none';\n e.currentTarget.style.transform = 'scale(1)';\n }}\n >\n {submitLabel}\n </button>\n </div>\n </div>\n </div>\n </>\n );\n }\n);\n\nexport default AnnotationPopup;\n","/** Text-only \"Skema\" wordmark for light backgrounds (dark text). Exported as data URL for img src. */\nconst svg = `<svg width=\"560\" height=\"132\" viewBox=\"430 210 560 132\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M932.899 341.531C914.746 341.531 903.291 329.319 903.291 308.457C903.291 288.867 914.218 278.691 931.489 275.892L971.319 269.787V262.409C971.319 241.547 964.974 234.169 948.232 234.169C932.018 234.169 924.087 241.801 924.087 260.373V261.391H905.23V260.373C905.23 231.625 921.796 210 949.642 210C977.487 210 990 231.879 990 262.154V338.986H972.552V307.439H971.319C966.737 328.81 952.814 341.531 932.899 341.531ZM922.325 306.676C922.325 316.853 927.083 321.687 938.01 321.687C957.925 321.687 971.319 311.001 971.319 286.069L936.952 291.666C927.083 293.447 922.325 296.754 922.325 306.676Z\" fill=\"#1a1a1a\"/>\n<path d=\"M754.267 338.986H735.233V212.544H752.68V250.706H753.738C756.029 229.59 765.546 210 787.399 210C807.314 210 818.065 227.554 820.532 251.723H821.589C823.881 230.098 833.75 210 855.956 210C878.691 210 890.146 232.388 890.146 262.918V338.986H871.289V270.295C871.289 245.363 864.415 234.678 847.496 234.678C828.815 234.678 822.118 248.416 822.118 276.401V338.986H803.261V270.295C803.261 245.363 796.564 234.678 779.645 234.678C760.787 234.678 754.267 248.416 754.267 276.401V338.986Z\" fill=\"#1a1a1a\"/>\n<path d=\"M675.684 341.531C646.957 341.531 628.1 318.125 628.1 275.892C628.1 236.459 646.781 210 675.331 210C702.472 210 720.977 231.625 720.977 270.041C720.977 274.62 720.801 278.182 720.272 281.998H645.9C646.605 306.422 654.888 319.397 675.155 319.397C693.484 319.397 701.062 310.747 701.062 295.737V293.701H720.096V295.991C720.096 322.959 701.767 341.531 675.684 341.531ZM674.979 231.625C655.593 231.625 647.133 244.091 646.076 266.734H703.001V266.225C703.001 242.819 693.66 231.625 674.979 231.625Z\" fill=\"#1a1a1a\"/>\n<path d=\"M548.771 338.986H529.737L529.737 212.544H548.771L548.771 262.663H573.796L600.056 212.544H622.262L589.305 273.348L622.085 338.986H599.703L573.796 287.341H548.771V338.986Z\" fill=\"#1a1a1a\"/>\n<path d=\"M475.117 341.531C446.919 341.531 430.881 325.503 430.881 296.245V295.482H449.915V297.517C449.915 314.054 456.788 319.397 475.117 319.397C492.212 319.397 497.323 314.309 497.323 303.114C497.323 292.684 493.093 289.376 480.58 286.832L456.612 282.253C440.046 279.2 430 269.023 430 247.907C430 225.773 443.923 210 470.887 210C497.675 210 513.889 225.519 513.889 255.54V256.303H495.032V254.776C495.032 239.766 489.745 231.879 470.358 231.879C454.321 231.879 448.681 236.968 448.681 248.925C448.681 258.847 452.206 262.409 465.424 264.953L485.691 269.023C506.487 272.84 516.004 283.016 516.004 303.878C516.004 327.538 499.79 341.531 475.117 341.531Z\" fill=\"#1a1a1a\"/>\n</svg>`;\nexport const LOGO_DARK_SVG = svg;\nexport default 'data:image/svg+xml,' + encodeURIComponent(svg);\n","/** Text-only \"Skema\" wordmark for dark backgrounds (light text). Exported as data URL for img src. */\nconst svg = `<svg width=\"560\" height=\"132\" viewBox=\"378 168 560 132\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M880.899 299.531C862.746 299.531 851.291 287.319 851.291 266.457C851.291 246.867 862.218 236.691 879.489 233.892L919.319 227.787V220.409C919.319 199.547 912.974 192.169 896.232 192.169C880.018 192.169 872.087 199.801 872.087 218.373V219.391H853.23V218.373C853.23 189.625 869.796 168 897.642 168C925.487 168 938 189.879 938 220.154V296.986H920.552V265.439H919.319C914.737 286.81 900.814 299.531 880.899 299.531ZM870.325 264.676C870.325 274.853 875.083 279.687 886.01 279.687C905.925 279.687 919.319 269.001 919.319 244.069L884.952 249.666C875.083 251.447 870.325 254.754 870.325 264.676Z\" fill=\"#FFFCFC\"/>\n<path d=\"M702.267 296.986H683.233V170.544H700.68V208.706H701.738C704.029 187.59 713.546 168 735.399 168C755.314 168 766.065 185.554 768.532 209.723H769.589C771.881 188.098 781.75 168 803.956 168C826.691 168 838.146 190.388 838.146 220.918V296.986H819.289V228.295C819.289 203.363 812.415 192.678 795.496 192.678C776.815 192.678 770.118 206.416 770.118 234.401V296.986H751.261V228.295C751.261 203.363 744.564 192.678 727.645 192.678C708.787 192.678 702.267 206.416 702.267 234.401V296.986Z\" fill=\"#FFFCFC\"/>\n<path d=\"M623.684 299.531C594.957 299.531 576.1 276.125 576.1 233.892C576.1 194.459 594.781 168 623.331 168C650.472 168 668.977 189.625 668.977 228.041C668.977 232.62 668.801 236.182 668.272 239.998H593.9C594.605 264.422 602.888 277.397 623.155 277.397C641.484 277.397 649.062 268.747 649.062 253.737V251.701H668.096V253.991C668.096 280.959 649.767 299.531 623.684 299.531ZM622.979 189.625C603.593 189.625 595.133 202.091 594.076 224.734H651.001V224.225C651.001 200.819 641.66 189.625 622.979 189.625Z\" fill=\"#FFFCFC\"/>\n<path d=\"M496.771 296.986H477.737L477.737 170.544H496.771L496.771 220.663H521.796L548.056 170.544H570.262L537.305 231.348L570.085 296.986H547.703L521.796 245.341H496.771V296.986Z\" fill=\"#FFFCFC\"/>\n<path d=\"M423.117 299.531C394.919 299.531 378.881 283.503 378.881 254.245V253.482H397.915V255.517C397.915 272.054 404.788 277.397 423.117 277.397C440.212 277.397 445.323 272.309 445.323 261.114C445.323 250.684 441.093 247.376 428.58 244.832L404.612 240.253C388.046 237.2 378 227.023 378 205.907C378 183.773 391.923 168 418.887 168C445.675 168 461.889 183.519 461.889 213.54V214.303H443.032V212.776C443.032 197.766 437.745 189.879 418.358 189.879C402.321 189.879 396.681 194.968 396.681 206.925C396.681 216.847 400.206 220.409 413.424 222.953L433.691 227.023C454.487 230.84 464.004 241.016 464.004 261.878C464.004 285.538 447.79 299.531 423.117 299.531Z\" fill=\"#FFFCFC\"/>\n</svg>`;\nexport const LOGO_LIGHT_SVG = svg;\nexport default 'data:image/svg+xml,' + encodeURIComponent(svg);\n","// =============================================================================\n// Settings Panel Component\n// =============================================================================\n\nimport React from 'react';\nimport type { ExecutionMode, ProviderName, ProviderStatus, AnnotationCounts } from '../../hooks/useDaemon';\nimport logoDarkUrl from '../../assets/logo-dark';\nimport logoLightUrl from '../../assets/logo-light';\n\n// Package version - imported at build time\nconst SKEMA_VERSION = '0.2.0';\n\nexport interface SettingsPanelProps {\n isOpen: boolean;\n onClose: () => void;\n zIndex: number;\n // Daemon state\n connected: boolean;\n mode: ExecutionMode;\n provider: ProviderName | string;\n availableProviders: string[];\n providerStatus: Record<ProviderName, ProviderStatus>;\n // MCP state\n mcpServerConnected: boolean;\n mcpClientName: string | null;\n annotationCounts: AnnotationCounts;\n // Actions\n onModeChange: (mode: ExecutionMode) => Promise<boolean>;\n onProviderChange: (provider: ProviderName) => Promise<boolean>;\n // Theme (controlled by parent)\n theme: 'light' | 'dark';\n onThemeChange: (theme: 'light' | 'dark') => void;\n}\n\nexport const SettingsPanel: React.FC<SettingsPanelProps> = ({\n isOpen,\n onClose,\n zIndex,\n connected,\n mode,\n provider,\n availableProviders,\n providerStatus,\n mcpServerConnected,\n mcpClientName,\n annotationCounts,\n onModeChange,\n onProviderChange,\n theme,\n onThemeChange,\n}) => {\n if (!isOpen) return null;\n\n const isDark = theme === 'dark';\n const bgColor = isDark ? '#1a1a1a' : '#ffffff';\n const textColor = isDark ? '#ffffff' : '#1a1a1a';\n const borderColor = isDark ? '#333333' : '#e5e5e5';\n const mutedColor = isDark ? '#888888' : '#666666';\n\n return (\n <div\n style={{\n position: 'fixed',\n bottom: 70,\n right: 16,\n width: 320,\n backgroundColor: bgColor,\n borderRadius: 16,\n boxShadow: '0 8px 32px rgba(0,0,0,0.2)',\n zIndex: zIndex + 10,\n pointerEvents: 'auto',\n overflow: 'hidden',\n border: `1px solid ${borderColor}`,\n }}\n >\n {/* Header */}\n <div\n style={{\n padding: '16px 20px',\n borderBottom: `1px solid ${borderColor}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>\n <SkemaWordmark isDark={isDark} height={24} />\n <div style={{ fontSize: 12, color: mutedColor }}>v{SKEMA_VERSION}</div>\n </div>\n <div\n style={{\n fontSize: 11,\n padding: '4px 8px',\n borderRadius: 6,\n backgroundColor: connected ? '#10b98120' : '#ef444420',\n color: connected ? '#10b981' : '#ef4444',\n }}\n >\n {connected ? 'Connected' : 'Disconnected'}\n </div>\n </div>\n\n {/* Settings Content */}\n <div style={{ padding: '16px 20px' }}>\n {/* Theme Toggle - Sun/Moon icon */}\n <SettingRow label=\"Theme\" isDark={isDark} textColor={textColor} mutedColor={mutedColor}>\n <ThemeIconToggle isDark={isDark} onToggle={() => onThemeChange(isDark ? 'light' : 'dark')} />\n </SettingRow>\n\n {/* Disconnected Banner */}\n {!connected && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '10px 12px',\n borderRadius: 10,\n backgroundColor: isDark ? '#2a1a1a' : '#fef2f2',\n border: `1px solid ${isDark ? '#3d2020' : '#fecaca'}`,\n marginBottom: 12,\n }}\n >\n <span\n style={{\n width: 7,\n height: 7,\n borderRadius: '50%',\n backgroundColor: '#ef4444',\n flexShrink: 0,\n boxShadow: '0 0 6px #ef444460',\n }}\n />\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 12, fontWeight: 500, color: isDark ? '#fca5a5' : '#dc2626' }}>\n Daemon not running\n </div>\n <div style={{ fontSize: 10, color: isDark ? '#888' : '#999', marginTop: 2, lineHeight: 1.3 }}>\n Run <span style={{ fontFamily: 'monospace', fontSize: 10, color: isDark ? '#aaa' : '#666' }}>npx skema-core</span> to start\n </div>\n </div>\n </div>\n )}\n\n {/* Mode Toggle: CLI vs MCP */}\n <SettingRow label=\"Mode\" isDark={isDark} textColor={textColor} mutedColor={mutedColor} disabled={!connected}>\n <ToggleSwitch\n options={['CLI', 'MCP']}\n value={mode === 'mcp' ? 1 : 0}\n onChange={(idx) => onModeChange(idx === 1 ? 'mcp' : 'direct-cli')}\n isDark={isDark}\n disabled={!connected}\n />\n </SettingRow>\n\n {/* Mode description */}\n <div style={{ fontSize: 11, color: mutedColor, marginTop: -6, marginBottom: 12, lineHeight: 1.4, opacity: connected ? 1 : 0.4 }}>\n {mode === 'mcp'\n ? 'Annotations are queued for your AI agent to process'\n : 'Annotations processed instantly via CLI agents'}\n </div>\n\n {/* MCP Status Panel */}\n {mode === 'mcp' && connected && (\n <McpStatusPanel\n mcpServerConnected={mcpServerConnected}\n mcpClientName={mcpClientName}\n annotationCounts={annotationCounts}\n isDark={isDark}\n mutedColor={mutedColor}\n />\n )}\n\n {/* CLI Provider Toggle (only in CLI mode) */}\n {mode === 'direct-cli' && (\n <>\n <SettingRow label=\"Provider\" isDark={isDark} textColor={textColor} mutedColor={mutedColor} disabled={!connected}>\n <ToggleSwitch\n options={['Gemini', 'Claude']}\n value={provider === 'claude' ? 1 : 0}\n onChange={(idx) => onProviderChange(idx === 1 ? 'claude' : 'gemini')}\n isDark={isDark}\n disabled={!connected}\n />\n </SettingRow>\n {connected && (\n <ProviderStatusIndicator\n provider={provider as ProviderName}\n status={providerStatus[provider as ProviderName]}\n isDark={isDark}\n mutedColor={mutedColor}\n />\n )}\n </>\n )}\n </div>\n </div>\n );\n};\n\n// =============================================================================\n// Sub-components\n// =============================================================================\n\ninterface SettingRowProps {\n label: string;\n isDark: boolean;\n textColor: string;\n mutedColor: string;\n disabled?: boolean;\n children: React.ReactNode;\n}\n\nconst SettingRow: React.FC<SettingRowProps> = ({ label, textColor, disabled, children }) => (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 12,\n }}\n >\n <span style={{ fontSize: 14, color: textColor, opacity: disabled ? 0.4 : 1, transition: 'opacity 0.2s ease' }}>{label}</span>\n {children}\n </div>\n);\n\ninterface ToggleSwitchProps {\n options: [string, string];\n value: number;\n onChange: (index: number) => void;\n isDark: boolean;\n disabled?: boolean;\n}\n\nconst ToggleSwitch: React.FC<ToggleSwitchProps> = ({ options, value, onChange, isDark, disabled }) => {\n const bgColor = isDark ? '#2a2a2a' : '#f0f0f0';\n const activeColor = disabled ? (isDark ? '#555' : '#aaa') : '#FF6800';\n\n return (\n <div\n style={{\n display: 'flex',\n backgroundColor: bgColor,\n borderRadius: 8,\n padding: 2,\n opacity: disabled ? 0.5 : 1,\n transition: 'opacity 0.2s ease',\n }}\n >\n {options.map((option, idx) => (\n <button\n key={option}\n onClick={() => !disabled && onChange(idx)}\n disabled={disabled}\n style={{\n padding: '6px 12px',\n fontSize: 12,\n fontWeight: 500,\n border: 'none',\n borderRadius: 6,\n cursor: disabled ? 'not-allowed' : 'pointer',\n backgroundColor: value === idx ? activeColor : 'transparent',\n color: value === idx ? 'white' : isDark ? '#888' : '#666',\n transition: 'all 0.2s ease',\n }}\n >\n {option}\n </button>\n ))}\n </div>\n );\n};\n\n// =============================================================================\n// MCP Client Name Formatting\n// =============================================================================\n\nconst CLIENT_NAME_MAP: Record<string, string> = {\n 'cursor': 'Cursor',\n 'claude-desktop': 'Claude Desktop',\n 'claude-code': 'Claude Code',\n 'windsurf': 'Windsurf',\n 'cline': 'Cline',\n 'continue': 'Continue',\n 'zed': 'Zed',\n 'anti-gravity': 'Anti-Gravity',\n};\n\nfunction formatClientName(name: string): string {\n const lower = name.toLowerCase();\n return CLIENT_NAME_MAP[lower] || name.charAt(0).toUpperCase() + name.slice(1);\n}\n\n// =============================================================================\n// MCP Status Panel\n// =============================================================================\n\ninterface McpStatusPanelProps {\n mcpServerConnected: boolean;\n mcpClientName: string | null;\n annotationCounts: AnnotationCounts;\n isDark: boolean;\n mutedColor: string;\n}\n\nconst McpStatusPanel: React.FC<McpStatusPanelProps> = ({\n mcpServerConnected,\n mcpClientName,\n annotationCounts,\n isDark,\n mutedColor,\n}) => {\n const serverDotColor = mcpServerConnected ? '#10b981' : '#ef4444';\n const serverStatusText = mcpServerConnected\n ? mcpClientName ? formatClientName(mcpClientName) : 'Connected'\n : 'Not detected';\n const totalActive = annotationCounts.pending + annotationCounts.acknowledged;\n\n return (\n <div\n style={{\n borderRadius: 10,\n backgroundColor: isDark ? '#1a2332' : '#f0f7ff',\n border: `1px solid ${isDark ? '#2a3a4a' : '#d0e4ff'}`,\n marginBottom: 12,\n overflow: 'hidden',\n }}\n >\n {/* MCP Server Status */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '10px 14px',\n borderBottom: totalActive > 0 ? `1px solid ${isDark ? '#2a3a4a' : '#d0e4ff'}` : 'none',\n }}\n >\n <span\n style={{\n width: 7,\n height: 7,\n borderRadius: '50%',\n backgroundColor: serverDotColor,\n flexShrink: 0,\n boxShadow: `0 0 6px ${serverDotColor}60`,\n }}\n />\n <span style={{ fontSize: 12, color: isDark ? '#c8d6e5' : '#333', fontWeight: 500 }}>\n MCP Server\n </span>\n <span\n style={{\n marginLeft: 'auto',\n fontSize: 11,\n color: serverDotColor,\n fontWeight: 500,\n }}\n >\n {serverStatusText}\n </span>\n </div>\n\n {/* Annotation Pipeline Counts (only when there are active annotations) */}\n {totalActive > 0 && (\n <div style={{ padding: '8px 14px 10px' }}>\n <div style={{ display: 'flex', gap: 12 }}>\n <CountBadge label=\"Queued\" count={annotationCounts.pending} color=\"#f59e0b\" isDark={isDark} />\n <CountBadge label=\"In Progress\" count={annotationCounts.acknowledged} color=\"#3b82f6\" isDark={isDark} />\n <CountBadge label=\"Done\" count={annotationCounts.resolved} color=\"#10b981\" isDark={isDark} />\n </div>\n </div>\n )}\n\n {/* Hint when no MCP server */}\n {!mcpServerConnected && (\n <div style={{ padding: '0 14px 10px', fontSize: 10, color: mutedColor, lineHeight: 1.4 }}>\n Configure the Skema MCP server in your AI agent (Cursor, Claude Desktop, etc.) to connect.\n </div>\n )}\n </div>\n );\n};\n\n// =============================================================================\n// Count Badge (for annotation pipeline)\n// =============================================================================\n\ninterface CountBadgeProps {\n label: string;\n count: number;\n color: string;\n isDark: boolean;\n}\n\nconst CountBadge: React.FC<CountBadgeProps> = ({ label, count, color, isDark }) => (\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', flex: 1 }}>\n <span style={{ fontSize: 16, fontWeight: 600, color, lineHeight: 1 }}>{count}</span>\n <span style={{ fontSize: 9, color: isDark ? '#778899' : '#888', marginTop: 2 }}>{label}</span>\n </div>\n);\n\n// =============================================================================\n// Provider Status Indicator (single selected provider)\n// =============================================================================\n\ninterface ProviderStatusIndicatorProps {\n provider: ProviderName;\n status: ProviderStatus | undefined;\n isDark: boolean;\n mutedColor: string;\n}\n\nconst ProviderStatusIndicator: React.FC<ProviderStatusIndicatorProps> = ({ provider, status, isDark, mutedColor }) => {\n let dotColor: string;\n let statusText: string;\n let bgTint: string;\n\n if (!status || status.message === 'Checking...') {\n dotColor = mutedColor;\n statusText = 'Checking...';\n bgTint = isDark ? '#2a2a2a' : '#f5f5f5';\n } else if (status.installed && status.authorized) {\n dotColor = '#10b981';\n statusText = 'Ready';\n bgTint = isDark ? '#10b98110' : '#10b98110';\n } else if (status.installed && !status.authorized) {\n dotColor = '#f59e0b';\n statusText = 'Not authorized';\n bgTint = isDark ? '#f59e0b10' : '#f59e0b10';\n } else {\n dotColor = '#ef4444';\n statusText = 'Not installed';\n bgTint = isDark ? '#ef444410' : '#ef444410';\n }\n\n const label = provider === 'gemini' ? 'Gemini CLI' : 'Claude Code';\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n fontSize: 11,\n color: mutedColor,\n marginTop: -6,\n marginBottom: 12,\n padding: '6px 10px',\n borderRadius: 8,\n backgroundColor: bgTint,\n }}\n >\n <span\n style={{\n width: 6,\n height: 6,\n borderRadius: '50%',\n backgroundColor: dotColor,\n flexShrink: 0,\n boxShadow: `0 0 4px ${dotColor}60`,\n }}\n />\n <span>{label}</span>\n <span style={{ marginLeft: 'auto', fontSize: 10, color: dotColor, fontWeight: 500 }}>{statusText}</span>\n </div>\n );\n};\n\n// =============================================================================\n// Theme Icon Toggle (Sun / Moon)\n// =============================================================================\n\ninterface ThemeIconToggleProps {\n isDark: boolean;\n onToggle: () => void;\n}\n\nconst ThemeIconToggle: React.FC<ThemeIconToggleProps> = ({ isDark, onToggle }) => (\n <button\n onClick={onToggle}\n title={isDark ? 'Switch to light mode' : 'Switch to dark mode'}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 36,\n height: 36,\n border: 'none',\n borderRadius: 10,\n backgroundColor: isDark ? '#333333' : '#f0f0f0',\n cursor: 'pointer',\n transition: 'all 0.2s ease',\n }}\n >\n {isDark ? (\n // Moon icon\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79Z\"\n fill=\"#fbbf24\"\n stroke=\"#fbbf24\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ) : (\n // Sun icon\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"12\" cy=\"12\" r=\"5\" fill=\"#FF6800\" stroke=\"#FF6800\" strokeWidth=\"2\" />\n <line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\" stroke=\"#FF6800\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n <line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\" stroke=\"#FF6800\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n <line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\" stroke=\"#FF6800\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n <line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\" stroke=\"#FF6800\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n <line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\" stroke=\"#FF6800\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n <line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\" stroke=\"#FF6800\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n <line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\" stroke=\"#FF6800\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n <line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\" stroke=\"#FF6800\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n )}\n </button>\n);\n\n// =============================================================================\n// Skema Wordmark Logo (uses assets/logo-dark.svg and assets/logo-light.svg)\n// =============================================================================\n\ninterface SkemaWordmarkProps {\n isDark: boolean;\n height?: number;\n}\n\nconst SkemaWordmark: React.FC<SkemaWordmarkProps> = ({ isDark, height = 24 }) => {\n const src = isDark ? logoLightUrl : logoDarkUrl;\n return (\n <img\n src={src}\n alt=\"Skema\"\n height={height}\n style={{ height, width: 'auto', display: 'block' }}\n />\n );\n};\n","// =============================================================================\n// useKeyboardShortcuts - Handle keyboard shortcuts for toggling Skema\n// =============================================================================\n\nimport { useEffect } from 'react';\n\ninterface UseKeyboardShortcutsOptions {\n onToggle: () => void;\n shortcut?: string; // e.g., 'mod+shift+e'\n}\n\n/**\n * Hook to handle keyboard shortcuts for Skema\n * Default shortcut: Cmd/Ctrl + Shift + E to toggle overlay\n */\nexport function useKeyboardShortcuts({ onToggle, shortcut = 'mod+shift+e' }: UseKeyboardShortcutsOptions) {\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n const isMod = e.metaKey || e.ctrlKey;\n\n // Parse shortcut (currently only supports mod+shift+key format)\n if (shortcut === 'mod+shift+e') {\n if (isMod && e.shiftKey && e.key.toLowerCase() === 'e') {\n e.preventDefault();\n onToggle();\n }\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [onToggle, shortcut]);\n}\n","// =============================================================================\n// useScrollSync - Sync scroll position with tldraw camera\n// =============================================================================\n\nimport { useEffect, useState, RefObject } from 'react';\nimport type { Editor } from 'tldraw';\n\ninterface ScrollOffset {\n x: number;\n y: number;\n}\n\n/**\n * Hook to sync page scroll position with tldraw camera\n * Returns the current scroll offset for use in coordinate calculations\n */\nexport function useScrollSync(\n isActive: boolean,\n editorRef: RefObject<Editor | null>\n): ScrollOffset {\n const [scrollOffset, setScrollOffset] = useState<ScrollOffset>({ x: 0, y: 0 });\n\n // Sync scroll position with tldraw camera\n useEffect(() => {\n if (!isActive) return;\n\n const syncScroll = () => {\n const newOffset = { x: window.scrollX, y: window.scrollY };\n setScrollOffset(newOffset);\n\n // Update tldraw camera to match scroll position\n if (editorRef.current) {\n editorRef.current.setCamera({ x: -newOffset.x, y: -newOffset.y, z: 1 });\n }\n };\n\n // Initial sync\n syncScroll();\n\n // Listen for scroll and resize events\n window.addEventListener('scroll', syncScroll, { passive: true });\n window.addEventListener('resize', syncScroll);\n\n return () => {\n window.removeEventListener('scroll', syncScroll);\n window.removeEventListener('resize', syncScroll);\n };\n }, [isActive, editorRef]);\n\n return scrollOffset;\n}\n\n/**\n * Hook to intercept wheel events and scroll the page instead of panning tldraw\n */\nexport function useWheelIntercept(isActive: boolean) {\n useEffect(() => {\n if (!isActive) return;\n\n const handleWheel = (e: WheelEvent) => {\n // Check if the event target is within tldraw's canvas area\n const target = e.target as HTMLElement;\n if (target.closest('.tl-container') || target.closest('[data-skema=\"container\"]')) {\n // Stop tldraw from handling it\n e.stopPropagation();\n\n // Manually scroll the page\n window.scrollBy({\n top: e.deltaY,\n left: e.deltaX,\n behavior: 'auto',\n });\n }\n };\n\n // Capture phase to intercept before tldraw\n document.addEventListener('wheel', handleWheel, { capture: true, passive: false });\n\n return () => {\n document.removeEventListener('wheel', handleWheel, { capture: true });\n };\n }, [isActive]);\n}\n","// =============================================================================\n// useShapePersistence - Hide/restore shapes when toggling Skema on/off\n// =============================================================================\n\nimport { useEffect, useRef, RefObject } from 'react';\nimport type { Editor } from 'tldraw';\n\n/**\n * Hook to persist drawing shapes when toggling Skema overlay off/on\n * \n * When user presses Cmd+Shift+E to hide Skema:\n * - Saves all drawing shapes to memory\n * - Removes them from canvas (so they don't show when overlay is hidden)\n * \n * When Skema is shown again:\n * - Restores shapes from memory back to canvas\n */\nexport function useShapePersistence(\n isActive: boolean,\n editorRef: RefObject<Editor | null>\n) {\n // Saved shapes for hide/restore when toggling Skema off/on\n const savedShapesRef = useRef<Record<string, any> | null>(null);\n const wasActiveRef = useRef<boolean>(isActive);\n\n // Hide shapes when Skema becomes inactive\n useEffect(() => {\n const editor = editorRef.current;\n\n // Detect transition from active to inactive (hiding Skema)\n if (wasActiveRef.current && !isActive && editor) {\n // Get all drawing shapes on the canvas\n const allShapes = editor.getCurrentPageShapes();\n const drawingShapes = allShapes.filter(shape =>\n ['draw', 'line', 'arrow', 'geo', 'text', 'note', 'frame'].includes(shape.type)\n );\n\n if (drawingShapes.length > 0) {\n // Save the current store snapshot (only shapes we care about)\n const shapeRecords: Record<string, any> = {};\n for (const shape of drawingShapes) {\n shapeRecords[shape.id] = shape;\n }\n savedShapesRef.current = shapeRecords;\n\n // Delete the shapes from canvas (they're now hidden)\n const shapeIds = drawingShapes.map(s => s.id);\n editor.deleteShapes(shapeIds);\n\n console.log(`[Skema] Hiding: saved ${drawingShapes.length} shape(s) to memory`);\n }\n }\n\n // Update the ref for next comparison\n wasActiveRef.current = isActive;\n }, [isActive, editorRef]);\n\n // Restore shapes when Skema becomes active again\n useEffect(() => {\n if (!isActive) return;\n\n const editor = editorRef.current;\n if (!editor || !savedShapesRef.current) return;\n\n // Small delay to ensure editor is fully ready after mount\n const timeoutId = setTimeout(() => {\n const savedShapes = savedShapesRef.current;\n const currentEditor = editorRef.current;\n if (!savedShapes || !currentEditor) return;\n\n const shapesToRestore = Object.values(savedShapes);\n\n if (shapesToRestore.length > 0) {\n // Restore shapes to the canvas\n currentEditor.createShapes(shapesToRestore);\n console.log(`[Skema] Restoring: loaded ${shapesToRestore.length} shape(s) from memory`);\n\n // Clear saved shapes after restore\n savedShapesRef.current = null;\n }\n }, 100);\n\n return () => clearTimeout(timeoutId);\n }, [isActive, editorRef]);\n}\n","/**\n * Gesture Recognition Utility\n * \n * Detects scribble gestures for the scribble-to-delete feature.\n * Based on heuristics optimized for detecting rapid back-and-forth scribbling.\n * Supports real-time detection during drawing (before pen release).\n */\n\nimport type { TLDrawShape, Editor, TLShapeId, Box } from 'tldraw';\n\nexport interface Point {\n x: number;\n y: number;\n}\n\nexport interface GestureResult {\n isScribble: boolean;\n confidence: number;\n directionChanges: number;\n compactness: number;\n}\n\nexport interface ScribbleBounds {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n width: number;\n height: number;\n}\n\n/**\n * Calculate the angle between two vectors in radians\n */\nfunction angleBetweenVectors(v1: Point, v2: Point): number {\n const dot = v1.x * v2.x + v1.y * v2.y;\n const mag1 = Math.sqrt(v1.x * v1.x + v1.y * v1.y);\n const mag2 = Math.sqrt(v2.x * v2.x + v2.y * v2.y);\n \n if (mag1 === 0 || mag2 === 0) return 0;\n \n const cosAngle = Math.max(-1, Math.min(1, dot / (mag1 * mag2)));\n return Math.acos(cosAngle);\n}\n\n/**\n * Calculate the total path length of a series of points\n */\nfunction calculatePathLength(points: Point[]): number {\n let length = 0;\n for (let i = 1; i < points.length; i++) {\n const dx = points[i].x - points[i - 1].x;\n const dy = points[i].y - points[i - 1].y;\n length += Math.sqrt(dx * dx + dy * dy);\n }\n return length;\n}\n\n/**\n * Calculate the bounding box of a series of points\n */\nfunction calculateBoundingBox(points: Point[]): { width: number; height: number; diagonal: number } {\n if (points.length === 0) {\n return { width: 0, height: 0, diagonal: 0 };\n }\n \n let minX = Infinity, maxX = -Infinity;\n let minY = Infinity, maxY = -Infinity;\n \n for (const point of points) {\n minX = Math.min(minX, point.x);\n maxX = Math.max(maxX, point.x);\n minY = Math.min(minY, point.y);\n maxY = Math.max(maxY, point.y);\n }\n \n const width = maxX - minX;\n const height = maxY - minY;\n const diagonal = Math.sqrt(width * width + height * height);\n \n return { width, height, diagonal };\n}\n\n/**\n * Calculate full bounding box with coordinates from points\n */\nexport function getPointsBounds(points: Point[]): ScribbleBounds | null {\n if (points.length === 0) {\n return null;\n }\n \n let minX = Infinity, maxX = -Infinity;\n let minY = Infinity, maxY = -Infinity;\n \n for (const point of points) {\n minX = Math.min(minX, point.x);\n maxX = Math.max(maxX, point.x);\n minY = Math.min(minY, point.y);\n maxY = Math.max(maxY, point.y);\n }\n \n return {\n minX,\n minY,\n maxX,\n maxY,\n width: maxX - minX,\n height: maxY - minY,\n };\n}\n\n/**\n * Count significant direction changes in a path\n * A direction change is when the angle between consecutive segments exceeds the threshold\n */\nfunction countDirectionChanges(points: Point[], angleThreshold: number = Math.PI / 2): number {\n if (points.length < 3) return 0;\n \n let changes = 0;\n \n // Sample points to avoid noise - take every Nth point\n const sampleRate = Math.max(1, Math.floor(points.length / 50));\n const sampledPoints: Point[] = [];\n \n for (let i = 0; i < points.length; i += sampleRate) {\n sampledPoints.push(points[i]);\n }\n // Always include the last point\n if (sampledPoints[sampledPoints.length - 1] !== points[points.length - 1]) {\n sampledPoints.push(points[points.length - 1]);\n }\n \n for (let i = 1; i < sampledPoints.length - 1; i++) {\n const v1: Point = {\n x: sampledPoints[i].x - sampledPoints[i - 1].x,\n y: sampledPoints[i].y - sampledPoints[i - 1].y,\n };\n const v2: Point = {\n x: sampledPoints[i + 1].x - sampledPoints[i].x,\n y: sampledPoints[i + 1].y - sampledPoints[i].y,\n };\n \n const angle = angleBetweenVectors(v1, v2);\n \n // Count as direction change if angle is greater than threshold (default 90 degrees)\n if (angle > angleThreshold) {\n changes++;\n }\n }\n \n return changes;\n}\n\n/**\n * Extract points from a tldraw draw shape\n */\nexport function extractPointsFromDrawShape(shape: TLDrawShape): Point[] {\n const points: Point[] = [];\n \n // TLDrawShape has segments containing points\n if (shape.props.segments) {\n for (const segment of shape.props.segments) {\n if (segment.points) {\n for (const point of segment.points) {\n points.push({ x: point.x + shape.x, y: point.y + shape.y });\n }\n }\n }\n }\n \n return points;\n}\n\n/**\n * Analyze a path and determine if it's a scribble gesture\n */\nexport function analyzeGesture(points: Point[]): GestureResult {\n if (points.length < 10) {\n return {\n isScribble: false,\n confidence: 0,\n directionChanges: 0,\n compactness: 0,\n };\n }\n \n const directionChanges = countDirectionChanges(points);\n const pathLength = calculatePathLength(points);\n const { diagonal } = calculateBoundingBox(points);\n \n // Compactness: how much the path \"folds back\" on itself\n // Higher values mean more back-and-forth motion\n const compactness = diagonal > 0 ? pathLength / diagonal : 0;\n \n // Scribble criteria:\n // - At least 4 significant direction changes (zig-zag pattern)\n // - Compactness ratio > 2.0 (path is much longer than direct distance)\n // - Minimum path length to avoid detecting small wiggles\n const minDirectionChanges = 4;\n const minCompactness = 2.0;\n const minPathLength = 100; // pixels\n \n const meetsDirectionCriteria = directionChanges >= minDirectionChanges;\n const meetsCompactnessCriteria = compactness >= minCompactness;\n const meetsLengthCriteria = pathLength >= minPathLength;\n \n const isScribble = meetsDirectionCriteria && meetsCompactnessCriteria && meetsLengthCriteria;\n \n // Calculate confidence based on how much the values exceed thresholds\n let confidence = 0;\n if (isScribble) {\n const directionScore = Math.min(1, (directionChanges - minDirectionChanges) / 6);\n const compactnessScore = Math.min(1, (compactness - minCompactness) / 3);\n confidence = (directionScore + compactnessScore) / 2;\n }\n \n return {\n isScribble,\n confidence,\n directionChanges,\n compactness,\n };\n}\n\n/**\n * Check if a tldraw draw shape is a scribble gesture\n */\nexport function isScribbleGesture(shape: TLDrawShape): GestureResult {\n const points = extractPointsFromDrawShape(shape);\n return analyzeGesture(points);\n}\n\n/**\n * Real-time scribble detection for use during drawing (before pen release)\n * Uses more aggressive thresholds since we want to detect early\n */\nexport function isRealtimeScribble(points: Point[]): GestureResult {\n // Need enough points to analyze\n if (points.length < 15) {\n return {\n isScribble: false,\n confidence: 0,\n directionChanges: 0,\n compactness: 0,\n };\n }\n \n const directionChanges = countDirectionChanges(points, Math.PI / 3); // 60 degrees - more sensitive\n const pathLength = calculatePathLength(points);\n const { diagonal } = calculateBoundingBox(points);\n \n const compactness = diagonal > 0 ? pathLength / diagonal : 0;\n \n // Real-time criteria (more sensitive for early detection):\n // - At least 3 significant direction changes\n // - Compactness ratio > 1.8 (path is longer than direct distance)\n // - Minimum path length to avoid tiny wiggles\n const minDirectionChanges = 5;\n const minCompactness = 1.8;\n const minPathLength = 80; // pixels\n \n const meetsDirectionCriteria = directionChanges >= minDirectionChanges;\n const meetsCompactnessCriteria = compactness >= minCompactness;\n const meetsLengthCriteria = pathLength >= minPathLength;\n \n const isScribble = meetsDirectionCriteria && meetsCompactnessCriteria && meetsLengthCriteria;\n \n let confidence = 0;\n if (isScribble) {\n const directionScore = Math.min(1, (directionChanges - minDirectionChanges) / 4);\n const compactnessScore = Math.min(1, (compactness - minCompactness) / 2);\n confidence = (directionScore + compactnessScore) / 2;\n }\n \n return {\n isScribble,\n confidence,\n directionChanges,\n compactness,\n };\n}\n\n/**\n * Check if two bounding boxes intersect\n */\nexport function boxesIntersect(box1: Box, box2: Box): boolean {\n return !(\n box1.x + box1.w < box2.x ||\n box2.x + box2.w < box1.x ||\n box1.y + box1.h < box2.y ||\n box2.y + box2.h < box1.y\n );\n}\n\n/**\n * Find all shapes that overlap with the given bounds\n */\nexport function findOverlappingShapes(\n editor: Editor,\n bounds: Box,\n excludeIds: TLShapeId[] = []\n): TLShapeId[] {\n const allShapes = editor.getCurrentPageShapes();\n const overlapping: TLShapeId[] = [];\n \n for (const shape of allShapes) {\n // Skip excluded shapes (like the scribble itself)\n if (excludeIds.includes(shape.id)) continue;\n \n // Only consider drawable shapes (not UI elements)\n if (!['draw', 'line', 'arrow', 'geo', 'text', 'note', 'frame'].includes(shape.type)) {\n continue;\n }\n \n const shapeBounds = editor.getShapePageBounds(shape.id);\n if (shapeBounds && boxesIntersect(bounds, shapeBounds)) {\n overlapping.push(shape.id);\n }\n }\n \n return overlapping;\n}\n\n/**\n * Find all shapes that overlap with raw bounds (for real-time detection)\n */\nexport function findOverlappingShapesFromBounds(\n editor: Editor,\n bounds: ScribbleBounds,\n excludeIds: TLShapeId[] = []\n): TLShapeId[] {\n const allShapes = editor.getCurrentPageShapes();\n const overlapping: TLShapeId[] = [];\n \n for (const shape of allShapes) {\n // Skip excluded shapes\n if (excludeIds.includes(shape.id)) continue;\n \n // Only consider drawable shapes (not UI elements)\n if (!['draw', 'line', 'arrow', 'geo', 'text', 'note', 'frame'].includes(shape.type)) {\n continue;\n }\n \n const shapeBounds = editor.getShapePageBounds(shape.id);\n if (shapeBounds) {\n // Check intersection using raw coordinates\n const intersects = !(\n bounds.maxX < shapeBounds.x ||\n bounds.minX > shapeBounds.x + shapeBounds.w ||\n bounds.maxY < shapeBounds.y ||\n bounds.minY > shapeBounds.y + shapeBounds.h\n );\n \n if (intersects) {\n overlapping.push(shape.id);\n }\n }\n }\n \n return overlapping;\n}\n","// =============================================================================\n// useScribbleDelete - Real-time scribble gesture detection for deleting shapes\n// =============================================================================\n\nimport { useEffect, useRef, Dispatch, SetStateAction } from 'react';\nimport type { Editor, TLShapeId } from 'tldraw';\nimport {\n isRealtimeScribble,\n findOverlappingShapesFromBounds,\n getPointsBounds,\n type Point as GesturePoint\n} from '../utils/gesture-recognizer';\nimport type { Annotation } from '../types';\n\ninterface UseScribbleDeleteOptions {\n isActive: boolean;\n editorRef: React.RefObject<Editor | null>;\n setAnnotations: Dispatch<SetStateAction<Annotation[]>>;\n setScribbleToast: Dispatch<SetStateAction<string | null>>;\n}\n\n/**\n * Hook to detect real-time scribble gestures and delete overlapping shapes\n * \n * While the draw tool is active, tracks pointer movements to detect\n * scribble-like patterns. When detected over existing shapes, cancels\n * the current drawing and deletes the shapes underneath.\n */\nexport function useScribbleDelete({\n isActive,\n editorRef,\n setAnnotations,\n setScribbleToast,\n}: UseScribbleDeleteOptions) {\n // Scribble detection refs - for real-time tracking during drawing\n const scribblePointsRef = useRef<GesturePoint[]>([]);\n const isDrawingRef = useRef<boolean>(false);\n const scribbleDetectedRef = useRef<boolean>(false);\n\n useEffect(() => {\n if (!isActive) return;\n\n const handleScribbleDelete = (overlappingIds: TLShapeId[]) => {\n const editor = editorRef.current;\n if (!editor || overlappingIds.length === 0) return;\n\n // Cancel the current drawing operation\n editor.cancel();\n\n // Delete overlapping shapes\n editor.deleteShapes(overlappingIds);\n\n // Remove any annotations associated with deleted shapes\n setAnnotations((prev) => prev.filter((annotation) => {\n if (annotation.type === 'drawing') {\n const drawingShapes = annotation.shapes as TLShapeId[];\n return !drawingShapes.some((shapeId) =>\n overlappingIds.includes(shapeId)\n );\n }\n return true;\n }));\n\n // Show toast notification\n const message = overlappingIds.length === 1\n ? 'Deleted 1 shape'\n : `Deleted ${overlappingIds.length} shapes`;\n setScribbleToast(message);\n setTimeout(() => setScribbleToast(null), 2000);\n\n console.log(`[Skema] Scribble-delete: removed ${overlappingIds.length} shape(s)`);\n };\n\n const handlePointerDown = (e: PointerEvent) => {\n const editor = editorRef.current;\n if (!editor) return;\n\n // Only track if draw tool is active\n const currentTool = editor.getCurrentToolId();\n if (currentTool !== 'draw') return;\n\n // Start tracking\n isDrawingRef.current = true;\n scribbleDetectedRef.current = false;\n scribblePointsRef.current = [{\n x: e.clientX + window.scrollX,\n y: e.clientY + window.scrollY\n }];\n };\n\n const handlePointerMove = (e: PointerEvent) => {\n const editor = editorRef.current;\n if (!editor || !isDrawingRef.current || scribbleDetectedRef.current) return;\n\n // Only track if draw tool is still active and pointer is down\n const currentTool = editor.getCurrentToolId();\n if (currentTool !== 'draw') {\n isDrawingRef.current = false;\n return;\n }\n\n // Add point (in page coordinates)\n const newPoint = {\n x: e.clientX + window.scrollX,\n y: e.clientY + window.scrollY\n };\n\n const points = scribblePointsRef.current;\n const lastPoint = points[points.length - 1];\n\n // Only add if moved enough (avoid duplicate points)\n if (lastPoint) {\n const dx = newPoint.x - lastPoint.x;\n const dy = newPoint.y - lastPoint.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n if (dist < 3) return;\n }\n\n points.push(newPoint);\n scribblePointsRef.current = points;\n\n // Check for scribble gesture periodically (every 5 points after initial batch)\n if (points.length >= 20 && points.length % 5 === 0) {\n const gestureResult = isRealtimeScribble(points);\n\n if (gestureResult.isScribble) {\n // Get bounds of the scribble path\n const bounds = getPointsBounds(points);\n\n if (bounds) {\n // Find shapes underneath the scribble\n const overlappingIds = findOverlappingShapesFromBounds(editor, bounds, []);\n\n if (overlappingIds.length > 0) {\n // Mark as detected to prevent re-triggering\n scribbleDetectedRef.current = true;\n isDrawingRef.current = false;\n\n // Trigger deletion\n handleScribbleDelete(overlappingIds);\n }\n }\n }\n }\n };\n\n const handlePointerUp = () => {\n // Reset tracking state\n isDrawingRef.current = false;\n scribblePointsRef.current = [];\n scribbleDetectedRef.current = false;\n };\n\n // Add listeners with capture to track before tldraw\n document.addEventListener('pointerdown', handlePointerDown, { capture: true });\n document.addEventListener('pointermove', handlePointerMove, { capture: true });\n document.addEventListener('pointerup', handlePointerUp, { capture: true });\n document.addEventListener('pointercancel', handlePointerUp, { capture: true });\n\n return () => {\n document.removeEventListener('pointerdown', handlePointerDown, { capture: true });\n document.removeEventListener('pointermove', handlePointerMove, { capture: true });\n document.removeEventListener('pointerup', handlePointerUp, { capture: true });\n document.removeEventListener('pointercancel', handlePointerUp, { capture: true });\n };\n }, [isActive, editorRef, setAnnotations, setScribbleToast]);\n}\n","// =============================================================================\n// Lasso Overlay - Renders the lasso path while drawing\n// =============================================================================\n\nimport React, { useMemo } from 'react';\nimport { TldrawOverlays, useEditor, useValue } from 'tldraw';\nimport type { LassoingState } from '../../tools/LassoSelectTool';\n\n// =============================================================================\n// Lasso Overlay Component\n// =============================================================================\n\nconst LassoOverlay: React.FC = () => {\n const editor = useEditor();\n\n // Reactively get lasso points from the tool state\n const lassoPoints = useValue(\n 'lasso points',\n () => {\n if (!editor.isIn('lasso-select.lassoing')) return [];\n // Use getStateDescendant to get the lassoing state (as per tldraw docs)\n const lassoing = editor.getStateDescendant('lasso-select.lassoing') as LassoingState | undefined;\n return lassoing?.points?.get() ?? [];\n },\n [editor]\n );\n\n // Convert points to SVG path\n const svgPath = useMemo(() => {\n if (lassoPoints.length < 2) return '';\n\n // Build SVG path from points\n let path = `M ${lassoPoints[0].x} ${lassoPoints[0].y}`;\n for (let i = 1; i < lassoPoints.length; i++) {\n path += ` L ${lassoPoints[i].x} ${lassoPoints[i].y}`;\n }\n // Close the path\n path += ' Z';\n return path;\n }, [lassoPoints]);\n\n if (lassoPoints.length === 0) return null;\n\n return (\n <svg className=\"tl-overlays__item\" aria-hidden=\"true\">\n <path\n d={svgPath}\n fill=\"none\"\n stroke=\"rgba(59, 130, 246, 1)\"\n strokeWidth=\"calc(2px / var(--tl-zoom))\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeDasharray=\"4 4\"\n />\n </svg>\n );\n};\n\n// =============================================================================\n// Combined Skema Overlays\n// =============================================================================\n\nexport const SkemaOverlays: React.FC = () => {\n return (\n <>\n <TldrawOverlays />\n <LassoOverlay />\n </>\n );\n};\n","// =============================================================================\n// tldraw Configuration - Components and UI overrides for Skema\n// =============================================================================\n\nimport type { TLComponents, TLUiOverrides } from 'tldraw';\nimport { DefaultColorThemePalette } from 'tldraw';\nimport { SkemaOverlays } from '../components/overlays/LassoOverlay';\n\n/**\n * Override tldraw's dark mode \"black\" color to stay dark.\n * By default, tldraw inverts \"black\" to light gray (#f2f2f2) in dark mode\n * for visibility on dark canvases. Since Skema is a transparent overlay,\n * the pencil should remain dark regardless of theme.\n */\nDefaultColorThemePalette.darkMode.black =\n DefaultColorThemePalette.lightMode.black;\n\n/**\n * Custom tldraw components configuration for Skema overlay mode\n * Hides most UI elements to create a clean overlay experience\n */\nexport const skemaComponents: TLComponents = {\n Toolbar: null,\n Overlays: SkemaOverlays,\n // Hide background to make canvas transparent (so website shows through)\n Background: null,\n // Hide UI elements we don't need\n SharePanel: null,\n MenuPanel: null,\n TopPanel: null,\n PageMenu: null,\n NavigationPanel: null,\n HelpMenu: null,\n Minimap: null,\n // Hide \"Back to Content\" button (HelperButtons contains this)\n HelperButtons: null,\n QuickActions: null,\n ZoomMenu: null,\n ActionsMenu: null,\n DebugPanel: null,\n DebugMenu: null,\n // Hide canvas overlays\n OnTheCanvas: null,\n InFrontOfTheCanvas: null,\n};\n\n/**\n * UI overrides to customize tool shortcuts\n */\nexport const skemaOverrides: TLUiOverrides = {\n tools(editor, tools) {\n return {\n ...tools,\n 'select': {\n ...tools['select'],\n kbd: 's',\n },\n 'lasso-select': {\n id: 'lasso-select',\n label: 'Lasso Select',\n icon: 'blob',\n kbd: 'l',\n onSelect: () => {\n editor.setCurrentTool('lasso-select');\n },\n },\n };\n },\n};\n\n/**\n * CSS to hide tldraw's UI elements we don't need\n */\nexport const skemaHiddenUiStyles = `\n .tlui-button[data-testid=\"back-to-content\"],\n .tlui-offscreen-indicator,\n [class*=\"back-to-content\"],\n .tl-offscreen-indicator,\n /* Hide \"made with tldraw\" watermark */\n .tlui-watermark,\n .tlui-watermark__inner,\n [class*=\"watermark\"] {\n display: none !important;\n }\n`;\n\n/**\n * CSS for toast animations\n */\nexport const skemaToastStyles = `\n @keyframes skema-toast-fade {\n from {\n opacity: 0;\n transform: translateX(-50%) translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n }\n`;\n","// =============================================================================\n// Skema - Main Drawing Overlay Component\n// =============================================================================\n\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n Tldraw,\n Editor,\n TLShapeId,\n StateNode,\n TLClickEventInfo,\n ArrowShapeKindStyle,\n} from 'tldraw';\nimport 'tldraw/tldraw.css';\n\n// Tools\nimport { LassoSelectTool } from '../tools/LassoSelectTool';\n\n// Types\nimport type { Annotation, DOMSelection, SkemaProps, BoundingBox, PendingAnnotation } from '../types';\n\n// Hooks\nimport { useDaemon } from '../hooks/useDaemon';\n\n// Utils\nimport { getViewportInfo, bboxIntersects } from '../utils/coordinates';\nimport {\n createDOMSelection,\n shouldIgnoreElement,\n findNearbyElementsWithStyles,\n extractProjectStyleContext,\n getBoundingBox,\n} from '../utils/element-identification';\nimport { blobToBase64, addGridToSvg, extractTextFromShapes } from '../lib/utils';\n\n// Extracted Components\nimport { SkemaToolbar } from './toolbar/SkemaToolbar';\nimport { AnnotationMarkersLayer } from './annotations/AnnotationMarker';\nimport { AnnotationsSidebar } from './annotations/AnnotationsSidebar';\nimport { SelectionOverlay } from './overlays/SelectionOverlay';\nimport { ProcessingOverlay } from './overlays/ProcessingOverlay';\nimport { AnnotationPopup, AnnotationPopupHandle } from './AnnotationPopup';\nimport { SettingsPanel } from './settings/SettingsPanel';\n\n// Extracted Hooks\nimport { useKeyboardShortcuts } from '../hooks/useKeyboardShortcuts';\nimport { useScrollSync, useWheelIntercept } from '../hooks/useScrollSync';\nimport { useShapePersistence } from '../hooks/useShapePersistence';\nimport { useScribbleDelete } from '../hooks/useScribbleDelete';\n\n// Extracted Config\nimport { skemaComponents, skemaOverrides, skemaHiddenUiStyles, skemaToastStyles } from '../lib/tldrawConfig';\n\n/**\n * Main Skema component - renders tldraw as a transparent overlay\n */\nexport const Skema: React.FC<SkemaProps> = ({\n enabled = true,\n daemonUrl = 'ws://localhost:9999',\n onAnnotationsChange,\n onAnnotationSubmit: externalOnAnnotationSubmit,\n onAnnotationDelete: externalOnAnnotationDelete,\n onProcessingCancel: externalOnProcessingCancel,\n toggleShortcut = 'mod+shift+e',\n initialAnnotations = [],\n zIndex = 99999,\n isProcessing: externalIsProcessing,\n}) => {\n // =============================================================================\n // State\n // =============================================================================\n const [annotations, setAnnotations] = useState<Annotation[]>(initialAnnotations);\n const [domSelections, setDomSelections] = useState<DOMSelection[]>([]);\n const [pendingAnnotation, setPendingAnnotation] = useState<PendingAnnotation | null>(null);\n const [pendingExiting, setPendingExiting] = useState(false);\n const [hoveredMarkerId, setHoveredMarkerId] = useState<string | null>(null);\n const [processingBoundingBox, setProcessingBoundingBox] = useState<BoundingBox | null>(null);\n const [scribbleToast, setScribbleToast] = useState<string | null>(null);\n const [internalIsProcessing, setInternalIsProcessing] = useState(false);\n const [isToolbarExpanded, setIsToolbarExpanded] = useState(false);\n const [isStylePanelOpen, setIsStylePanelOpen] = useState(false);\n const [currentToolId, setCurrentToolId] = useState<string>('select');\n\n // Theme state (persisted in localStorage)\n const [theme, setTheme] = useState<'light' | 'dark'>(() => {\n if (typeof window !== 'undefined') {\n return (localStorage.getItem('skema-theme') as 'light' | 'dark') || 'light';\n }\n return 'light';\n });\n const isDark = theme === 'dark';\n\n // Persist theme to localStorage and sync with tldraw\n useEffect(() => {\n if (typeof window !== 'undefined') {\n localStorage.setItem('skema-theme', theme);\n }\n // Sync tldraw's dark mode with Skema theme\n if (editorRef.current) {\n editorRef.current.user.updateUserPreferences({ colorScheme: theme });\n }\n }, [theme]);\n\n // Track annotation IDs to their change IDs for reverting\n const annotationChangesRef = useRef<Map<string, string>>(new Map());\n\n // =============================================================================\n // Daemon Connection (auto-connect when daemonUrl is provided)\n // =============================================================================\n const {\n state: daemonState,\n isGenerating,\n generate,\n revert,\n setMode,\n setProvider,\n } = useDaemon({\n url: daemonUrl || 'ws://localhost:9999',\n autoConnect: daemonUrl !== null,\n autoReconnect: daemonUrl !== null,\n });\n\n // Use external isProcessing if provided, otherwise use internal state\n const isProcessing = externalIsProcessing !== undefined ? externalIsProcessing : (internalIsProcessing || isGenerating);\n\n // =============================================================================\n // Internal Handlers (used when external callbacks not provided)\n // =============================================================================\n const internalOnAnnotationSubmit = useCallback(async (annotation: Annotation, comment: string) => {\n if (!daemonState.connected) {\n console.warn('[Skema] Not connected to daemon. Run: npx skema-serve');\n return;\n }\n\n setInternalIsProcessing(true);\n\n try {\n const result = await generate(\n { ...annotation, comment },\n (event) => {\n // Log events to browser console\n if (event.type === 'text') {\n console.log(`%c[Skema ${daemonState.provider}]`, 'color: #10b981', event.content);\n } else if (event.type === 'error') {\n console.error('[Skema Error]', event.content);\n }\n }\n );\n\n // Track annotation ID for revert\n if (result.annotationId) {\n annotationChangesRef.current.set(annotation.id, result.annotationId);\n }\n } catch (error) {\n console.error('[Skema] Failed to generate:', error);\n } finally {\n setInternalIsProcessing(false);\n }\n }, [daemonState.connected, daemonState.provider, generate]);\n\n const internalOnAnnotationDelete = useCallback(async (annotationId: string) => {\n const trackedId = annotationChangesRef.current.get(annotationId);\n if (!trackedId) {\n return;\n }\n\n try {\n await revert(trackedId);\n annotationChangesRef.current.delete(annotationId);\n } catch (error) {\n console.error('[Skema] Failed to revert:', error);\n }\n }, [revert]);\n\n const internalOnProcessingCancel = useCallback(() => {\n setInternalIsProcessing(false);\n }, []);\n\n // Use external callbacks if provided, otherwise use internal ones\n const onAnnotationSubmit = externalOnAnnotationSubmit || (daemonUrl !== null ? internalOnAnnotationSubmit : undefined);\n const onAnnotationDelete = externalOnAnnotationDelete || (daemonUrl !== null ? internalOnAnnotationDelete : undefined);\n const onProcessingCancel = externalOnProcessingCancel || internalOnProcessingCancel;\n\n // =============================================================================\n // Refs\n // =============================================================================\n const editorRef = useRef<Editor | null>(null);\n const popupRef = useRef<AnnotationPopupHandle>(null);\n const lastDoubleClickRef = useRef<number>(0);\n const cleanupRef = useRef<(() => void) | null>(null);\n\n // =============================================================================\n // Custom Hooks\n // =============================================================================\n\n // Keyboard shortcut to toggle toolbar expansion\n useKeyboardShortcuts({\n onToggle: useCallback(() => {\n setIsToolbarExpanded(prev => !prev);\n setIsStylePanelOpen(false);\n }, []),\n shortcut: toggleShortcut,\n });\n\n // Scroll sync between page and tldraw camera\n const scrollOffset = useScrollSync(isToolbarExpanded, editorRef);\n\n // Intercept wheel events to scroll page instead of panning tldraw\n useWheelIntercept(isToolbarExpanded);\n\n // Persist shapes when toggling overlay off/on\n useShapePersistence(isToolbarExpanded, editorRef);\n\n // Scribble gesture detection for delete\n useScribbleDelete({\n isActive: isToolbarExpanded,\n editorRef,\n setAnnotations,\n setScribbleToast,\n });\n\n // =============================================================================\n // Effects\n // =============================================================================\n\n // Notify parent of annotation changes\n useEffect(() => {\n onAnnotationsChange?.(annotations);\n }, [annotations, onAnnotationsChange]);\n\n // Clear processing bounding box when processing completes\n useEffect(() => {\n if (!isProcessing) {\n setProcessingBoundingBox(null);\n }\n }, [isProcessing]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (cleanupRef.current) {\n cleanupRef.current();\n }\n };\n }, []);\n\n // Recalculate bounding boxes on window resize\n useEffect(() => {\n if (!isToolbarExpanded) return;\n\n const handleResize = () => {\n // Update domSelections bounding boxes\n setDomSelections((prevSelections) => {\n if (prevSelections.length === 0) return prevSelections;\n\n return prevSelections.map((selection) => {\n // Handle multi-select with individual elements\n if (selection.isMultiSelect && selection.elements) {\n const updatedElements = selection.elements.map((el) => {\n const domElement = document.querySelector(el.selector) as HTMLElement | null;\n if (domElement) {\n return { ...el, boundingBox: getBoundingBox(domElement) };\n }\n return el;\n });\n\n // Recalculate combined bounding box\n const validElements = updatedElements.filter((el) => {\n const domEl = document.querySelector(el.selector);\n return domEl !== null;\n });\n\n if (validElements.length > 0) {\n const minX = Math.min(...updatedElements.map((e) => e.boundingBox.x));\n const minY = Math.min(...updatedElements.map((e) => e.boundingBox.y));\n const maxX = Math.max(...updatedElements.map((e) => e.boundingBox.x + e.boundingBox.width));\n const maxY = Math.max(...updatedElements.map((e) => e.boundingBox.y + e.boundingBox.height));\n\n return {\n ...selection,\n elements: updatedElements,\n boundingBox: {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n },\n };\n }\n return selection;\n }\n\n // Single element selection\n const domElement = document.querySelector(selection.selector) as HTMLElement | null;\n if (domElement) {\n return { ...selection, boundingBox: getBoundingBox(domElement) };\n }\n return selection;\n });\n });\n\n // Update annotations bounding boxes for dom_selection types\n setAnnotations((prevAnnotations) => {\n if (prevAnnotations.length === 0) return prevAnnotations;\n\n return prevAnnotations.map((annotation) => {\n if (annotation.type !== 'dom_selection') return annotation;\n\n // Handle multi-select with individual elements\n if (annotation.isMultiSelect && annotation.elements) {\n const updatedElements = annotation.elements.map((el) => {\n const domElement = document.querySelector(el.selector) as HTMLElement | null;\n if (domElement) {\n return { ...el, boundingBox: getBoundingBox(domElement) };\n }\n return el;\n });\n\n const validElements = updatedElements.filter((el) => {\n const domEl = document.querySelector(el.selector);\n return domEl !== null;\n });\n\n if (validElements.length > 0) {\n const minX = Math.min(...updatedElements.map((e) => e.boundingBox.x));\n const minY = Math.min(...updatedElements.map((e) => e.boundingBox.y));\n const maxX = Math.max(...updatedElements.map((e) => e.boundingBox.x + e.boundingBox.width));\n const maxY = Math.max(...updatedElements.map((e) => e.boundingBox.y + e.boundingBox.height));\n\n return {\n ...annotation,\n elements: updatedElements,\n boundingBox: {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n },\n };\n }\n return annotation;\n }\n\n // Single element selection\n const domElement = document.querySelector(annotation.selector) as HTMLElement | null;\n if (domElement) {\n return { ...annotation, boundingBox: getBoundingBox(domElement) };\n }\n return annotation;\n });\n });\n };\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, [isToolbarExpanded]);\n\n // =============================================================================\n // Helper Functions\n // =============================================================================\n\n // Get selected drawing shapes from tldraw\n const getSelectedDrawings = useCallback(() => {\n if (!editorRef.current) return [];\n const editor = editorRef.current;\n const selectedIds = editor.getSelectedShapeIds();\n const shapes = selectedIds.map(id => editor.getShape(id)).filter(Boolean);\n return shapes.filter(shape =>\n shape && ['draw', 'line', 'arrow', 'geo', 'text', 'note'].includes(shape.type)\n );\n }, []);\n\n // Find DOM elements that intersect with a bounding box\n const findDOMElementsInBounds = useCallback((bounds: BoundingBox): HTMLElement[] => {\n const elements: HTMLElement[] = [];\n const allElements = document.querySelectorAll('*');\n\n allElements.forEach((el) => {\n if (!(el instanceof HTMLElement)) return;\n if (shouldIgnoreElement(el)) return;\n\n const rect = el.getBoundingClientRect();\n const elBounds: BoundingBox = {\n x: rect.left,\n y: rect.top,\n width: rect.width,\n height: rect.height,\n };\n\n // Skip tiny elements\n if (elBounds.width < 10 || elBounds.height < 10) return;\n\n if (bboxIntersects(bounds, elBounds)) {\n const isParent = elements.some((existing) => el.contains(existing));\n if (!isParent) {\n const filtered = elements.filter((existing) => !existing.contains(el) && !el.contains(existing));\n filtered.push(el);\n elements.length = 0;\n elements.push(...filtered);\n }\n }\n });\n\n return elements;\n }, []);\n\n // =============================================================================\n // DOM Selection Handlers\n // =============================================================================\n\n const handleDOMSelect = useCallback((selection: DOMSelection) => {\n const selectedDrawings = getSelectedDrawings();\n const hasDrawings = selectedDrawings.length > 0;\n const rect = selection.boundingBox;\n const x = ((rect.x + rect.width / 2) / window.innerWidth) * 100;\n const clientY = rect.y - window.scrollY + rect.height / 2;\n\n let elementDesc = selection.tagName;\n if (hasDrawings) {\n elementDesc = `Drawing + ${selection.tagName}`;\n }\n\n setPendingAnnotation({\n x,\n y: rect.y + rect.height / 2,\n clientY,\n element: elementDesc,\n elementPath: selection.elementPath,\n selectedText: selection.text?.slice(0, 100),\n boundingBox: rect,\n isMultiSelect: hasDrawings,\n selections: [selection],\n annotationType: hasDrawings ? 'drawing' : 'dom_selection',\n shapeIds: hasDrawings ? editorRef.current?.getSelectedShapeIds() as string[] : undefined,\n });\n }, [getSelectedDrawings]);\n\n const handleMultiDOMSelect = useCallback((selections: DOMSelection[]) => {\n if (selections.length === 0) return;\n\n const selectedDrawings = getSelectedDrawings();\n const hasDrawings = selectedDrawings.length > 0;\n\n const minX = Math.min(...selections.map(s => s.boundingBox.x));\n const minY = Math.min(...selections.map(s => s.boundingBox.y));\n const maxX = Math.max(...selections.map(s => s.boundingBox.x + s.boundingBox.width));\n const maxY = Math.max(...selections.map(s => s.boundingBox.y + s.boundingBox.height));\n\n const combinedBounds: BoundingBox = {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n\n const centerX = minX + (maxX - minX) / 2;\n const centerY = minY + (maxY - minY) / 2;\n const x = (centerX / window.innerWidth) * 100;\n const clientY = centerY - window.scrollY;\n\n const elementNames = selections.slice(0, 3).map(s => s.tagName).join(', ');\n const suffix = selections.length > 3 ? ` +${selections.length - 3} more` : '';\n let element = `${selections.length} elements: ${elementNames}${suffix}`;\n\n if (hasDrawings) {\n const drawingCount = selectedDrawings.length;\n element = `Drawing (${drawingCount}) + ${element}`;\n }\n\n setPendingAnnotation({\n x,\n y: centerY,\n clientY,\n element,\n elementPath: 'multi-select',\n boundingBox: combinedBounds,\n isMultiSelect: true,\n selections,\n annotationType: hasDrawings ? 'drawing' : 'dom_selection',\n shapeIds: hasDrawings ? editorRef.current?.getSelectedShapeIds() as string[] : undefined,\n });\n }, [getSelectedDrawings]);\n\n // =============================================================================\n // Drawing Annotation Handler\n // =============================================================================\n\n const handleDrawingAnnotation = useCallback((selectedIds: TLShapeId[], skipDomElements = false) => {\n if (!editorRef.current || selectedIds.length === 0) return;\n if (pendingAnnotation) return;\n\n const editor = editorRef.current;\n const selectedShapes = selectedIds.map((id) => editor.getShape(id)).filter(Boolean);\n if (selectedShapes.length === 0) return;\n\n // Calculate bounds from shapes\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const shape of selectedShapes) {\n if (!shape) continue;\n const bounds = editor.getShapePageBounds(shape.id);\n if (bounds) {\n minX = Math.min(minX, bounds.x);\n minY = Math.min(minY, bounds.y);\n maxX = Math.max(maxX, bounds.x + bounds.width);\n maxY = Math.max(maxY, bounds.y + bounds.height);\n }\n }\n if (minX === Infinity) return;\n\n const selectionBounds = { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n\n const drawingShapes = selectedShapes.filter(shape =>\n shape && ['draw', 'line', 'arrow', 'geo', 'text', 'note'].includes(shape.type)\n );\n if (drawingShapes.length === 0) return;\n\n // Find DOM elements in bounds (unless skipped)\n let domElements: HTMLElement[] = [];\n if (!skipDomElements) {\n const viewportBounds: BoundingBox = {\n x: selectionBounds.x - window.scrollX,\n y: selectionBounds.y - window.scrollY,\n width: selectionBounds.width,\n height: selectionBounds.height,\n };\n domElements = findDOMElementsInBounds(viewportBounds);\n }\n\n const centerX = selectionBounds.x + selectionBounds.width / 2;\n const centerY = selectionBounds.y + selectionBounds.height / 2;\n const x = ((centerX - window.scrollX) / window.innerWidth) * 100;\n const clientY = centerY - window.scrollY;\n\n let elementDesc = `Drawing (${drawingShapes.length} shape${drawingShapes.length > 1 ? 's' : ''})`;\n if (domElements.length > 0) {\n const domNames = domElements.slice(0, 2).map(el => el.tagName.toLowerCase()).join(', ');\n const domSuffix = domElements.length > 2 ? ` +${domElements.length - 2} more` : '';\n elementDesc += ` + ${domNames}${domSuffix}`;\n }\n\n const newDomSelections = domElements.map(el => createDOMSelection(el));\n\n setPendingAnnotation({\n x,\n y: centerY,\n clientY,\n element: elementDesc,\n elementPath: 'drawing',\n boundingBox: selectionBounds,\n isMultiSelect: drawingShapes.length > 1 || domElements.length > 0,\n annotationType: 'drawing',\n shapeIds: selectedIds as string[],\n selections: newDomSelections.length > 0 ? newDomSelections : undefined,\n });\n }, [pendingAnnotation, findDOMElementsInBounds]);\n\n // =============================================================================\n // Annotation Submit/Cancel/Delete Handlers\n // =============================================================================\n\n const handleAnnotationSubmit = useCallback(async (comment: string) => {\n if (!pendingAnnotation) return;\n\n // Generate IDs once to ensure consistency between state and callback\n const now = Date.now();\n let submittedAnnotation: Annotation | undefined;\n\n if (pendingAnnotation.annotationType === 'dom_selection' && pendingAnnotation.selections) {\n const selections = pendingAnnotation.selections;\n\n if (selections.length === 1) {\n const selection = { ...selections[0], comment };\n setDomSelections((prev) => [...prev, selection]);\n setAnnotations((prev) => [...prev, { type: 'dom_selection' as const, ...selection }]);\n submittedAnnotation = { type: 'dom_selection' as const, ...selections[0], comment };\n } else {\n const groupedSelection: DOMSelection = {\n id: `group-${now}`,\n selector: selections.map(s => s.selector).join(', '),\n tagName: pendingAnnotation.element,\n elementPath: selections[0].elementPath,\n text: selections.map(s => s.text).filter(Boolean).join(' | ').slice(0, 200),\n boundingBox: pendingAnnotation.boundingBox!,\n timestamp: now,\n pathname: selections[0].pathname,\n comment,\n isMultiSelect: true,\n elements: selections.map(s => ({\n selector: s.selector,\n tagName: s.tagName,\n elementPath: s.elementPath,\n text: s.text,\n boundingBox: s.boundingBox,\n cssClasses: s.cssClasses,\n attributes: s.attributes,\n })),\n };\n setDomSelections((prev) => [...prev, groupedSelection]);\n setAnnotations((prev) => [...prev, { type: 'dom_selection' as const, ...groupedSelection }]);\n submittedAnnotation = { type: 'dom_selection' as const, ...groupedSelection };\n }\n } else if (pendingAnnotation.annotationType === 'drawing' && pendingAnnotation.shapeIds) {\n // Drawing annotation - extract SVG, PNG image\n const editor = editorRef.current;\n let drawingSvg: string | undefined;\n let drawingImage: string | undefined;\n let extractedText: string | undefined;\n const gridConfig = { color: '#0066FF', size: 100, labels: true };\n\n if (editor && pendingAnnotation.shapeIds && pendingAnnotation.shapeIds.length > 0) {\n const shapeIds = pendingAnnotation.shapeIds as TLShapeId[];\n\n try {\n const svgResult = await editor.getSvgString(shapeIds, { padding: 20, background: false });\n if (svgResult?.svg) {\n drawingSvg = addGridToSvg(svgResult.svg, gridConfig);\n }\n } catch (e) {\n console.warn('[Skema] Failed to export drawing SVG:', e);\n }\n\n try {\n const imageResult = await editor.toImage(shapeIds, { format: 'png', padding: 20, background: true });\n if (imageResult?.blob) {\n drawingImage = await blobToBase64(imageResult.blob);\n }\n } catch (e) {\n console.warn('[Skema] Failed to export drawing image:', e);\n }\n\n try {\n const shapes = shapeIds.map(id => editor.getShape(id)).filter(Boolean);\n extractedText = extractTextFromShapes(shapes);\n } catch (e) {\n console.warn('[Skema] Failed to extract text from shapes:', e);\n }\n }\n\n const nearbyElements = pendingAnnotation.boundingBox\n ? findNearbyElementsWithStyles(pendingAnnotation.boundingBox, 5)\n : [];\n const projectStyles = extractProjectStyleContext();\n const viewport = getViewportInfo();\n\n // Create the drawing annotation once with consistent ID\n const drawingAnnotation: Annotation = {\n id: `drawing-${now}`,\n type: 'drawing',\n tool: 'draw',\n shapes: pendingAnnotation.shapeIds,\n boundingBox: pendingAnnotation.boundingBox!,\n timestamp: now,\n comment,\n drawingSvg,\n drawingImage,\n extractedText: extractedText || undefined,\n gridConfig,\n nearbyElements,\n viewport,\n projectStyles,\n };\n setAnnotations((prev) => [...prev, drawingAnnotation]);\n submittedAnnotation = drawingAnnotation;\n }\n\n // Call onAnnotationSubmit callback with the same annotation object\n if (onAnnotationSubmit && submittedAnnotation) {\n if (pendingAnnotation.boundingBox) {\n setProcessingBoundingBox(pendingAnnotation.boundingBox);\n }\n onAnnotationSubmit(submittedAnnotation, comment);\n }\n\n // Animate out and clear\n setPendingExiting(true);\n setTimeout(() => {\n setPendingAnnotation(null);\n setPendingExiting(false);\n }, 150);\n }, [pendingAnnotation, onAnnotationSubmit]);\n\n const handleAnnotationCancel = useCallback(() => {\n setPendingExiting(true);\n if (isProcessing) {\n onProcessingCancel?.();\n }\n setProcessingBoundingBox(null);\n if (editorRef.current) {\n editorRef.current.setSelectedShapes([]);\n }\n setTimeout(() => {\n setPendingAnnotation(null);\n setPendingExiting(false);\n }, 150);\n }, [isProcessing, onProcessingCancel]);\n\n const handleDeleteAnnotation = useCallback((annotation: Annotation) => {\n setAnnotations((prev) => prev.filter((a) => a.id !== annotation.id));\n if (annotation.type === 'dom_selection') {\n setDomSelections((prev) => prev.filter((s) => s.id !== annotation.id));\n }\n setHoveredMarkerId(null);\n\n if (isProcessing) {\n onProcessingCancel?.();\n setProcessingBoundingBox(null);\n }\n onAnnotationDelete?.(annotation.id);\n }, [onAnnotationDelete, isProcessing, onProcessingCancel]);\n\n const handleClear = useCallback(() => {\n setAnnotations([]);\n setDomSelections([]);\n if (editorRef.current) {\n editorRef.current.selectAll();\n editorRef.current.deleteShapes(editorRef.current.getSelectedShapeIds());\n }\n }, []);\n\n const handleExport = useCallback(() => {\n const exportData = {\n version: '1.0.0',\n timestamp: new Date().toISOString(),\n viewport: getViewportInfo(),\n pathname: window.location.pathname,\n annotations,\n };\n navigator.clipboard.writeText(JSON.stringify(exportData, null, 2));\n console.log('[Skema] Exported annotations:', exportData);\n alert('Annotations copied to clipboard!');\n }, [annotations]);\n\n // =============================================================================\n // Brush/Lasso Selection Handlers\n // =============================================================================\n\n const handleBrushSelection = useCallback((brushBounds: BoundingBox) => {\n if (editorRef.current) {\n const selectedShapeIds = editorRef.current.getSelectedShapeIds();\n if (selectedShapeIds.length > 0) {\n handleDrawingAnnotation(selectedShapeIds, true);\n return;\n }\n }\n\n const viewportBounds: BoundingBox = {\n x: brushBounds.x - window.scrollX,\n y: brushBounds.y - window.scrollY,\n width: brushBounds.width,\n height: brushBounds.height,\n };\n\n const foundElements = findDOMElementsInBounds(viewportBounds);\n const newElements = foundElements.filter((el) => {\n const rect = el.getBoundingClientRect();\n return !domSelections.some(\n (s) => Math.abs(s.boundingBox.x - (rect.left + window.scrollX)) < 5 &&\n Math.abs(s.boundingBox.y - (rect.top + window.scrollY)) < 5\n );\n });\n\n if (newElements.length === 0) return;\n\n const selections = newElements.map(el => createDOMSelection(el));\n if (selections.length === 1) {\n handleDOMSelect(selections[0]);\n } else {\n handleMultiDOMSelect(selections);\n }\n }, [findDOMElementsInBounds, domSelections, handleDOMSelect, handleMultiDOMSelect, handleDrawingAnnotation]);\n\n const handleLassoSelection = useCallback((lassoPoints: { x: number; y: number }[]) => {\n if (lassoPoints.length < 3) return;\n\n if (editorRef.current) {\n const selectedShapeIds = editorRef.current.getSelectedShapeIds();\n if (selectedShapeIds.length > 0) {\n handleDrawingAnnotation(selectedShapeIds, true);\n return;\n }\n }\n\n const viewportPoints = lassoPoints.map(p => ({\n x: p.x - window.scrollX,\n y: p.y - window.scrollY,\n }));\n\n let lassoMinX = Infinity, lassoMinY = Infinity;\n let lassoMaxX = -Infinity, lassoMaxY = -Infinity;\n for (const p of viewportPoints) {\n lassoMinX = Math.min(lassoMinX, p.x);\n lassoMinY = Math.min(lassoMinY, p.y);\n lassoMaxX = Math.max(lassoMaxX, p.x);\n lassoMaxY = Math.max(lassoMaxY, p.y);\n }\n\n const allElements = document.querySelectorAll('*');\n const foundElements: HTMLElement[] = [];\n\n allElements.forEach((el) => {\n if (!(el instanceof HTMLElement)) return;\n if (shouldIgnoreElement(el)) return;\n\n const rect = el.getBoundingClientRect();\n if (rect.width < 10 || rect.height < 10) return;\n\n const boundsOverlap = !(\n rect.left > lassoMaxX ||\n rect.right < lassoMinX ||\n rect.top > lassoMaxY ||\n rect.bottom < lassoMinY\n );\n\n if (boundsOverlap) {\n const isParent = foundElements.some((existing) => el.contains(existing));\n if (!isParent) {\n const filtered = foundElements.filter((existing) => !existing.contains(el) && !el.contains(existing));\n filtered.push(el);\n foundElements.length = 0;\n foundElements.push(...filtered);\n }\n }\n });\n\n const newElements = foundElements.filter((el) => {\n const rect = el.getBoundingClientRect();\n return !domSelections.some(\n (s) => Math.abs(s.boundingBox.x - (rect.left + window.scrollX)) < 5 &&\n Math.abs(s.boundingBox.y - (rect.top + window.scrollY)) < 5\n );\n });\n\n if (newElements.length === 0) return;\n\n const selections = newElements.map(el => createDOMSelection(el));\n if (selections.length === 1) {\n handleDOMSelect(selections[0]);\n } else {\n handleMultiDOMSelect(selections);\n }\n }, [domSelections, handleDOMSelect, handleMultiDOMSelect, handleDrawingAnnotation]);\n\n // =============================================================================\n // Editor Mount Handler\n // =============================================================================\n\n const handleMount = useCallback((editor: Editor) => {\n editorRef.current = editor;\n\n // Set initial dark mode to match Skema theme\n editor.user.updateUserPreferences({ colorScheme: theme });\n\n // Set default arrow style to arc (curved)\n editor.setStyleForNextShapes(ArrowShapeKindStyle, 'arc');\n\n // Override double click behavior\n try {\n type IdleStateNode = StateNode & {\n handleDoubleClickOnCanvas(info: TLClickEventInfo): void;\n handleDoubleClickOnShape?(info: TLClickEventInfo, shape: any): void;\n };\n const selectIdleState = editor.getStateDescendant<IdleStateNode>('select.idle');\n if (selectIdleState) {\n selectIdleState.handleDoubleClickOnCanvas = (_info) => {\n lastDoubleClickRef.current = Date.now();\n const point = editor.inputs.currentScreenPoint;\n const elements = document.elementsFromPoint(point.x, point.y);\n\n const target = elements.find(el =>\n el instanceof HTMLElement && !shouldIgnoreElement(el as HTMLElement)\n ) as HTMLElement | undefined;\n\n if (target) {\n const selection = createDOMSelection(target);\n const rect = selection.boundingBox;\n const x = ((rect.x + rect.width / 2) / window.innerWidth) * 100;\n const clientY = rect.y - window.scrollY + rect.height / 2;\n\n setPendingAnnotation({\n x,\n y: rect.y + rect.height / 2,\n clientY,\n element: selection.tagName,\n elementPath: selection.elementPath,\n selectedText: selection.text?.slice(0, 100),\n boundingBox: rect,\n isMultiSelect: false,\n selections: [selection],\n annotationType: 'dom_selection',\n });\n }\n };\n\n selectIdleState.handleDoubleClickOnShape = (_info, shape) => {\n lastDoubleClickRef.current = Date.now();\n if (shape && ['draw', 'line', 'arrow', 'geo', 'text', 'note'].includes(shape.type)) {\n const selectedIds = editor.getSelectedShapeIds();\n const shapeIds = selectedIds.length > 0 ? selectedIds : [shape.id];\n handleDrawingAnnotation(shapeIds, true);\n }\n };\n }\n } catch (e) {\n console.warn('Failed to override double click behavior', e);\n }\n\n // Set initial camera to match scroll position\n editor.setCamera({ x: -window.scrollX, y: -window.scrollY, z: 1 });\n\n // Prevent zoom changes\n editor.sideEffects.registerAfterChangeHandler('camera', () => {\n const camera = editor.getCamera();\n if (camera.z !== 1) {\n editor.setCamera({ x: camera.x, y: camera.y, z: 1 });\n }\n });\n\n // Set up lasso tool callbacks\n const lassoSelectTool = editor.root.children?.['lasso-select'] as any;\n if (lassoSelectTool && 'setOnLassoComplete' in lassoSelectTool) {\n lassoSelectTool.setOnLassoComplete((points: { x: number; y: number }[]) => {\n handleLassoSelection(points);\n });\n }\n\n // Track brush selection\n let lastBrush: { x: number; y: number; w: number; h: number } | null = null;\n editor.sideEffects.registerAfterChangeHandler('instance', (prev, next) => {\n if (prev.brush && !next.brush && lastBrush) {\n const brushBounds: BoundingBox = {\n x: lastBrush.x,\n y: lastBrush.y,\n width: lastBrush.w,\n height: lastBrush.h,\n };\n handleBrushSelection(brushBounds);\n lastBrush = null;\n } else if (next.brush) {\n lastBrush = next.brush;\n }\n });\n\n // Track current tool changes for conditional UI (e.g. style panel visibility)\n const handleToolChange = () => {\n const toolId = editor.getCurrentToolId();\n setCurrentToolId((prev) => (prev !== toolId ? toolId : prev));\n };\n editor.sideEffects.registerAfterChangeHandler('instance', handleToolChange);\n }, [handleDOMSelect, handleBrushSelection, handleLassoSelection, handleMultiDOMSelect, handleDrawingAnnotation, theme]);\n\n // =============================================================================\n // Click Handler (for canceling pending annotation)\n // =============================================================================\n\n useEffect(() => {\n if (!isToolbarExpanded) return;\n\n const handlePointerDown = (e: PointerEvent) => {\n if (e.button !== 0) return;\n const target = e.target as HTMLElement;\n\n if (target.closest('[data-skema=\"annotation-popup\"]')) return;\n\n if (pendingAnnotation) {\n e.preventDefault();\n e.stopPropagation();\n handleAnnotationCancel();\n return;\n }\n\n if (e.shiftKey) return;\n if (!target.closest('.tl-canvas')) return;\n };\n\n document.addEventListener('pointerdown', handlePointerDown, { capture: true });\n return () => document.removeEventListener('pointerdown', handlePointerDown, { capture: true });\n }, [isToolbarExpanded, pendingAnnotation, handleAnnotationCancel]);\n\n // =============================================================================\n // Render\n // =============================================================================\n\n if (!enabled) {\n return null;\n }\n\n return (\n <div\n data-skema=\"container\"\n style={{\n position: 'fixed',\n inset: 0,\n zIndex,\n pointerEvents: 'none',\n }}\n >\n {/* Hide tldraw UI elements */}\n <style>{skemaHiddenUiStyles}</style>\n \n {/* Style panel - only visible for draw/geo tools, positioned in top right corner */}\n <style>{`\n .tlui-style-panel__wrapper {\n position: fixed !important;\n top: 16px !important;\n right: 16px !important;\n bottom: auto !important;\n left: auto !important;\n ${isToolbarExpanded && (currentToolId === 'draw' || currentToolId === 'geo') ? '' : 'display: none !important;'}\n }\n `}</style>\n\n {/* Floating Settings Button - Bottom Right */}\n {isToolbarExpanded && (\n <button\n onClick={() => setIsStylePanelOpen(prev => !prev)}\n title={isStylePanelOpen ? \"Hide style settings\" : \"Show style settings\"}\n style={{\n position: 'fixed',\n bottom: 16,\n right: 16,\n width: 44,\n height: 44,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: isStylePanelOpen ? '#FF6800' : isDark ? '#2a2a2a' : 'white',\n border: 'none',\n borderRadius: 12,\n boxShadow: '0 2px 10px rgba(0,0,0,0.15)',\n cursor: 'pointer',\n pointerEvents: 'auto',\n zIndex: zIndex + 5,\n transition: 'all 0.2s ease',\n }}\n >\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15Z\"\n stroke={isStylePanelOpen ? \"white\" : isDark ? \"#9CA3AF\" : \"#6B7280\"}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M19.4 15C19.2669 15.3016 19.2272 15.6362 19.286 15.9606C19.3448 16.285 19.4995 16.5843 19.73 16.82L19.79 16.88C19.976 17.0657 20.1235 17.2863 20.2241 17.5291C20.3248 17.7719 20.3766 18.0322 20.3766 18.295C20.3766 18.5578 20.3248 18.8181 20.2241 19.0609C20.1235 19.3037 19.976 19.5243 19.79 19.71C19.6043 19.896 19.3837 20.0435 19.1409 20.1441C18.8981 20.2448 18.6378 20.2966 18.375 20.2966C18.1122 20.2966 17.8519 20.2448 17.6091 20.1441C17.3663 20.0435 17.1457 19.896 16.96 19.71L16.9 19.65C16.6643 19.4195 16.365 19.2648 16.0406 19.206C15.7162 19.1472 15.3816 19.1869 15.08 19.32C14.7842 19.4468 14.532 19.6572 14.3543 19.9255C14.1766 20.1938 14.0813 20.5082 14.08 20.83V21C14.08 21.5304 13.8693 22.0391 13.4942 22.4142C13.1191 22.7893 12.6104 23 12.08 23C11.5496 23 11.0409 22.7893 10.6658 22.4142C10.2907 22.0391 10.08 21.5304 10.08 21V20.91C10.0723 20.579 9.96512 20.258 9.77251 19.9887C9.5799 19.7194 9.31074 19.5143 9 19.4C8.69838 19.2669 8.36381 19.2272 8.03941 19.286C7.71502 19.3448 7.41568 19.4995 7.18 19.73L7.12 19.79C6.93425 19.976 6.71368 20.1235 6.47088 20.2241C6.22808 20.3248 5.96783 20.3766 5.705 20.3766C5.44217 20.3766 5.18192 20.3248 4.93912 20.2241C4.69632 20.1235 4.47575 19.976 4.29 19.79C4.10405 19.6043 3.95653 19.3837 3.85588 19.1409C3.75523 18.8981 3.70343 18.6378 3.70343 18.375C3.70343 18.1122 3.75523 17.8519 3.85588 17.6091C3.95653 17.3663 4.10405 17.1457 4.29 16.96L4.35 16.9C4.58054 16.6643 4.73519 16.365 4.794 16.0406C4.85282 15.7162 4.81312 15.3816 4.68 15.08C4.55324 14.7842 4.34276 14.532 4.07447 14.3543C3.80618 14.1766 3.49179 14.0813 3.17 14.08H3C2.46957 14.08 1.96086 13.8693 1.58579 13.4942C1.21071 13.1191 1 12.6104 1 12.08C1 11.5496 1.21071 11.0409 1.58579 10.6658C1.96086 10.2907 2.46957 10.08 3 10.08H3.09C3.42099 10.0723 3.742 9.96512 4.0113 9.77251C4.28059 9.5799 4.48572 9.31074 4.6 9C4.73312 8.69838 4.77282 8.36381 4.714 8.03941C4.65519 7.71502 4.50054 7.41568 4.27 7.18L4.21 7.12C4.02405 6.93425 3.87653 6.71368 3.77588 6.47088C3.67523 6.22808 3.62343 5.96783 3.62343 5.705C3.62343 5.44217 3.67523 5.18192 3.77588 4.93912C3.87653 4.69632 4.02405 4.47575 4.21 4.29C4.39575 4.10405 4.61632 3.95653 4.85912 3.85588C5.10192 3.75523 5.36217 3.70343 5.625 3.70343C5.88783 3.70343 6.14808 3.75523 6.39088 3.85588C6.63368 3.95653 6.85425 4.10405 7.04 4.29L7.1 4.35C7.33568 4.58054 7.63502 4.73519 7.95941 4.794C8.28381 4.85282 8.61838 4.81312 8.92 4.68H9C9.29577 4.55324 9.54802 4.34276 9.72569 4.07447C9.90337 3.80618 9.99872 3.49179 10 3.17V3C10 2.46957 10.2107 1.96086 10.5858 1.58579C10.9609 1.21071 11.4696 1 12 1C12.5304 1 13.0391 1.21071 13.4142 1.58579C13.7893 1.96086 14 2.46957 14 3V3.09C14.0013 3.41179 14.0966 3.72618 14.2743 3.99447C14.452 4.26276 14.7042 4.47324 15 4.6C15.3016 4.73312 15.6362 4.77282 15.9606 4.714C16.285 4.65519 16.5843 4.50054 16.82 4.27L16.88 4.21C17.0657 4.02405 17.2863 3.87653 17.5291 3.77588C17.7719 3.67523 18.0322 3.62343 18.295 3.62343C18.5578 3.62343 18.8181 3.67523 19.0609 3.77588C19.3037 3.87653 19.5243 4.02405 19.71 4.21C19.896 4.39575 20.0435 4.61632 20.1441 4.85912C20.2448 5.10192 20.2966 5.36217 20.2966 5.625C20.2966 5.88783 20.2448 6.14808 20.1441 6.39088C20.0435 6.63368 19.896 6.85425 19.71 7.04L19.65 7.1C19.4195 7.33568 19.2648 7.63502 19.206 7.95941C19.1472 8.28381 19.1869 8.61838 19.32 8.92V9C19.4468 9.29577 19.6572 9.54802 19.9255 9.72569C20.1938 9.90337 20.5082 9.99872 20.83 10H21C21.5304 10 22.0391 10.2107 22.4142 10.5858C22.7893 10.9609 23 11.4696 23 12C23 12.5304 22.7893 13.0391 22.4142 13.4142C22.0391 13.7893 21.5304 14 21 14H20.91C20.5882 14.0013 20.2738 14.0966 20.0055 14.2743C19.7372 14.452 19.5268 14.7042 19.4 15Z\"\n stroke={isStylePanelOpen ? \"white\" : isDark ? \"#9CA3AF\" : \"#6B7280\"}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n\n {/* Settings Panel */}\n <SettingsPanel\n isOpen={isStylePanelOpen}\n onClose={() => setIsStylePanelOpen(false)}\n zIndex={zIndex}\n connected={daemonState.connected}\n mode={daemonState.mode}\n provider={daemonState.provider}\n availableProviders={daemonState.availableProviders}\n providerStatus={daemonState.providerStatus}\n mcpServerConnected={daemonState.mcpServerConnected}\n mcpClientName={daemonState.mcpClientName}\n annotationCounts={daemonState.annotationCounts}\n onModeChange={setMode}\n onProviderChange={setProvider}\n theme={theme}\n onThemeChange={setTheme}\n />\n\n {/* tldraw overlay - only intercept events when toolbar is expanded */}\n <div\n style={{\n position: 'absolute',\n inset: 0,\n pointerEvents: isToolbarExpanded ? 'auto' : 'none',\n }}\n >\n <Tldraw\n tools={[LassoSelectTool]}\n components={skemaComponents}\n overrides={skemaOverrides}\n onMount={handleMount}\n hideUi={false}\n inferDarkMode={false}\n options={{ maxPages: 1 }}\n >\n <SkemaToolbar\n isExpanded={isToolbarExpanded}\n onExpandedChange={setIsToolbarExpanded}\n onStylePanelChange={setIsStylePanelOpen}\n isDark={isDark}\n />\n </Tldraw>\n </div>\n\n {/* DOM selection highlights */}\n <SelectionOverlay selections={domSelections} />\n\n {/* Processing loading overlay */}\n {isProcessing && processingBoundingBox && (\n <ProcessingOverlay\n boundingBox={processingBoundingBox}\n scrollOffset={scrollOffset}\n />\n )}\n\n {/* Annotation markers */}\n <AnnotationMarkersLayer\n annotations={annotations}\n scrollOffset={scrollOffset}\n hoveredMarkerId={hoveredMarkerId}\n onHover={setHoveredMarkerId}\n onDelete={handleDeleteAnnotation}\n />\n\n {/* Pending annotation highlight and popup */}\n {pendingAnnotation && pendingAnnotation.boundingBox && (\n <>\n <div\n data-skema=\"pending-highlight\"\n style={{\n position: 'fixed',\n left: pendingAnnotation.boundingBox.x - scrollOffset.x,\n top: pendingAnnotation.boundingBox.y - scrollOffset.y,\n width: pendingAnnotation.boundingBox.width,\n height: pendingAnnotation.boundingBox.height,\n border: `2px solid ${pendingAnnotation.isMultiSelect ? '#34C759' : '#3b82f6'}`,\n backgroundColor: pendingAnnotation.isMultiSelect\n ? 'rgba(52, 199, 89, 0.1)'\n : 'rgba(59, 130, 246, 0.1)',\n borderRadius: 4,\n pointerEvents: 'none',\n zIndex: zIndex + 2,\n transition: 'opacity 0.15s ease',\n opacity: pendingExiting ? 0 : 1,\n }}\n />\n\n <AnnotationPopup\n ref={popupRef}\n element={pendingAnnotation.element}\n selectedText={pendingAnnotation.selectedText}\n placeholder={\n pendingAnnotation.annotationType === 'drawing'\n ? 'What does this drawing mean?'\n : pendingAnnotation.isMultiSelect\n ? 'What should change about these elements?'\n : 'Write your changes'\n }\n onSubmit={handleAnnotationSubmit}\n onCancel={handleAnnotationCancel}\n isExiting={pendingExiting}\n isMultiSelect={pendingAnnotation.isMultiSelect}\n accentColor={pendingAnnotation.isMultiSelect ? '#34C759' : '#3b82f6'}\n isDark={isDark}\n style={{\n left: Math.max(160, Math.min(window.innerWidth - 160, (pendingAnnotation.x / 100) * window.innerWidth)),\n ...(pendingAnnotation.clientY > window.innerHeight - 250\n ? { bottom: window.innerHeight - pendingAnnotation.clientY + 30 }\n : { top: pendingAnnotation.clientY + 30 }),\n zIndex: zIndex + 3,\n pointerEvents: 'auto',\n }}\n />\n </>\n )}\n\n {/* Annotations sidebar */}\n <AnnotationsSidebar\n annotations={annotations}\n onClear={handleClear}\n onExport={handleExport}\n />\n\n {/* Scribble-delete toast notification */}\n {scribbleToast && (\n <div\n data-skema=\"scribble-toast\"\n style={{\n position: 'fixed',\n bottom: 60,\n left: '50%',\n transform: 'translateX(-50%)',\n padding: '10px 20px',\n backgroundColor: 'rgba(239, 68, 68, 0.95)',\n color: 'white',\n borderRadius: '8px',\n fontSize: '14px',\n fontWeight: 500,\n pointerEvents: 'none',\n zIndex: zIndex + 10,\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n animation: 'skema-toast-fade 0.2s ease-out',\n }}\n >\n {scribbleToast}\n </div>\n )}\n\n {/* Toast animation styles */}\n <style>{skemaToastStyles}</style>\n </div>\n );\n};\n\nexport default Skema;\n"]}
1
+ {"version":3,"sources":["../src/tools/LassoSelectTool.ts","../src/hooks/useDaemon.ts","../src/utils/coordinates.ts","../src/utils/element-identification.ts","../src/lib/utils.ts","../src/lib/settingsStorage.ts","../src/components/toolbar/ToolbarIcons.tsx","../src/components/toolbar/ShapePicker.tsx","../src/components/toolbar/SkemaToolbar.tsx","../src/components/annotations/AnnotationMarker.tsx","../src/components/annotations/AnnotationsSidebar.tsx","../src/components/overlays/SelectionOverlay.tsx","../src/components/overlays/ProcessingOverlay.tsx","../src/components/AnnotationPopup.tsx","../src/assets/logo-dark.ts","../src/assets/logo-light.ts","../src/components/settings/SettingsPanel.tsx","../src/hooks/useKeyboardShortcuts.ts","../src/hooks/useScrollSync.ts","../src/hooks/useShapePersistence.ts","../src/utils/gesture-recognizer.ts","../src/hooks/useScribbleDelete.ts","../src/components/overlays/LassoOverlay.tsx","../src/lib/tldrawConfig.ts","../src/components/Skema.tsx"],"names":["StateNode","atom","Box","useState","useRef","useCallback","options","useEffect","jsxs","jsx","useEditor","GeoShapeGeoStyle","motion","AnimatePresence","useTools","useIsToolSelected","Fragment","forwardRef","AnnotationPopup","useImperativeHandle","svg","useValue","useMemo","TldrawOverlays","DefaultColorThemePalette","domElement","ArrowShapeKindStyle","Tldraw"],"mappings":"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","file":"index.js","sourcesContent":["// =============================================================================\n// Lasso Select Tool - Freehand selection for DOM elements\n// Based on https://tldraw.dev/examples/lasso-select-tool\n// =============================================================================\n\nimport {\n StateNode,\n TLEventHandlers,\n TLPointerEventInfo,\n TLShapeId,\n atom,\n Atom,\n VecModel,\n Box,\n} from 'tldraw';\n\n/**\n * Idle state - waiting for user to start drawing lasso\n */\nclass IdleState extends StateNode {\n static override id = 'idle';\n\n override onPointerDown: TLEventHandlers['onPointerDown'] = (info) => {\n this.parent.transition('lassoing', info);\n };\n\n override onCancel: TLEventHandlers['onCancel'] = () => {\n this.editor.setCurrentTool('select');\n };\n}\n\n// Callback types\ntype OnClearSelectionsCallback = () => void;\ntype OnLassoCompleteCallback = (points: VecModel[]) => void;\n\n/**\n * Lassoing state - user is actively drawing the lasso\n */\nexport class LassoingState extends StateNode {\n static override id = 'lassoing';\n\n // Reactive atom to store lasso points for rendering\n points: Atom<VecModel[]> = atom('lasso points', []);\n \n // Track starting point to detect clicks vs drags\n startPoint: VecModel | null = null;\n\n override onEnter = (info: TLPointerEventInfo) => {\n const { currentPagePoint } = this.editor.inputs;\n this.startPoint = { x: currentPagePoint.x, y: currentPagePoint.y };\n this.points.set([{ x: currentPagePoint.x, y: currentPagePoint.y }]);\n };\n\n override onPointerMove: TLEventHandlers['onPointerMove'] = () => {\n const { currentPagePoint } = this.editor.inputs;\n const currentPoints = this.points.get();\n \n // Add point if it's far enough from the last point\n const lastPoint = currentPoints[currentPoints.length - 1];\n if (lastPoint) {\n const dx = currentPagePoint.x - lastPoint.x;\n const dy = currentPagePoint.y - lastPoint.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n \n // Only add point if moved at least 3 pixels\n if (dist > 3) {\n this.points.set([...currentPoints, { x: currentPagePoint.x, y: currentPagePoint.y }]);\n }\n }\n };\n\n override onPointerUp: TLEventHandlers['onPointerUp'] = () => {\n this.complete();\n };\n\n override onCancel: TLEventHandlers['onCancel'] = () => {\n this.cancel();\n };\n\n override onComplete: TLEventHandlers['onComplete'] = () => {\n this.complete();\n };\n\n private complete() {\n const points = this.points.get();\n const { currentPagePoint } = this.editor.inputs;\n \n // Check if this was a click (minimal movement from start)\n if (this.startPoint) {\n const dx = currentPagePoint.x - this.startPoint.x;\n const dy = currentPagePoint.y - this.startPoint.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n \n // If moved less than 10 pixels, treat as a click to deselect\n if (dist < 10 || points.length < 3) {\n // Clear tldraw selections\n this.editor.setSelectedShapes([]);\n // Signal to clear DOM selections via the tool's callback\n const tool = this.parent as LassoSelectTool;\n tool.onClearSelections?.();\n \n this.points.set([]);\n this.startPoint = null;\n this.parent.transition('idle');\n return;\n }\n }\n \n if (points.length > 2) {\n // Find shapes that intersect with the lasso\n this.selectShapesInLasso(points);\n \n // Signal to select DOM elements via the tool's callback\n const tool = this.parent as LassoSelectTool;\n tool.onLassoComplete?.(points);\n }\n \n this.points.set([]);\n this.startPoint = null;\n this.parent.transition('idle');\n }\n\n private cancel() {\n this.points.set([]);\n this.startPoint = null;\n this.parent.transition('idle');\n }\n\n /**\n * Select shapes that intersect with the lasso area (any overlap counts)\n */\n private selectShapesInLasso(points: VecModel[]) {\n // Get all shapes on the page\n const allShapes = this.editor.getCurrentPageShapes();\n \n if (allShapes.length === 0) {\n return;\n }\n\n // Get the bounding box of the lasso\n let minX = Infinity, minY = Infinity;\n let maxX = -Infinity, maxY = -Infinity;\n for (const p of points) {\n minX = Math.min(minX, p.x);\n minY = Math.min(minY, p.y);\n maxX = Math.max(maxX, p.x);\n maxY = Math.max(maxY, p.y);\n }\n\n const selectedIds: TLShapeId[] = [];\n\n for (const shape of allShapes) {\n const shapeBounds = this.editor.getShapePageBounds(shape.id);\n if (!shapeBounds) continue;\n \n // Select if bounding boxes overlap at all (any intersection)\n const boundsOverlap = !(\n shapeBounds.x > maxX ||\n shapeBounds.x + shapeBounds.width < minX ||\n shapeBounds.y > maxY ||\n shapeBounds.y + shapeBounds.height < minY\n );\n \n if (boundsOverlap) {\n selectedIds.push(shape.id);\n }\n }\n \n if (selectedIds.length > 0) {\n this.editor.setSelectedShapes(selectedIds);\n }\n }\n\n /**\n * Ray casting algorithm to check if a point is inside a polygon\n */\n private isPointInPolygon(point: VecModel, polygon: VecModel[]): boolean {\n let inside = false;\n const n = polygon.length;\n\n for (let i = 0, j = n - 1; i < n; j = i++) {\n const xi = polygon[i].x;\n const yi = polygon[i].y;\n const xj = polygon[j].x;\n const yj = polygon[j].y;\n\n const intersect =\n yi > point.y !== yj > point.y &&\n point.x < ((xj - xi) * (point.y - yi)) / (yj - yi) + xi;\n\n if (intersect) {\n inside = !inside;\n }\n }\n\n return inside;\n }\n\n /**\n * Get the bounding box of the lasso in page coordinates\n */\n getLassoBounds(): Box | null {\n const points = this.points.get();\n if (points.length < 2) return null;\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for (const point of points) {\n minX = Math.min(minX, point.x);\n minY = Math.min(minY, point.y);\n maxX = Math.max(maxX, point.x);\n maxY = Math.max(maxY, point.y);\n }\n\n return new Box(minX, minY, maxX - minX, maxY - minY);\n }\n}\n\n/**\n * Lasso Select Tool - allows freehand drawing to select shapes\n */\nexport class LassoSelectTool extends StateNode {\n static override id = 'lasso-select';\n static override initial = 'idle';\n static override children = () => [IdleState, LassoingState];\n \n // Callback to clear DOM selections (set by Skema component)\n onClearSelections: OnClearSelectionsCallback | null = null;\n \n // Callback when lasso selection completes (set by Skema component)\n onLassoComplete: OnLassoCompleteCallback | null = null;\n \n /**\n * Set callback for clearing DOM selections\n */\n setOnClearSelections(callback: OnClearSelectionsCallback) {\n this.onClearSelections = callback;\n }\n \n /**\n * Set callback for when lasso selection completes\n */\n setOnLassoComplete(callback: OnLassoCompleteCallback) {\n this.onLassoComplete = callback;\n }\n}\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport type { Annotation } from '../types';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type ProviderName = 'gemini' | 'claude';\nexport type ExecutionMode = 'direct-cli' | 'mcp';\n\nexport interface ProviderStatus {\n installed: boolean;\n authorized: boolean;\n message: string;\n}\n\nexport interface AnnotationCounts {\n pending: number;\n acknowledged: number;\n resolved: number;\n dismissed: number;\n}\n\nexport interface DaemonState {\n connected: boolean;\n provider: ProviderName;\n mode: ExecutionMode;\n availableProviders: ProviderName[];\n availableModes: ExecutionMode[];\n providerStatus: Record<ProviderName, ProviderStatus>;\n cwd: string;\n mcpServerConnected: boolean;\n mcpClientName: string | null;\n annotationCounts: AnnotationCounts;\n}\n\nexport interface AIStreamEvent {\n type: 'init' | 'text' | 'tool_use' | 'tool_result' | 'error' | 'done' | 'debug';\n content?: string;\n timestamp: string;\n provider: ProviderName;\n raw?: unknown;\n}\n\nexport interface GenerateOptions {\n /** Override execution mode for this request */\n mode?: ExecutionMode;\n /** Override provider for this request */\n provider?: ProviderName;\n /** API key for vision/drawing analysis (e.g. from settings) */\n visionApiKey?: string | null;\n /** Vision provider for drawing analysis (default: gemini) */\n visionProvider?: string;\n /** Vision model for drawing analysis */\n visionModel?: string;\n}\n\nexport interface UseDaemonOptions {\n /** WebSocket URL (default: ws://localhost:9999) */\n url?: string;\n /** Auto-connect on mount (default: true) */\n autoConnect?: boolean;\n /** Reconnect on disconnect (default: true) */\n autoReconnect?: boolean;\n /** Reconnect delay in ms (default: 2000) */\n reconnectDelay?: number;\n}\n\nexport interface UseDaemonReturn {\n /** Current daemon state */\n state: DaemonState;\n /** Whether currently generating */\n isGenerating: boolean;\n /** Last error message */\n error: string | null;\n /** Connect to daemon */\n connect: () => void;\n /** Disconnect from daemon */\n disconnect: () => void;\n /** Switch AI provider */\n setProvider: (provider: ProviderName) => Promise<boolean>;\n /** Switch execution mode */\n setMode: (mode: ExecutionMode) => Promise<boolean>;\n /** Refresh provider status from daemon */\n refreshProviderStatus: () => Promise<void>;\n /** Generate code from annotation (streaming) */\n generate: (\n annotation: Partial<Annotation> & { comment?: string },\n onEvent?: (event: AIStreamEvent) => void,\n options?: GenerateOptions\n ) => Promise<{ success: boolean; annotationId: string }>;\n /** Revert changes for an annotation */\n revert: (annotationId: string) => Promise<{ success: boolean; message: string }>;\n /** Read a file */\n readFile: (path: string) => Promise<string>;\n /** Write a file */\n writeFile: (path: string, content: string) => Promise<boolean>;\n /** Run a command */\n runCommand: (command: string) => Promise<{ stdout: string; stderr: string; exitCode: number }>;\n}\n\n// =============================================================================\n// Hook Implementation\n// =============================================================================\n\nexport function useDaemon(options: UseDaemonOptions = {}): UseDaemonReturn {\n const {\n url = 'ws://localhost:9999',\n autoConnect = true,\n autoReconnect = true,\n reconnectDelay = 2000,\n } = options;\n\n const defaultProviderStatus: Record<ProviderName, ProviderStatus> = {\n gemini: { installed: false, authorized: false, message: 'Checking...' },\n claude: { installed: false, authorized: false, message: 'Checking...' },\n };\n\n const [state, setState] = useState<DaemonState>({\n connected: false,\n provider: 'gemini',\n mode: 'direct-cli',\n availableProviders: [],\n availableModes: ['direct-cli', 'mcp'],\n providerStatus: defaultProviderStatus,\n cwd: '',\n mcpServerConnected: false,\n mcpClientName: null,\n annotationCounts: { pending: 0, acknowledged: 0, resolved: 0, dismissed: 0 },\n });\n const [isGenerating, setIsGenerating] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const wsRef = useRef<WebSocket | null>(null);\n const pendingRequests = useRef<Map<string, { resolve: (value: any) => void; reject: (error: any) => void }>>(new Map());\n const eventCallbacks = useRef<Map<string, (event: AIStreamEvent) => void>>(new Map());\n const reconnectTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const messageIdRef = useRef(0);\n\n // Generate unique message ID\n const nextId = useCallback(() => {\n messageIdRef.current += 1;\n return `msg-${messageIdRef.current}-${Date.now()}`;\n }, []);\n\n // Send message and wait for response\n const sendRequest = useCallback(<T>(type: string, payload: Record<string, unknown> = {}): Promise<T> => {\n return new Promise((resolve, reject) => {\n if (!wsRef.current || wsRef.current.readyState !== WebSocket.OPEN) {\n reject(new Error('Not connected to daemon'));\n return;\n }\n\n const id = nextId();\n pendingRequests.current.set(id, { resolve, reject });\n\n wsRef.current.send(JSON.stringify({ id, type, ...payload }));\n\n // Timeout after 30 seconds\n setTimeout(() => {\n if (pendingRequests.current.has(id)) {\n pendingRequests.current.delete(id);\n reject(new Error('Request timeout'));\n }\n }, 30000);\n });\n }, [nextId]);\n\n // Handle incoming messages\n const handleMessage = useCallback((event: MessageEvent) => {\n try {\n const msg = JSON.parse(event.data);\n\n // Handle initial connection state\n if (msg.type === 'connected') {\n setState((prev) => ({\n ...prev,\n connected: true,\n provider: msg.provider || prev.provider,\n mode: msg.mode || prev.mode,\n availableProviders: msg.availableProviders || prev.availableProviders,\n availableModes: msg.availableModes || prev.availableModes,\n providerStatus: msg.providerStatus || prev.providerStatus,\n cwd: msg.cwd || prev.cwd,\n mcpServerConnected: msg.mcpServerConnected ?? prev.mcpServerConnected,\n mcpClientName: msg.mcpClientName !== undefined ? msg.mcpClientName : prev.mcpClientName,\n }));\n setError(null);\n return;\n }\n\n // Handle provider status update\n if (msg.type === 'provider-statuses') {\n setState((prev) => ({\n ...prev,\n providerStatus: msg.providerStatus || prev.providerStatus,\n }));\n return;\n }\n\n // Handle streaming AI events\n if (msg.type === 'ai-event' && msg.id) {\n const callback = eventCallbacks.current.get(msg.id);\n if (callback) {\n callback(msg.event);\n }\n return;\n }\n\n // Handle generate complete\n if (msg.type === 'generate-complete' && msg.id) {\n const pending = pendingRequests.current.get(msg.id);\n if (pending) {\n pendingRequests.current.delete(msg.id);\n eventCallbacks.current.delete(msg.id);\n pending.resolve({ success: msg.success, annotationId: msg.annotationId });\n }\n setIsGenerating(false);\n return;\n }\n\n // Handle MCP mode: annotation queued (not processed immediately)\n if (msg.type === 'annotation-queued' && msg.id) {\n const pending = pendingRequests.current.get(msg.id);\n if (pending) {\n pendingRequests.current.delete(msg.id);\n eventCallbacks.current.delete(msg.id);\n pending.resolve({ success: true, annotationId: msg.annotationId, queued: true });\n }\n setIsGenerating(false);\n return;\n }\n\n // Handle MCP annotation status changes (broadcast from daemon)\n if (msg.type === 'annotation-status-changed') {\n // This is a broadcast - no pending request to resolve\n // Components can listen for this via state updates\n return;\n }\n\n // Handle MCP server connection status\n if (msg.type === 'mcp-server-status') {\n setState((prev) => ({\n ...prev,\n mcpServerConnected: msg.connected,\n mcpClientName: msg.clientName !== undefined ? msg.clientName : prev.mcpClientName,\n }));\n return;\n }\n\n // Handle MCP annotation count updates\n if (msg.type === 'mcp-annotation-counts') {\n setState((prev) => ({\n ...prev,\n annotationCounts: msg.counts,\n }));\n return;\n }\n\n // Handle provider change\n if (msg.type === 'provider-changed') {\n setState((prev) => ({ ...prev, provider: msg.provider }));\n }\n\n // Handle mode change\n if (msg.type === 'mode-changed') {\n setState((prev) => ({ ...prev, mode: msg.mode }));\n }\n\n // Handle errors\n if (msg.type === 'error' && msg.id) {\n const pending = pendingRequests.current.get(msg.id);\n if (pending) {\n pendingRequests.current.delete(msg.id);\n eventCallbacks.current.delete(msg.id);\n pending.reject(new Error(msg.error));\n }\n setIsGenerating(false);\n return;\n }\n\n // Handle other responses with ID\n if (msg.id) {\n const pending = pendingRequests.current.get(msg.id);\n if (pending) {\n pendingRequests.current.delete(msg.id);\n pending.resolve(msg);\n }\n }\n } catch {\n }\n }, []);\n\n // Connect to daemon\n const connect = useCallback(() => {\n if (wsRef.current?.readyState === WebSocket.OPEN) return;\n\n // Clear any pending reconnect\n if (reconnectTimeoutRef.current) {\n clearTimeout(reconnectTimeoutRef.current);\n reconnectTimeoutRef.current = null;\n }\n\n try {\n const ws = new WebSocket(url);\n\n ws.onopen = () => {};\n\n ws.onmessage = handleMessage;\n\n ws.onclose = () => {\n setState((prev) => ({ ...prev, connected: false }));\n wsRef.current = null;\n\n // Auto-reconnect\n if (autoReconnect) {\n reconnectTimeoutRef.current = setTimeout(connect, reconnectDelay);\n }\n };\n\n ws.onerror = () => {\n setError('Failed to connect to Skema daemon. Is it running?');\n };\n\n wsRef.current = ws;\n } catch {\n setError('Failed to connect to Skema daemon');\n }\n }, [url, autoReconnect, reconnectDelay, handleMessage]);\n\n // Disconnect from daemon\n const disconnect = useCallback(() => {\n if (reconnectTimeoutRef.current) {\n clearTimeout(reconnectTimeoutRef.current);\n reconnectTimeoutRef.current = null;\n }\n\n if (wsRef.current) {\n wsRef.current.close();\n wsRef.current = null;\n }\n\n setState((prev) => ({ ...prev, connected: false }));\n }, []);\n\n // Switch AI provider\n const setProvider = useCallback(async (provider: ProviderName): Promise<boolean> => {\n try {\n const response = await sendRequest<{ type: string; provider: ProviderName }>('set-provider', { provider });\n return response.type === 'provider-changed';\n } catch {\n return false;\n }\n }, [sendRequest]);\n\n // Switch execution mode\n const setMode = useCallback(async (mode: ExecutionMode): Promise<boolean> => {\n try {\n const response = await sendRequest<{ type: string; mode: ExecutionMode }>('set-mode', { mode });\n return response.type === 'mode-changed';\n } catch {\n return false;\n }\n }, [sendRequest]);\n\n // Refresh provider status from daemon\n const refreshProviderStatus = useCallback(async () => {\n try {\n await sendRequest('check-providers', {});\n } catch {\n }\n }, [sendRequest]);\n\n // Generate code from annotation\n const generate = useCallback(async (\n annotation: Partial<Annotation> & { comment?: string },\n onEvent?: (event: AIStreamEvent) => void,\n options?: GenerateOptions\n ): Promise<{ success: boolean; annotationId: string }> => {\n const id = nextId();\n\n if (onEvent) {\n eventCallbacks.current.set(id, onEvent);\n }\n\n setIsGenerating(true);\n\n return new Promise((resolve, reject) => {\n if (!wsRef.current || wsRef.current.readyState !== WebSocket.OPEN) {\n setIsGenerating(false);\n reject(new Error('Not connected to daemon'));\n return;\n }\n\n pendingRequests.current.set(id, { resolve, reject });\n\n wsRef.current.send(JSON.stringify({\n id,\n type: 'generate',\n annotation,\n // Include optional overrides\n ...(options?.mode && { mode: options.mode }),\n ...(options?.provider && { provider: options.provider }),\n ...(options?.visionApiKey != null && options.visionApiKey !== '' && { visionApiKey: options.visionApiKey }),\n ...(options?.visionProvider && { visionProvider: options.visionProvider }),\n ...(options?.visionModel && { visionModel: options.visionModel }),\n }));\n });\n }, [nextId]);\n\n // Revert changes\n const revert = useCallback(async (annotationId: string): Promise<{ success: boolean; message: string }> => {\n const response = await sendRequest<{ success: boolean; message: string }>('revert', { annotationId });\n return { success: response.success, message: response.message || '' };\n }, [sendRequest]);\n\n // Read file\n const readFile = useCallback(async (path: string): Promise<string> => {\n const response = await sendRequest<{ content: string }>('read-file', { path });\n return response.content;\n }, [sendRequest]);\n\n // Write file\n const writeFile = useCallback(async (path: string, content: string): Promise<boolean> => {\n const response = await sendRequest<{ type: string }>('write-file', { path, content });\n return response.type === 'write-success';\n }, [sendRequest]);\n\n // Run command\n const runCommand = useCallback(async (command: string): Promise<{ stdout: string; stderr: string; exitCode: number }> => {\n const response = await sendRequest<{ stdout: string; stderr: string; exitCode: number }>('run-command', { command });\n return {\n stdout: response.stdout || '',\n stderr: response.stderr || '',\n exitCode: response.exitCode ?? 0,\n };\n }, [sendRequest]);\n\n // Auto-connect on mount\n useEffect(() => {\n if (autoConnect) {\n connect();\n }\n\n return () => {\n disconnect();\n };\n }, [autoConnect, connect, disconnect]);\n\n return {\n state,\n isGenerating,\n error,\n connect,\n disconnect,\n setProvider,\n setMode,\n refreshProviderStatus,\n generate,\n revert,\n readFile,\n writeFile,\n runCommand,\n };\n}\n","// =============================================================================\n// Coordinate System Utilities\n// =============================================================================\n\nimport type { BoundingBox, ViewportInfo } from '../types';\n\n/**\n * Gets current viewport information\n */\nexport function getViewportInfo(): ViewportInfo {\n if (typeof window === 'undefined') {\n return { width: 0, height: 0, scrollX: 0, scrollY: 0 };\n }\n \n return {\n width: window.innerWidth,\n height: window.innerHeight,\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n };\n}\n\n/**\n * Converts viewport-relative coordinates to document coordinates\n */\nexport function viewportToDocument(\n x: number,\n y: number,\n viewport: ViewportInfo = getViewportInfo()\n): { x: number; y: number } {\n return {\n x: x + viewport.scrollX,\n y: y + viewport.scrollY,\n };\n}\n\n/**\n * Converts document coordinates to viewport-relative coordinates\n */\nexport function documentToViewport(\n x: number,\n y: number,\n viewport: ViewportInfo = getViewportInfo()\n): { x: number; y: number } {\n return {\n x: x - viewport.scrollX,\n y: y - viewport.scrollY,\n };\n}\n\n/**\n * Converts a bounding box from viewport to document coordinates\n */\nexport function bboxViewportToDocument(\n bbox: BoundingBox,\n viewport: ViewportInfo = getViewportInfo()\n): BoundingBox {\n const { x, y } = viewportToDocument(bbox.x, bbox.y, viewport);\n return {\n x,\n y,\n width: bbox.width,\n height: bbox.height,\n };\n}\n\n/**\n * Converts a bounding box from document to viewport coordinates\n */\nexport function bboxDocumentToViewport(\n bbox: BoundingBox,\n viewport: ViewportInfo = getViewportInfo()\n): BoundingBox {\n const { x, y } = documentToViewport(bbox.x, bbox.y, viewport);\n return {\n x,\n y,\n width: bbox.width,\n height: bbox.height,\n };\n}\n\n/**\n * Checks if two bounding boxes intersect\n */\nexport function bboxIntersects(a: BoundingBox, b: BoundingBox): boolean {\n return !(\n a.x + a.width < b.x ||\n b.x + b.width < a.x ||\n a.y + a.height < b.y ||\n b.y + b.height < a.y\n );\n}\n\n/**\n * Checks if point is inside bounding box\n */\nexport function pointInBbox(x: number, y: number, bbox: BoundingBox): boolean {\n return (\n x >= bbox.x &&\n x <= bbox.x + bbox.width &&\n y >= bbox.y &&\n y <= bbox.y + bbox.height\n );\n}\n\n/**\n * Gets the center point of a bounding box\n */\nexport function bboxCenter(bbox: BoundingBox): { x: number; y: number } {\n return {\n x: bbox.x + bbox.width / 2,\n y: bbox.y + bbox.height / 2,\n };\n}\n\n/**\n * Expands a bounding box by a padding amount\n */\nexport function expandBbox(bbox: BoundingBox, padding: number): BoundingBox {\n return {\n x: bbox.x - padding,\n y: bbox.y - padding,\n width: bbox.width + padding * 2,\n height: bbox.height + padding * 2,\n };\n}\n\n/**\n * Creates a bounding box from two points\n */\nexport function bboxFromPoints(\n x1: number,\n y1: number,\n x2: number,\n y2: number\n): BoundingBox {\n return {\n x: Math.min(x1, x2),\n y: Math.min(y1, y2),\n width: Math.abs(x2 - x1),\n height: Math.abs(y2 - y1),\n };\n}\n","// =============================================================================\n// Element Identification Utilities\n// =============================================================================\n\nimport type { BoundingBox, DOMSelection, ElementStyles, NearbyElement, ProjectStyleContext } from '../types';\n\n/**\n * Generates a unique CSS selector for an element\n */\nexport function generateSelector(element: HTMLElement): string {\n // If element has an ID, use it\n if (element.id) {\n return `#${element.id}`;\n }\n\n // Build selector path\n const path: string[] = [];\n let current: HTMLElement | null = element;\n\n while (current && current !== document.body && current !== document.documentElement) {\n let selector = current.tagName.toLowerCase();\n\n // Add ID if present\n if (current.id) {\n selector = `#${current.id}`;\n path.unshift(selector);\n break;\n }\n\n // Add meaningful class names (filter out CSS module hashes)\n if (current.className && typeof current.className === 'string') {\n const meaningfulClasses = current.className\n .split(/\\s+/)\n .filter(c => c.length > 2 && !c.match(/^[a-z]{1,2}$/) && !c.match(/[A-Z0-9]{5,}/))\n .slice(0, 2);\n \n if (meaningfulClasses.length > 0) {\n selector += '.' + meaningfulClasses.join('.');\n }\n }\n\n // Add nth-child if needed for uniqueness\n const parent = current.parentElement;\n if (parent) {\n const siblings = Array.from(parent.children).filter(\n child => child.tagName === current!.tagName\n );\n if (siblings.length > 1) {\n const index = siblings.indexOf(current) + 1;\n selector += `:nth-child(${index})`;\n }\n }\n\n path.unshift(selector);\n current = current.parentElement;\n }\n\n return path.join(' > ');\n}\n\n/**\n * Gets a readable path for an element (e.g., \"article > section > p\")\n */\nexport function getElementPath(target: HTMLElement, maxDepth = 4): string {\n const parts: string[] = [];\n let current: HTMLElement | null = target;\n let depth = 0;\n\n while (current && depth < maxDepth) {\n const tag = current.tagName.toLowerCase();\n\n // Skip generic wrappers\n if (tag === 'html' || tag === 'body') break;\n\n // Get identifier\n let identifier = tag;\n if (current.id) {\n identifier = `#${current.id}`;\n } else if (current.className && typeof current.className === 'string') {\n const meaningfulClass = current.className\n .split(/\\s+/)\n .find(c => c.length > 2 && !c.match(/^[a-z]{1,2}$/) && !c.match(/[A-Z0-9]{5,}/));\n if (meaningfulClass) {\n identifier = `.${meaningfulClass.split('_')[0]}`;\n }\n }\n\n parts.unshift(identifier);\n current = current.parentElement;\n depth++;\n }\n\n return parts.join(' > ');\n}\n\n/**\n * Identifies an element and returns a human-readable name\n */\nexport function identifyElement(target: HTMLElement): string {\n const tag = target.tagName.toLowerCase();\n\n // Interactive elements\n if (tag === 'button') {\n const text = target.textContent?.trim();\n const ariaLabel = target.getAttribute('aria-label');\n if (ariaLabel) return `button [${ariaLabel}]`;\n return text ? `button \"${text.slice(0, 25)}\"` : 'button';\n }\n \n if (tag === 'a') {\n const text = target.textContent?.trim();\n const href = target.getAttribute('href');\n if (text) return `link \"${text.slice(0, 25)}\"`;\n if (href) return `link to ${href.slice(0, 30)}`;\n return 'link';\n }\n \n if (tag === 'input') {\n const type = target.getAttribute('type') || 'text';\n const placeholder = target.getAttribute('placeholder');\n const name = target.getAttribute('name');\n if (placeholder) return `input \"${placeholder}\"`;\n if (name) return `input [${name}]`;\n return `${type} input`;\n }\n\n // Headings\n if (['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(tag)) {\n const text = target.textContent?.trim();\n return text ? `${tag} \"${text.slice(0, 35)}\"` : tag;\n }\n\n // Text elements\n if (tag === 'p') {\n const text = target.textContent?.trim();\n if (text) return `paragraph: \"${text.slice(0, 40)}${text.length > 40 ? '...' : ''}\"`;\n return 'paragraph';\n }\n\n // Media\n if (tag === 'img') {\n const alt = target.getAttribute('alt');\n return alt ? `image \"${alt.slice(0, 30)}\"` : 'image';\n }\n\n // Containers\n if (['div', 'section', 'article', 'nav', 'header', 'footer', 'aside', 'main'].includes(tag)) {\n const className = target.className;\n const role = target.getAttribute('role');\n const ariaLabel = target.getAttribute('aria-label');\n\n if (ariaLabel) return `${tag} [${ariaLabel}]`;\n if (role) return role;\n\n if (typeof className === 'string' && className) {\n const words = className\n .split(/[\\s_-]+/)\n .map(c => c.replace(/[A-Z0-9]{5,}.*$/, ''))\n .filter(c => c.length > 2 && !/^[a-z]{1,2}$/.test(c))\n .slice(0, 2);\n if (words.length > 0) return words.join(' ');\n }\n\n return tag === 'div' ? 'container' : tag;\n }\n\n return tag;\n}\n\n/**\n * Gets bounding box for an element in document coordinates (includes scroll offset)\n */\nexport function getBoundingBox(element: HTMLElement): BoundingBox {\n const rect = element.getBoundingClientRect();\n return {\n x: rect.left + window.scrollX,\n y: rect.top + window.scrollY,\n width: rect.width,\n height: rect.height,\n };\n}\n\n/**\n * Gets CSS class names from an element (cleaned of module hashes)\n */\nexport function getElementClasses(target: HTMLElement): string {\n const className = target.className;\n if (typeof className !== 'string' || !className) return '';\n\n const classes = className\n .split(/\\s+/)\n .filter(c => c.length > 0)\n .map(c => {\n const match = c.match(/^([a-zA-Z][a-zA-Z0-9_-]*?)(?:_[a-zA-Z0-9]{5,})?$/);\n return match ? match[1] : c;\n })\n .filter((c, i, arr) => arr.indexOf(c) === i);\n\n return classes.join(', ');\n}\n\n/**\n * Creates a DOMSelection from an element\n */\nexport function createDOMSelection(element: HTMLElement): DOMSelection {\n return {\n id: `dom-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n selector: generateSelector(element),\n tagName: element.tagName.toLowerCase(),\n elementPath: getElementPath(element),\n text: element.textContent?.trim().slice(0, 100) || '',\n boundingBox: getBoundingBox(element),\n timestamp: Date.now(),\n pathname: typeof window !== 'undefined' ? window.location.pathname : '',\n cssClasses: getElementClasses(element) || undefined,\n attributes: getElementAttributes(element),\n };\n}\n\n/**\n * Gets relevant attributes from an element\n */\nfunction getElementAttributes(element: HTMLElement): Record<string, string> | undefined {\n const attrs: Record<string, string> = {};\n const relevantAttrs = ['id', 'href', 'src', 'alt', 'type', 'name', 'placeholder', 'role', 'aria-label'];\n \n for (const attr of relevantAttrs) {\n const value = element.getAttribute(attr);\n if (value) {\n attrs[attr] = value;\n }\n }\n \n return Object.keys(attrs).length > 0 ? attrs : undefined;\n}\n\n/**\n * Checks if an element should be ignored for DOM picking\n */\nexport function shouldIgnoreElement(element: HTMLElement): boolean {\n // Ignore Skema's own elements\n if (element.closest('[data-skema]')) return true;\n if (element.closest('.tl-container')) return true;\n\n // Ignore script and style tags\n const tag = element.tagName.toLowerCase();\n if (['script', 'style', 'noscript', 'meta', 'link'].includes(tag)) return true;\n\n // Ignore broad container elements (too broad for annotation)\n if (tag === 'section' || tag === 'main' || tag === 'body' || tag === 'html') return true;\n\n return false;\n}\n\n// =============================================================================\n// Style Extraction Utilities\n// =============================================================================\n\n/**\n * Extract computed styles from an element for style matching\n */\nexport function getComputedElementStyles(element: HTMLElement): ElementStyles {\n const computed = window.getComputedStyle(element);\n\n return {\n // Typography\n fontFamily: computed.fontFamily,\n fontSize: computed.fontSize,\n fontWeight: computed.fontWeight,\n lineHeight: computed.lineHeight,\n letterSpacing: computed.letterSpacing !== 'normal' ? computed.letterSpacing : undefined,\n textAlign: computed.textAlign !== 'start' ? computed.textAlign : undefined,\n color: computed.color,\n // Spacing\n padding: computed.padding !== '0px' ? computed.padding : undefined,\n margin: computed.margin !== '0px' ? computed.margin : undefined,\n gap: computed.gap !== 'normal' ? computed.gap : undefined,\n // Layout\n display: computed.display,\n flexDirection: computed.flexDirection !== 'row' ? computed.flexDirection : undefined,\n alignItems: computed.alignItems !== 'normal' ? computed.alignItems : undefined,\n justifyContent: computed.justifyContent !== 'normal' ? computed.justifyContent : undefined,\n // Visual\n backgroundColor: computed.backgroundColor !== 'rgba(0, 0, 0, 0)' ? computed.backgroundColor : undefined,\n borderRadius: computed.borderRadius !== '0px' ? computed.borderRadius : undefined,\n border: computed.border !== 'none' && computed.borderWidth !== '0px' ? computed.border : undefined,\n boxShadow: computed.boxShadow !== 'none' ? computed.boxShadow : undefined,\n // Sizing\n width: computed.width,\n height: computed.height,\n maxWidth: computed.maxWidth !== 'none' ? computed.maxWidth : undefined,\n };\n}\n\n/**\n * Extract Tailwind classes from an element's className\n */\nexport function extractTailwindClasses(element: HTMLElement): string[] | undefined {\n const className = element.className;\n if (typeof className !== 'string' || !className) return undefined;\n\n // Common Tailwind class patterns\n const tailwindPatterns = [\n /^(flex|grid|block|inline|hidden)$/,\n /^(flex|grid|items|justify|gap|space|p|m|px|py|mx|my|pt|pb|pl|pr|mt|mb|ml|mr)-/,\n /^(w|h|min-w|min-h|max-w|max-h)-/,\n /^(text|font|leading|tracking|bg|border|rounded|shadow|opacity)-/,\n /^(sm|md|lg|xl|2xl):/,\n /^(hover|focus|active|disabled):/,\n /^(dark|light):/,\n ];\n\n const classes = className.split(/\\s+/).filter(c =>\n tailwindPatterns.some(pattern => pattern.test(c))\n );\n\n return classes.length > 0 ? classes : undefined;\n}\n\n/**\n * Create a NearbyElement with computed styles\n */\nexport function createNearbyElement(element: HTMLElement): NearbyElement {\n return {\n selector: generateSelector(element),\n tagName: element.tagName.toLowerCase(),\n text: element.textContent?.trim().slice(0, 100),\n styles: getComputedElementStyles(element),\n tailwindClasses: extractTailwindClasses(element),\n };\n}\n\n/**\n * Detect which CSS framework is being used in the project\n */\nexport function detectCSSFramework(): ProjectStyleContext['cssFramework'] {\n // Check for Tailwind\n const hasTailwind = document.querySelector('[class*=\"flex\"]') !== null ||\n document.querySelector('[class*=\"grid-\"]') !== null ||\n document.querySelector('[class*=\"text-\"]') !== null ||\n document.querySelector('[class*=\"bg-\"]') !== null ||\n // Check for Tailwind's reset stylesheet\n document.querySelector('style[data-precedence]') !== null;\n\n if (hasTailwind) {\n // Double check with more specific Tailwind patterns\n const allClasses = Array.from(document.querySelectorAll('[class]'))\n .slice(0, 50)\n .flatMap(el => {\n const className = el.className;\n if (typeof className !== 'string') return [];\n return className.split(/\\s+/);\n });\n\n const tailwindIndicators = allClasses.filter(c =>\n /^(flex|grid|block|inline-block|hidden|p-|m-|px-|py-|mx-|my-|w-|h-|text-|bg-|border-|rounded-|shadow-|gap-)/.test(c)\n );\n\n if (tailwindIndicators.length > 5) {\n return 'tailwind';\n }\n }\n\n // Check for CSS Modules (classes with hash suffixes)\n const hasModuleClasses = Array.from(document.querySelectorAll('[class]'))\n .slice(0, 20)\n .some(el => {\n const className = el.className;\n if (typeof className !== 'string') return false;\n return /[a-zA-Z]+_[a-zA-Z0-9]{5,}/.test(className);\n });\n\n if (hasModuleClasses) {\n return 'css-modules';\n }\n\n // Check for styled-components (data-styled attribute)\n if (document.querySelector('[data-styled]') !== null ||\n document.querySelector('style[data-styled-components]') !== null) {\n return 'styled-components';\n }\n\n return 'vanilla';\n}\n\n/**\n * Extract CSS custom properties (design tokens) from :root\n */\nexport function extractCSSVariables(): Record<string, string> | undefined {\n const variables: Record<string, string> = {};\n\n try {\n const rootStyles = getComputedStyle(document.documentElement);\n\n // Get all stylesheets and look for :root rules\n for (const sheet of document.styleSheets) {\n try {\n const rules = sheet.cssRules || sheet.rules;\n for (const rule of rules) {\n if (rule instanceof CSSStyleRule && rule.selectorText === ':root') {\n for (let i = 0; i < rule.style.length; i++) {\n const prop = rule.style[i];\n if (prop.startsWith('--')) {\n variables[prop] = rule.style.getPropertyValue(prop).trim();\n }\n }\n }\n }\n } catch {\n // Cross-origin stylesheets will throw\n }\n }\n\n // Also check inline styles on html element\n const htmlStyle = document.documentElement.getAttribute('style');\n if (htmlStyle) {\n const matches = htmlStyle.matchAll(/--([a-zA-Z0-9-]+)\\s*:\\s*([^;]+)/g);\n for (const match of matches) {\n variables[`--${match[1]}`] = match[2].trim();\n }\n }\n } catch {\n // Ignore errors\n }\n\n return Object.keys(variables).length > 0 ? variables : undefined;\n}\n\n/**\n * Extract common colors used on the page\n */\nexport function extractColorPalette(): string[] | undefined {\n const colors = new Set<string>();\n const elements = document.querySelectorAll('*');\n\n // Sample first 100 elements to avoid performance issues\n const sampleSize = Math.min(elements.length, 100);\n\n for (let i = 0; i < sampleSize; i++) {\n const el = elements[i] as HTMLElement;\n if (shouldIgnoreElement(el)) continue;\n\n const computed = window.getComputedStyle(el);\n\n // Collect background colors (skip transparent)\n if (computed.backgroundColor && computed.backgroundColor !== 'rgba(0, 0, 0, 0)') {\n colors.add(computed.backgroundColor);\n }\n\n // Collect text colors\n if (computed.color) {\n colors.add(computed.color);\n }\n\n // Collect border colors\n if (computed.borderColor && computed.borderColor !== 'rgb(0, 0, 0)') {\n colors.add(computed.borderColor);\n }\n }\n\n // Return unique colors (limit to 20)\n const uniqueColors = Array.from(colors).slice(0, 20);\n return uniqueColors.length > 0 ? uniqueColors : undefined;\n}\n\n/**\n * Extract comprehensive project style context\n */\nexport function extractProjectStyleContext(): ProjectStyleContext {\n const bodyStyles = window.getComputedStyle(document.body);\n const htmlStyles = window.getComputedStyle(document.documentElement);\n\n return {\n cssFramework: detectCSSFramework(),\n cssVariables: extractCSSVariables(),\n colorPalette: extractColorPalette(),\n baseFontFamily: bodyStyles.fontFamily,\n baseFontSize: htmlStyles.fontSize,\n };\n}\n\n/**\n * Find DOM elements near a bounding box and extract their style context\n */\nexport function findNearbyElementsWithStyles(\n bounds: BoundingBox,\n maxElements: number = 5\n): NearbyElement[] {\n const elements: Array<{ element: HTMLElement; distance: number }> = [];\n const allElements = document.querySelectorAll('*');\n\n const boundsCenter = {\n x: bounds.x + bounds.width / 2,\n y: bounds.y + bounds.height / 2,\n };\n\n allElements.forEach((el) => {\n if (!(el instanceof HTMLElement)) return;\n if (shouldIgnoreElement(el)) return;\n\n const rect = el.getBoundingClientRect();\n // Skip very small elements\n if (rect.width < 10 || rect.height < 10) return;\n\n const elCenter = {\n x: rect.left + window.scrollX + rect.width / 2,\n y: rect.top + window.scrollY + rect.height / 2,\n };\n\n // Calculate distance from bounds center to element center\n const distance = Math.sqrt(\n Math.pow(boundsCenter.x - elCenter.x, 2) +\n Math.pow(boundsCenter.y - elCenter.y, 2)\n );\n\n // Only include elements within reasonable distance (500px)\n if (distance < 500) {\n elements.push({ element: el, distance });\n }\n });\n\n // Sort by distance and take closest elements\n elements.sort((a, b) => a.distance - b.distance);\n\n // Filter to get diverse elements (different types)\n const seen = new Set<string>();\n const diverse: HTMLElement[] = [];\n\n for (const { element } of elements) {\n const key = `${element.tagName}-${element.className}`;\n if (!seen.has(key)) {\n seen.add(key);\n diverse.push(element);\n if (diverse.length >= maxElements) break;\n }\n }\n\n return diverse.map(createNearbyElement);\n}","// =============================================================================\n// Skema Utility Functions\n// =============================================================================\n\n/**\n * Convert a Blob to a base64 string\n */\nexport async function blobToBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result as string;\n resolve(result);\n };\n reader.onerror = () => reject(reader.error);\n reader.readAsDataURL(blob);\n });\n}\n\n/**\n * Add a labeled grid overlay to an SVG string\n * Grid uses A/B/C column labels and 0/1/2 row numbers for positioning reference\n * @param svgString - The SVG markup to add grid to\n * @param opts - Grid options (color, cell size, whether to show labels)\n * @returns SVG string with grid overlay added\n */\nexport function addGridToSvg(\n svgString: string,\n opts: { color?: string; size?: number; labels?: boolean } = {}\n): string {\n const { color = '#0066FF', size = 100, labels = true } = opts;\n\n // Parse SVG to get dimensions\n const viewBoxMatch = svgString.match(/viewBox=\"([^\"]+)\"/);\n if (!viewBoxMatch) return svgString;\n\n const [x, y, w, h] = viewBoxMatch[1].split(' ').map(Number);\n\n // Build grid lines and labels\n const gridElements: string[] = [];\n\n // Vertical lines\n for (let i = 0; i <= Math.ceil(w / size); i++) {\n const xPos = i * size;\n if (i > 0) {\n gridElements.push(\n `<line x1=\"${xPos}\" y1=\"0\" x2=\"${xPos}\" y2=\"${h}\" stroke=\"${color}\" stroke-width=\"1\" stroke-opacity=\"0.5\"/>`\n );\n }\n if (labels) {\n // Column labels (A, B, C, ...)\n const colLabel = String.fromCharCode(65 + i); // 65 = 'A'\n gridElements.push(\n `<text x=\"${xPos + size / 2}\" y=\"16\" fill=\"${color}\" font-size=\"12\" font-family=\"sans-serif\" text-anchor=\"middle\">${colLabel}</text>`\n );\n }\n }\n\n // Horizontal lines\n for (let i = 0; i <= Math.ceil(h / size); i++) {\n const yPos = i * size;\n gridElements.push(\n `<line x1=\"0\" y1=\"${yPos}\" x2=\"${w}\" y2=\"${yPos}\" stroke=\"${color}\" stroke-width=\"1\" stroke-opacity=\"0.5\"/>`\n );\n if (labels && i < Math.ceil(h / size)) {\n // Row labels (0, 1, 2, ...)\n gridElements.push(\n `<text x=\"8\" y=\"${yPos + size / 2 + 4}\" fill=\"${color}\" font-size=\"12\" font-family=\"sans-serif\">${i}</text>`\n );\n }\n }\n\n // Create grid group\n const gridGroup = `<g id=\"skema-grid\" transform=\"translate(${x}, ${y})\">${gridElements.join('')}</g>`;\n\n // Insert grid before closing </svg> tag\n return svgString.replace('</svg>', `${gridGroup}</svg>`);\n}\n\n/**\n * Get the grid cell reference (e.g., \"B2\") for a given position\n * @param x - X coordinate in pixels\n * @param y - Y coordinate in pixels\n * @param gridSize - Size of each grid cell (default 100px)\n * @returns Grid cell reference string (e.g., \"B2\")\n */\nexport function getGridCellReference(x: number, y: number, gridSize: number = 100): string {\n const col = Math.floor(x / gridSize);\n const row = Math.floor(y / gridSize);\n const colLabel = String.fromCharCode(65 + col); // 65 = 'A'\n return `${colLabel}${row}`;\n}\n\n/**\n * Extract text content from tldraw shapes\n * @param shapes - Array of tldraw shapes\n * @returns Combined text content from text and note shapes\n */\nexport function extractTextFromShapes(shapes: unknown[]): string {\n const textContent: string[] = [];\n\n for (const shape of shapes) {\n const s = shape as { type?: string; props?: { text?: string; richText?: unknown } };\n\n if (s.type === 'text' || s.type === 'note') {\n // Handle plain text\n if (s.props?.text) {\n textContent.push(s.props.text);\n }\n // Handle rich text (newer tldraw versions)\n if (s.props?.richText && typeof s.props.richText === 'object') {\n const rt = s.props.richText as { content?: Array<{ content?: Array<{ text?: string }> }> };\n if (rt.content) {\n for (const block of rt.content) {\n if (block.content) {\n for (const inline of block.content) {\n if (inline.text) {\n textContent.push(inline.text);\n }\n }\n }\n }\n }\n }\n }\n }\n\n return textContent.filter(Boolean).join('\\n');\n}\n","// =============================================================================\n// Client-side settings persisted in localStorage (browser only)\n// =============================================================================\n\nexport type VisionProviderName = 'gemini' | 'claude' | 'openai';\n\nconst VISION_API_KEY_PREFIX = 'skema-vision-api-key-';\nconst VISION_PROVIDER_KEY = 'skema-vision-provider';\nconst VISION_MODEL_KEY = 'skema-vision-model';\nconst OLD_GEMINI_KEY = 'skema-gemini-api-key';\n\n// --- API Key (per provider) ---\n\nexport function getStoredVisionApiKey(provider: VisionProviderName): string | null {\n if (typeof window === 'undefined' || !window.localStorage) return null;\n try {\n let value = localStorage.getItem(VISION_API_KEY_PREFIX + provider);\n // Migrate old gemini key format\n if (!value && provider === 'gemini') {\n value = localStorage.getItem(OLD_GEMINI_KEY);\n if (value) {\n localStorage.setItem(VISION_API_KEY_PREFIX + 'gemini', value);\n localStorage.removeItem(OLD_GEMINI_KEY);\n }\n }\n return value && value.trim() ? value.trim() : null;\n } catch {\n return null;\n }\n}\n\nexport function setStoredVisionApiKey(provider: VisionProviderName, value: string): void {\n if (typeof window === 'undefined' || !window.localStorage) return;\n try {\n const trimmed = value.trim();\n if (trimmed) {\n localStorage.setItem(VISION_API_KEY_PREFIX + provider, trimmed);\n } else {\n localStorage.removeItem(VISION_API_KEY_PREFIX + provider);\n }\n } catch {\n // ignore\n }\n}\n\n// --- Provider ---\n\nexport function getStoredVisionProvider(): VisionProviderName {\n if (typeof window === 'undefined' || !window.localStorage) return 'gemini';\n try {\n const value = localStorage.getItem(VISION_PROVIDER_KEY);\n if (value === 'gemini' || value === 'claude' || value === 'openai') return value;\n return 'gemini';\n } catch {\n return 'gemini';\n }\n}\n\nexport function setStoredVisionProvider(provider: VisionProviderName): void {\n if (typeof window === 'undefined' || !window.localStorage) return;\n try {\n localStorage.setItem(VISION_PROVIDER_KEY, provider);\n } catch {\n // ignore\n }\n}\n\n// --- Model ---\n\nexport function getStoredVisionModel(): string | null {\n if (typeof window === 'undefined' || !window.localStorage) return null;\n try {\n return localStorage.getItem(VISION_MODEL_KEY);\n } catch {\n return null;\n }\n}\n\nexport function setStoredVisionModel(model: string): void {\n if (typeof window === 'undefined' || !window.localStorage) return;\n try {\n if (model) {\n localStorage.setItem(VISION_MODEL_KEY, model);\n } else {\n localStorage.removeItem(VISION_MODEL_KEY);\n }\n } catch {\n // ignore\n }\n}\n\n// --- Backward compatibility aliases ---\n\n/** @deprecated Use getStoredVisionApiKey('gemini') instead */\nexport function getStoredGeminiApiKey(): string | null {\n return getStoredVisionApiKey('gemini');\n}\n\n/** @deprecated Use setStoredVisionApiKey('gemini', value) instead */\nexport function setStoredGeminiApiKey(value: string): void {\n setStoredVisionApiKey('gemini', value);\n}\n","// =============================================================================\n// Toolbar Icon Components for Skema\n// =============================================================================\n\nimport React from 'react';\n\n// =============================================================================\n// Simple Colored Shape Icons (for collapsible toolbar)\n// =============================================================================\n\n/** Orange S Logo - shown when collapsed or as default in expanded state */\nexport const SLogoIcon: React.FC<{ size?: number }> = ({ size = 32 }) => (\n <svg width={size} height={size} viewBox=\"0 0 166 161\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n {/* Orange star burst background */}\n <path\n d=\"M77.0782 5.17419C80.4699 2.21068 85.5301 2.21067 88.9218 5.17419L109.929 23.529C111.161 24.6057 112.663 25.3261 114.274 25.6126L141.769 30.5023C146.225 31.2947 149.399 35.2725 149.183 39.7929L147.86 67.4755C147.782 69.1226 148.157 70.7596 148.945 72.2079L162.203 96.5644C164.372 100.55 163.236 105.527 159.551 108.175L136.957 124.416C135.623 125.375 134.577 126.681 133.932 128.193L123.03 153.753C121.26 157.902 116.692 160.1 112.346 158.894L85.4054 151.422C83.8315 150.985 82.1685 150.985 80.5946 151.422L53.6541 158.894C49.3075 160.1 44.7399 157.902 42.9702 153.753L32.0681 128.193C31.4234 126.681 30.3771 125.375 29.0427 124.416L6.4487 108.175C2.76426 105.527 1.62755 100.55 3.79688 96.5644L17.0547 72.2079C17.8431 70.7596 18.2184 69.1226 18.1397 67.4755L16.8169 39.7929C16.6009 35.2725 19.7752 31.2947 24.2308 30.5023L51.7255 25.6126C53.3366 25.3261 54.8392 24.6057 56.0714 23.529L77.0782 5.17419Z\"\n fill=\"#FF6800\"\n />\n {/* White S letter */}\n <path\n d=\"M65.0888 64.1092C65.0888 68.461 73.1316 69.0511 83.5428 69.7887C102.046 71.1901 128.049 73.1078 128 97.9645C128 126.288 106.289 133 83 133C59.7599 132.926 40.4672 128.722 38.0001 97.9645H65.0888C68.0494 105.635 74.9079 107.627 83 107.627C91.0428 107.627 100.911 105.635 100.911 97.9645C100.911 93.6128 92.8684 92.9489 82.4572 92.2113C63.954 90.8099 37.9507 88.8922 38.0001 64.1092C38.0001 35.7858 59.7106 29 83 29C106.24 29.2213 125.533 33.1305 128 64.1092H100.911C97.9506 56.2908 91.0921 54.4468 83 54.4468C74.9572 54.4468 65.0888 56.217 65.0888 64.1092Z\"\n fill=\"white\"\n />\n </svg>\n);\n\n/** Orange Star - shown on hover over the S logo */\nexport const OrangeStarIcon: React.FC<{ size?: number }> = ({ size = 42 }) => (\n <svg width={size} height={size} viewBox=\"0 0 25 25\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12.253 0.8403C12.65 0.393 13.35 0.393 13.747 0.8403L16.628 4.0796C16.805 4.2791 17.055 4.3993 17.321 4.4136L21.65 4.6461C22.248 4.6782 22.684 5.2247 22.582 5.8146L21.845 10.0863C21.8 10.3493 21.862 10.6196 22.017 10.8369L24.534 14.366C24.881 14.8533 24.726 15.5348 24.201 15.8231L20.402 17.9105C20.168 18.0391 19.995 18.2558 19.922 18.5125L18.732 22.6808C18.568 23.2564 17.938 23.5596 17.386 23.3292L13.385 21.6606C13.139 21.5578 12.861 21.5578 12.615 21.6606L8.614 23.3292C8.062 23.5596 7.432 23.2564 7.268 22.6808L6.078 18.5125C6.005 18.2558 5.832 18.0391 5.598 17.9105L1.799 15.8231C1.274 15.5348 1.119 14.8533 1.466 14.366L3.983 10.8369C4.138 10.6196 4.2 10.3493 4.155 10.0863L3.418 5.8146C3.316 5.2247 3.752 4.6782 4.35 4.6461L8.679 4.4136C8.945 4.3993 9.195 4.2791 9.372 4.0796L12.253 0.8403Z\"\n fill=\"#FF6B00\"\n />\n </svg>\n);\n\n/** Green Square - Draw tool */\nexport const GreenSquareIcon: React.FC<{ size?: number }> = ({ size = 42 }) => (\n <svg width={size} height={size} viewBox=\"0 0 42 42\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"3\" y=\"3\" width=\"36\" height=\"36\" rx=\"4\" fill=\"#22C55E\" />\n </svg>\n);\n\n/** Yellow Parallelogram - Erase tool */\nexport const YellowParallelogramIcon: React.FC<{ size?: number }> = ({ size = 42 }) => (\n <svg width={size} height={size} viewBox=\"0 0 50 42\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M8 38L18 4H42L32 38H8Z\"\n fill=\"#EAB308\"\n />\n </svg>\n);\n\n/** Red/Orange Triangle - Select tool */\nexport const RedTriangleIcon: React.FC<{ size?: number }> = ({ size = 42 }) => (\n <svg width={size} height={size} viewBox=\"0 0 42 42\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M21 4L38 38H4L21 4Z\"\n fill=\"#F97316\"\n />\n </svg>\n);\n\n/** Blue Circle - Lasso tool */\nexport const BlueCircleIcon: React.FC<{ size?: number }> = ({ size = 42 }) => (\n <svg width={size} height={size} viewBox=\"0 0 42 42\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"21\" cy=\"21\" r=\"18\" fill=\"#3B82F6\" />\n </svg>\n);\n\n/** Chevron Left - Collapse button */\nexport const ChevronLeftIcon: React.FC<{ size?: number }> = ({ size = 24 }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M15 18L9 12L15 6\"\n stroke=\"#9CA3AF\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n/** Chevron Right - Expand indicator (shown on S logo hover) */\nexport const ChevronRightIcon: React.FC<{ size?: number }> = ({ size = 24 }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M9 6L15 12L9 18\"\n stroke=\"#9CA3AF\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n/** Settings Icon - Gear/cog for style panel toggle */\nexport const SettingsIcon: React.FC<{ size?: number; isActive?: boolean }> = ({ size = 20, isActive }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15Z\"\n stroke={isActive ? \"#FF6800\" : \"#6B7280\"}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M19.4 15C19.2669 15.3016 19.2272 15.6362 19.286 15.9606C19.3448 16.285 19.4995 16.5843 19.73 16.82L19.79 16.88C19.976 17.0657 20.1235 17.2863 20.2241 17.5291C20.3248 17.7719 20.3766 18.0322 20.3766 18.295C20.3766 18.5578 20.3248 18.8181 20.2241 19.0609C20.1235 19.3037 19.976 19.5243 19.79 19.71C19.6043 19.896 19.3837 20.0435 19.1409 20.1441C18.8981 20.2448 18.6378 20.2966 18.375 20.2966C18.1122 20.2966 17.8519 20.2448 17.6091 20.1441C17.3663 20.0435 17.1457 19.896 16.96 19.71L16.9 19.65C16.6643 19.4195 16.365 19.2648 16.0406 19.206C15.7162 19.1472 15.3816 19.1869 15.08 19.32C14.7842 19.4468 14.532 19.6572 14.3543 19.9255C14.1766 20.1938 14.0813 20.5082 14.08 20.83V21C14.08 21.5304 13.8693 22.0391 13.4942 22.4142C13.1191 22.7893 12.6104 23 12.08 23C11.5496 23 11.0409 22.7893 10.6658 22.4142C10.2907 22.0391 10.08 21.5304 10.08 21V20.91C10.0723 20.579 9.96512 20.258 9.77251 19.9887C9.5799 19.7194 9.31074 19.5143 9 19.4C8.69838 19.2669 8.36381 19.2272 8.03941 19.286C7.71502 19.3448 7.41568 19.4995 7.18 19.73L7.12 19.79C6.93425 19.976 6.71368 20.1235 6.47088 20.2241C6.22808 20.3248 5.96783 20.3766 5.705 20.3766C5.44217 20.3766 5.18192 20.3248 4.93912 20.2241C4.69632 20.1235 4.47575 19.976 4.29 19.79C4.10405 19.6043 3.95653 19.3837 3.85588 19.1409C3.75523 18.8981 3.70343 18.6378 3.70343 18.375C3.70343 18.1122 3.75523 17.8519 3.85588 17.6091C3.95653 17.3663 4.10405 17.1457 4.29 16.96L4.35 16.9C4.58054 16.6643 4.73519 16.365 4.794 16.0406C4.85282 15.7162 4.81312 15.3816 4.68 15.08C4.55324 14.7842 4.34276 14.532 4.07447 14.3543C3.80618 14.1766 3.49179 14.0813 3.17 14.08H3C2.46957 14.08 1.96086 13.8693 1.58579 13.4942C1.21071 13.1191 1 12.6104 1 12.08C1 11.5496 1.21071 11.0409 1.58579 10.6658C1.96086 10.2907 2.46957 10.08 3 10.08H3.09C3.42099 10.0723 3.742 9.96512 4.0113 9.77251C4.28059 9.5799 4.48572 9.31074 4.6 9C4.73312 8.69838 4.77282 8.36381 4.714 8.03941C4.65519 7.71502 4.50054 7.41568 4.27 7.18L4.21 7.12C4.02405 6.93425 3.87653 6.71368 3.77588 6.47088C3.67523 6.22808 3.62343 5.96783 3.62343 5.705C3.62343 5.44217 3.67523 5.18192 3.77588 4.93912C3.87653 4.69632 4.02405 4.47575 4.21 4.29C4.39575 4.10405 4.61632 3.95653 4.85912 3.85588C5.10192 3.75523 5.36217 3.70343 5.625 3.70343C5.88783 3.70343 6.14808 3.75523 6.39088 3.85588C6.63368 3.95653 6.85425 4.10405 7.04 4.29L7.1 4.35C7.33568 4.58054 7.63502 4.73519 7.95941 4.794C8.28381 4.85282 8.61838 4.81312 8.92 4.68H9C9.29577 4.55324 9.54802 4.34276 9.72569 4.07447C9.90337 3.80618 9.99872 3.49179 10 3.17V3C10 2.46957 10.2107 1.96086 10.5858 1.58579C10.9609 1.21071 11.4696 1 12 1C12.5304 1 13.0391 1.21071 13.4142 1.58579C13.7893 1.96086 14 2.46957 14 3V3.09C14.0013 3.41179 14.0966 3.72618 14.2743 3.99447C14.452 4.26276 14.7042 4.47324 15 4.6C15.3016 4.73312 15.6362 4.77282 15.9606 4.714C16.285 4.65519 16.5843 4.50054 16.82 4.27L16.88 4.21C17.0657 4.02405 17.2863 3.87653 17.5291 3.77588C17.7719 3.67523 18.0322 3.62343 18.295 3.62343C18.5578 3.62343 18.8181 3.67523 19.0609 3.77588C19.3037 3.87653 19.5243 4.02405 19.71 4.21C19.896 4.39575 20.0435 4.61632 20.1441 4.85912C20.2448 5.10192 20.2966 5.36217 20.2966 5.625C20.2966 5.88783 20.2448 6.14808 20.1441 6.39088C20.0435 6.63368 19.896 6.85425 19.71 7.04L19.65 7.1C19.4195 7.33568 19.2648 7.63502 19.206 7.95941C19.1472 8.28381 19.1869 8.61838 19.32 8.92V9C19.4468 9.29577 19.6572 9.54802 19.9255 9.72569C20.1938 9.90337 20.5082 9.99872 20.83 10H21C21.5304 10 22.0391 10.2107 22.4142 10.5858C22.7893 10.9609 23 11.4696 23 12C23 12.5304 22.7893 13.0391 22.4142 13.4142C22.0391 13.7893 21.5304 14 21 14H20.91C20.5882 14.0013 20.2738 14.0966 20.0055 14.2743C19.7372 14.452 19.5268 14.7042 19.4 15Z\"\n stroke={isActive ? \"#FF6800\" : \"#6B7280\"}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// =============================================================================\n// Original Detailed Icons (with inner tool graphics)\n// =============================================================================\n\nexport const SelectIcon: React.FC<{ isSelected?: boolean }> = ({ isSelected }) => (\n <svg width=\"30\" height=\"30\" viewBox=\"0 0 25 25\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n {/* Red/Orange triangle background */}\n <path\n d=\"M11.268 3C12.0378 1.6667 13.9623 1.6667 14.7321 3L25.1244 21C25.8942 22.3333 24.9319 24 23.3923 24H2.6077C1.0681 24 0.1058 22.3333 0.8756 21L11.268 3Z\"\n fill=\"#F24E1E\"\n opacity={isSelected ? 1 : 0.7}\n />\n {/* Cursor/pointer icon */}\n <path\n d=\"M9 10L9 18.5L11.5 16L14 20L15.5 19L13 15L16 14.5L9 10Z\"\n fill=\"white\"\n />\n </svg>\n);\n\nexport const DrawIcon: React.FC<{ isSelected?: boolean }> = ({ isSelected }) => (\n <svg width=\"30\" height=\"30\" viewBox=\"0 0 25 25\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"25\" height=\"25\" rx=\"2\" fill={isSelected ? '#00C851' : '#00C851'} opacity={isSelected ? 1 : 0.7} />\n <g transform=\"translate(12.5, 12.5) scale(1.4) translate(-12.5, -12.5)\">\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M13.6919 10.2852L14.2593 9.6908L14.8282 10.2864L14.2605 10.8808L13.6919 10.2852ZM9.5682 15.7944L8.9992 15.1988L13.1233 10.8808L13.6919 11.476L9.5682 15.7944ZM14.3284 8.5L8 15.1988V16.5H9.5682L16 10.0436L14.3284 8.5Z\"\n fill=\"white\"\n />\n </g>\n </svg>\n);\n\nexport const LassoIcon: React.FC<{ isSelected?: boolean }> = ({ isSelected }) => (\n <svg width=\"30\" height=\"30\" viewBox=\"0 0 25 25\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"25\" height=\"25\" rx=\"12.5\" fill={isSelected ? '#2C7FFF' : '#2C7FFF'} opacity={isSelected ? 1 : 0.7} />\n <g transform=\"translate(12.5, 12.5) scale(1.4) translate(-12.5, -12.5)\">\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9.219 11.3C9.219 10.8021 9.504 10.3117 10.043 9.9297C10.582 9.5484 11.347 9.3 12.211 9.3C13.074 9.3 13.839 9.5484 14.378 9.9297C14.918 10.3117 15.202 10.8021 15.202 11.3C15.202 11.7979 14.918 12.2882 14.378 12.6702C13.839 13.0515 13.074 13.2999 12.211 13.2999C12.005 13.2999 11.805 13.2859 11.612 13.2591C11.586 12.5417 10.887 12.0999 10.216 12.0999C9.988 12.0999 9.768 12.147 9.572 12.234C9.339 11.9444 9.219 11.625 9.219 11.3ZM12.211 14.0999C11.908 14.0999 11.614 14.074 11.331 14.0249C11.298 14.0629 11.262 14.0988 11.224 14.1325C11.226 14.154 11.228 14.1774 11.229 14.2026C11.232 14.3182 11.216 14.4769 11.137 14.6456C10.97 15.0066 10.586 15.2824 9.919 15.3874C9.091 15.5175 8.878 15.7607 8.827 15.8497C8.8 15.8961 8.797 15.9328 8.798 15.9542C8.798 15.9629 8.799 15.9695 8.8 15.973C8.805 15.9901 8.81 16.0079 8.813 16.026C8.833 16.1321 8.809 16.2395 8.751 16.3254C8.718 16.3733 8.675 16.4145 8.623 16.445C8.584 16.4681 8.54 16.4847 8.494 16.4932C8.447 16.502 8.4 16.5021 8.355 16.4944C8.296 16.4846 8.242 16.4619 8.195 16.4294C8.148 16.3972 8.108 16.3549 8.078 16.304C8.063 16.278 8.05 16.2501 8.041 16.2208C8.04 16.217 8.038 16.2128 8.037 16.2083C8.032 16.1931 8.027 16.1741 8.022 16.1517C8.012 16.1071 8.002 16.0477 8 15.977C7.996 15.8338 8.023 15.6452 8.136 15.4492C8.365 15.0533 8.87 14.7426 9.795 14.5971C9.958 14.5714 10.079 14.5362 10.167 14.4992C9.499 14.478 8.82 14.0237 8.82 13.2999C8.82 13.0999 8.876 12.9166 8.969 12.758C8.629 12.344 8.421 11.8466 8.421 11.3C8.421 10.4724 8.896 9.7627 9.583 9.2761C10.272 8.7888 11.202 8.5 12.211 8.5C13.219 8.5 14.15 8.7888 14.838 9.2761C15.526 9.7627 16 10.4724 16 11.3C16 12.1275 15.526 12.8372 14.838 13.3238C14.15 13.8111 13.219 14.0999 12.211 14.0999ZM9.754 13.0514C9.859 12.9649 10.021 12.8999 10.216 12.8999C10.634 12.8999 10.815 13.1577 10.815 13.2999C10.815 13.3371 10.806 13.3739 10.789 13.4108C10.757 13.4794 10.69 13.5552 10.58 13.6136C10.482 13.666 10.357 13.6999 10.216 13.6999C9.798 13.6999 9.618 13.4422 9.618 13.2999C9.618 13.2236 9.655 13.1338 9.754 13.0514Z\"\n fill=\"white\"\n />\n </g>\n </svg>\n);\n\nexport const EraseIcon: React.FC<{ isSelected?: boolean }> = ({ isSelected }) => (\n <svg width=\"36\" height=\"30\" viewBox=\"0 0 30 25\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n {/* Yellow parallelogram background */}\n <path\n d=\"M0.308 1.2407C0.151 0.61 0.628 0 1.278 0H23.664C24.118 0 24.516 0.3065 24.631 0.746L30.671 23.746C30.837 24.38 30.359 25 29.704 25H6.982C6.523 25 6.122 24.6868 6.012 24.2407L0.308 1.2407Z\"\n fill=\"#FFBA00\"\n opacity={isSelected ? 1 : 0.7}\n />\n {/* Eraser icon - proper diagonal orientation (down-left to up-right) */}\n <g transform=\"translate(15, 12.5)\">\n <g transform=\"rotate(-45)\">\n <rect x=\"-6\" y=\"-3\" width=\"12\" height=\"6\" rx=\"1\" fill=\"none\" stroke=\"white\" strokeWidth=\"1.5\" />\n <line x1=\"-2\" y1=\"-3\" x2=\"-2\" y2=\"3\" stroke=\"white\" strokeWidth=\"1.5\" />\n </g>\n </g>\n </svg>\n);\n\nexport const ShapesIcon: React.FC<{ isSelected?: boolean }> = ({ isSelected }) => (\n <svg width=\"30\" height=\"30\" viewBox=\"0 0 25 25\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n {/* Orange star */}\n <path\n d=\"M12.253 0.8403C12.65 0.393 13.35 0.393 13.747 0.8403L16.628 4.0796C16.805 4.2791 17.055 4.3993 17.321 4.4136L21.65 4.6461C22.248 4.6782 22.684 5.2247 22.582 5.8146L21.845 10.0863C21.8 10.3493 21.862 10.6196 22.017 10.8369L24.534 14.366C24.881 14.8533 24.726 15.5348 24.201 15.8231L20.402 17.9105C20.168 18.0391 19.995 18.2558 19.922 18.5125L18.732 22.6808C18.568 23.2564 17.938 23.5596 17.386 23.3292L13.385 21.6606C13.139 21.5578 12.861 21.5578 12.615 21.6606L8.614 23.3292C8.062 23.5596 7.432 23.2564 7.268 22.6808L6.078 18.5125C6.005 18.2558 5.832 18.0391 5.598 17.9105L1.799 15.8231C1.274 15.5348 1.119 14.8533 1.466 14.366L3.983 10.8369C4.138 10.6196 4.2 10.3493 4.155 10.0863L3.418 5.8146C3.316 5.2247 3.752 4.6782 4.35 4.6461L8.679 4.4136C8.945 4.3993 9.195 4.2791 9.372 4.0796L12.253 0.8403Z\"\n fill=\"#FF6800\"\n opacity={isSelected ? 1 : 0.7}\n />\n {/* Shapes: rectangle, circle, triangle (white) */}\n <g transform=\"translate(5.5, 7)\">\n {/* Small rectangle */}\n <rect x=\"0\" y=\"6\" width=\"4\" height=\"4\" rx=\"0.5\" fill=\"white\" />\n {/* Circle */}\n <circle cx=\"10\" cy=\"4\" r=\"3\" fill=\"white\" />\n {/* Triangle */}\n <path d=\"M5 11L7.5 6.5L10 11H5Z\" fill=\"white\" />\n </g>\n </svg>\n);\n","// =============================================================================\n// Shape Picker Popup Component\n// =============================================================================\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport { useEditor, GeoShapeGeoStyle } from 'tldraw';\n\n// All available geo shapes in tldraw\nconst GEO_SHAPES = [\n 'rectangle',\n 'ellipse',\n 'triangle',\n 'diamond',\n 'pentagon',\n 'hexagon',\n 'octagon',\n 'star',\n 'rhombus',\n 'rhombus-2',\n 'oval',\n 'trapezoid',\n 'arrow-right',\n 'arrow-left',\n 'arrow-up',\n 'arrow-down',\n 'x-box',\n 'check-box',\n 'cloud',\n 'heart',\n] as const;\n\ntype GeoShape = (typeof GEO_SHAPES)[number];\n\n// SVG icons for each shape\nconst ShapeIcon: React.FC<{ shape: GeoShape; size?: number }> = ({ shape, size = 20 }) => {\n const stroke = 'currentColor';\n const strokeWidth = 1.5;\n const fill = 'none';\n\n switch (shape) {\n case 'rectangle':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"1\" />\n </svg>\n );\n case 'ellipse':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <ellipse cx=\"12\" cy=\"12\" rx=\"9\" ry=\"7\" />\n </svg>\n );\n case 'triangle':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M12 4L21 20H3L12 4Z\" />\n </svg>\n );\n case 'diamond':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M12 2L22 12L12 22L2 12L12 2Z\" />\n </svg>\n );\n case 'pentagon':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M12 2L22 9L18 21H6L2 9L12 2Z\" />\n </svg>\n );\n case 'hexagon':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M12 2L21 7V17L12 22L3 17V7L12 2Z\" />\n </svg>\n );\n case 'octagon':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M8 2H16L22 8V16L16 22H8L2 16V8L8 2Z\" />\n </svg>\n );\n case 'star':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M12 2L14.5 9H22L16 13.5L18.5 21L12 16.5L5.5 21L8 13.5L2 9H9.5L12 2Z\" />\n </svg>\n );\n case 'rhombus':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M12 3L20 12L12 21L4 12L12 3Z\" />\n </svg>\n );\n case 'rhombus-2':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M2 12L12 4L22 12L12 20L2 12Z\" />\n </svg>\n );\n case 'oval':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <ellipse cx=\"12\" cy=\"12\" rx=\"6\" ry=\"9\" />\n </svg>\n );\n case 'trapezoid':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M6 6H18L21 18H3L6 6Z\" />\n </svg>\n );\n case 'arrow-right':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M4 8V16H12V20L20 12L12 4V8H4Z\" />\n </svg>\n );\n case 'arrow-left':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M20 8V16H12V20L4 12L12 4V8H20Z\" />\n </svg>\n );\n case 'arrow-up':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M8 22V10L4 10L12 2L20 10H16V22H8Z\" />\n </svg>\n );\n case 'arrow-down':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M8 2V14L4 14L12 22L20 14H16V2H8Z\" />\n </svg>\n );\n case 'x-box':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"1\" />\n <path d=\"M8 8L16 16M16 8L8 16\" />\n </svg>\n );\n case 'check-box':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"1\" />\n <path d=\"M7 12L10 15L17 8\" />\n </svg>\n );\n case 'cloud':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M6.5 19C4 19 2 17 2 14.5C2 12.5 3.5 10.5 5.5 10C5.5 7 8 4 12 4C15.5 4 18 6.5 18.5 9.5C20.5 10 22 11.5 22 14C22 16.5 20 19 17.5 19H6.5Z\" />\n </svg>\n );\n case 'heart':\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <path d=\"M12 21C12 21 3 15 3 9C3 6 5.5 3 8.5 3C10.5 3 12 4.5 12 4.5C12 4.5 13.5 3 15.5 3C18.5 3 21 6 21 9C21 15 12 21 12 21Z\" />\n </svg>\n );\n default:\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill={fill} stroke={stroke} strokeWidth={strokeWidth}>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"1\" />\n </svg>\n );\n }\n};\n\ninterface ShapePickerProps {\n isOpen: boolean;\n onClose: () => void;\n onSelectShape: (shape: GeoShape) => void;\n anchorRef: React.RefObject<HTMLButtonElement | null>;\n}\n\nexport const ShapePicker: React.FC<ShapePickerProps> = ({ isOpen, onClose, onSelectShape, anchorRef }) => {\n const editor = useEditor();\n const pickerRef = useRef<HTMLDivElement>(null);\n const [selectedShape, setSelectedShape] = useState<GeoShape>('rectangle');\n\n // Get the current geo style from the editor\n useEffect(() => {\n const currentGeo = editor.getStyleForNextShape(GeoShapeGeoStyle);\n if (currentGeo && GEO_SHAPES.includes(currentGeo as GeoShape)) {\n setSelectedShape(currentGeo as GeoShape);\n }\n }, [editor, isOpen]);\n\n // Close on click outside\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n if (\n pickerRef.current &&\n !pickerRef.current.contains(e.target as Node) &&\n anchorRef.current &&\n !anchorRef.current.contains(e.target as Node)\n ) {\n onClose();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen, onClose, anchorRef]);\n\n // Close on escape\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, onClose]);\n\n if (!isOpen) return null;\n\n const handleShapeClick = (e: React.MouseEvent, shape: GeoShape) => {\n e.preventDefault();\n e.stopPropagation();\n setSelectedShape(shape);\n onSelectShape(shape);\n };\n\n // Prevent all pointer events from reaching tldraw\n const stopAllEvents = (e: React.SyntheticEvent) => {\n e.preventDefault();\n e.stopPropagation();\n };\n\n // Calculate position above the anchor button\n const anchorRect = anchorRef.current?.getBoundingClientRect();\n const pickerStyle: React.CSSProperties = anchorRect\n ? {\n position: 'fixed',\n bottom: window.innerHeight - anchorRect.top + 8,\n left: anchorRect.left + anchorRect.width / 2,\n transform: 'translateX(-50%)',\n }\n : {};\n\n return (\n <div\n ref={pickerRef}\n style={{\n ...pickerStyle,\n backgroundColor: 'white',\n borderRadius: 8,\n boxShadow: '0 4px 20px rgba(0,0,0,0.15)',\n padding: 8,\n zIndex: 100000,\n pointerEvents: 'auto',\n }}\n onClick={stopAllEvents}\n onPointerDown={stopAllEvents}\n onMouseDown={stopAllEvents}\n >\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(4, 1fr)',\n gap: 2,\n }}\n >\n {GEO_SHAPES.map((shape) => (\n <button\n key={shape}\n onClick={(e) => handleShapeClick(e, shape)}\n onPointerDown={stopAllEvents}\n onMouseDown={stopAllEvents}\n title={shape.replace(/-/g, ' ')}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 32,\n height: 32,\n border: 'none',\n borderRadius: 4,\n backgroundColor: selectedShape === shape ? '#e8f4ff' : 'transparent',\n color: selectedShape === shape ? '#2c7fff' : '#333',\n cursor: 'pointer',\n transition: 'background-color 0.1s',\n }}\n onMouseEnter={(e) => {\n if (selectedShape !== shape) {\n e.currentTarget.style.backgroundColor = '#f5f5f5';\n }\n }}\n onMouseLeave={(e) => {\n if (selectedShape !== shape) {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }}\n >\n <ShapeIcon shape={shape} size={18} />\n </button>\n ))}\n </div>\n </div>\n );\n};\n\nexport { GEO_SHAPES, type GeoShape };\n","// =============================================================================\n// Skema Toolbar Component - Collapsible with Framer Motion Animations\n// =============================================================================\n\nimport React, { useState, useRef } from 'react';\nimport { useEditor, useTools, useIsToolSelected, GeoShapeGeoStyle } from 'tldraw';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { SelectIcon, DrawIcon, LassoIcon, EraseIcon, ShapesIcon } from './ToolbarIcons';\nimport { SLogoIcon, ChevronLeftIcon, ChevronRightIcon, SettingsIcon } from './ToolbarIcons';\nimport { ShapePicker, type GeoShape } from './ShapePicker';\n\n// =============================================================================\n// Animation Variants\n// =============================================================================\n\n// Total number of tools (for reverse stagger calculation)\nconst TOOL_COUNT = 4;\n\n// Smooth exit duration for coordinated collapse\nconst EXIT_DURATION = 0.12;\nconst EXIT_STAGGER = 0.01;\n\n// Cubic bezier easing for smooth deceleration\nconst smoothEasing: [number, number, number, number] = [0.4, 0, 0.2, 1];\n\nconst toolVariants = {\n hidden: {\n opacity: 0,\n scale: 0.8,\n width: 0,\n marginRight: -6,\n },\n visible: (i: number) => ({\n opacity: 1,\n scale: 1,\n width: 40,\n marginRight: 0,\n transition: {\n opacity: { duration: 0.15, delay: i * 0.04 },\n scale: { type: 'spring' as const, stiffness: 400, damping: 25, delay: i * 0.04 },\n width: { type: 'spring' as const, stiffness: 400, damping: 30, delay: i * 0.03 },\n marginRight: { duration: 0.1, delay: i * 0.03 },\n },\n }),\n exit: (i: number) => ({\n opacity: 0,\n scale: 0.8,\n width: 0,\n marginRight: -6,\n transition: {\n opacity: { duration: 0.06, ease: 'easeOut' as const },\n scale: { duration: EXIT_DURATION, ease: smoothEasing },\n width: { duration: EXIT_DURATION, ease: smoothEasing, delay: EXIT_STAGGER * (TOOL_COUNT - 1 - i) },\n marginRight: { duration: EXIT_DURATION, ease: smoothEasing, delay: EXIT_STAGGER * (TOOL_COUNT - 1 - i) },\n },\n }),\n};\n\nconst chevronVariants = {\n hidden: { \n opacity: 0, \n scale: 0.8,\n width: 0,\n },\n visible: {\n opacity: 0.6,\n scale: 1,\n width: 28,\n transition: { \n opacity: { delay: 0.1, duration: 0.1 },\n scale: { delay: 0.1, type: 'spring' as const, stiffness: 500, damping: 30 },\n width: { delay: 0.08, duration: 0.12, ease: 'easeOut' as const },\n },\n },\n exit: { \n opacity: 0, \n scale: 0.8,\n width: 0,\n transition: { \n opacity: { duration: 0.06 },\n scale: { duration: 0.08 },\n width: { duration: 0.1, ease: smoothEasing },\n } \n },\n};\n\n// =============================================================================\n// Toolbar Button Component (original style)\n// =============================================================================\n\ninterface ToolbarButtonProps {\n onClick: () => void;\n isSelected: boolean;\n icon: React.ReactNode;\n label: string;\n buttonRef?: React.RefObject<HTMLButtonElement | null>;\n index?: number;\n}\n\nconst ToolbarButton: React.FC<ToolbarButtonProps> = ({ \n onClick, \n isSelected, \n icon, \n label, \n buttonRef,\n index = 0,\n}) => {\n const handleClick = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onClick();\n };\n\n return (\n <motion.button\n ref={buttonRef}\n custom={index}\n variants={toolVariants}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"exit\"\n onClick={handleClick}\n title={label}\n type=\"button\"\n whileHover={{ scale: 1.05 }}\n whileTap={{ scale: 0.95 }}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: 40,\n minWidth: 0,\n border: 'none',\n borderRadius: 8,\n backgroundColor: isSelected ? 'rgba(255,255,255,0.15)' : 'transparent',\n cursor: 'pointer',\n pointerEvents: 'auto',\n overflow: 'hidden',\n flexShrink: 0,\n }}\n >\n <motion.span\n style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.8 }}\n transition={{ duration: 0.12 }}\n >\n {icon}\n </motion.span>\n </motion.button>\n );\n};\n\n// =============================================================================\n// Logo/Shapes Button Component (S logo when collapsed, ShapesIcon when expanded)\n// =============================================================================\n\ninterface LogoShapesButtonProps {\n isExpanded: boolean;\n isHovered: boolean;\n isSelected: boolean;\n onClick: () => void;\n onShapesClick: () => void;\n onMouseEnter: () => void;\n onMouseLeave: () => void;\n buttonRef?: React.RefObject<HTMLButtonElement | null>;\n}\n\nconst LogoShapesButton: React.FC<LogoShapesButtonProps> = ({\n isExpanded,\n isHovered,\n isSelected,\n onClick,\n onShapesClick,\n onMouseEnter,\n onMouseLeave,\n buttonRef,\n}) => {\n const handleClick = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (isExpanded) {\n onShapesClick();\n } else {\n onClick();\n }\n };\n\n return (\n <motion.button\n ref={buttonRef}\n onClick={handleClick}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n title={isExpanded ? \"Shapes (G)\" : \"Expand toolbar\"}\n type=\"button\"\n whileHover={{ scale: 1.08 }}\n whileTap={{ scale: 0.95 }}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 40,\n height: 40,\n border: 'none',\n borderRadius: 8,\n backgroundColor: isSelected ? 'rgba(255,255,255,0.15)' : 'transparent',\n cursor: 'pointer',\n pointerEvents: 'auto',\n position: 'relative',\n }}\n >\n <AnimatePresence mode=\"popLayout\">\n {isExpanded ? (\n <motion.div\n key=\"shapes\"\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.85 }}\n transition={{ \n type: 'spring',\n stiffness: 500,\n damping: 30,\n opacity: { duration: 0.08 }\n }}\n >\n <ShapesIcon isSelected={isSelected} />\n </motion.div>\n ) : isHovered ? (\n <motion.div\n key=\"chevron\"\n initial={{ opacity: 0, x: -3 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: 3 }}\n transition={{ duration: 0.08, ease: 'easeOut' }}\n >\n <ChevronRightIcon size={20} />\n </motion.div>\n ) : (\n <motion.div\n key=\"s\"\n initial={{ opacity: 0, scale: 0.9 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.85 }}\n transition={{ \n type: 'spring',\n stiffness: 500,\n damping: 30,\n opacity: { duration: 0.06 }\n }}\n >\n <SLogoIcon size={32} />\n </motion.div>\n )}\n </AnimatePresence>\n </motion.button>\n );\n};\n\n// =============================================================================\n// Collapse Button Component\n// =============================================================================\n\nconst CollapseButton: React.FC<{ onClick: () => void }> = ({ onClick }) => {\n return (\n <motion.button\n variants={chevronVariants}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"exit\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onClick();\n }}\n title=\"Collapse toolbar\"\n type=\"button\"\n whileHover={{ opacity: 1, scale: 1.1 }}\n whileTap={{ scale: 0.9 }}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: 40,\n minWidth: 0,\n border: 'none',\n borderRadius: 6,\n backgroundColor: 'transparent',\n cursor: 'pointer',\n pointerEvents: 'auto',\n marginLeft: 2,\n overflow: 'hidden',\n flexShrink: 0,\n }}\n >\n <motion.span\n style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.1 }}\n >\n <ChevronLeftIcon size={20} />\n </motion.span>\n </motion.button>\n );\n};\n\n// =============================================================================\n// Settings Button Component\n// =============================================================================\n\ninterface SettingsButtonProps {\n isActive: boolean;\n onClick: () => void;\n index: number;\n}\n\nconst SettingsButton: React.FC<SettingsButtonProps> = ({ isActive, onClick, index }) => {\n return (\n <motion.button\n custom={index}\n variants={toolVariants}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"exit\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onClick();\n }}\n title=\"Style settings\"\n type=\"button\"\n whileHover={{ scale: 1.05 }}\n whileTap={{ scale: 0.95 }}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 36,\n height: 40,\n border: 'none',\n borderRadius: 8,\n backgroundColor: isActive ? 'rgba(255, 104, 0, 0.1)' : 'transparent',\n cursor: 'pointer',\n pointerEvents: 'auto',\n }}\n >\n <SettingsIcon size={20} isActive={isActive} />\n </motion.button>\n );\n};\n\n// =============================================================================\n// Main Skema Toolbar\n// =============================================================================\n\nexport interface SkemaToolbarProps {\n isExpanded?: boolean;\n onExpandedChange?: (expanded: boolean) => void;\n onStylePanelChange?: (open: boolean) => void;\n isDark?: boolean;\n}\n\nexport const SkemaToolbar: React.FC<SkemaToolbarProps> = ({ isExpanded: controlledExpanded, onExpandedChange, onStylePanelChange, isDark = false }) => {\n const editor = useEditor();\n const tools = useTools();\n const shapesButtonRef = useRef<HTMLButtonElement>(null);\n\n // Collapse/expand state (use controlled prop if provided)\n const [internalExpanded, setInternalExpanded] = useState(false);\n const isExpanded = controlledExpanded !== undefined ? controlledExpanded : internalExpanded;\n const [isLogoHovered, setIsLogoHovered] = useState(false);\n const [isShapePickerOpen, setIsShapePickerOpen] = useState(false);\n const [isStylePanelOpen, setIsStylePanelOpen] = useState(false);\n\n // Tool selection states\n const isSelectSelected = useIsToolSelected(tools['select']);\n const isDrawSelected = useIsToolSelected(tools['draw']);\n const isLassoSelected = useIsToolSelected(tools['lasso-select']);\n const isEraseSelected = useIsToolSelected(tools['eraser']);\n const isGeoSelected = useIsToolSelected(tools['geo']);\n\n const handleExpand = (expanded: boolean) => {\n setInternalExpanded(expanded);\n onExpandedChange?.(expanded);\n // Close style panel when collapsing\n if (!expanded) {\n setIsStylePanelOpen(false);\n onStylePanelChange?.(false);\n }\n };\n\n const handleStylePanelToggle = () => {\n const newState = !isStylePanelOpen;\n setIsStylePanelOpen(newState);\n onStylePanelChange?.(newState);\n };\n\n const handleLogoClick = () => {\n handleExpand(true);\n };\n\n const handleCollapse = () => {\n handleExpand(false);\n setIsShapePickerOpen(false);\n };\n\n const handleShapesClick = () => {\n setIsShapePickerOpen((prev) => !prev);\n };\n\n const handleSelectShape = (shape: GeoShape) => {\n editor.setStyleForNextShapes(GeoShapeGeoStyle, shape);\n editor.setCurrentTool('geo');\n setIsShapePickerOpen(false);\n };\n\n return (\n <>\n {/* Centering wrapper */}\n <div\n style={{\n position: 'absolute',\n bottom: 16,\n left: 0,\n right: 0,\n display: 'flex',\n justifyContent: 'center',\n pointerEvents: 'none',\n zIndex: 99999,\n }}\n >\n <motion.div\n data-skema=\"toolbar\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '6px 12px',\n backgroundColor: isDark ? '#1a1a1a' : 'white',\n borderRadius: 28,\n boxShadow: isDark\n ? '0 2px 10px rgba(0,0,0,0.4), 0 0 0 1px rgba(255,255,255,0.08)'\n : '0 2px 10px rgba(0,0,0,0.15)',\n pointerEvents: 'auto',\n }}\n >\n {/* Logo/Shapes button - always first, transforms from S to Shapes when expanded */}\n <LogoShapesButton\n isExpanded={isExpanded}\n isHovered={isLogoHovered}\n isSelected={isGeoSelected || isShapePickerOpen}\n onClick={handleLogoClick}\n onShapesClick={handleShapesClick}\n onMouseEnter={() => setIsLogoHovered(true)}\n onMouseLeave={() => setIsLogoHovered(false)}\n buttonRef={shapesButtonRef}\n />\n\n {/* Other toolbar buttons - show when expanded */}\n <AnimatePresence mode=\"popLayout\">\n {isExpanded && (\n <>\n <ToolbarButton\n key=\"select\"\n onClick={() => editor.setCurrentTool('select')}\n isSelected={isSelectSelected}\n icon={<SelectIcon isSelected={isSelectSelected} />}\n label=\"Select (S)\"\n index={0}\n />\n <ToolbarButton\n key=\"draw\"\n onClick={() => editor.setCurrentTool('draw')}\n isSelected={isDrawSelected}\n icon={<DrawIcon isSelected={isDrawSelected} />}\n label=\"Draw (D)\"\n index={1}\n />\n <ToolbarButton\n key=\"lasso\"\n onClick={() => editor.setCurrentTool('lasso-select')}\n isSelected={isLassoSelected}\n icon={<LassoIcon isSelected={isLassoSelected} />}\n label=\"Lasso Select (L)\"\n index={2}\n />\n <ToolbarButton\n key=\"erase\"\n onClick={() => editor.setCurrentTool('eraser')}\n isSelected={isEraseSelected}\n icon={<EraseIcon isSelected={isEraseSelected} />}\n label=\"Eraser (E)\"\n index={3}\n />\n\n {/* Collapse Chevron */}\n <CollapseButton\n key=\"collapse\"\n onClick={handleCollapse}\n />\n </>\n )}\n </AnimatePresence>\n </motion.div>\n </div>\n\n {/* Shape Picker (for geo tool sub-shapes) */}\n <ShapePicker\n isOpen={isShapePickerOpen}\n onClose={() => setIsShapePickerOpen(false)}\n onSelectShape={handleSelectShape}\n anchorRef={shapesButtonRef}\n />\n </>\n );\n};\n","// =============================================================================\n// Annotation Marker Component - Shows numbered markers for each annotation\n// =============================================================================\n\nimport React from 'react';\nimport type { Annotation, DOMSelection } from '../../types';\n\n// =============================================================================\n// Single Annotation Marker\n// =============================================================================\n\ninterface AnnotationMarkerProps {\n annotation: Annotation;\n index: number;\n scrollOffset: { x: number; y: number };\n onHover: (id: string | null) => void;\n onClick: (annotation: Annotation) => void;\n isHovered: boolean;\n accentColor?: string;\n}\n\nconst AnnotationMarker: React.FC<AnnotationMarkerProps> = ({\n annotation,\n index,\n scrollOffset,\n onHover,\n onClick,\n isHovered,\n accentColor = '#3b82f6',\n}) => {\n // Get position based on annotation type\n let markerX: number;\n let markerY: number;\n\n if (annotation.type === 'dom_selection') {\n const sel = annotation as DOMSelection;\n markerX = sel.boundingBox.x + sel.boundingBox.width / 2;\n markerY = sel.boundingBox.y;\n } else if (annotation.type === 'drawing') {\n markerX = annotation.boundingBox.x + annotation.boundingBox.width / 2;\n markerY = annotation.boundingBox.y;\n } else {\n markerX = annotation.boundingBox.x + annotation.boundingBox.width / 2;\n markerY = annotation.boundingBox.y;\n }\n\n // Convert to viewport coordinates\n const viewportX = markerX - scrollOffset.x;\n const viewportY = markerY - scrollOffset.y - 12; // Position above the element\n\n const isDrawing = annotation.type === 'drawing';\n const markerColor = isDrawing ? '#8B5CF6' : accentColor; // Purple for drawings\n\n // Get comment for tooltip\n const comment = annotation.type === 'dom_selection'\n ? (annotation as DOMSelection).comment\n : undefined;\n const elementName = annotation.type === 'dom_selection'\n ? (annotation as DOMSelection).tagName\n : 'Drawing';\n\n return (\n <div\n data-skema=\"annotation-marker\"\n style={{\n position: 'fixed',\n left: viewportX,\n top: viewportY,\n transform: 'translate(-50%, -100%)',\n zIndex: 999998,\n pointerEvents: 'auto',\n }}\n >\n {/* Marker circle */}\n <div\n style={{\n width: isHovered ? 26 : 22,\n height: isHovered ? 26 : 22,\n borderRadius: '50%',\n backgroundColor: isHovered ? '#ef4444' : markerColor,\n color: 'white',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 11,\n fontWeight: 600,\n fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n cursor: 'pointer',\n boxShadow: '0 2px 8px rgba(0,0,0,0.2)',\n transition: 'all 0.15s ease',\n userSelect: 'none',\n }}\n onMouseEnter={() => onHover(annotation.id)}\n onMouseLeave={() => onHover(null)}\n onClick={(e) => {\n e.stopPropagation();\n onClick(annotation);\n }}\n >\n {isHovered ? '×' : index + 1}\n </div>\n\n {/* Tooltip on hover */}\n {isHovered && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n bottom: '100%',\n transform: 'translateX(-50%)',\n marginBottom: 8,\n padding: '8px 12px',\n backgroundColor: '#1a1a1a',\n borderRadius: 8,\n boxShadow: '0 4px 12px rgba(0,0,0,0.3)',\n whiteSpace: 'nowrap',\n maxWidth: 200,\n zIndex: 999999,\n }}\n >\n <div style={{\n fontSize: 11,\n color: 'rgba(255,255,255,0.6)',\n marginBottom: comment ? 4 : 0,\n }}>\n {elementName}\n </div>\n {comment && (\n <div style={{\n fontSize: 12,\n color: 'white',\n whiteSpace: 'normal',\n wordBreak: 'break-word',\n }}>\n {comment.length > 50 ? comment.slice(0, 50) + '...' : comment}\n </div>\n )}\n <div style={{\n fontSize: 10,\n color: 'rgba(255,255,255,0.4)',\n marginTop: 4,\n }}>\n Click to delete\n </div>\n </div>\n )}\n </div>\n );\n};\n\n// =============================================================================\n// Annotation Markers Layer - Container for all markers\n// =============================================================================\n\ninterface AnnotationMarkersLayerProps {\n annotations: Annotation[];\n scrollOffset: { x: number; y: number };\n hoveredMarkerId: string | null;\n onHover: (id: string | null) => void;\n onDelete: (annotation: Annotation) => void;\n}\n\nexport const AnnotationMarkersLayer: React.FC<AnnotationMarkersLayerProps> = ({\n annotations,\n scrollOffset,\n hoveredMarkerId,\n onHover,\n onDelete,\n}) => {\n return (\n <>\n {annotations.map((annotation, index) => (\n <AnnotationMarker\n key={annotation.id}\n annotation={annotation}\n index={index}\n scrollOffset={scrollOffset}\n onHover={onHover}\n onClick={onDelete}\n isHovered={hoveredMarkerId === annotation.id}\n />\n ))}\n </>\n );\n};\n","// =============================================================================\n// Annotations Sidebar - Collapsible panel showing annotation list\n// =============================================================================\n\nimport React, { useState } from 'react';\nimport type { Annotation, DOMSelection, DrawingAnnotation } from '../../types';\n\ninterface AnnotationsSidebarProps {\n annotations: Annotation[];\n onClear: () => void;\n onExport: () => void;\n}\n\nexport const AnnotationsSidebar: React.FC<AnnotationsSidebarProps> = ({\n annotations,\n onClear,\n onExport,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n\n return (\n <div\n data-skema=\"sidebar\"\n style={{\n position: 'fixed',\n right: isOpen ? 0 : -280,\n top: 60,\n width: 280,\n maxHeight: 'calc(100vh - 120px)',\n backgroundColor: 'white',\n borderRadius: '8px 0 0 8px',\n boxShadow: '-2px 0 10px rgba(0,0,0,0.1)',\n transition: 'right 0.2s ease-out',\n zIndex: 999996,\n overflow: 'hidden',\n }}\n >\n {/* Toggle button */}\n <button\n onClick={() => setIsOpen(!isOpen)}\n style={{\n position: 'absolute',\n left: -32,\n top: 10,\n width: 32,\n height: 32,\n backgroundColor: '#3b82f6',\n border: 'none',\n borderRadius: '8px 0 0 8px',\n color: 'white',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {isOpen ? '→' : '←'}\n </button>\n\n {/* Header */}\n <div\n style={{\n padding: '12px 16px',\n borderBottom: '1px solid #e5e7eb',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <span style={{ fontWeight: 600, fontSize: '14px' }}>\n Annotations ({annotations.length})\n </span>\n <div style={{ display: 'flex', gap: '8px' }}>\n <button\n onClick={onExport}\n style={{\n padding: '4px 8px',\n fontSize: '12px',\n backgroundColor: '#3b82f6',\n color: 'white',\n border: 'none',\n borderRadius: '4px',\n cursor: 'pointer',\n }}\n >\n Export\n </button>\n <button\n onClick={onClear}\n style={{\n padding: '4px 8px',\n fontSize: '12px',\n backgroundColor: '#ef4444',\n color: 'white',\n border: 'none',\n borderRadius: '4px',\n cursor: 'pointer',\n }}\n >\n Clear\n </button>\n </div>\n </div>\n\n {/* Annotations list */}\n <div style={{ overflowY: 'auto', maxHeight: 'calc(100vh - 200px)' }}>\n {annotations.length === 0 ? (\n <div style={{ padding: '16px', color: '#6b7280', fontSize: '13px' }}>\n No annotations yet. Double-click to select an element, or use draw/lasso to annotate.\n </div>\n ) : (\n annotations.map((annotation) => (\n <div\n key={annotation.id}\n style={{\n padding: '12px 16px',\n borderBottom: '1px solid #f3f4f6',\n fontSize: '13px',\n }}\n >\n <div style={{ fontWeight: 500, marginBottom: '4px' }}>\n {annotation.type === 'dom_selection' && `[DOM] ${(annotation as DOMSelection).tagName}`}\n {annotation.type === 'drawing' && `[Draw] ${(annotation as DrawingAnnotation).comment || 'Drawing'}`}\n {annotation.type === 'gesture' && `[Gesture] ${annotation.gesture}`}\n </div>\n {annotation.type === 'dom_selection' && (\n <>\n {(annotation as DOMSelection).comment && (\n <div style={{ color: '#374151', fontSize: '12px', marginBottom: '4px' }}>\n {(annotation as DOMSelection).comment}\n </div>\n )}\n <div style={{ color: '#6b7280', fontSize: '11px' }}>\n {(annotation as DOMSelection).selector.slice(0, 50)}\n </div>\n </>\n )}\n </div>\n ))\n )}\n </div>\n </div>\n );\n};\n","// =============================================================================\n// Selection Overlay - Highlights selected DOM elements\n// =============================================================================\n\nimport React, { useEffect, useState } from 'react';\nimport type { DOMSelection } from '../../types';\n\ninterface SelectionOverlayProps {\n selections: DOMSelection[];\n}\n\nexport const SelectionOverlay: React.FC<SelectionOverlayProps> = ({ selections }) => {\n // Track scroll position to trigger re-renders\n const [scrollPos, setScrollPos] = useState({ x: 0, y: 0 });\n\n useEffect(() => {\n const handleScrollOrResize = () => {\n setScrollPos({ x: window.scrollX, y: window.scrollY });\n };\n // Initial position\n handleScrollOrResize();\n window.addEventListener('scroll', handleScrollOrResize, { passive: true });\n window.addEventListener('resize', handleScrollOrResize);\n return () => {\n window.removeEventListener('scroll', handleScrollOrResize);\n window.removeEventListener('resize', handleScrollOrResize);\n };\n }, []);\n\n return (\n <>\n {selections.map((selection) => {\n // boundingBox is stored in document coordinates\n // Convert to viewport coordinates by subtracting current scroll\n const viewportX = selection.boundingBox.x - scrollPos.x;\n const viewportY = selection.boundingBox.y - scrollPos.y;\n\n return (\n <div\n key={selection.id}\n data-skema=\"selection\"\n style={{\n position: 'fixed',\n left: viewportX,\n top: viewportY,\n width: selection.boundingBox.width,\n height: selection.boundingBox.height,\n border: '2px solid #10b981',\n backgroundColor: 'rgba(16, 185, 129, 0.1)',\n pointerEvents: 'none',\n zIndex: 999997,\n }}\n >\n <span\n style={{\n position: 'absolute',\n top: -20,\n left: 0,\n backgroundColor: '#10b981',\n color: 'white',\n padding: '2px 6px',\n fontSize: '11px',\n borderRadius: '3px',\n whiteSpace: 'nowrap',\n }}\n >\n {selection.tagName}\n </span>\n </div>\n );\n })}\n </>\n );\n};\n","// =============================================================================\n// Processing Overlay - Shows animation when changes are being made\n// =============================================================================\n\nimport React from 'react';\nimport type { BoundingBox } from '../../types';\n\n// =============================================================================\n// Animated Shape Loader - Cycles through colorful shapes\n// =============================================================================\n\nconst ShapeLoader: React.FC = () => {\n return (\n <div\n style={{\n position: 'relative',\n width: 28,\n height: 28,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {/* Orange Star */}\n <svg\n className=\"skema-shape skema-shape-1\"\n viewBox=\"0 0 24 24\"\n style={{\n position: 'absolute',\n width: 24,\n height: 24,\n }}\n >\n <polygon\n points=\"12,2 15,9 22,9 16,14 18,22 12,17 6,22 8,14 2,9 9,9\"\n fill=\"#F97316\"\n />\n </svg>\n {/* Yellow Parallelogram */}\n <svg\n className=\"skema-shape skema-shape-2\"\n viewBox=\"0 0 24 24\"\n style={{\n position: 'absolute',\n width: 24,\n height: 24,\n }}\n >\n <polygon\n points=\"6,4 22,4 18,20 2,20\"\n fill=\"#FACC15\"\n />\n </svg>\n {/* Red Triangle */}\n <svg\n className=\"skema-shape skema-shape-3\"\n viewBox=\"0 0 24 24\"\n style={{\n position: 'absolute',\n width: 24,\n height: 24,\n }}\n >\n <polygon\n points=\"12,3 22,21 2,21\"\n fill=\"#EF4444\"\n />\n </svg>\n {/* Blue Circle */}\n <svg\n className=\"skema-shape skema-shape-4\"\n viewBox=\"0 0 24 24\"\n style={{\n position: 'absolute',\n width: 24,\n height: 24,\n }}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"#3B82F6\" />\n </svg>\n {/* Green Square */}\n <svg\n className=\"skema-shape skema-shape-5\"\n viewBox=\"0 0 24 24\"\n style={{\n position: 'absolute',\n width: 24,\n height: 24,\n }}\n >\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" fill=\"#22C55E\" />\n </svg>\n </div>\n );\n};\n\n// =============================================================================\n// Processing Overlay Styles (CSS Keyframes)\n// =============================================================================\n\nexport const ProcessingOverlayStyles = `\n @keyframes skema-processing-pulse {\n 0%, 100% {\n opacity: 0.7;\n transform: scale(1);\n }\n 50% {\n opacity: 0.95;\n transform: scale(1.02);\n }\n }\n @keyframes skema-processing-shimmer {\n 0% {\n background-position: -200% 0;\n }\n 100% {\n background-position: 200% 0;\n }\n }\n @keyframes skema-processing-border {\n 0%, 100% {\n border-color: rgba(139, 92, 246, 0.85);\n }\n 50% {\n border-color: rgba(139, 92, 246, 1);\n }\n }\n \n /* Shape loader animations */\n .skema-shape {\n opacity: 0;\n transform: scale(0.5) rotate(-180deg);\n animation: skema-shape-cycle 2.5s ease-in-out infinite;\n }\n .skema-shape-1 { animation-delay: 0s; }\n .skema-shape-2 { animation-delay: 0.5s; }\n .skema-shape-3 { animation-delay: 1s; }\n .skema-shape-4 { animation-delay: 1.5s; }\n .skema-shape-5 { animation-delay: 2s; }\n \n @keyframes skema-shape-cycle {\n 0%, 100% {\n opacity: 0;\n transform: scale(0.5) rotate(-180deg);\n }\n 10%, 30% {\n opacity: 1;\n transform: scale(1) rotate(0deg);\n }\n 40% {\n opacity: 0;\n transform: scale(0.5) rotate(180deg);\n }\n }\n`;\n\n// =============================================================================\n// Main Processing Overlay Component\n// =============================================================================\n\ninterface ProcessingOverlayProps {\n boundingBox: BoundingBox;\n scrollOffset: { x: number; y: number };\n}\n\nexport const ProcessingOverlay: React.FC<ProcessingOverlayProps> = ({ boundingBox, scrollOffset }) => {\n // Convert to viewport coordinates\n const viewportX = boundingBox.x - scrollOffset.x;\n const viewportY = boundingBox.y - scrollOffset.y;\n\n return (\n <>\n <style>{ProcessingOverlayStyles}</style>\n <div\n data-skema=\"processing-overlay\"\n style={{\n position: 'fixed',\n left: viewportX,\n top: viewportY,\n width: boundingBox.width,\n height: boundingBox.height,\n border: '3px solid rgba(139, 92, 246, 0.95)',\n borderRadius: 4,\n pointerEvents: 'none',\n zIndex: 999998,\n animation: 'skema-processing-pulse 1.5s ease-in-out infinite, skema-processing-border 1.5s ease-in-out infinite',\n background: 'linear-gradient(90deg, rgba(139, 92, 246, 0.15) 0%, rgba(139, 92, 246, 0.35) 50%, rgba(139, 92, 246, 0.15) 100%)',\n backgroundSize: '200% 100%',\n }}\n >\n {/* Shimmer effect */}\n <div\n style={{\n position: 'absolute',\n inset: 0,\n background: 'linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.25) 50%, transparent 100%)',\n backgroundSize: '200% 100%',\n animation: 'skema-processing-shimmer 2s linear infinite',\n borderRadius: 2,\n }}\n />\n {/* Loading indicator badge with animated shapes */}\n <div\n style={{\n position: 'absolute',\n top: -18,\n left: '50%',\n transform: 'translateX(-50%)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '8px 14px',\n backgroundColor: '#FFFFFF',\n borderRadius: 20,\n boxShadow: '0 4px 16px rgba(0, 0, 0, 0.2), 0 0 0 1px rgba(0, 0, 0, 0.08)',\n }}\n >\n <ShapeLoader />\n </div>\n </div>\n </>\n );\n};\n","// =============================================================================\n// Annotation Popup Component\n// =============================================================================\n// A popup that appears when selecting DOM elements or drawings, allowing users\n// to add comments to their annotations. Matches Skema's white floating card\n// design language with playful geometric accent shapes.\n\nimport React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n forwardRef,\n useImperativeHandle,\n} from 'react';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface AnnotationPopupProps {\n /** Element name/description to display in header */\n element: string;\n /** Optional selected/highlighted text */\n selectedText?: string;\n /** Placeholder text for the textarea */\n placeholder?: string;\n /** Initial value for textarea (for edit mode) */\n initialValue?: string;\n /** Label for submit button (default: \"Add\") */\n submitLabel?: string;\n /** Called when annotation is submitted with text */\n onSubmit: (text: string) => void;\n /** Called when popup is cancelled/dismissed */\n onCancel: () => void;\n /** Position styles (left, top) */\n style?: React.CSSProperties;\n /** Custom accent color (hex) */\n accentColor?: string;\n /** External exit state (parent controls exit animation) */\n isExiting?: boolean;\n /** Whether this is a multi-select annotation */\n isMultiSelect?: boolean;\n /** Dark mode */\n isDark?: boolean;\n}\n\nexport interface AnnotationPopupHandle {\n /** Shake the popup (e.g., when user clicks outside) */\n shake: () => void;\n}\n\n// =============================================================================\n// Geometric Accent Shape\n// =============================================================================\n\n/** Small decorative shape that indicates annotation type via color */\nconst AccentShape: React.FC<{ color: string; isMultiSelect: boolean }> = ({ color, isMultiSelect }) => {\n // Green (#34C759) = multi-select → square\n // Purple (#8B5CF6) = drawing → star\n // Blue (#3b82f6) = single DOM → circle (default)\n const isDrawing = color === '#8B5CF6';\n\n if (isMultiSelect && !isDrawing) {\n // Green square for multi-select\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" style={{ flexShrink: 0 }}>\n <rect x=\"1\" y=\"1\" width=\"8\" height=\"8\" rx=\"1.5\" fill={color} />\n </svg>\n );\n }\n\n if (isDrawing) {\n // Star for drawing annotations\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" style={{ flexShrink: 0 }}>\n <path\n d=\"M6 1L7.4 4.2L10.8 4.6L8.2 7L8.9 10.4L6 8.7L3.1 10.4L3.8 7L1.2 4.6L4.6 4.2L6 1Z\"\n fill={color}\n />\n </svg>\n );\n }\n\n // Circle for single DOM selection\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" style={{ flexShrink: 0 }}>\n <circle cx=\"5\" cy=\"5\" r=\"4\" fill={color} />\n </svg>\n );\n};\n\n// =============================================================================\n// Styles — White floating card matching Skema toolbar aesthetic\n// =============================================================================\n\nconst styles = {\n popup: {\n position: 'fixed' as const,\n transform: 'translateX(-50%)',\n width: 280,\n padding: '14px 16px 14px',\n background: '#FFFFFF',\n borderRadius: 16,\n boxShadow: '0 4px 24px rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(0, 0, 0, 0.06)',\n cursor: 'default',\n zIndex: 100001,\n fontFamily: '\"Clash Display\", system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n opacity: 0,\n transition: 'opacity 0.2s ease, transform 0.2s ease',\n },\n popupEnter: {\n opacity: 1,\n transform: 'translateX(-50%) scale(1) translateY(0)',\n },\n popupExit: {\n opacity: 0,\n transform: 'translateX(-50%) scale(0.96) translateY(4px)',\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n gap: 7,\n marginBottom: 10,\n },\n element: {\n fontSize: 12,\n fontWeight: 500,\n color: '#9CA3AF',\n maxWidth: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap' as const,\n flex: 1,\n letterSpacing: '0.01em',\n },\n quote: {\n fontSize: 12,\n fontStyle: 'italic' as const,\n color: '#6B7280',\n marginBottom: 8,\n padding: '6px 9px',\n background: '#F9FAFB',\n borderRadius: 6,\n lineHeight: 1.45,\n borderLeft: '2px solid',\n },\n textarea: {\n width: '100%',\n padding: '9px 11px',\n fontSize: 13,\n fontFamily: 'inherit',\n background: '#F9FAFB',\n color: '#1a1a1a',\n border: '1px solid #E5E7EB',\n borderRadius: 10,\n resize: 'none' as const,\n outline: 'none',\n transition: 'border-color 0.15s ease, box-shadow 0.15s ease',\n boxSizing: 'border-box' as const,\n lineHeight: 1.5,\n },\n actions: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginTop: 10,\n },\n hint: {\n fontSize: 11,\n color: '#C0C5CE',\n fontWeight: 400,\n letterSpacing: '0.01em',\n userSelect: 'none' as const,\n },\n buttonGroup: {\n display: 'flex',\n gap: 6,\n },\n button: {\n padding: '6px 14px',\n fontSize: 12,\n fontWeight: 500,\n borderRadius: 16,\n border: 'none',\n cursor: 'pointer',\n transition: 'background-color 0.15s ease, color 0.15s ease, opacity 0.15s ease, transform 0.1s ease',\n },\n cancelButton: {\n background: 'transparent',\n color: '#9CA3AF',\n },\n submitButton: {\n color: 'white',\n },\n};\n\n// =============================================================================\n// Component\n// =============================================================================\n\nexport const AnnotationPopup = forwardRef<AnnotationPopupHandle, AnnotationPopupProps>(\n function AnnotationPopup(\n {\n element,\n selectedText,\n placeholder = 'Write your changes?',\n initialValue = '',\n submitLabel = 'Add',\n onSubmit,\n onCancel,\n style,\n accentColor = '#3c82f7',\n isExiting = false,\n isMultiSelect = false,\n isDark = false,\n },\n ref\n ) {\n const [text, setText] = useState(initialValue);\n const [isShaking, setIsShaking] = useState(false);\n const [animState, setAnimState] = useState<'initial' | 'enter' | 'entered' | 'exit'>('initial');\n const [isFocused, setIsFocused] = useState(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const popupRef = useRef<HTMLDivElement>(null);\n\n // Sync with parent exit state\n useEffect(() => {\n if (isExiting && animState !== 'exit') {\n setAnimState('exit');\n }\n }, [isExiting, animState]);\n\n // Animate in on mount and focus textarea\n useEffect(() => {\n // Start enter animation\n requestAnimationFrame(() => {\n setAnimState('enter');\n });\n // Transition to entered state after animation completes\n const enterTimer = setTimeout(() => {\n setAnimState('entered');\n }, 200);\n const focusTimer = setTimeout(() => {\n const textarea = textareaRef.current;\n if (textarea) {\n textarea.focus();\n textarea.selectionStart = textarea.selectionEnd = textarea.value.length;\n textarea.scrollTop = textarea.scrollHeight;\n }\n }, 50);\n return () => {\n clearTimeout(enterTimer);\n clearTimeout(focusTimer);\n };\n }, []);\n\n // Shake animation\n const shake = useCallback(() => {\n setIsShaking(true);\n setTimeout(() => {\n setIsShaking(false);\n textareaRef.current?.focus();\n }, 250);\n }, []);\n\n // Expose shake to parent via ref\n useImperativeHandle(ref, () => ({\n shake,\n }), [shake]);\n\n // Handle cancel with exit animation\n const handleCancel = useCallback(() => {\n setAnimState('exit');\n setTimeout(() => {\n onCancel();\n }, 150);\n }, [onCancel]);\n\n // Handle submit\n const handleSubmit = useCallback(() => {\n if (!text.trim()) return;\n onSubmit(text.trim());\n }, [text, onSubmit]);\n\n // Handle keyboard\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if ((e.nativeEvent as any).isComposing) return;\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n if (e.key === 'Escape') {\n handleCancel();\n }\n },\n [handleSubmit, handleCancel]\n );\n\n // Dark mode color overrides\n const popupBg = isDark ? '#1a1a1a' : '#FFFFFF';\n const popupBorder = isDark ? 'rgba(255,255,255,0.08)' : 'rgba(0, 0, 0, 0.06)';\n const elementColor = isDark ? '#9CA3AF' : '#9CA3AF';\n const quoteBg = isDark ? '#2a2a2a' : '#F9FAFB';\n const quoteColor = isDark ? '#a1a1aa' : '#6B7280';\n const textareaBg = isDark ? '#2a2a2a' : '#F9FAFB';\n const textareaColor = isDark ? '#f0f0f0' : '#1a1a1a';\n const textareaBorder = isDark ? '#444444' : '#E5E7EB';\n const hintColor = isDark ? '#666666' : '#C0C5CE';\n const kbdBg = isDark ? '#333333' : '#F3F4F6';\n const kbdBorder = isDark ? '#555555' : '#E5E7EB';\n const cancelColor = isDark ? '#888888' : '#9CA3AF';\n const cancelHoverBg = isDark ? '#333333' : '#F3F4F6';\n const cancelHoverColor = isDark ? '#cccccc' : '#6B7280';\n\n // Compute popup style based on animation state\n const popupStyle: React.CSSProperties = {\n ...styles.popup,\n background: popupBg,\n boxShadow: isDark\n ? `0 4px 24px rgba(0, 0, 0, 0.4), 0 0 0 1px ${popupBorder}`\n : `0 4px 24px rgba(0, 0, 0, 0.12), 0 0 0 1px ${popupBorder}`,\n ...(animState === 'enter' || animState === 'entered' ? styles.popupEnter : {}),\n ...(animState === 'exit' ? styles.popupExit : {}),\n ...(isShaking ? {\n animation: 'skema-shake 0.25s ease-out',\n } : {}),\n ...style,\n };\n\n // Multi-select uses green accent\n const effectiveAccentColor = isMultiSelect ? '#34C759' : accentColor;\n\n // Compute textarea style with accent-colored focus ring\n const textareaStyle: React.CSSProperties = {\n ...styles.textarea,\n background: textareaBg,\n color: textareaColor,\n border: `1px solid ${textareaBorder}`,\n ...(isFocused ? {\n borderColor: effectiveAccentColor,\n boxShadow: `0 0 0 2px ${effectiveAccentColor}18`,\n } : {}),\n };\n\n return (\n <>\n {/* Inject keyframe animation */}\n <style>{`\n @keyframes skema-shake {\n 0%, 100% { transform: translateX(-50%) scale(1) translateY(0) translateX(0); }\n 20% { transform: translateX(-50%) scale(1) translateY(0) translateX(-3px); }\n 40% { transform: translateX(-50%) scale(1) translateY(0) translateX(3px); }\n 60% { transform: translateX(-50%) scale(1) translateY(0) translateX(-2px); }\n 80% { transform: translateX(-50%) scale(1) translateY(0) translateX(2px); }\n }\n `}</style>\n <div\n ref={popupRef}\n data-skema=\"annotation-popup\"\n style={popupStyle}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n >\n {/* Header with geometric accent shape */}\n <div style={styles.header}>\n <AccentShape color={effectiveAccentColor} isMultiSelect={isMultiSelect} />\n <span style={{ ...styles.element, color: elementColor }}>{element}</span>\n </div>\n\n {/* Quoted selected text */}\n {selectedText && (\n <div style={{ ...styles.quote, borderLeftColor: effectiveAccentColor, background: quoteBg, color: quoteColor }}>\n &ldquo;{selectedText.slice(0, 80)}\n {selectedText.length > 80 ? '...' : ''}&rdquo;\n </div>\n )}\n\n {/* Input area */}\n <textarea\n ref={textareaRef}\n style={textareaStyle}\n placeholder={placeholder}\n value={text}\n onChange={(e) => setText(e.target.value)}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n rows={2}\n onKeyDown={handleKeyDown}\n />\n\n {/* Actions row */}\n <div style={styles.actions}>\n <span style={{ ...styles.hint, color: hintColor }}>\n <kbd style={{\n fontFamily: 'inherit',\n fontSize: 10,\n padding: '1px 4px',\n background: kbdBg,\n borderRadius: 3,\n border: `1px solid ${kbdBorder}`,\n }}>↵</kbd> to send\n </span>\n <div style={styles.buttonGroup}>\n <button\n style={{ ...styles.button, ...styles.cancelButton, color: cancelColor }}\n onClick={handleCancel}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = cancelHoverBg;\n e.currentTarget.style.color = cancelHoverColor;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n e.currentTarget.style.color = cancelColor;\n }}\n >\n Cancel\n </button>\n <button\n style={{\n ...styles.button,\n ...styles.submitButton,\n backgroundColor: effectiveAccentColor,\n opacity: text.trim() ? 1 : 0.4,\n }}\n onClick={handleSubmit}\n disabled={!text.trim()}\n onMouseEnter={(e) => {\n if (text.trim()) {\n e.currentTarget.style.filter = 'brightness(0.92)';\n e.currentTarget.style.transform = 'scale(1.02)';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.filter = 'none';\n e.currentTarget.style.transform = 'scale(1)';\n }}\n >\n {submitLabel}\n </button>\n </div>\n </div>\n </div>\n </>\n );\n }\n);\n\nexport default AnnotationPopup;\n","/** Text-only \"Skema\" wordmark for light backgrounds (dark text). Exported as data URL for img src. */\nconst svg = `<svg width=\"560\" height=\"132\" viewBox=\"430 210 560 132\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M932.899 341.531C914.746 341.531 903.291 329.319 903.291 308.457C903.291 288.867 914.218 278.691 931.489 275.892L971.319 269.787V262.409C971.319 241.547 964.974 234.169 948.232 234.169C932.018 234.169 924.087 241.801 924.087 260.373V261.391H905.23V260.373C905.23 231.625 921.796 210 949.642 210C977.487 210 990 231.879 990 262.154V338.986H972.552V307.439H971.319C966.737 328.81 952.814 341.531 932.899 341.531ZM922.325 306.676C922.325 316.853 927.083 321.687 938.01 321.687C957.925 321.687 971.319 311.001 971.319 286.069L936.952 291.666C927.083 293.447 922.325 296.754 922.325 306.676Z\" fill=\"#1a1a1a\"/>\n<path d=\"M754.267 338.986H735.233V212.544H752.68V250.706H753.738C756.029 229.59 765.546 210 787.399 210C807.314 210 818.065 227.554 820.532 251.723H821.589C823.881 230.098 833.75 210 855.956 210C878.691 210 890.146 232.388 890.146 262.918V338.986H871.289V270.295C871.289 245.363 864.415 234.678 847.496 234.678C828.815 234.678 822.118 248.416 822.118 276.401V338.986H803.261V270.295C803.261 245.363 796.564 234.678 779.645 234.678C760.787 234.678 754.267 248.416 754.267 276.401V338.986Z\" fill=\"#1a1a1a\"/>\n<path d=\"M675.684 341.531C646.957 341.531 628.1 318.125 628.1 275.892C628.1 236.459 646.781 210 675.331 210C702.472 210 720.977 231.625 720.977 270.041C720.977 274.62 720.801 278.182 720.272 281.998H645.9C646.605 306.422 654.888 319.397 675.155 319.397C693.484 319.397 701.062 310.747 701.062 295.737V293.701H720.096V295.991C720.096 322.959 701.767 341.531 675.684 341.531ZM674.979 231.625C655.593 231.625 647.133 244.091 646.076 266.734H703.001V266.225C703.001 242.819 693.66 231.625 674.979 231.625Z\" fill=\"#1a1a1a\"/>\n<path d=\"M548.771 338.986H529.737L529.737 212.544H548.771L548.771 262.663H573.796L600.056 212.544H622.262L589.305 273.348L622.085 338.986H599.703L573.796 287.341H548.771V338.986Z\" fill=\"#1a1a1a\"/>\n<path d=\"M475.117 341.531C446.919 341.531 430.881 325.503 430.881 296.245V295.482H449.915V297.517C449.915 314.054 456.788 319.397 475.117 319.397C492.212 319.397 497.323 314.309 497.323 303.114C497.323 292.684 493.093 289.376 480.58 286.832L456.612 282.253C440.046 279.2 430 269.023 430 247.907C430 225.773 443.923 210 470.887 210C497.675 210 513.889 225.519 513.889 255.54V256.303H495.032V254.776C495.032 239.766 489.745 231.879 470.358 231.879C454.321 231.879 448.681 236.968 448.681 248.925C448.681 258.847 452.206 262.409 465.424 264.953L485.691 269.023C506.487 272.84 516.004 283.016 516.004 303.878C516.004 327.538 499.79 341.531 475.117 341.531Z\" fill=\"#1a1a1a\"/>\n</svg>`;\nexport const LOGO_DARK_SVG = svg;\nexport default 'data:image/svg+xml,' + encodeURIComponent(svg);\n","/** Text-only \"Skema\" wordmark for dark backgrounds (light text). Exported as data URL for img src. */\nconst svg = `<svg width=\"560\" height=\"132\" viewBox=\"378 168 560 132\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M880.899 299.531C862.746 299.531 851.291 287.319 851.291 266.457C851.291 246.867 862.218 236.691 879.489 233.892L919.319 227.787V220.409C919.319 199.547 912.974 192.169 896.232 192.169C880.018 192.169 872.087 199.801 872.087 218.373V219.391H853.23V218.373C853.23 189.625 869.796 168 897.642 168C925.487 168 938 189.879 938 220.154V296.986H920.552V265.439H919.319C914.737 286.81 900.814 299.531 880.899 299.531ZM870.325 264.676C870.325 274.853 875.083 279.687 886.01 279.687C905.925 279.687 919.319 269.001 919.319 244.069L884.952 249.666C875.083 251.447 870.325 254.754 870.325 264.676Z\" fill=\"#FFFCFC\"/>\n<path d=\"M702.267 296.986H683.233V170.544H700.68V208.706H701.738C704.029 187.59 713.546 168 735.399 168C755.314 168 766.065 185.554 768.532 209.723H769.589C771.881 188.098 781.75 168 803.956 168C826.691 168 838.146 190.388 838.146 220.918V296.986H819.289V228.295C819.289 203.363 812.415 192.678 795.496 192.678C776.815 192.678 770.118 206.416 770.118 234.401V296.986H751.261V228.295C751.261 203.363 744.564 192.678 727.645 192.678C708.787 192.678 702.267 206.416 702.267 234.401V296.986Z\" fill=\"#FFFCFC\"/>\n<path d=\"M623.684 299.531C594.957 299.531 576.1 276.125 576.1 233.892C576.1 194.459 594.781 168 623.331 168C650.472 168 668.977 189.625 668.977 228.041C668.977 232.62 668.801 236.182 668.272 239.998H593.9C594.605 264.422 602.888 277.397 623.155 277.397C641.484 277.397 649.062 268.747 649.062 253.737V251.701H668.096V253.991C668.096 280.959 649.767 299.531 623.684 299.531ZM622.979 189.625C603.593 189.625 595.133 202.091 594.076 224.734H651.001V224.225C651.001 200.819 641.66 189.625 622.979 189.625Z\" fill=\"#FFFCFC\"/>\n<path d=\"M496.771 296.986H477.737L477.737 170.544H496.771L496.771 220.663H521.796L548.056 170.544H570.262L537.305 231.348L570.085 296.986H547.703L521.796 245.341H496.771V296.986Z\" fill=\"#FFFCFC\"/>\n<path d=\"M423.117 299.531C394.919 299.531 378.881 283.503 378.881 254.245V253.482H397.915V255.517C397.915 272.054 404.788 277.397 423.117 277.397C440.212 277.397 445.323 272.309 445.323 261.114C445.323 250.684 441.093 247.376 428.58 244.832L404.612 240.253C388.046 237.2 378 227.023 378 205.907C378 183.773 391.923 168 418.887 168C445.675 168 461.889 183.519 461.889 213.54V214.303H443.032V212.776C443.032 197.766 437.745 189.879 418.358 189.879C402.321 189.879 396.681 194.968 396.681 206.925C396.681 216.847 400.206 220.409 413.424 222.953L433.691 227.023C454.487 230.84 464.004 241.016 464.004 261.878C464.004 285.538 447.79 299.531 423.117 299.531Z\" fill=\"#FFFCFC\"/>\n</svg>`;\nexport const LOGO_LIGHT_SVG = svg;\nexport default 'data:image/svg+xml,' + encodeURIComponent(svg);\n","// =============================================================================\n// Settings Panel Component\n// =============================================================================\n\nimport React, { useState, useEffect } from 'react';\nimport type { ExecutionMode, ProviderName, ProviderStatus, AnnotationCounts } from '../../hooks/useDaemon';\nimport {\n getStoredVisionApiKey,\n setStoredVisionApiKey,\n getStoredVisionProvider,\n setStoredVisionProvider,\n getStoredVisionModel,\n setStoredVisionModel,\n type VisionProviderName,\n} from '../../lib/settingsStorage';\nimport logoDarkUrl from '../../assets/logo-dark';\nimport logoLightUrl from '../../assets/logo-light';\n\n// Package version - imported at build time\nconst SKEMA_VERSION = '0.2.0';\n\n// Vision provider/model configuration\nconst VISION_PROVIDERS: { value: VisionProviderName; label: string }[] = [\n { value: 'gemini', label: 'Gemini' },\n { value: 'claude', label: 'Claude' },\n { value: 'openai', label: 'OpenAI' },\n];\n\nconst VISION_PROVIDER_MODELS: Record<VisionProviderName, { value: string; label: string }[]> = {\n gemini: [\n { value: 'gemini-2.5-flash', label: '2.5 Flash' },\n { value: 'gemini-2.5-pro', label: '2.5 Pro' },\n { value: 'gemini-3-flash-preview', label: '3 Flash' },\n { value: 'gemini-3-pro-preview', label: '3 Pro' },\n ],\n claude: [\n { value: 'claude-haiku-4-5-20251001', label: 'Haiku 4.5' },\n { value: 'claude-sonnet-4-5-20250929', label: 'Sonnet 4.5' },\n { value: 'claude-opus-4-6', label: 'Opus 4.6' },\n ],\n openai: [\n { value: 'gpt-4o-mini', label: 'GPT-4o Mini' },\n { value: 'gpt-4o', label: 'GPT-4o' },\n { value: 'gpt-4.1', label: 'GPT-4.1' },\n { value: 'gpt-5.2', label: 'GPT-5.2' },\n ],\n};\n\nconst VISION_PROVIDER_DEFAULT_MODEL: Record<VisionProviderName, string> = {\n gemini: 'gemini-2.5-flash',\n claude: 'claude-haiku-4-5-20251001',\n openai: 'gpt-4o-mini',\n};\n\nconst VISION_PROVIDER_KEY_LINKS: Record<VisionProviderName, { label: string; url: string }> = {\n gemini: { label: 'Google AI Studio', url: 'https://aistudio.google.com/apikey' },\n claude: { label: 'Anthropic Console', url: 'https://console.anthropic.com/settings/keys' },\n openai: { label: 'OpenAI Platform', url: 'https://platform.openai.com/api-keys' },\n};\n\nexport interface SettingsPanelProps {\n isOpen: boolean;\n onClose: () => void;\n zIndex: number;\n // Daemon state\n connected: boolean;\n mode: ExecutionMode;\n provider: ProviderName | string;\n availableProviders: string[];\n providerStatus: Record<ProviderName, ProviderStatus>;\n // MCP state\n mcpServerConnected: boolean;\n mcpClientName: string | null;\n annotationCounts: AnnotationCounts;\n // Actions\n onModeChange: (mode: ExecutionMode) => Promise<boolean>;\n onProviderChange: (provider: ProviderName) => Promise<boolean>;\n // Theme (controlled by parent)\n theme: 'light' | 'dark';\n onThemeChange: (theme: 'light' | 'dark') => void;\n}\n\nexport const SettingsPanel: React.FC<SettingsPanelProps> = ({\n isOpen,\n onClose,\n zIndex,\n connected,\n mode,\n provider,\n availableProviders,\n providerStatus,\n mcpServerConnected,\n mcpClientName,\n annotationCounts,\n onModeChange,\n onProviderChange,\n theme,\n onThemeChange,\n}) => {\n const [visionProvider, setVisionProvider] = useState<VisionProviderName>('gemini');\n const [visionModel, setVisionModel] = useState('');\n const [visionApiKey, setVisionApiKey] = useState('');\n const [showApiKey, setShowApiKey] = useState(false);\n\n useEffect(() => {\n if (isOpen) {\n const storedProvider = getStoredVisionProvider();\n setVisionProvider(storedProvider);\n setVisionModel(getStoredVisionModel() || VISION_PROVIDER_DEFAULT_MODEL[storedProvider]);\n const storedKey = getStoredVisionApiKey(storedProvider);\n setVisionApiKey(storedKey ?? '');\n }\n }, [isOpen]);\n\n const handleVisionProviderChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const newProvider = e.target.value as VisionProviderName;\n setVisionProvider(newProvider);\n setStoredVisionProvider(newProvider);\n // Load per-provider API key\n const storedKey = getStoredVisionApiKey(newProvider);\n setVisionApiKey(storedKey ?? '');\n setShowApiKey(false);\n // Reset model to default for new provider\n const defaultModel = VISION_PROVIDER_DEFAULT_MODEL[newProvider];\n setVisionModel(defaultModel);\n setStoredVisionModel(defaultModel);\n };\n\n const handleVisionModelChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const newModel = e.target.value;\n setVisionModel(newModel);\n setStoredVisionModel(newModel);\n };\n\n const handleVisionApiKeyChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const v = e.target.value;\n setVisionApiKey(v);\n setStoredVisionApiKey(visionProvider, v || '');\n };\n\n if (!isOpen) return null;\n\n const isDark = theme === 'dark';\n const bgColor = isDark ? '#1a1a1a' : '#ffffff';\n const textColor = isDark ? '#ffffff' : '#1a1a1a';\n const borderColor = isDark ? '#333333' : '#e5e5e5';\n const mutedColor = isDark ? '#888888' : '#666666';\n\n return (\n <div\n style={{\n position: 'fixed',\n bottom: 70,\n right: 16,\n width: 320,\n backgroundColor: bgColor,\n borderRadius: 16,\n boxShadow: '0 8px 32px rgba(0,0,0,0.2)',\n zIndex: zIndex + 10,\n pointerEvents: 'auto',\n overflow: 'hidden',\n border: `1px solid ${borderColor}`,\n }}\n >\n {/* Header */}\n <div\n style={{\n padding: '16px 20px',\n borderBottom: `1px solid ${borderColor}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>\n <SkemaWordmark isDark={isDark} height={24} />\n <div style={{ fontSize: 12, color: mutedColor }}>v{SKEMA_VERSION}</div>\n </div>\n <div\n style={{\n fontSize: 11,\n padding: '4px 8px',\n borderRadius: 6,\n backgroundColor: connected ? '#10b98120' : '#ef444420',\n color: connected ? '#10b981' : '#ef4444',\n }}\n >\n {connected ? 'Connected' : 'Disconnected'}\n </div>\n </div>\n\n {/* Settings Content */}\n <div style={{ padding: '16px 20px' }}>\n {/* Theme Toggle - Sun/Moon icon */}\n <SettingRow label=\"Theme\" isDark={isDark} textColor={textColor} mutedColor={mutedColor}>\n <ThemeIconToggle isDark={isDark} onToggle={() => onThemeChange(isDark ? 'light' : 'dark')} />\n </SettingRow>\n\n {/* Vision API key (for drawing analysis) */}\n <div style={{ marginBottom: 12 }}>\n <div style={{ fontSize: 14, color: textColor, marginBottom: 6, display: 'flex', alignItems: 'center', gap: 6 }}>\n Vision API key\n <InfoTooltip\n text=\"Used to analyze drawing annotations so the AI understands what you've sketched.\"\n isDark={isDark}\n mutedColor={mutedColor}\n />\n </div>\n <div style={{ position: 'relative' }}>\n <input\n type={showApiKey ? 'text' : 'password'}\n placeholder=\"\"\n value={visionApiKey}\n onChange={handleVisionApiKeyChange}\n autoComplete=\"off\"\n style={{\n width: '100%',\n boxSizing: 'border-box',\n padding: '8px 32px 8px 10px',\n fontSize: 12,\n fontFamily: 'monospace',\n border: `1px solid ${borderColor}`,\n borderRadius: 8,\n backgroundColor: isDark ? '#2a2a2a' : '#f5f5f5',\n color: textColor,\n outline: 'none',\n }}\n />\n {visionApiKey && (\n <button\n type=\"button\"\n onClick={() => setShowApiKey(!showApiKey)}\n title={showApiKey ? 'Hide API key' : 'Show API key'}\n style={{\n position: 'absolute',\n right: 6,\n top: '50%',\n transform: 'translateY(-50%)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 24,\n height: 24,\n border: 'none',\n borderRadius: 4,\n backgroundColor: 'transparent',\n cursor: 'pointer',\n padding: 0,\n color: mutedColor,\n }}\n >\n {showApiKey ? (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94\" />\n <path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n ) : (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n )}\n </button>\n )}\n </div>\n <div style={{ fontSize: 10, color: mutedColor, marginTop: 4, lineHeight: 1.3 }}>\n Stored in this browser only. Get a key at{' '}\n <a\n href={VISION_PROVIDER_KEY_LINKS[visionProvider].url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ color: isDark ? '#93c5fd' : '#2563eb' }}\n >\n {VISION_PROVIDER_KEY_LINKS[visionProvider].label}\n </a>\n </div>\n {/* Provider + Model selectors (compact one-line) */}\n <div style={{ display: 'flex', gap: 8, marginTop: 8 }}>\n <select\n value={visionProvider}\n onChange={handleVisionProviderChange}\n style={{\n flex: 1,\n padding: '6px 8px',\n fontSize: 12,\n border: `1px solid ${borderColor}`,\n borderRadius: 6,\n backgroundColor: isDark ? '#2a2a2a' : '#f5f5f5',\n color: textColor,\n outline: 'none',\n cursor: 'pointer',\n }}\n >\n {VISION_PROVIDERS.map(p => (\n <option key={p.value} value={p.value}>{p.label}</option>\n ))}\n </select>\n <select\n value={visionModel}\n onChange={handleVisionModelChange}\n style={{\n flex: 1.5,\n padding: '6px 8px',\n fontSize: 11,\n border: `1px solid ${borderColor}`,\n borderRadius: 6,\n backgroundColor: isDark ? '#2a2a2a' : '#f5f5f5',\n color: textColor,\n outline: 'none',\n cursor: 'pointer',\n }}\n >\n {VISION_PROVIDER_MODELS[visionProvider].map(m => (\n <option key={m.value} value={m.value}>{m.label}</option>\n ))}\n </select>\n </div>\n </div>\n\n {/* Disconnected Banner */}\n {!connected && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '10px 12px',\n borderRadius: 10,\n backgroundColor: isDark ? '#2a1a1a' : '#fef2f2',\n border: `1px solid ${isDark ? '#3d2020' : '#fecaca'}`,\n marginBottom: 12,\n }}\n >\n <span\n style={{\n width: 7,\n height: 7,\n borderRadius: '50%',\n backgroundColor: '#ef4444',\n flexShrink: 0,\n boxShadow: '0 0 6px #ef444460',\n }}\n />\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 12, fontWeight: 500, color: isDark ? '#fca5a5' : '#dc2626' }}>\n Daemon not running\n </div>\n <div style={{ fontSize: 10, color: isDark ? '#888' : '#999', marginTop: 2, lineHeight: 1.3 }}>\n Run <span style={{ fontFamily: 'monospace', fontSize: 10, color: isDark ? '#aaa' : '#666' }}>npx skema-core</span> to start\n </div>\n </div>\n </div>\n )}\n\n {/* Mode Toggle: CLI vs MCP */}\n <SettingRow label=\"Mode\" isDark={isDark} textColor={textColor} mutedColor={mutedColor} disabled={!connected}>\n <ToggleSwitch\n options={['CLI', 'MCP']}\n value={mode === 'mcp' ? 1 : 0}\n onChange={(idx) => onModeChange(idx === 1 ? 'mcp' : 'direct-cli')}\n isDark={isDark}\n disabled={!connected}\n />\n </SettingRow>\n\n {/* Mode description */}\n <div style={{ fontSize: 11, color: mutedColor, marginTop: -6, marginBottom: 12, lineHeight: 1.4, opacity: connected ? 1 : 0.4 }}>\n {mode === 'mcp'\n ? 'Annotations are queued for your AI agent to process'\n : 'Annotations processed instantly via CLI agents'}\n </div>\n\n {/* MCP Status Panel */}\n {mode === 'mcp' && connected && (\n <McpStatusPanel\n mcpServerConnected={mcpServerConnected}\n mcpClientName={mcpClientName}\n annotationCounts={annotationCounts}\n isDark={isDark}\n mutedColor={mutedColor}\n />\n )}\n\n {/* CLI Provider Toggle (only in CLI mode) */}\n {mode === 'direct-cli' && (\n <>\n <SettingRow label=\"Provider\" isDark={isDark} textColor={textColor} mutedColor={mutedColor} disabled={!connected}>\n <ToggleSwitch\n options={['Gemini', 'Claude']}\n value={provider === 'claude' ? 1 : 0}\n onChange={(idx) => onProviderChange(idx === 1 ? 'claude' : 'gemini')}\n isDark={isDark}\n disabled={!connected}\n />\n </SettingRow>\n {connected && (\n <ProviderStatusIndicator\n provider={provider as ProviderName}\n status={providerStatus[provider as ProviderName]}\n isDark={isDark}\n mutedColor={mutedColor}\n />\n )}\n </>\n )}\n </div>\n </div>\n );\n};\n\n// =============================================================================\n// Sub-components\n// =============================================================================\n\n// =============================================================================\n// Info Tooltip\n// =============================================================================\n\ninterface InfoTooltipProps {\n text: string;\n isDark: boolean;\n mutedColor: string;\n}\n\nconst InfoTooltip: React.FC<InfoTooltipProps> = ({ text, isDark, mutedColor }) => {\n const [show, setShow] = useState(false);\n\n return (\n <span\n style={{ position: 'relative', display: 'inline-flex' }}\n onMouseEnter={() => setShow(true)}\n onMouseLeave={() => setShow(false)}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n style={{ cursor: 'help', flexShrink: 0 }}\n >\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke={mutedColor} strokeWidth=\"1.5\" />\n <text\n x=\"8\"\n y=\"12\"\n textAnchor=\"middle\"\n fill={mutedColor}\n fontSize=\"11\"\n fontWeight=\"600\"\n fontStyle=\"italic\"\n fontFamily='Georgia, \"Times New Roman\", serif'\n >\n i\n </text>\n </svg>\n {show && (\n <div\n style={{\n position: 'absolute',\n bottom: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginBottom: 8,\n width: 240,\n padding: '10px 12px',\n borderRadius: 10,\n backgroundColor: isDark ? '#2a2a2a' : '#ffffff',\n border: `1px solid ${isDark ? '#444' : '#e0e0e0'}`,\n boxShadow: '0 4px 16px rgba(0,0,0,0.15)',\n fontSize: 11,\n lineHeight: 1.5,\n color: isDark ? '#ccc' : '#444',\n zIndex: 10,\n pointerEvents: 'none',\n }}\n >\n {text}\n </div>\n )}\n </span>\n );\n};\n\n// =============================================================================\n// Setting Row\n// =============================================================================\n\ninterface SettingRowProps {\n label: string;\n isDark: boolean;\n textColor: string;\n mutedColor: string;\n disabled?: boolean;\n children: React.ReactNode;\n}\n\nconst SettingRow: React.FC<SettingRowProps> = ({ label, textColor, disabled, children }) => (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 12,\n }}\n >\n <span style={{ fontSize: 14, color: textColor, opacity: disabled ? 0.4 : 1, transition: 'opacity 0.2s ease' }}>{label}</span>\n {children}\n </div>\n);\n\ninterface ToggleSwitchProps {\n options: [string, string];\n value: number;\n onChange: (index: number) => void;\n isDark: boolean;\n disabled?: boolean;\n}\n\nconst ToggleSwitch: React.FC<ToggleSwitchProps> = ({ options, value, onChange, isDark, disabled }) => {\n const bgColor = isDark ? '#2a2a2a' : '#f0f0f0';\n const activeColor = disabled ? (isDark ? '#555' : '#aaa') : '#FF6800';\n\n return (\n <div\n style={{\n display: 'flex',\n backgroundColor: bgColor,\n borderRadius: 8,\n padding: 2,\n opacity: disabled ? 0.5 : 1,\n transition: 'opacity 0.2s ease',\n }}\n >\n {options.map((option, idx) => (\n <button\n key={option}\n onClick={() => !disabled && onChange(idx)}\n disabled={disabled}\n style={{\n padding: '6px 12px',\n fontSize: 12,\n fontWeight: 500,\n border: 'none',\n borderRadius: 6,\n cursor: disabled ? 'not-allowed' : 'pointer',\n backgroundColor: value === idx ? activeColor : 'transparent',\n color: value === idx ? 'white' : isDark ? '#888' : '#666',\n transition: 'all 0.2s ease',\n }}\n >\n {option}\n </button>\n ))}\n </div>\n );\n};\n\n// =============================================================================\n// MCP Client Name Formatting\n// =============================================================================\n\nconst CLIENT_NAME_MAP: Record<string, string> = {\n 'cursor': 'Cursor',\n 'claude-desktop': 'Claude Desktop',\n 'claude-code': 'Claude Code',\n 'windsurf': 'Windsurf',\n 'cline': 'Cline',\n 'continue': 'Continue',\n 'zed': 'Zed',\n 'anti-gravity': 'Anti-Gravity',\n};\n\nfunction formatClientName(name: string): string {\n const lower = name.toLowerCase();\n return CLIENT_NAME_MAP[lower] || name.charAt(0).toUpperCase() + name.slice(1);\n}\n\n// =============================================================================\n// MCP Status Panel\n// =============================================================================\n\ninterface McpStatusPanelProps {\n mcpServerConnected: boolean;\n mcpClientName: string | null;\n annotationCounts: AnnotationCounts;\n isDark: boolean;\n mutedColor: string;\n}\n\nconst McpStatusPanel: React.FC<McpStatusPanelProps> = ({\n mcpServerConnected,\n mcpClientName,\n annotationCounts,\n isDark,\n mutedColor,\n}) => {\n const serverDotColor = mcpServerConnected ? '#10b981' : '#ef4444';\n const serverStatusText = mcpServerConnected\n ? mcpClientName ? formatClientName(mcpClientName) : 'Connected'\n : 'Not detected';\n const totalActive = annotationCounts.pending + annotationCounts.acknowledged;\n\n return (\n <div\n style={{\n borderRadius: 10,\n backgroundColor: isDark ? '#1a2332' : '#f0f7ff',\n border: `1px solid ${isDark ? '#2a3a4a' : '#d0e4ff'}`,\n marginBottom: 12,\n overflow: 'hidden',\n }}\n >\n {/* MCP Server Status */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '10px 14px',\n borderBottom: totalActive > 0 ? `1px solid ${isDark ? '#2a3a4a' : '#d0e4ff'}` : 'none',\n }}\n >\n <span\n style={{\n width: 7,\n height: 7,\n borderRadius: '50%',\n backgroundColor: serverDotColor,\n flexShrink: 0,\n boxShadow: `0 0 6px ${serverDotColor}60`,\n }}\n />\n <span style={{ fontSize: 12, color: isDark ? '#c8d6e5' : '#333', fontWeight: 500 }}>\n MCP Server\n </span>\n <span\n style={{\n marginLeft: 'auto',\n fontSize: 11,\n color: serverDotColor,\n fontWeight: 500,\n }}\n >\n {serverStatusText}\n </span>\n </div>\n\n {/* Annotation Pipeline Counts (only when there are active annotations) */}\n {totalActive > 0 && (\n <div style={{ padding: '8px 14px 10px' }}>\n <div style={{ display: 'flex', gap: 12 }}>\n <CountBadge label=\"Queued\" count={annotationCounts.pending} color=\"#f59e0b\" isDark={isDark} />\n <CountBadge label=\"In Progress\" count={annotationCounts.acknowledged} color=\"#3b82f6\" isDark={isDark} />\n <CountBadge label=\"Done\" count={annotationCounts.resolved} color=\"#10b981\" isDark={isDark} />\n </div>\n </div>\n )}\n\n {/* Hint when no MCP server */}\n {!mcpServerConnected && (\n <div style={{ padding: '0 14px 10px', fontSize: 10, color: mutedColor, lineHeight: 1.4 }}>\n Configure the Skema MCP server in your AI agent (Cursor, Claude Desktop, etc.) to connect.\n </div>\n )}\n </div>\n );\n};\n\n// =============================================================================\n// Count Badge (for annotation pipeline)\n// =============================================================================\n\ninterface CountBadgeProps {\n label: string;\n count: number;\n color: string;\n isDark: boolean;\n}\n\nconst CountBadge: React.FC<CountBadgeProps> = ({ label, count, color, isDark }) => (\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', flex: 1 }}>\n <span style={{ fontSize: 16, fontWeight: 600, color, lineHeight: 1 }}>{count}</span>\n <span style={{ fontSize: 9, color: isDark ? '#778899' : '#888', marginTop: 2 }}>{label}</span>\n </div>\n);\n\n// =============================================================================\n// Provider Status Indicator (single selected provider)\n// =============================================================================\n\ninterface ProviderStatusIndicatorProps {\n provider: ProviderName;\n status: ProviderStatus | undefined;\n isDark: boolean;\n mutedColor: string;\n}\n\nconst ProviderStatusIndicator: React.FC<ProviderStatusIndicatorProps> = ({ provider, status, isDark, mutedColor }) => {\n let dotColor: string;\n let statusText: string;\n let bgTint: string;\n\n if (!status || status.message === 'Checking...') {\n dotColor = mutedColor;\n statusText = 'Checking...';\n bgTint = isDark ? '#2a2a2a' : '#f5f5f5';\n } else if (status.installed && status.authorized) {\n dotColor = '#10b981';\n statusText = 'Ready';\n bgTint = isDark ? '#10b98110' : '#10b98110';\n } else if (status.installed && !status.authorized) {\n dotColor = '#f59e0b';\n statusText = 'Not authorized';\n bgTint = isDark ? '#f59e0b10' : '#f59e0b10';\n } else {\n dotColor = '#ef4444';\n statusText = 'Not installed';\n bgTint = isDark ? '#ef444410' : '#ef444410';\n }\n\n const label = provider === 'gemini' ? 'Gemini CLI' : 'Claude Code';\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n fontSize: 11,\n color: mutedColor,\n marginTop: -6,\n marginBottom: 12,\n padding: '6px 10px',\n borderRadius: 8,\n backgroundColor: bgTint,\n }}\n >\n <span\n style={{\n width: 6,\n height: 6,\n borderRadius: '50%',\n backgroundColor: dotColor,\n flexShrink: 0,\n boxShadow: `0 0 4px ${dotColor}60`,\n }}\n />\n <span>{label}</span>\n <span style={{ marginLeft: 'auto', fontSize: 10, color: dotColor, fontWeight: 500 }}>{statusText}</span>\n </div>\n );\n};\n\n// =============================================================================\n// Theme Icon Toggle (Sun / Moon)\n// =============================================================================\n\ninterface ThemeIconToggleProps {\n isDark: boolean;\n onToggle: () => void;\n}\n\nconst ThemeIconToggle: React.FC<ThemeIconToggleProps> = ({ isDark, onToggle }) => (\n <button\n onClick={onToggle}\n title={isDark ? 'Switch to light mode' : 'Switch to dark mode'}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 36,\n height: 36,\n border: 'none',\n borderRadius: 10,\n backgroundColor: isDark ? '#333333' : '#f0f0f0',\n cursor: 'pointer',\n transition: 'all 0.2s ease',\n }}\n >\n {isDark ? (\n // Moon icon\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79Z\"\n fill=\"#fbbf24\"\n stroke=\"#fbbf24\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ) : (\n // Sun icon\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"12\" cy=\"12\" r=\"5\" fill=\"#FF6800\" stroke=\"#FF6800\" strokeWidth=\"2\" />\n <line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\" stroke=\"#FF6800\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n <line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\" stroke=\"#FF6800\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n <line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\" stroke=\"#FF6800\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n <line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\" stroke=\"#FF6800\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n <line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\" stroke=\"#FF6800\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n <line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\" stroke=\"#FF6800\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n <line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\" stroke=\"#FF6800\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n <line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\" stroke=\"#FF6800\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n )}\n </button>\n);\n\n// =============================================================================\n// Skema Wordmark Logo (uses assets/logo-dark.svg and assets/logo-light.svg)\n// =============================================================================\n\ninterface SkemaWordmarkProps {\n isDark: boolean;\n height?: number;\n}\n\nconst SkemaWordmark: React.FC<SkemaWordmarkProps> = ({ isDark, height = 24 }) => {\n const src = isDark ? logoLightUrl : logoDarkUrl;\n return (\n <img\n src={src}\n alt=\"Skema\"\n height={height}\n style={{ height, width: 'auto', display: 'block' }}\n />\n );\n};\n","// =============================================================================\n// useKeyboardShortcuts - Handle keyboard shortcuts for toggling Skema\n// =============================================================================\n\nimport { useEffect } from 'react';\n\ninterface UseKeyboardShortcutsOptions {\n onToggle: () => void;\n shortcut?: string; // e.g., 'mod+shift+e'\n}\n\n/**\n * Hook to handle keyboard shortcuts for Skema\n * Default shortcut: Cmd/Ctrl + Shift + E to toggle overlay\n */\nexport function useKeyboardShortcuts({ onToggle, shortcut = 'mod+shift+e' }: UseKeyboardShortcutsOptions) {\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n const isMod = e.metaKey || e.ctrlKey;\n\n // Parse shortcut (currently only supports mod+shift+key format)\n if (shortcut === 'mod+shift+e') {\n if (isMod && e.shiftKey && e.key.toLowerCase() === 'e') {\n e.preventDefault();\n onToggle();\n }\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [onToggle, shortcut]);\n}\n","// =============================================================================\n// useScrollSync - Sync scroll position with tldraw camera\n// =============================================================================\n\nimport { useEffect, useState, RefObject } from 'react';\nimport type { Editor } from 'tldraw';\n\ninterface ScrollOffset {\n x: number;\n y: number;\n}\n\n/**\n * Hook to sync page scroll position with tldraw camera\n * Returns the current scroll offset for use in coordinate calculations\n */\nexport function useScrollSync(\n isActive: boolean,\n editorRef: RefObject<Editor | null>\n): ScrollOffset {\n const [scrollOffset, setScrollOffset] = useState<ScrollOffset>({ x: 0, y: 0 });\n\n // Sync scroll position with tldraw camera\n useEffect(() => {\n if (!isActive) return;\n\n const syncScroll = () => {\n const newOffset = { x: window.scrollX, y: window.scrollY };\n setScrollOffset(newOffset);\n\n // Update tldraw camera to match scroll position\n if (editorRef.current) {\n editorRef.current.setCamera({ x: -newOffset.x, y: -newOffset.y, z: 1 });\n }\n };\n\n // Initial sync\n syncScroll();\n\n // Listen for scroll and resize events\n window.addEventListener('scroll', syncScroll, { passive: true });\n window.addEventListener('resize', syncScroll);\n\n return () => {\n window.removeEventListener('scroll', syncScroll);\n window.removeEventListener('resize', syncScroll);\n };\n }, [isActive, editorRef]);\n\n return scrollOffset;\n}\n\n/**\n * Hook to intercept wheel events and scroll the page instead of panning tldraw\n */\nexport function useWheelIntercept(isActive: boolean) {\n useEffect(() => {\n if (!isActive) return;\n\n const handleWheel = (e: WheelEvent) => {\n // Check if the event target is within tldraw's canvas area\n const target = e.target as HTMLElement;\n if (target.closest('.tl-container') || target.closest('[data-skema=\"container\"]')) {\n // Stop tldraw from handling it\n e.stopPropagation();\n\n // Manually scroll the page\n window.scrollBy({\n top: e.deltaY,\n left: e.deltaX,\n behavior: 'auto',\n });\n }\n };\n\n // Capture phase to intercept before tldraw\n document.addEventListener('wheel', handleWheel, { capture: true, passive: false });\n\n return () => {\n document.removeEventListener('wheel', handleWheel, { capture: true });\n };\n }, [isActive]);\n}\n","// =============================================================================\n// useShapePersistence - Hide/restore shapes when toggling Skema on/off\n// =============================================================================\n\nimport { useEffect, useRef, RefObject } from 'react';\nimport type { Editor } from 'tldraw';\n\n/**\n * Hook to persist drawing shapes when toggling Skema overlay off/on\n * \n * When user presses Cmd+Shift+E to hide Skema:\n * - Saves all drawing shapes to memory\n * - Removes them from canvas (so they don't show when overlay is hidden)\n * \n * When Skema is shown again:\n * - Restores shapes from memory back to canvas\n */\nexport function useShapePersistence(\n isActive: boolean,\n editorRef: RefObject<Editor | null>\n) {\n // Saved shapes for hide/restore when toggling Skema off/on\n const savedShapesRef = useRef<Record<string, any> | null>(null);\n const wasActiveRef = useRef<boolean>(isActive);\n\n // Hide shapes when Skema becomes inactive\n useEffect(() => {\n const editor = editorRef.current;\n\n // Detect transition from active to inactive (hiding Skema)\n if (wasActiveRef.current && !isActive && editor) {\n // Get all drawing shapes on the canvas\n const allShapes = editor.getCurrentPageShapes();\n const drawingShapes = allShapes.filter(shape =>\n ['draw', 'line', 'arrow', 'geo', 'text', 'note', 'frame'].includes(shape.type)\n );\n\n if (drawingShapes.length > 0) {\n // Save the current store snapshot (only shapes we care about)\n const shapeRecords: Record<string, any> = {};\n for (const shape of drawingShapes) {\n shapeRecords[shape.id] = shape;\n }\n savedShapesRef.current = shapeRecords;\n\n // Delete the shapes from canvas (they're now hidden)\n const shapeIds = drawingShapes.map(s => s.id);\n editor.deleteShapes(shapeIds);\n\n console.log(`[Skema] Hiding: saved ${drawingShapes.length} shape(s) to memory`);\n }\n }\n\n // Update the ref for next comparison\n wasActiveRef.current = isActive;\n }, [isActive, editorRef]);\n\n // Restore shapes when Skema becomes active again\n useEffect(() => {\n if (!isActive) return;\n\n const editor = editorRef.current;\n if (!editor || !savedShapesRef.current) return;\n\n // Small delay to ensure editor is fully ready after mount\n const timeoutId = setTimeout(() => {\n const savedShapes = savedShapesRef.current;\n const currentEditor = editorRef.current;\n if (!savedShapes || !currentEditor) return;\n\n const shapesToRestore = Object.values(savedShapes);\n\n if (shapesToRestore.length > 0) {\n // Restore shapes to the canvas\n currentEditor.createShapes(shapesToRestore);\n console.log(`[Skema] Restoring: loaded ${shapesToRestore.length} shape(s) from memory`);\n\n // Clear saved shapes after restore\n savedShapesRef.current = null;\n }\n }, 100);\n\n return () => clearTimeout(timeoutId);\n }, [isActive, editorRef]);\n}\n","/**\n * Gesture Recognition Utility\n * \n * Detects scribble gestures for the scribble-to-delete feature.\n * Based on heuristics optimized for detecting rapid back-and-forth scribbling.\n * Supports real-time detection during drawing (before pen release).\n */\n\nimport type { TLDrawShape, Editor, TLShapeId, Box } from 'tldraw';\n\nexport interface Point {\n x: number;\n y: number;\n}\n\nexport interface GestureResult {\n isScribble: boolean;\n confidence: number;\n directionChanges: number;\n compactness: number;\n}\n\nexport interface ScribbleBounds {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n width: number;\n height: number;\n}\n\n/**\n * Calculate the angle between two vectors in radians\n */\nfunction angleBetweenVectors(v1: Point, v2: Point): number {\n const dot = v1.x * v2.x + v1.y * v2.y;\n const mag1 = Math.sqrt(v1.x * v1.x + v1.y * v1.y);\n const mag2 = Math.sqrt(v2.x * v2.x + v2.y * v2.y);\n \n if (mag1 === 0 || mag2 === 0) return 0;\n \n const cosAngle = Math.max(-1, Math.min(1, dot / (mag1 * mag2)));\n return Math.acos(cosAngle);\n}\n\n/**\n * Calculate the total path length of a series of points\n */\nfunction calculatePathLength(points: Point[]): number {\n let length = 0;\n for (let i = 1; i < points.length; i++) {\n const dx = points[i].x - points[i - 1].x;\n const dy = points[i].y - points[i - 1].y;\n length += Math.sqrt(dx * dx + dy * dy);\n }\n return length;\n}\n\n/**\n * Calculate the bounding box of a series of points\n */\nfunction calculateBoundingBox(points: Point[]): { width: number; height: number; diagonal: number } {\n if (points.length === 0) {\n return { width: 0, height: 0, diagonal: 0 };\n }\n \n let minX = Infinity, maxX = -Infinity;\n let minY = Infinity, maxY = -Infinity;\n \n for (const point of points) {\n minX = Math.min(minX, point.x);\n maxX = Math.max(maxX, point.x);\n minY = Math.min(minY, point.y);\n maxY = Math.max(maxY, point.y);\n }\n \n const width = maxX - minX;\n const height = maxY - minY;\n const diagonal = Math.sqrt(width * width + height * height);\n \n return { width, height, diagonal };\n}\n\n/**\n * Calculate full bounding box with coordinates from points\n */\nexport function getPointsBounds(points: Point[]): ScribbleBounds | null {\n if (points.length === 0) {\n return null;\n }\n \n let minX = Infinity, maxX = -Infinity;\n let minY = Infinity, maxY = -Infinity;\n \n for (const point of points) {\n minX = Math.min(minX, point.x);\n maxX = Math.max(maxX, point.x);\n minY = Math.min(minY, point.y);\n maxY = Math.max(maxY, point.y);\n }\n \n return {\n minX,\n minY,\n maxX,\n maxY,\n width: maxX - minX,\n height: maxY - minY,\n };\n}\n\n/**\n * Count significant direction changes in a path\n * A direction change is when the angle between consecutive segments exceeds the threshold\n */\nfunction countDirectionChanges(points: Point[], angleThreshold: number = Math.PI / 2): number {\n if (points.length < 3) return 0;\n \n let changes = 0;\n \n // Sample points to avoid noise - take every Nth point\n const sampleRate = Math.max(1, Math.floor(points.length / 50));\n const sampledPoints: Point[] = [];\n \n for (let i = 0; i < points.length; i += sampleRate) {\n sampledPoints.push(points[i]);\n }\n // Always include the last point\n if (sampledPoints[sampledPoints.length - 1] !== points[points.length - 1]) {\n sampledPoints.push(points[points.length - 1]);\n }\n \n for (let i = 1; i < sampledPoints.length - 1; i++) {\n const v1: Point = {\n x: sampledPoints[i].x - sampledPoints[i - 1].x,\n y: sampledPoints[i].y - sampledPoints[i - 1].y,\n };\n const v2: Point = {\n x: sampledPoints[i + 1].x - sampledPoints[i].x,\n y: sampledPoints[i + 1].y - sampledPoints[i].y,\n };\n \n const angle = angleBetweenVectors(v1, v2);\n \n // Count as direction change if angle is greater than threshold (default 90 degrees)\n if (angle > angleThreshold) {\n changes++;\n }\n }\n \n return changes;\n}\n\n/**\n * Extract points from a tldraw draw shape\n */\nexport function extractPointsFromDrawShape(shape: TLDrawShape): Point[] {\n const points: Point[] = [];\n \n // TLDrawShape has segments containing points\n if (shape.props.segments) {\n for (const segment of shape.props.segments) {\n if (segment.points) {\n for (const point of segment.points) {\n points.push({ x: point.x + shape.x, y: point.y + shape.y });\n }\n }\n }\n }\n \n return points;\n}\n\n/**\n * Analyze a path and determine if it's a scribble gesture\n */\nexport function analyzeGesture(points: Point[]): GestureResult {\n if (points.length < 10) {\n return {\n isScribble: false,\n confidence: 0,\n directionChanges: 0,\n compactness: 0,\n };\n }\n \n const directionChanges = countDirectionChanges(points);\n const pathLength = calculatePathLength(points);\n const { diagonal } = calculateBoundingBox(points);\n \n // Compactness: how much the path \"folds back\" on itself\n // Higher values mean more back-and-forth motion\n const compactness = diagonal > 0 ? pathLength / diagonal : 0;\n \n // Scribble criteria:\n // - At least 4 significant direction changes (zig-zag pattern)\n // - Compactness ratio > 2.0 (path is much longer than direct distance)\n // - Minimum path length to avoid detecting small wiggles\n const minDirectionChanges = 4;\n const minCompactness = 2.0;\n const minPathLength = 100; // pixels\n \n const meetsDirectionCriteria = directionChanges >= minDirectionChanges;\n const meetsCompactnessCriteria = compactness >= minCompactness;\n const meetsLengthCriteria = pathLength >= minPathLength;\n \n const isScribble = meetsDirectionCriteria && meetsCompactnessCriteria && meetsLengthCriteria;\n \n // Calculate confidence based on how much the values exceed thresholds\n let confidence = 0;\n if (isScribble) {\n const directionScore = Math.min(1, (directionChanges - minDirectionChanges) / 6);\n const compactnessScore = Math.min(1, (compactness - minCompactness) / 3);\n confidence = (directionScore + compactnessScore) / 2;\n }\n \n return {\n isScribble,\n confidence,\n directionChanges,\n compactness,\n };\n}\n\n/**\n * Check if a tldraw draw shape is a scribble gesture\n */\nexport function isScribbleGesture(shape: TLDrawShape): GestureResult {\n const points = extractPointsFromDrawShape(shape);\n return analyzeGesture(points);\n}\n\n/**\n * Real-time scribble detection for use during drawing (before pen release)\n * Uses more aggressive thresholds since we want to detect early\n */\nexport function isRealtimeScribble(points: Point[]): GestureResult {\n // Need enough points to analyze\n if (points.length < 15) {\n return {\n isScribble: false,\n confidence: 0,\n directionChanges: 0,\n compactness: 0,\n };\n }\n \n const directionChanges = countDirectionChanges(points, Math.PI / 3); // 60 degrees - more sensitive\n const pathLength = calculatePathLength(points);\n const { diagonal } = calculateBoundingBox(points);\n \n const compactness = diagonal > 0 ? pathLength / diagonal : 0;\n \n // Real-time criteria (more sensitive for early detection):\n // - At least 3 significant direction changes\n // - Compactness ratio > 1.8 (path is longer than direct distance)\n // - Minimum path length to avoid tiny wiggles\n const minDirectionChanges = 5;\n const minCompactness = 1.8;\n const minPathLength = 80; // pixels\n \n const meetsDirectionCriteria = directionChanges >= minDirectionChanges;\n const meetsCompactnessCriteria = compactness >= minCompactness;\n const meetsLengthCriteria = pathLength >= minPathLength;\n \n const isScribble = meetsDirectionCriteria && meetsCompactnessCriteria && meetsLengthCriteria;\n \n let confidence = 0;\n if (isScribble) {\n const directionScore = Math.min(1, (directionChanges - minDirectionChanges) / 4);\n const compactnessScore = Math.min(1, (compactness - minCompactness) / 2);\n confidence = (directionScore + compactnessScore) / 2;\n }\n \n return {\n isScribble,\n confidence,\n directionChanges,\n compactness,\n };\n}\n\n/**\n * Check if two bounding boxes intersect\n */\nexport function boxesIntersect(box1: Box, box2: Box): boolean {\n return !(\n box1.x + box1.w < box2.x ||\n box2.x + box2.w < box1.x ||\n box1.y + box1.h < box2.y ||\n box2.y + box2.h < box1.y\n );\n}\n\n/**\n * Find all shapes that overlap with the given bounds\n */\nexport function findOverlappingShapes(\n editor: Editor,\n bounds: Box,\n excludeIds: TLShapeId[] = []\n): TLShapeId[] {\n const allShapes = editor.getCurrentPageShapes();\n const overlapping: TLShapeId[] = [];\n \n for (const shape of allShapes) {\n // Skip excluded shapes (like the scribble itself)\n if (excludeIds.includes(shape.id)) continue;\n \n // Only consider drawable shapes (not UI elements)\n if (!['draw', 'line', 'arrow', 'geo', 'text', 'note', 'frame'].includes(shape.type)) {\n continue;\n }\n \n const shapeBounds = editor.getShapePageBounds(shape.id);\n if (shapeBounds && boxesIntersect(bounds, shapeBounds)) {\n overlapping.push(shape.id);\n }\n }\n \n return overlapping;\n}\n\n/**\n * Find all shapes that overlap with raw bounds (for real-time detection)\n */\nexport function findOverlappingShapesFromBounds(\n editor: Editor,\n bounds: ScribbleBounds,\n excludeIds: TLShapeId[] = []\n): TLShapeId[] {\n const allShapes = editor.getCurrentPageShapes();\n const overlapping: TLShapeId[] = [];\n \n for (const shape of allShapes) {\n // Skip excluded shapes\n if (excludeIds.includes(shape.id)) continue;\n \n // Only consider drawable shapes (not UI elements)\n if (!['draw', 'line', 'arrow', 'geo', 'text', 'note', 'frame'].includes(shape.type)) {\n continue;\n }\n \n const shapeBounds = editor.getShapePageBounds(shape.id);\n if (shapeBounds) {\n // Check intersection using raw coordinates\n const intersects = !(\n bounds.maxX < shapeBounds.x ||\n bounds.minX > shapeBounds.x + shapeBounds.w ||\n bounds.maxY < shapeBounds.y ||\n bounds.minY > shapeBounds.y + shapeBounds.h\n );\n \n if (intersects) {\n overlapping.push(shape.id);\n }\n }\n }\n \n return overlapping;\n}\n","// =============================================================================\n// useScribbleDelete - Real-time scribble gesture detection for deleting shapes\n// =============================================================================\n\nimport { useEffect, useRef, Dispatch, SetStateAction } from 'react';\nimport type { Editor, TLShapeId } from 'tldraw';\nimport {\n isRealtimeScribble,\n findOverlappingShapesFromBounds,\n getPointsBounds,\n type Point as GesturePoint\n} from '../utils/gesture-recognizer';\nimport type { Annotation } from '../types';\n\ninterface UseScribbleDeleteOptions {\n isActive: boolean;\n editorRef: React.RefObject<Editor | null>;\n setAnnotations: Dispatch<SetStateAction<Annotation[]>>;\n setScribbleToast: Dispatch<SetStateAction<string | null>>;\n}\n\n/**\n * Hook to detect real-time scribble gestures and delete overlapping shapes\n * \n * While the draw tool is active, tracks pointer movements to detect\n * scribble-like patterns. When detected over existing shapes, cancels\n * the current drawing and deletes the shapes underneath.\n */\nexport function useScribbleDelete({\n isActive,\n editorRef,\n setAnnotations,\n setScribbleToast,\n}: UseScribbleDeleteOptions) {\n // Scribble detection refs - for real-time tracking during drawing\n const scribblePointsRef = useRef<GesturePoint[]>([]);\n const isDrawingRef = useRef<boolean>(false);\n const scribbleDetectedRef = useRef<boolean>(false);\n\n useEffect(() => {\n if (!isActive) return;\n\n const handleScribbleDelete = (overlappingIds: TLShapeId[]) => {\n const editor = editorRef.current;\n if (!editor || overlappingIds.length === 0) return;\n\n // Cancel the current drawing operation\n editor.cancel();\n\n // Delete overlapping shapes\n editor.deleteShapes(overlappingIds);\n\n // Remove any annotations associated with deleted shapes\n setAnnotations((prev) => prev.filter((annotation) => {\n if (annotation.type === 'drawing') {\n const drawingShapes = annotation.shapes as TLShapeId[];\n return !drawingShapes.some((shapeId) =>\n overlappingIds.includes(shapeId)\n );\n }\n return true;\n }));\n\n // Show toast notification\n const message = overlappingIds.length === 1\n ? 'Deleted 1 shape'\n : `Deleted ${overlappingIds.length} shapes`;\n setScribbleToast(message);\n setTimeout(() => setScribbleToast(null), 2000);\n\n console.log(`[Skema] Scribble-delete: removed ${overlappingIds.length} shape(s)`);\n };\n\n const handlePointerDown = (e: PointerEvent) => {\n const editor = editorRef.current;\n if (!editor) return;\n\n // Only track if draw tool is active\n const currentTool = editor.getCurrentToolId();\n if (currentTool !== 'draw') return;\n\n // Start tracking\n isDrawingRef.current = true;\n scribbleDetectedRef.current = false;\n scribblePointsRef.current = [{\n x: e.clientX + window.scrollX,\n y: e.clientY + window.scrollY\n }];\n };\n\n const handlePointerMove = (e: PointerEvent) => {\n const editor = editorRef.current;\n if (!editor || !isDrawingRef.current || scribbleDetectedRef.current) return;\n\n // Only track if draw tool is still active and pointer is down\n const currentTool = editor.getCurrentToolId();\n if (currentTool !== 'draw') {\n isDrawingRef.current = false;\n return;\n }\n\n // Add point (in page coordinates)\n const newPoint = {\n x: e.clientX + window.scrollX,\n y: e.clientY + window.scrollY\n };\n\n const points = scribblePointsRef.current;\n const lastPoint = points[points.length - 1];\n\n // Only add if moved enough (avoid duplicate points)\n if (lastPoint) {\n const dx = newPoint.x - lastPoint.x;\n const dy = newPoint.y - lastPoint.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n if (dist < 3) return;\n }\n\n points.push(newPoint);\n scribblePointsRef.current = points;\n\n // Check for scribble gesture periodically (every 5 points after initial batch)\n if (points.length >= 20 && points.length % 5 === 0) {\n const gestureResult = isRealtimeScribble(points);\n\n if (gestureResult.isScribble) {\n // Get bounds of the scribble path\n const bounds = getPointsBounds(points);\n\n if (bounds) {\n // Find shapes underneath the scribble\n const overlappingIds = findOverlappingShapesFromBounds(editor, bounds, []);\n\n if (overlappingIds.length > 0) {\n // Mark as detected to prevent re-triggering\n scribbleDetectedRef.current = true;\n isDrawingRef.current = false;\n\n // Trigger deletion\n handleScribbleDelete(overlappingIds);\n }\n }\n }\n }\n };\n\n const handlePointerUp = () => {\n // Reset tracking state\n isDrawingRef.current = false;\n scribblePointsRef.current = [];\n scribbleDetectedRef.current = false;\n };\n\n // Add listeners with capture to track before tldraw\n document.addEventListener('pointerdown', handlePointerDown, { capture: true });\n document.addEventListener('pointermove', handlePointerMove, { capture: true });\n document.addEventListener('pointerup', handlePointerUp, { capture: true });\n document.addEventListener('pointercancel', handlePointerUp, { capture: true });\n\n return () => {\n document.removeEventListener('pointerdown', handlePointerDown, { capture: true });\n document.removeEventListener('pointermove', handlePointerMove, { capture: true });\n document.removeEventListener('pointerup', handlePointerUp, { capture: true });\n document.removeEventListener('pointercancel', handlePointerUp, { capture: true });\n };\n }, [isActive, editorRef, setAnnotations, setScribbleToast]);\n}\n","// =============================================================================\n// Lasso Overlay - Renders the lasso path while drawing\n// =============================================================================\n\nimport React, { useMemo } from 'react';\nimport { TldrawOverlays, useEditor, useValue } from 'tldraw';\nimport type { LassoingState } from '../../tools/LassoSelectTool';\n\n// =============================================================================\n// Lasso Overlay Component\n// =============================================================================\n\nconst LassoOverlay: React.FC = () => {\n const editor = useEditor();\n\n // Reactively get lasso points from the tool state\n const lassoPoints = useValue(\n 'lasso points',\n () => {\n if (!editor.isIn('lasso-select.lassoing')) return [];\n // Use getStateDescendant to get the lassoing state (as per tldraw docs)\n const lassoing = editor.getStateDescendant('lasso-select.lassoing') as LassoingState | undefined;\n return lassoing?.points?.get() ?? [];\n },\n [editor]\n );\n\n // Convert points to SVG path\n const svgPath = useMemo(() => {\n if (lassoPoints.length < 2) return '';\n\n // Build SVG path from points\n let path = `M ${lassoPoints[0].x} ${lassoPoints[0].y}`;\n for (let i = 1; i < lassoPoints.length; i++) {\n path += ` L ${lassoPoints[i].x} ${lassoPoints[i].y}`;\n }\n // Close the path\n path += ' Z';\n return path;\n }, [lassoPoints]);\n\n if (lassoPoints.length === 0) return null;\n\n return (\n <svg className=\"tl-overlays__item\" aria-hidden=\"true\">\n <path\n d={svgPath}\n fill=\"none\"\n stroke=\"rgba(59, 130, 246, 1)\"\n strokeWidth=\"calc(2px / var(--tl-zoom))\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeDasharray=\"4 4\"\n />\n </svg>\n );\n};\n\n// =============================================================================\n// Combined Skema Overlays\n// =============================================================================\n\nexport const SkemaOverlays: React.FC = () => {\n return (\n <>\n <TldrawOverlays />\n <LassoOverlay />\n </>\n );\n};\n","// =============================================================================\n// tldraw Configuration - Components and UI overrides for Skema\n// =============================================================================\n\nimport type { TLComponents, TLUiOverrides } from 'tldraw';\nimport { DefaultColorThemePalette } from 'tldraw';\nimport { SkemaOverlays } from '../components/overlays/LassoOverlay';\n\n/**\n * Override tldraw's dark mode \"black\" color to stay dark.\n * By default, tldraw inverts \"black\" to light gray (#f2f2f2) in dark mode\n * for visibility on dark canvases. Since Skema is a transparent overlay,\n * the pencil should remain dark regardless of theme.\n */\nDefaultColorThemePalette.darkMode.black =\n DefaultColorThemePalette.lightMode.black;\n\n/**\n * Custom tldraw components configuration for Skema overlay mode\n * Hides most UI elements to create a clean overlay experience\n */\nexport const skemaComponents: TLComponents = {\n Toolbar: null,\n Overlays: SkemaOverlays,\n // Hide background to make canvas transparent (so website shows through)\n Background: null,\n // Hide UI elements we don't need\n SharePanel: null,\n MenuPanel: null,\n TopPanel: null,\n PageMenu: null,\n NavigationPanel: null,\n HelpMenu: null,\n Minimap: null,\n // Hide \"Back to Content\" button (HelperButtons contains this)\n HelperButtons: null,\n QuickActions: null,\n ZoomMenu: null,\n ActionsMenu: null,\n DebugPanel: null,\n DebugMenu: null,\n // Hide canvas overlays\n OnTheCanvas: null,\n InFrontOfTheCanvas: null,\n};\n\n/**\n * UI overrides to customize tool shortcuts\n */\nexport const skemaOverrides: TLUiOverrides = {\n tools(editor, tools) {\n return {\n ...tools,\n 'select': {\n ...tools['select'],\n kbd: 's',\n },\n 'lasso-select': {\n id: 'lasso-select',\n label: 'Lasso Select',\n icon: 'blob',\n kbd: 'l',\n onSelect: () => {\n editor.setCurrentTool('lasso-select');\n },\n },\n };\n },\n};\n\n/**\n * CSS to hide tldraw's UI elements we don't need\n */\nexport const skemaHiddenUiStyles = `\n .tlui-button[data-testid=\"back-to-content\"],\n .tlui-offscreen-indicator,\n [class*=\"back-to-content\"],\n .tl-offscreen-indicator,\n /* Hide \"made with tldraw\" watermark */\n .tlui-watermark,\n .tlui-watermark__inner,\n [class*=\"watermark\"] {\n display: none !important;\n }\n`;\n\n/**\n * CSS for toast animations\n */\nexport const skemaToastStyles = `\n @keyframes skema-toast-fade {\n from {\n opacity: 0;\n transform: translateX(-50%) translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n }\n`;\n","// =============================================================================\n// Skema - Main Drawing Overlay Component\n// =============================================================================\n\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n Tldraw,\n Editor,\n TLShapeId,\n StateNode,\n TLClickEventInfo,\n ArrowShapeKindStyle,\n} from 'tldraw';\nimport 'tldraw/tldraw.css';\n\n// Tools\nimport { LassoSelectTool } from '../tools/LassoSelectTool';\n\n// Types\nimport type { Annotation, DOMSelection, SkemaProps, BoundingBox, PendingAnnotation } from '../types';\n\n// Hooks\nimport { useDaemon } from '../hooks/useDaemon';\n\n// Utils\nimport { getViewportInfo, bboxIntersects } from '../utils/coordinates';\nimport {\n createDOMSelection,\n shouldIgnoreElement,\n findNearbyElementsWithStyles,\n extractProjectStyleContext,\n getBoundingBox,\n} from '../utils/element-identification';\nimport { blobToBase64, addGridToSvg, extractTextFromShapes } from '../lib/utils';\nimport { getStoredVisionApiKey, getStoredVisionProvider, getStoredVisionModel } from '../lib/settingsStorage';\n\n// Extracted Components\nimport { SkemaToolbar } from './toolbar/SkemaToolbar';\nimport { AnnotationMarkersLayer } from './annotations/AnnotationMarker';\nimport { AnnotationsSidebar } from './annotations/AnnotationsSidebar';\nimport { SelectionOverlay } from './overlays/SelectionOverlay';\nimport { ProcessingOverlay } from './overlays/ProcessingOverlay';\nimport { AnnotationPopup, AnnotationPopupHandle } from './AnnotationPopup';\nimport { SettingsPanel } from './settings/SettingsPanel';\n\n// Extracted Hooks\nimport { useKeyboardShortcuts } from '../hooks/useKeyboardShortcuts';\nimport { useScrollSync, useWheelIntercept } from '../hooks/useScrollSync';\nimport { useShapePersistence } from '../hooks/useShapePersistence';\nimport { useScribbleDelete } from '../hooks/useScribbleDelete';\n\n// Extracted Config\nimport { skemaComponents, skemaOverrides, skemaHiddenUiStyles, skemaToastStyles } from '../lib/tldrawConfig';\n\n/**\n * Main Skema component - renders tldraw as a transparent overlay\n */\nexport const Skema: React.FC<SkemaProps> = ({\n enabled = true,\n daemonUrl = 'ws://localhost:9999',\n onAnnotationsChange,\n onAnnotationSubmit: externalOnAnnotationSubmit,\n onAnnotationDelete: externalOnAnnotationDelete,\n onProcessingCancel: externalOnProcessingCancel,\n toggleShortcut = 'mod+shift+e',\n initialAnnotations = [],\n zIndex = 99999,\n isProcessing: externalIsProcessing,\n}) => {\n // =============================================================================\n // State\n // =============================================================================\n const [annotations, setAnnotations] = useState<Annotation[]>(initialAnnotations);\n const [domSelections, setDomSelections] = useState<DOMSelection[]>([]);\n const [pendingAnnotation, setPendingAnnotation] = useState<PendingAnnotation | null>(null);\n const [pendingExiting, setPendingExiting] = useState(false);\n const [hoveredMarkerId, setHoveredMarkerId] = useState<string | null>(null);\n const [processingBoundingBox, setProcessingBoundingBox] = useState<BoundingBox | null>(null);\n const [scribbleToast, setScribbleToast] = useState<string | null>(null);\n const [internalIsProcessing, setInternalIsProcessing] = useState(false);\n const [isToolbarExpanded, setIsToolbarExpanded] = useState(false);\n const [isStylePanelOpen, setIsStylePanelOpen] = useState(false);\n const [currentToolId, setCurrentToolId] = useState<string>('select');\n\n // Theme state (persisted in localStorage)\n const [theme, setTheme] = useState<'light' | 'dark'>(() => {\n if (typeof window !== 'undefined') {\n return (localStorage.getItem('skema-theme') as 'light' | 'dark') || 'light';\n }\n return 'light';\n });\n const isDark = theme === 'dark';\n\n // Persist theme to localStorage and sync with tldraw\n useEffect(() => {\n if (typeof window !== 'undefined') {\n localStorage.setItem('skema-theme', theme);\n }\n // Sync tldraw's dark mode with Skema theme\n if (editorRef.current) {\n editorRef.current.user.updateUserPreferences({ colorScheme: theme });\n }\n }, [theme]);\n\n // Track annotation IDs to their change IDs for reverting\n const annotationChangesRef = useRef<Map<string, string>>(new Map());\n\n // =============================================================================\n // Daemon Connection (auto-connect when daemonUrl is provided)\n // =============================================================================\n const {\n state: daemonState,\n isGenerating,\n generate,\n revert,\n setMode,\n setProvider,\n } = useDaemon({\n url: daemonUrl || 'ws://localhost:9999',\n autoConnect: daemonUrl !== null,\n autoReconnect: daemonUrl !== null,\n });\n\n // Use external isProcessing if provided, otherwise use internal state\n const isProcessing = externalIsProcessing !== undefined ? externalIsProcessing : (internalIsProcessing || isGenerating);\n\n // =============================================================================\n // Internal Handlers (used when external callbacks not provided)\n // =============================================================================\n const internalOnAnnotationSubmit = useCallback(async (annotation: Annotation, comment: string) => {\n if (!daemonState.connected) {\n return;\n }\n\n setInternalIsProcessing(true);\n\n try {\n const result = await generate(\n { ...annotation, comment },\n () => {},\n {\n visionApiKey: getStoredVisionApiKey(getStoredVisionProvider()),\n visionProvider: getStoredVisionProvider(),\n visionModel: getStoredVisionModel() || undefined,\n }\n );\n\n // Track annotation ID for revert\n if (result.annotationId) {\n annotationChangesRef.current.set(annotation.id, result.annotationId);\n }\n } catch {\n } finally {\n setInternalIsProcessing(false);\n }\n }, [daemonState.connected, daemonState.provider, generate]);\n\n const internalOnAnnotationDelete = useCallback(async (annotationId: string) => {\n const trackedId = annotationChangesRef.current.get(annotationId);\n if (!trackedId) {\n return;\n }\n\n try {\n await revert(trackedId);\n annotationChangesRef.current.delete(annotationId);\n } catch {\n }\n }, [revert]);\n\n const internalOnProcessingCancel = useCallback(() => {\n setInternalIsProcessing(false);\n }, []);\n\n // Use external callbacks if provided, otherwise use internal ones\n const onAnnotationSubmit = externalOnAnnotationSubmit || (daemonUrl !== null ? internalOnAnnotationSubmit : undefined);\n const onAnnotationDelete = externalOnAnnotationDelete || (daemonUrl !== null ? internalOnAnnotationDelete : undefined);\n const onProcessingCancel = externalOnProcessingCancel || internalOnProcessingCancel;\n\n // =============================================================================\n // Refs\n // =============================================================================\n const editorRef = useRef<Editor | null>(null);\n const popupRef = useRef<AnnotationPopupHandle>(null);\n const lastDoubleClickRef = useRef<number>(0);\n const cleanupRef = useRef<(() => void) | null>(null);\n\n // =============================================================================\n // Custom Hooks\n // =============================================================================\n\n // Keyboard shortcut to toggle toolbar expansion\n useKeyboardShortcuts({\n onToggle: useCallback(() => {\n setIsToolbarExpanded(prev => !prev);\n setIsStylePanelOpen(false);\n }, []),\n shortcut: toggleShortcut,\n });\n\n // Scroll sync between page and tldraw camera\n const scrollOffset = useScrollSync(isToolbarExpanded, editorRef);\n\n // Intercept wheel events to scroll page instead of panning tldraw\n useWheelIntercept(isToolbarExpanded);\n\n // Persist shapes when toggling overlay off/on\n useShapePersistence(isToolbarExpanded, editorRef);\n\n // Scribble gesture detection for delete\n useScribbleDelete({\n isActive: isToolbarExpanded,\n editorRef,\n setAnnotations,\n setScribbleToast,\n });\n\n // =============================================================================\n // Effects\n // =============================================================================\n\n // Notify parent of annotation changes\n useEffect(() => {\n onAnnotationsChange?.(annotations);\n }, [annotations, onAnnotationsChange]);\n\n // Clear processing bounding box when processing completes\n useEffect(() => {\n if (!isProcessing) {\n setProcessingBoundingBox(null);\n }\n }, [isProcessing]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (cleanupRef.current) {\n cleanupRef.current();\n }\n };\n }, []);\n\n // Recalculate bounding boxes on window resize\n useEffect(() => {\n if (!isToolbarExpanded) return;\n\n const handleResize = () => {\n // Update domSelections bounding boxes\n setDomSelections((prevSelections) => {\n if (prevSelections.length === 0) return prevSelections;\n\n return prevSelections.map((selection) => {\n // Handle multi-select with individual elements\n if (selection.isMultiSelect && selection.elements) {\n const updatedElements = selection.elements.map((el) => {\n const domElement = document.querySelector(el.selector) as HTMLElement | null;\n if (domElement) {\n return { ...el, boundingBox: getBoundingBox(domElement) };\n }\n return el;\n });\n\n // Recalculate combined bounding box\n const validElements = updatedElements.filter((el) => {\n const domEl = document.querySelector(el.selector);\n return domEl !== null;\n });\n\n if (validElements.length > 0) {\n const minX = Math.min(...updatedElements.map((e) => e.boundingBox.x));\n const minY = Math.min(...updatedElements.map((e) => e.boundingBox.y));\n const maxX = Math.max(...updatedElements.map((e) => e.boundingBox.x + e.boundingBox.width));\n const maxY = Math.max(...updatedElements.map((e) => e.boundingBox.y + e.boundingBox.height));\n\n return {\n ...selection,\n elements: updatedElements,\n boundingBox: {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n },\n };\n }\n return selection;\n }\n\n // Single element selection\n const domElement = document.querySelector(selection.selector) as HTMLElement | null;\n if (domElement) {\n return { ...selection, boundingBox: getBoundingBox(domElement) };\n }\n return selection;\n });\n });\n\n // Update annotations bounding boxes for dom_selection types\n setAnnotations((prevAnnotations) => {\n if (prevAnnotations.length === 0) return prevAnnotations;\n\n return prevAnnotations.map((annotation) => {\n if (annotation.type !== 'dom_selection') return annotation;\n\n // Handle multi-select with individual elements\n if (annotation.isMultiSelect && annotation.elements) {\n const updatedElements = annotation.elements.map((el) => {\n const domElement = document.querySelector(el.selector) as HTMLElement | null;\n if (domElement) {\n return { ...el, boundingBox: getBoundingBox(domElement) };\n }\n return el;\n });\n\n const validElements = updatedElements.filter((el) => {\n const domEl = document.querySelector(el.selector);\n return domEl !== null;\n });\n\n if (validElements.length > 0) {\n const minX = Math.min(...updatedElements.map((e) => e.boundingBox.x));\n const minY = Math.min(...updatedElements.map((e) => e.boundingBox.y));\n const maxX = Math.max(...updatedElements.map((e) => e.boundingBox.x + e.boundingBox.width));\n const maxY = Math.max(...updatedElements.map((e) => e.boundingBox.y + e.boundingBox.height));\n\n return {\n ...annotation,\n elements: updatedElements,\n boundingBox: {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n },\n };\n }\n return annotation;\n }\n\n // Single element selection\n const domElement = document.querySelector(annotation.selector) as HTMLElement | null;\n if (domElement) {\n return { ...annotation, boundingBox: getBoundingBox(domElement) };\n }\n return annotation;\n });\n });\n };\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, [isToolbarExpanded]);\n\n // =============================================================================\n // Helper Functions\n // =============================================================================\n\n // Get selected drawing shapes from tldraw\n const getSelectedDrawings = useCallback(() => {\n if (!editorRef.current) return [];\n const editor = editorRef.current;\n const selectedIds = editor.getSelectedShapeIds();\n const shapes = selectedIds.map(id => editor.getShape(id)).filter(Boolean);\n return shapes.filter(shape =>\n shape && ['draw', 'line', 'arrow', 'geo', 'text', 'note'].includes(shape.type)\n );\n }, []);\n\n // Find DOM elements that intersect with a bounding box\n const findDOMElementsInBounds = useCallback((bounds: BoundingBox): HTMLElement[] => {\n const elements: HTMLElement[] = [];\n const allElements = document.querySelectorAll('*');\n\n allElements.forEach((el) => {\n if (!(el instanceof HTMLElement)) return;\n if (shouldIgnoreElement(el)) return;\n\n const rect = el.getBoundingClientRect();\n const elBounds: BoundingBox = {\n x: rect.left,\n y: rect.top,\n width: rect.width,\n height: rect.height,\n };\n\n // Skip tiny elements\n if (elBounds.width < 10 || elBounds.height < 10) return;\n\n if (bboxIntersects(bounds, elBounds)) {\n const isParent = elements.some((existing) => el.contains(existing));\n if (!isParent) {\n const filtered = elements.filter((existing) => !existing.contains(el) && !el.contains(existing));\n filtered.push(el);\n elements.length = 0;\n elements.push(...filtered);\n }\n }\n });\n\n return elements;\n }, []);\n\n // =============================================================================\n // DOM Selection Handlers\n // =============================================================================\n\n const handleDOMSelect = useCallback((selection: DOMSelection) => {\n const selectedDrawings = getSelectedDrawings();\n const hasDrawings = selectedDrawings.length > 0;\n const rect = selection.boundingBox;\n const x = ((rect.x + rect.width / 2) / window.innerWidth) * 100;\n const clientY = rect.y - window.scrollY + rect.height / 2;\n\n let elementDesc = selection.tagName;\n if (hasDrawings) {\n elementDesc = `Drawing + ${selection.tagName}`;\n }\n\n setPendingAnnotation({\n x,\n y: rect.y + rect.height / 2,\n clientY,\n element: elementDesc,\n elementPath: selection.elementPath,\n selectedText: selection.text?.slice(0, 100),\n boundingBox: rect,\n isMultiSelect: hasDrawings,\n selections: [selection],\n annotationType: hasDrawings ? 'drawing' : 'dom_selection',\n shapeIds: hasDrawings ? editorRef.current?.getSelectedShapeIds() as string[] : undefined,\n });\n }, [getSelectedDrawings]);\n\n const handleMultiDOMSelect = useCallback((selections: DOMSelection[]) => {\n if (selections.length === 0) return;\n\n const selectedDrawings = getSelectedDrawings();\n const hasDrawings = selectedDrawings.length > 0;\n\n const minX = Math.min(...selections.map(s => s.boundingBox.x));\n const minY = Math.min(...selections.map(s => s.boundingBox.y));\n const maxX = Math.max(...selections.map(s => s.boundingBox.x + s.boundingBox.width));\n const maxY = Math.max(...selections.map(s => s.boundingBox.y + s.boundingBox.height));\n\n const combinedBounds: BoundingBox = {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n\n const centerX = minX + (maxX - minX) / 2;\n const centerY = minY + (maxY - minY) / 2;\n const x = (centerX / window.innerWidth) * 100;\n const clientY = centerY - window.scrollY;\n\n const elementNames = selections.slice(0, 3).map(s => s.tagName).join(', ');\n const suffix = selections.length > 3 ? ` +${selections.length - 3} more` : '';\n let element = `${selections.length} elements: ${elementNames}${suffix}`;\n\n if (hasDrawings) {\n const drawingCount = selectedDrawings.length;\n element = `Drawing (${drawingCount}) + ${element}`;\n }\n\n setPendingAnnotation({\n x,\n y: centerY,\n clientY,\n element,\n elementPath: 'multi-select',\n boundingBox: combinedBounds,\n isMultiSelect: true,\n selections,\n annotationType: hasDrawings ? 'drawing' : 'dom_selection',\n shapeIds: hasDrawings ? editorRef.current?.getSelectedShapeIds() as string[] : undefined,\n });\n }, [getSelectedDrawings]);\n\n // =============================================================================\n // Drawing Annotation Handler\n // =============================================================================\n\n const handleDrawingAnnotation = useCallback((selectedIds: TLShapeId[], skipDomElements = false) => {\n if (!editorRef.current || selectedIds.length === 0) return;\n if (pendingAnnotation) return;\n\n const editor = editorRef.current;\n const selectedShapes = selectedIds.map((id) => editor.getShape(id)).filter(Boolean);\n if (selectedShapes.length === 0) return;\n\n // Calculate bounds from shapes\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const shape of selectedShapes) {\n if (!shape) continue;\n const bounds = editor.getShapePageBounds(shape.id);\n if (bounds) {\n minX = Math.min(minX, bounds.x);\n minY = Math.min(minY, bounds.y);\n maxX = Math.max(maxX, bounds.x + bounds.width);\n maxY = Math.max(maxY, bounds.y + bounds.height);\n }\n }\n if (minX === Infinity) return;\n\n const selectionBounds = { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n\n const drawingShapes = selectedShapes.filter(shape =>\n shape && ['draw', 'line', 'arrow', 'geo', 'text', 'note'].includes(shape.type)\n );\n if (drawingShapes.length === 0) return;\n\n // Find DOM elements in bounds (unless skipped)\n let domElements: HTMLElement[] = [];\n if (!skipDomElements) {\n const viewportBounds: BoundingBox = {\n x: selectionBounds.x - window.scrollX,\n y: selectionBounds.y - window.scrollY,\n width: selectionBounds.width,\n height: selectionBounds.height,\n };\n domElements = findDOMElementsInBounds(viewportBounds);\n }\n\n const centerX = selectionBounds.x + selectionBounds.width / 2;\n const centerY = selectionBounds.y + selectionBounds.height / 2;\n const x = ((centerX - window.scrollX) / window.innerWidth) * 100;\n const clientY = centerY - window.scrollY;\n\n let elementDesc = `Drawing (${drawingShapes.length} shape${drawingShapes.length > 1 ? 's' : ''})`;\n if (domElements.length > 0) {\n const domNames = domElements.slice(0, 2).map(el => el.tagName.toLowerCase()).join(', ');\n const domSuffix = domElements.length > 2 ? ` +${domElements.length - 2} more` : '';\n elementDesc += ` + ${domNames}${domSuffix}`;\n }\n\n const newDomSelections = domElements.map(el => createDOMSelection(el));\n\n setPendingAnnotation({\n x,\n y: centerY,\n clientY,\n element: elementDesc,\n elementPath: 'drawing',\n boundingBox: selectionBounds,\n isMultiSelect: drawingShapes.length > 1 || domElements.length > 0,\n annotationType: 'drawing',\n shapeIds: selectedIds as string[],\n selections: newDomSelections.length > 0 ? newDomSelections : undefined,\n });\n }, [pendingAnnotation, findDOMElementsInBounds]);\n\n // =============================================================================\n // Annotation Submit/Cancel/Delete Handlers\n // =============================================================================\n\n const handleAnnotationSubmit = useCallback(async (comment: string) => {\n if (!pendingAnnotation) return;\n\n // Generate IDs once to ensure consistency between state and callback\n const now = Date.now();\n let submittedAnnotation: Annotation | undefined;\n\n if (pendingAnnotation.annotationType === 'dom_selection' && pendingAnnotation.selections) {\n const selections = pendingAnnotation.selections;\n\n if (selections.length === 1) {\n const selection = { ...selections[0], comment };\n setDomSelections((prev) => [...prev, selection]);\n setAnnotations((prev) => [...prev, { type: 'dom_selection' as const, ...selection }]);\n submittedAnnotation = { type: 'dom_selection' as const, ...selections[0], comment };\n } else {\n const groupedSelection: DOMSelection = {\n id: `group-${now}`,\n selector: selections.map(s => s.selector).join(', '),\n tagName: pendingAnnotation.element,\n elementPath: selections[0].elementPath,\n text: selections.map(s => s.text).filter(Boolean).join(' | ').slice(0, 200),\n boundingBox: pendingAnnotation.boundingBox!,\n timestamp: now,\n pathname: selections[0].pathname,\n comment,\n isMultiSelect: true,\n elements: selections.map(s => ({\n selector: s.selector,\n tagName: s.tagName,\n elementPath: s.elementPath,\n text: s.text,\n boundingBox: s.boundingBox,\n cssClasses: s.cssClasses,\n attributes: s.attributes,\n })),\n };\n setDomSelections((prev) => [...prev, groupedSelection]);\n setAnnotations((prev) => [...prev, { type: 'dom_selection' as const, ...groupedSelection }]);\n submittedAnnotation = { type: 'dom_selection' as const, ...groupedSelection };\n }\n } else if (pendingAnnotation.annotationType === 'drawing' && pendingAnnotation.shapeIds) {\n // Drawing annotation - extract SVG, PNG image\n const editor = editorRef.current;\n let drawingSvg: string | undefined;\n let drawingImage: string | undefined;\n let extractedText: string | undefined;\n const gridConfig = { color: '#0066FF', size: 100, labels: true };\n\n if (editor && pendingAnnotation.shapeIds && pendingAnnotation.shapeIds.length > 0) {\n const shapeIds = pendingAnnotation.shapeIds as TLShapeId[];\n\n try {\n const svgResult = await editor.getSvgString(shapeIds, { padding: 20, background: false });\n if (svgResult?.svg) {\n drawingSvg = addGridToSvg(svgResult.svg, gridConfig);\n }\n } catch {\n }\n\n try {\n const imageResult = await editor.toImage(shapeIds, { format: 'png', padding: 20, background: true });\n if (imageResult?.blob) {\n drawingImage = await blobToBase64(imageResult.blob);\n }\n } catch {\n }\n\n try {\n const shapes = shapeIds.map(id => editor.getShape(id)).filter(Boolean);\n extractedText = extractTextFromShapes(shapes);\n } catch {\n }\n }\n\n const nearbyElements = pendingAnnotation.boundingBox\n ? findNearbyElementsWithStyles(pendingAnnotation.boundingBox, 5)\n : [];\n const projectStyles = extractProjectStyleContext();\n const viewport = getViewportInfo();\n\n // Create the drawing annotation once with consistent ID\n const drawingAnnotation: Annotation = {\n id: `drawing-${now}`,\n type: 'drawing',\n tool: 'draw',\n shapes: pendingAnnotation.shapeIds,\n boundingBox: pendingAnnotation.boundingBox!,\n timestamp: now,\n comment,\n drawingSvg,\n drawingImage,\n extractedText: extractedText || undefined,\n gridConfig,\n nearbyElements,\n viewport,\n projectStyles,\n };\n setAnnotations((prev) => [...prev, drawingAnnotation]);\n submittedAnnotation = drawingAnnotation;\n }\n\n // Call onAnnotationSubmit callback with the same annotation object\n if (onAnnotationSubmit && submittedAnnotation) {\n if (pendingAnnotation.boundingBox) {\n setProcessingBoundingBox(pendingAnnotation.boundingBox);\n }\n onAnnotationSubmit(submittedAnnotation, comment);\n }\n\n // Animate out and clear\n setPendingExiting(true);\n setTimeout(() => {\n setPendingAnnotation(null);\n setPendingExiting(false);\n }, 150);\n }, [pendingAnnotation, onAnnotationSubmit]);\n\n const handleAnnotationCancel = useCallback(() => {\n setPendingExiting(true);\n if (isProcessing) {\n onProcessingCancel?.();\n }\n setProcessingBoundingBox(null);\n if (editorRef.current) {\n editorRef.current.setSelectedShapes([]);\n }\n setTimeout(() => {\n setPendingAnnotation(null);\n setPendingExiting(false);\n }, 150);\n }, [isProcessing, onProcessingCancel]);\n\n const handleDeleteAnnotation = useCallback((annotation: Annotation) => {\n setAnnotations((prev) => prev.filter((a) => a.id !== annotation.id));\n if (annotation.type === 'dom_selection') {\n setDomSelections((prev) => prev.filter((s) => s.id !== annotation.id));\n }\n setHoveredMarkerId(null);\n\n if (isProcessing) {\n onProcessingCancel?.();\n setProcessingBoundingBox(null);\n }\n onAnnotationDelete?.(annotation.id);\n }, [onAnnotationDelete, isProcessing, onProcessingCancel]);\n\n const handleClear = useCallback(() => {\n setAnnotations([]);\n setDomSelections([]);\n if (editorRef.current) {\n editorRef.current.selectAll();\n editorRef.current.deleteShapes(editorRef.current.getSelectedShapeIds());\n }\n }, []);\n\n const handleExport = useCallback(() => {\n const exportData = {\n version: '1.0.0',\n timestamp: new Date().toISOString(),\n viewport: getViewportInfo(),\n pathname: window.location.pathname,\n annotations,\n };\n navigator.clipboard.writeText(JSON.stringify(exportData, null, 2));\n alert('Annotations copied to clipboard!');\n }, [annotations]);\n\n // =============================================================================\n // Brush/Lasso Selection Handlers\n // =============================================================================\n\n const handleBrushSelection = useCallback((brushBounds: BoundingBox) => {\n if (editorRef.current) {\n const selectedShapeIds = editorRef.current.getSelectedShapeIds();\n if (selectedShapeIds.length > 0) {\n handleDrawingAnnotation(selectedShapeIds, true);\n return;\n }\n }\n\n const viewportBounds: BoundingBox = {\n x: brushBounds.x - window.scrollX,\n y: brushBounds.y - window.scrollY,\n width: brushBounds.width,\n height: brushBounds.height,\n };\n\n const foundElements = findDOMElementsInBounds(viewportBounds);\n const newElements = foundElements.filter((el) => {\n const rect = el.getBoundingClientRect();\n return !domSelections.some(\n (s) => Math.abs(s.boundingBox.x - (rect.left + window.scrollX)) < 5 &&\n Math.abs(s.boundingBox.y - (rect.top + window.scrollY)) < 5\n );\n });\n\n if (newElements.length === 0) return;\n\n const selections = newElements.map(el => createDOMSelection(el));\n if (selections.length === 1) {\n handleDOMSelect(selections[0]);\n } else {\n handleMultiDOMSelect(selections);\n }\n }, [findDOMElementsInBounds, domSelections, handleDOMSelect, handleMultiDOMSelect, handleDrawingAnnotation]);\n\n const handleLassoSelection = useCallback((lassoPoints: { x: number; y: number }[]) => {\n if (lassoPoints.length < 3) return;\n\n if (editorRef.current) {\n const selectedShapeIds = editorRef.current.getSelectedShapeIds();\n if (selectedShapeIds.length > 0) {\n handleDrawingAnnotation(selectedShapeIds, true);\n return;\n }\n }\n\n const viewportPoints = lassoPoints.map(p => ({\n x: p.x - window.scrollX,\n y: p.y - window.scrollY,\n }));\n\n let lassoMinX = Infinity, lassoMinY = Infinity;\n let lassoMaxX = -Infinity, lassoMaxY = -Infinity;\n for (const p of viewportPoints) {\n lassoMinX = Math.min(lassoMinX, p.x);\n lassoMinY = Math.min(lassoMinY, p.y);\n lassoMaxX = Math.max(lassoMaxX, p.x);\n lassoMaxY = Math.max(lassoMaxY, p.y);\n }\n\n const allElements = document.querySelectorAll('*');\n const foundElements: HTMLElement[] = [];\n\n allElements.forEach((el) => {\n if (!(el instanceof HTMLElement)) return;\n if (shouldIgnoreElement(el)) return;\n\n const rect = el.getBoundingClientRect();\n if (rect.width < 10 || rect.height < 10) return;\n\n const boundsOverlap = !(\n rect.left > lassoMaxX ||\n rect.right < lassoMinX ||\n rect.top > lassoMaxY ||\n rect.bottom < lassoMinY\n );\n\n if (boundsOverlap) {\n const isParent = foundElements.some((existing) => el.contains(existing));\n if (!isParent) {\n const filtered = foundElements.filter((existing) => !existing.contains(el) && !el.contains(existing));\n filtered.push(el);\n foundElements.length = 0;\n foundElements.push(...filtered);\n }\n }\n });\n\n const newElements = foundElements.filter((el) => {\n const rect = el.getBoundingClientRect();\n return !domSelections.some(\n (s) => Math.abs(s.boundingBox.x - (rect.left + window.scrollX)) < 5 &&\n Math.abs(s.boundingBox.y - (rect.top + window.scrollY)) < 5\n );\n });\n\n if (newElements.length === 0) return;\n\n const selections = newElements.map(el => createDOMSelection(el));\n if (selections.length === 1) {\n handleDOMSelect(selections[0]);\n } else {\n handleMultiDOMSelect(selections);\n }\n }, [domSelections, handleDOMSelect, handleMultiDOMSelect, handleDrawingAnnotation]);\n\n // =============================================================================\n // Editor Mount Handler\n // =============================================================================\n\n const handleMount = useCallback((editor: Editor) => {\n editorRef.current = editor;\n\n // Set initial dark mode to match Skema theme\n editor.user.updateUserPreferences({ colorScheme: theme });\n\n // Set default arrow style to arc (curved)\n editor.setStyleForNextShapes(ArrowShapeKindStyle, 'arc');\n\n // Override double click behavior\n try {\n type IdleStateNode = StateNode & {\n handleDoubleClickOnCanvas(info: TLClickEventInfo): void;\n handleDoubleClickOnShape?(info: TLClickEventInfo, shape: any): void;\n };\n const selectIdleState = editor.getStateDescendant<IdleStateNode>('select.idle');\n if (selectIdleState) {\n selectIdleState.handleDoubleClickOnCanvas = (_info) => {\n lastDoubleClickRef.current = Date.now();\n const point = editor.inputs.currentScreenPoint;\n const elements = document.elementsFromPoint(point.x, point.y);\n\n const target = elements.find(el =>\n el instanceof HTMLElement && !shouldIgnoreElement(el as HTMLElement)\n ) as HTMLElement | undefined;\n\n if (target) {\n const selection = createDOMSelection(target);\n const rect = selection.boundingBox;\n const x = ((rect.x + rect.width / 2) / window.innerWidth) * 100;\n const clientY = rect.y - window.scrollY + rect.height / 2;\n\n setPendingAnnotation({\n x,\n y: rect.y + rect.height / 2,\n clientY,\n element: selection.tagName,\n elementPath: selection.elementPath,\n selectedText: selection.text?.slice(0, 100),\n boundingBox: rect,\n isMultiSelect: false,\n selections: [selection],\n annotationType: 'dom_selection',\n });\n }\n };\n\n selectIdleState.handleDoubleClickOnShape = (_info, shape) => {\n lastDoubleClickRef.current = Date.now();\n if (shape && ['draw', 'line', 'arrow', 'geo', 'text', 'note'].includes(shape.type)) {\n const selectedIds = editor.getSelectedShapeIds();\n const shapeIds = selectedIds.length > 0 ? selectedIds : [shape.id];\n handleDrawingAnnotation(shapeIds, true);\n }\n };\n }\n } catch {\n }\n\n // Set initial camera to match scroll position\n editor.setCamera({ x: -window.scrollX, y: -window.scrollY, z: 1 });\n\n // Prevent zoom changes\n editor.sideEffects.registerAfterChangeHandler('camera', () => {\n const camera = editor.getCamera();\n if (camera.z !== 1) {\n editor.setCamera({ x: camera.x, y: camera.y, z: 1 });\n }\n });\n\n // Set up lasso tool callbacks\n const lassoSelectTool = editor.root.children?.['lasso-select'] as any;\n if (lassoSelectTool && 'setOnLassoComplete' in lassoSelectTool) {\n lassoSelectTool.setOnLassoComplete((points: { x: number; y: number }[]) => {\n handleLassoSelection(points);\n });\n }\n\n // Track brush selection\n let lastBrush: { x: number; y: number; w: number; h: number } | null = null;\n editor.sideEffects.registerAfterChangeHandler('instance', (prev, next) => {\n if (prev.brush && !next.brush && lastBrush) {\n const brushBounds: BoundingBox = {\n x: lastBrush.x,\n y: lastBrush.y,\n width: lastBrush.w,\n height: lastBrush.h,\n };\n handleBrushSelection(brushBounds);\n lastBrush = null;\n } else if (next.brush) {\n lastBrush = next.brush;\n }\n });\n\n // Track current tool changes for conditional UI (e.g. style panel visibility)\n const handleToolChange = () => {\n const toolId = editor.getCurrentToolId();\n setCurrentToolId((prev) => (prev !== toolId ? toolId : prev));\n };\n editor.sideEffects.registerAfterChangeHandler('instance', handleToolChange);\n }, [handleDOMSelect, handleBrushSelection, handleLassoSelection, handleMultiDOMSelect, handleDrawingAnnotation, theme]);\n\n // =============================================================================\n // Click Handler (for canceling pending annotation)\n // =============================================================================\n\n useEffect(() => {\n if (!isToolbarExpanded) return;\n\n const handlePointerDown = (e: PointerEvent) => {\n if (e.button !== 0) return;\n const target = e.target as HTMLElement;\n\n if (target.closest('[data-skema=\"annotation-popup\"]')) return;\n\n if (pendingAnnotation) {\n e.preventDefault();\n e.stopPropagation();\n handleAnnotationCancel();\n return;\n }\n\n if (e.shiftKey) return;\n if (!target.closest('.tl-canvas')) return;\n };\n\n document.addEventListener('pointerdown', handlePointerDown, { capture: true });\n return () => document.removeEventListener('pointerdown', handlePointerDown, { capture: true });\n }, [isToolbarExpanded, pendingAnnotation, handleAnnotationCancel]);\n\n // =============================================================================\n // Render\n // =============================================================================\n\n if (!enabled) {\n return null;\n }\n\n return (\n <div\n data-skema=\"container\"\n style={{\n position: 'fixed',\n inset: 0,\n zIndex,\n pointerEvents: 'none',\n }}\n >\n {/* Hide tldraw UI elements */}\n <style>{skemaHiddenUiStyles}</style>\n \n {/* Style panel - only visible for draw/geo tools, positioned in top right corner */}\n <style>{`\n .tlui-style-panel__wrapper {\n position: fixed !important;\n top: 16px !important;\n right: 16px !important;\n bottom: auto !important;\n left: auto !important;\n ${isToolbarExpanded && (currentToolId === 'draw' || currentToolId === 'geo') ? '' : 'display: none !important;'}\n }\n `}</style>\n\n {/* Pulsing animation for disconnected state */}\n <style>{`\n @keyframes skema-pulse {\n 0%, 100% { transform: scale(1); opacity: 1; }\n 50% { transform: scale(1.15); opacity: 0.8; }\n }\n @keyframes skema-glow {\n 0%, 100% { box-shadow: 0 0 0 0 rgba(239, 68, 68, 0.4); }\n 50% { box-shadow: 0 0 0 8px rgba(239, 68, 68, 0); }\n }\n `}</style>\n\n {/* Floating Settings Button - Bottom Right */}\n {isToolbarExpanded && (\n <button\n onClick={() => setIsStylePanelOpen(prev => !prev)}\n title={isStylePanelOpen ? \"Hide style settings\" : !daemonState.connected ? \"Daemon not connected - click to configure\" : \"Show style settings\"}\n style={{\n position: 'fixed',\n bottom: 16,\n right: 16,\n width: 44,\n height: 44,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: isStylePanelOpen ? '#FF6800' : isDark ? '#2a2a2a' : 'white',\n border: !daemonState.connected && !isStylePanelOpen ? '2px solid #ef4444' : 'none',\n borderRadius: 12,\n boxShadow: '0 2px 10px rgba(0,0,0,0.15)',\n cursor: 'pointer',\n pointerEvents: 'auto',\n zIndex: zIndex + 5,\n transition: 'all 0.2s ease',\n animation: !daemonState.connected && !isStylePanelOpen ? 'skema-glow 2s ease-in-out infinite' : 'none',\n }}\n >\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15Z\"\n stroke={isStylePanelOpen ? \"white\" : isDark ? \"#9CA3AF\" : \"#6B7280\"}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M19.4 15C19.2669 15.3016 19.2272 15.6362 19.286 15.9606C19.3448 16.285 19.4995 16.5843 19.73 16.82L19.79 16.88C19.976 17.0657 20.1235 17.2863 20.2241 17.5291C20.3248 17.7719 20.3766 18.0322 20.3766 18.295C20.3766 18.5578 20.3248 18.8181 20.2241 19.0609C20.1235 19.3037 19.976 19.5243 19.79 19.71C19.6043 19.896 19.3837 20.0435 19.1409 20.1441C18.8981 20.2448 18.6378 20.2966 18.375 20.2966C18.1122 20.2966 17.8519 20.2448 17.6091 20.1441C17.3663 20.0435 17.1457 19.896 16.96 19.71L16.9 19.65C16.6643 19.4195 16.365 19.2648 16.0406 19.206C15.7162 19.1472 15.3816 19.1869 15.08 19.32C14.7842 19.4468 14.532 19.6572 14.3543 19.9255C14.1766 20.1938 14.0813 20.5082 14.08 20.83V21C14.08 21.5304 13.8693 22.0391 13.4942 22.4142C13.1191 22.7893 12.6104 23 12.08 23C11.5496 23 11.0409 22.7893 10.6658 22.4142C10.2907 22.0391 10.08 21.5304 10.08 21V20.91C10.0723 20.579 9.96512 20.258 9.77251 19.9887C9.5799 19.7194 9.31074 19.5143 9 19.4C8.69838 19.2669 8.36381 19.2272 8.03941 19.286C7.71502 19.3448 7.41568 19.4995 7.18 19.73L7.12 19.79C6.93425 19.976 6.71368 20.1235 6.47088 20.2241C6.22808 20.3248 5.96783 20.3766 5.705 20.3766C5.44217 20.3766 5.18192 20.3248 4.93912 20.2241C4.69632 20.1235 4.47575 19.976 4.29 19.79C4.10405 19.6043 3.95653 19.3837 3.85588 19.1409C3.75523 18.8981 3.70343 18.6378 3.70343 18.375C3.70343 18.1122 3.75523 17.8519 3.85588 17.6091C3.95653 17.3663 4.10405 17.1457 4.29 16.96L4.35 16.9C4.58054 16.6643 4.73519 16.365 4.794 16.0406C4.85282 15.7162 4.81312 15.3816 4.68 15.08C4.55324 14.7842 4.34276 14.532 4.07447 14.3543C3.80618 14.1766 3.49179 14.0813 3.17 14.08H3C2.46957 14.08 1.96086 13.8693 1.58579 13.4942C1.21071 13.1191 1 12.6104 1 12.08C1 11.5496 1.21071 11.0409 1.58579 10.6658C1.96086 10.2907 2.46957 10.08 3 10.08H3.09C3.42099 10.0723 3.742 9.96512 4.0113 9.77251C4.28059 9.5799 4.48572 9.31074 4.6 9C4.73312 8.69838 4.77282 8.36381 4.714 8.03941C4.65519 7.71502 4.50054 7.41568 4.27 7.18L4.21 7.12C4.02405 6.93425 3.87653 6.71368 3.77588 6.47088C3.67523 6.22808 3.62343 5.96783 3.62343 5.705C3.62343 5.44217 3.67523 5.18192 3.77588 4.93912C3.87653 4.69632 4.02405 4.47575 4.21 4.29C4.39575 4.10405 4.61632 3.95653 4.85912 3.85588C5.10192 3.75523 5.36217 3.70343 5.625 3.70343C5.88783 3.70343 6.14808 3.75523 6.39088 3.85588C6.63368 3.95653 6.85425 4.10405 7.04 4.29L7.1 4.35C7.33568 4.58054 7.63502 4.73519 7.95941 4.794C8.28381 4.85282 8.61838 4.81312 8.92 4.68H9C9.29577 4.55324 9.54802 4.34276 9.72569 4.07447C9.90337 3.80618 9.99872 3.49179 10 3.17V3C10 2.46957 10.2107 1.96086 10.5858 1.58579C10.9609 1.21071 11.4696 1 12 1C12.5304 1 13.0391 1.21071 13.4142 1.58579C13.7893 1.96086 14 2.46957 14 3V3.09C14.0013 3.41179 14.0966 3.72618 14.2743 3.99447C14.452 4.26276 14.7042 4.47324 15 4.6C15.3016 4.73312 15.6362 4.77282 15.9606 4.714C16.285 4.65519 16.5843 4.50054 16.82 4.27L16.88 4.21C17.0657 4.02405 17.2863 3.87653 17.5291 3.77588C17.7719 3.67523 18.0322 3.62343 18.295 3.62343C18.5578 3.62343 18.8181 3.67523 19.0609 3.77588C19.3037 3.87653 19.5243 4.02405 19.71 4.21C19.896 4.39575 20.0435 4.61632 20.1441 4.85912C20.2448 5.10192 20.2966 5.36217 20.2966 5.625C20.2966 5.88783 20.2448 6.14808 20.1441 6.39088C20.0435 6.63368 19.896 6.85425 19.71 7.04L19.65 7.1C19.4195 7.33568 19.2648 7.63502 19.206 7.95941C19.1472 8.28381 19.1869 8.61838 19.32 8.92V9C19.4468 9.29577 19.6572 9.54802 19.9255 9.72569C20.1938 9.90337 20.5082 9.99872 20.83 10H21C21.5304 10 22.0391 10.2107 22.4142 10.5858C22.7893 10.9609 23 11.4696 23 12C23 12.5304 22.7893 13.0391 22.4142 13.4142C22.0391 13.7893 21.5304 14 21 14H20.91C20.5882 14.0013 20.2738 14.0966 20.0055 14.2743C19.7372 14.452 19.5268 14.7042 19.4 15Z\"\n stroke={isStylePanelOpen ? \"white\" : isDark ? \"#9CA3AF\" : \"#6B7280\"}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n {/* Warning badge when disconnected */}\n {!daemonState.connected && !isStylePanelOpen && (\n <div\n style={{\n position: 'absolute',\n top: -4,\n right: -4,\n width: 20,\n height: 20,\n backgroundColor: '#ef4444',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n animation: 'skema-pulse 2s ease-in-out infinite',\n boxShadow: '0 2px 4px rgba(239, 68, 68, 0.4)',\n }}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 9V13M12 17H12.01M21 12C21 16.9706 16.9706 21 12 21C7.02944 21 3 16.9706 3 12C3 7.02944 7.02944 3 12 3C16.9706 3 21 7.02944 21 12Z\"\n stroke=\"white\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n )}\n </button>\n )}\n\n {/* Settings Panel */}\n <SettingsPanel\n isOpen={isStylePanelOpen}\n onClose={() => setIsStylePanelOpen(false)}\n zIndex={zIndex}\n connected={daemonState.connected}\n mode={daemonState.mode}\n provider={daemonState.provider}\n availableProviders={daemonState.availableProviders}\n providerStatus={daemonState.providerStatus}\n mcpServerConnected={daemonState.mcpServerConnected}\n mcpClientName={daemonState.mcpClientName}\n annotationCounts={daemonState.annotationCounts}\n onModeChange={setMode}\n onProviderChange={setProvider}\n theme={theme}\n onThemeChange={setTheme}\n />\n\n {/* tldraw overlay - only intercept events when toolbar is expanded */}\n <div\n style={{\n position: 'absolute',\n inset: 0,\n pointerEvents: isToolbarExpanded ? 'auto' : 'none',\n }}\n >\n <Tldraw\n tools={[LassoSelectTool]}\n components={skemaComponents}\n overrides={skemaOverrides}\n onMount={handleMount}\n hideUi={false}\n inferDarkMode={false}\n options={{ maxPages: 1 }}\n >\n <SkemaToolbar\n isExpanded={isToolbarExpanded}\n onExpandedChange={setIsToolbarExpanded}\n onStylePanelChange={setIsStylePanelOpen}\n isDark={isDark}\n />\n </Tldraw>\n </div>\n\n {/* DOM selection highlights */}\n <SelectionOverlay selections={domSelections} />\n\n {/* Processing loading overlay */}\n {isProcessing && processingBoundingBox && (\n <ProcessingOverlay\n boundingBox={processingBoundingBox}\n scrollOffset={scrollOffset}\n />\n )}\n\n {/* Annotation markers */}\n <AnnotationMarkersLayer\n annotations={annotations}\n scrollOffset={scrollOffset}\n hoveredMarkerId={hoveredMarkerId}\n onHover={setHoveredMarkerId}\n onDelete={handleDeleteAnnotation}\n />\n\n {/* Pending annotation highlight and popup */}\n {pendingAnnotation && pendingAnnotation.boundingBox && (\n <>\n <div\n data-skema=\"pending-highlight\"\n style={{\n position: 'fixed',\n left: pendingAnnotation.boundingBox.x - scrollOffset.x,\n top: pendingAnnotation.boundingBox.y - scrollOffset.y,\n width: pendingAnnotation.boundingBox.width,\n height: pendingAnnotation.boundingBox.height,\n border: `2px solid ${pendingAnnotation.isMultiSelect ? '#34C759' : '#3b82f6'}`,\n backgroundColor: pendingAnnotation.isMultiSelect\n ? 'rgba(52, 199, 89, 0.1)'\n : 'rgba(59, 130, 246, 0.1)',\n borderRadius: 4,\n pointerEvents: 'none',\n zIndex: zIndex + 2,\n transition: 'opacity 0.15s ease',\n opacity: pendingExiting ? 0 : 1,\n }}\n />\n\n <AnnotationPopup\n ref={popupRef}\n element={pendingAnnotation.element}\n selectedText={pendingAnnotation.selectedText}\n placeholder={\n pendingAnnotation.annotationType === 'drawing'\n ? 'What does this drawing mean?'\n : pendingAnnotation.isMultiSelect\n ? 'What should change about these elements?'\n : 'Write your changes'\n }\n onSubmit={handleAnnotationSubmit}\n onCancel={handleAnnotationCancel}\n isExiting={pendingExiting}\n isMultiSelect={pendingAnnotation.isMultiSelect}\n accentColor={pendingAnnotation.isMultiSelect ? '#34C759' : '#3b82f6'}\n isDark={isDark}\n style={{\n left: Math.max(160, Math.min(window.innerWidth - 160, (pendingAnnotation.x / 100) * window.innerWidth)),\n ...(pendingAnnotation.clientY > window.innerHeight - 250\n ? { bottom: window.innerHeight - pendingAnnotation.clientY + 30 }\n : { top: pendingAnnotation.clientY + 30 }),\n zIndex: zIndex + 3,\n pointerEvents: 'auto',\n }}\n />\n </>\n )}\n\n {/* Annotations sidebar */}\n <AnnotationsSidebar\n annotations={annotations}\n onClear={handleClear}\n onExport={handleExport}\n />\n\n {/* Scribble-delete toast notification */}\n {scribbleToast && (\n <div\n data-skema=\"scribble-toast\"\n style={{\n position: 'fixed',\n bottom: 60,\n left: '50%',\n transform: 'translateX(-50%)',\n padding: '10px 20px',\n backgroundColor: 'rgba(239, 68, 68, 0.95)',\n color: 'white',\n borderRadius: '8px',\n fontSize: '14px',\n fontWeight: 500,\n pointerEvents: 'none',\n zIndex: zIndex + 10,\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n animation: 'skema-toast-fade 0.2s ease-out',\n }}\n >\n {scribbleToast}\n </div>\n )}\n\n {/* Toast animation styles */}\n <style>{skemaToastStyles}</style>\n </div>\n );\n};\n\nexport default Skema;\n"]}