skema-core 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +10 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +10 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -1
package/dist/index.mjs.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/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":["jsx","jsxs","useRef","useState","useEffect","useEditor","GeoShapeGeoStyle","Fragment","AnnotationPopup","useCallback","domElement"],"mappings":"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","file":"index.mjs","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 AIProvider = 'gemini' | 'claude';\n\nexport interface DaemonState {\n connected: boolean;\n provider: AIProvider;\n availableProviders: AIProvider[];\n cwd: string;\n}\n\nexport interface AIStreamEvent {\n type: 'init' | 'text' | 'tool_use' | 'tool_result' | 'error' | 'done' | 'debug';\n content?: string;\n timestamp: string;\n provider: AIProvider;\n raw?: unknown;\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: AIProvider) => Promise<boolean>;\n /** Generate code from annotation (streaming) */\n generate: (\n annotation: Partial<Annotation> & { comment?: string },\n onEvent?: (event: AIStreamEvent) => void\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 [state, setState] = useState<DaemonState>({\n connected: false,\n provider: 'gemini',\n availableProviders: [],\n cwd: '',\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 availableProviders: msg.availableProviders || prev.availableProviders,\n cwd: msg.cwd || prev.cwd,\n }));\n setError(null);\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 provider change\n if (msg.type === 'provider-changed') {\n setState((prev) => ({ ...prev, provider: msg.provider }));\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: AIProvider): Promise<boolean> => {\n try {\n const response = await sendRequest<{ type: string; provider: AIProvider }>('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 // Generate code from annotation\n const generate = useCallback(async (\n annotation: Partial<Annotation> & { comment?: string },\n onEvent?: (event: AIStreamEvent) => void\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 }));\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 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// Adapted from Agentation with modifications for Skema\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","// =============================================================================\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 onExpandedChange?: (expanded: boolean) => void;\n onStylePanelChange?: (open: boolean) => void;\n}\n\nexport const SkemaToolbar: React.FC<SkemaToolbarProps> = ({ onExpandedChange, onStylePanelChange }) => {\n const editor = useEditor();\n const tools = useTools();\n const shapesButtonRef = useRef<HTMLButtonElement>(null);\n\n // Collapse/expand state\n const [isExpanded, setIsExpanded] = useState(false);\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 setIsExpanded(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: 'white',\n borderRadius: 28,\n boxShadow: '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. Use the DOM picker or drawing tools 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. Inspired by agentation's implementation.\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}\n\nexport interface AnnotationPopupHandle {\n /** Shake the popup (e.g., when user clicks outside) */\n shake: () => void;\n}\n\n// =============================================================================\n// Styles\n// =============================================================================\n\nconst styles = {\n popup: {\n position: 'fixed' as const,\n transform: 'translateX(-50%)',\n width: 280,\n padding: '12px 16px 14px',\n background: '#1a1a1a',\n borderRadius: 16,\n boxShadow: '0 4px 24px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(255, 255, 255, 0.08)',\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.95) translateY(4px)',\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 9,\n },\n element: {\n fontSize: 12,\n fontWeight: 400,\n color: 'rgba(255, 255, 255, 0.5)',\n maxWidth: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap' as const,\n flex: 1,\n },\n quote: {\n fontSize: 12,\n fontStyle: 'italic' as const,\n color: 'rgba(255, 255, 255, 0.6)',\n marginBottom: 8,\n padding: '6px 8px',\n background: 'rgba(255, 255, 255, 0.05)',\n borderRadius: 4,\n lineHeight: 1.45,\n },\n textarea: {\n width: '100%',\n padding: '8px 10px',\n fontSize: 13,\n fontFamily: 'inherit',\n background: 'rgba(255, 255, 255, 0.05)',\n color: '#fff',\n border: '1px solid rgba(255, 255, 255, 0.15)',\n borderRadius: 8,\n resize: 'none' as const,\n outline: 'none',\n transition: 'border-color 0.15s ease',\n boxSizing: 'border-box' as const,\n },\n textareaFocused: {\n borderColor: '#3c82f7',\n },\n actions: {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: 6,\n marginTop: 8,\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',\n },\n cancelButton: {\n background: 'transparent',\n color: 'rgba(255, 255, 255, 0.5)',\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 = 'What should change?',\n initialValue = '',\n submitLabel = 'Add',\n onSubmit,\n onCancel,\n style,\n accentColor = '#3c82f7',\n isExiting = false,\n isMultiSelect = 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 // Compute popup style based on animation state\n const popupStyle: React.CSSProperties = {\n ...styles.popup,\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 // Compute textarea style\n const textareaStyle: React.CSSProperties = {\n ...styles.textarea,\n ...(isFocused ? { borderColor: accentColor } : {}),\n };\n\n // Multi-select uses green accent\n const effectiveAccentColor = isMultiSelect ? '#34C759' : accentColor;\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 <div style={styles.header}>\n <span style={styles.element}>{element}</span>\n </div>\n\n {selectedText && (\n <div style={styles.quote}>\n “{selectedText.slice(0, 80)}\n {selectedText.length > 80 ? '...' : ''}”\n </div>\n )}\n\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 <div style={styles.actions}>\n <button\n style={{ ...styles.button, ...styles.cancelButton }}\n onClick={handleCancel}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'rgba(255, 255, 255, 0.1)';\n e.currentTarget.style.color = 'rgba(255, 255, 255, 0.8)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n e.currentTarget.style.color = 'rgba(255, 255, 255, 0.5)';\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.9)';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.filter = 'none';\n }}\n >\n {submitLabel}\n </button>\n </div>\n </div>\n </>\n );\n }\n);\n\nexport default AnnotationPopup;\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 { SkemaOverlays } from '../components/overlays/LassoOverlay';\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 \"Back to Content\" button\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 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';\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 [isActive, setIsActive] = useState(enabled);\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\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 } = 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 overlay\n useKeyboardShortcuts({\n onToggle: useCallback(() => setIsActive(prev => !prev), []),\n shortcut: toggleShortcut,\n });\n\n // Scroll sync between page and tldraw camera\n const scrollOffset = useScrollSync(isActive, editorRef);\n\n // Intercept wheel events to scroll page instead of panning tldraw\n useWheelIntercept(isActive);\n\n // Persist shapes when toggling overlay off/on\n useShapePersistence(isActive, editorRef);\n\n // Scribble gesture detection for delete\n useScribbleDelete({\n isActive,\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 (!isActive) 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 }, [isActive]);\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 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 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 }, [handleDOMSelect, handleBrushSelection, handleLassoSelection, handleMultiDOMSelect, handleDrawingAnnotation]);\n\n // =============================================================================\n // Click Handler (for canceling pending annotation)\n // =============================================================================\n\n useEffect(() => {\n if (!isActive) 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 }, [isActive, pendingAnnotation, handleAnnotationCancel]);\n\n // =============================================================================\n // Render\n // =============================================================================\n\n if (!isActive) {\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 {/* Hide style panel when settings is not active */}\n {!isStylePanelOpen && (\n <style>{`\n .tlui-style-panel__wrapper,\n .tlui-style-panel {\n display: none !important;\n }\n `}</style>\n )}\n \n {/* Style panel positioning when visible */}\n {isStylePanelOpen && (\n <style>{`\n .tlui-style-panel__wrapper {\n top: 68px !important;\n right: 16px !important;\n }\n `}</style>\n )}\n\n {/* Floating Settings Button - Top 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 top: 16,\n right: 16,\n width: 44,\n height: 44,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: isStylePanelOpen ? '#FF6800' : '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\" : \"#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\" : \"#6B7280\"}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n\n {/* tldraw overlay */}\n <div\n style={{\n position: 'absolute',\n inset: 0,\n pointerEvents: 'auto',\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 onExpandedChange={setIsToolbarExpanded} \n onStylePanelChange={setIsStylePanelOpen}\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 : 'What should change?'\n }\n onSubmit={handleAnnotationSubmit}\n onCancel={handleAnnotationCancel}\n isExiting={pendingExiting}\n isMultiSelect={pendingAnnotation.isMultiSelect}\n accentColor={pendingAnnotation.isMultiSelect ? '#34C759' : '#3b82f6'}\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 {/* Toggle indicator */}\n <div\n data-skema=\"toggle-hint\"\n style={{\n position: 'fixed',\n bottom: 16,\n left: 16,\n padding: '8px 12px',\n backgroundColor: 'rgba(0, 0, 0, 0.7)',\n color: 'white',\n borderRadius: '6px',\n fontSize: '12px',\n pointerEvents: 'none',\n zIndex: zIndex + 1,\n }}\n >\n Press <kbd style={{\n backgroundColor: 'rgba(255,255,255,0.2)',\n padding: '2px 6px',\n borderRadius: '3px',\n marginLeft: '4px',\n marginRight: '4px',\n }}>⌘⇧E</kbd> to toggle Skema\n </div>\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/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/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":["jsx","jsxs","useRef","useState","useEffect","useEditor","GeoShapeGeoStyle","Fragment","AnnotationPopup","useCallback","domElement"],"mappings":"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","file":"index.mjs","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 AIProvider = 'gemini' | 'claude';\n\nexport interface DaemonState {\n connected: boolean;\n provider: AIProvider;\n availableProviders: AIProvider[];\n cwd: string;\n}\n\nexport interface AIStreamEvent {\n type: 'init' | 'text' | 'tool_use' | 'tool_result' | 'error' | 'done' | 'debug';\n content?: string;\n timestamp: string;\n provider: AIProvider;\n raw?: unknown;\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: AIProvider) => Promise<boolean>;\n /** Generate code from annotation (streaming) */\n generate: (\n annotation: Partial<Annotation> & { comment?: string },\n onEvent?: (event: AIStreamEvent) => void\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 [state, setState] = useState<DaemonState>({\n connected: false,\n provider: 'gemini',\n availableProviders: [],\n cwd: '',\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 availableProviders: msg.availableProviders || prev.availableProviders,\n cwd: msg.cwd || prev.cwd,\n }));\n setError(null);\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 provider change\n if (msg.type === 'provider-changed') {\n setState((prev) => ({ ...prev, provider: msg.provider }));\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: AIProvider): Promise<boolean> => {\n try {\n const response = await sendRequest<{ type: string; provider: AIProvider }>('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 // Generate code from annotation\n const generate = useCallback(async (\n annotation: Partial<Annotation> & { comment?: string },\n onEvent?: (event: AIStreamEvent) => void\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 }));\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 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// Adapted from Agentation with modifications for Skema\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","// =============================================================================\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 onExpandedChange?: (expanded: boolean) => void;\n onStylePanelChange?: (open: boolean) => void;\n}\n\nexport const SkemaToolbar: React.FC<SkemaToolbarProps> = ({ onExpandedChange, onStylePanelChange }) => {\n const editor = useEditor();\n const tools = useTools();\n const shapesButtonRef = useRef<HTMLButtonElement>(null);\n\n // Collapse/expand state\n const [isExpanded, setIsExpanded] = useState(false);\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 setIsExpanded(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: 'white',\n borderRadius: 28,\n boxShadow: '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. Use the DOM picker or drawing tools 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. Inspired by agentation's implementation.\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}\n\nexport interface AnnotationPopupHandle {\n /** Shake the popup (e.g., when user clicks outside) */\n shake: () => void;\n}\n\n// =============================================================================\n// Styles\n// =============================================================================\n\nconst styles = {\n popup: {\n position: 'fixed' as const,\n transform: 'translateX(-50%)',\n width: 280,\n padding: '12px 16px 14px',\n background: '#1a1a1a',\n borderRadius: 16,\n boxShadow: '0 4px 24px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(255, 255, 255, 0.08)',\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.95) translateY(4px)',\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 9,\n },\n element: {\n fontSize: 12,\n fontWeight: 400,\n color: 'rgba(255, 255, 255, 0.5)',\n maxWidth: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap' as const,\n flex: 1,\n },\n quote: {\n fontSize: 12,\n fontStyle: 'italic' as const,\n color: 'rgba(255, 255, 255, 0.6)',\n marginBottom: 8,\n padding: '6px 8px',\n background: 'rgba(255, 255, 255, 0.05)',\n borderRadius: 4,\n lineHeight: 1.45,\n },\n textarea: {\n width: '100%',\n padding: '8px 10px',\n fontSize: 13,\n fontFamily: 'inherit',\n background: 'rgba(255, 255, 255, 0.05)',\n color: '#fff',\n border: '1px solid rgba(255, 255, 255, 0.15)',\n borderRadius: 8,\n resize: 'none' as const,\n outline: 'none',\n transition: 'border-color 0.15s ease',\n boxSizing: 'border-box' as const,\n },\n textareaFocused: {\n borderColor: '#3c82f7',\n },\n actions: {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: 6,\n marginTop: 8,\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',\n },\n cancelButton: {\n background: 'transparent',\n color: 'rgba(255, 255, 255, 0.5)',\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 = 'What should change?',\n initialValue = '',\n submitLabel = 'Add',\n onSubmit,\n onCancel,\n style,\n accentColor = '#3c82f7',\n isExiting = false,\n isMultiSelect = 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 // Compute popup style based on animation state\n const popupStyle: React.CSSProperties = {\n ...styles.popup,\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 // Compute textarea style\n const textareaStyle: React.CSSProperties = {\n ...styles.textarea,\n ...(isFocused ? { borderColor: accentColor } : {}),\n };\n\n // Multi-select uses green accent\n const effectiveAccentColor = isMultiSelect ? '#34C759' : accentColor;\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 <div style={styles.header}>\n <span style={styles.element}>{element}</span>\n </div>\n\n {selectedText && (\n <div style={styles.quote}>\n “{selectedText.slice(0, 80)}\n {selectedText.length > 80 ? '...' : ''}”\n </div>\n )}\n\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 <div style={styles.actions}>\n <button\n style={{ ...styles.button, ...styles.cancelButton }}\n onClick={handleCancel}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'rgba(255, 255, 255, 0.1)';\n e.currentTarget.style.color = 'rgba(255, 255, 255, 0.8)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n e.currentTarget.style.color = 'rgba(255, 255, 255, 0.5)';\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.9)';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.filter = 'none';\n }}\n >\n {submitLabel}\n </button>\n </div>\n </div>\n </>\n );\n }\n);\n\nexport default AnnotationPopup;\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 { SkemaOverlays } from '../components/overlays/LassoOverlay';\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';\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 [isActive, setIsActive] = useState(enabled);\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\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 } = 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 overlay\n useKeyboardShortcuts({\n onToggle: useCallback(() => setIsActive(prev => !prev), []),\n shortcut: toggleShortcut,\n });\n\n // Scroll sync between page and tldraw camera\n const scrollOffset = useScrollSync(isActive, editorRef);\n\n // Intercept wheel events to scroll page instead of panning tldraw\n useWheelIntercept(isActive);\n\n // Persist shapes when toggling overlay off/on\n useShapePersistence(isActive, editorRef);\n\n // Scribble gesture detection for delete\n useScribbleDelete({\n isActive,\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 (!isActive) 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 }, [isActive]);\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 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 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 }, [handleDOMSelect, handleBrushSelection, handleLassoSelection, handleMultiDOMSelect, handleDrawingAnnotation]);\n\n // =============================================================================\n // Click Handler (for canceling pending annotation)\n // =============================================================================\n\n useEffect(() => {\n if (!isActive) 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 }, [isActive, pendingAnnotation, handleAnnotationCancel]);\n\n // =============================================================================\n // Render\n // =============================================================================\n\n if (!isActive) {\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 {/* Hide style panel when settings is not active */}\n {!isStylePanelOpen && (\n <style>{`\n .tlui-style-panel__wrapper,\n .tlui-style-panel {\n display: none !important;\n }\n `}</style>\n )}\n \n {/* Style panel positioning when visible - directly above the bottom-right settings button */}\n {isStylePanelOpen && (\n <style>{`\n .tlui-style-panel__wrapper {\n position: fixed !important;\n bottom: 68px !important;\n right: 16px !important;\n top: auto !important;\n left: auto !important;\n }\n `}</style>\n )}\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' : '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\" : \"#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\" : \"#6B7280\"}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n\n {/* tldraw overlay */}\n <div\n style={{\n position: 'absolute',\n inset: 0,\n pointerEvents: 'auto',\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 onExpandedChange={setIsToolbarExpanded} \n onStylePanelChange={setIsStylePanelOpen}\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 : 'What should change?'\n }\n onSubmit={handleAnnotationSubmit}\n onCancel={handleAnnotationCancel}\n isExiting={pendingExiting}\n isMultiSelect={pendingAnnotation.isMultiSelect}\n accentColor={pendingAnnotation.isMultiSelect ? '#34C759' : '#3b82f6'}\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 {/* Toggle indicator */}\n <div\n data-skema=\"toggle-hint\"\n style={{\n position: 'fixed',\n bottom: 16,\n left: 16,\n padding: '8px 12px',\n backgroundColor: 'rgba(0, 0, 0, 0.7)',\n color: 'white',\n borderRadius: '6px',\n fontSize: '12px',\n pointerEvents: 'none',\n zIndex: zIndex + 1,\n }}\n >\n Press <kbd style={{\n backgroundColor: 'rgba(255,255,255,0.2)',\n padding: '2px 6px',\n borderRadius: '3px',\n marginLeft: '4px',\n marginRight: '4px',\n }}>⌘⇧E</kbd> to toggle Skema\n </div>\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"]}
|