skema-core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/LassoSelectTool.ts","../src/utils/coordinates.ts","../src/utils/element-identification.ts","../src/components/AnnotationPopup.tsx","../src/lib/utils.ts","../src/components/Skema.tsx"],"names":["AnnotationPopup","jsxs","jsx","Fragment","useState","useEffect","useRef","useCallback","styles"],"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","// =============================================================================\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// 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: '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 &ldquo;{selectedText.slice(0, 80)}\n {selectedText.length > 80 ? '...' : ''}&rdquo;\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// 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// Skema - Main Drawing Overlay Component\n// =============================================================================\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Tldraw,\n TLComponents,\n TLUiOverrides,\n TldrawOverlays,\n useTools,\n useIsToolSelected,\n useEditor,\n useValue,\n Editor,\n TLShapeId,\n StateNode,\n TLClickEventInfo,\n ArrowShapeKindStyle,\n} from 'tldraw';\nimport 'tldraw/tldraw.css';\n\nimport { LassoSelectTool, LassoingState } from '../tools/LassoSelectTool';\nimport type { Annotation, DOMSelection, SkemaProps, BoundingBox, PendingAnnotation } from '../types';\nimport { getViewportInfo, bboxIntersects } from '../utils/coordinates';\nimport {\n createDOMSelection,\n shouldIgnoreElement,\n findNearbyElementsWithStyles,\n extractProjectStyleContext,\n} from '../utils/element-identification';\nimport { AnnotationPopup, AnnotationPopupHandle } from './AnnotationPopup';\nimport { blobToBase64, addGridToSvg, extractTextFromShapes } from '../lib/utils';\n\n// =============================================================================\n// Annotation Marker Component - Shows numbered markers for each annotation\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, 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// Annotation markers layer\nconst AnnotationMarkersLayer: React.FC<{\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}> = ({ annotations, scrollOffset, hoveredMarkerId, onHover, onDelete }) => {\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// =============================================================================\n// Custom Icon Components for Toolbar\n// =============================================================================\n\nconst SelectIcon: React.FC<{ isSelected?: boolean }> = ({ isSelected }) => (\n <svg width=\"42\" height=\"42\" 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\nconst DrawIcon: React.FC<{ isSelected?: boolean }> = ({ isSelected }) => (\n <svg width=\"42\" height=\"42\" 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\nconst LassoIcon: React.FC<{ isSelected?: boolean }> = ({ isSelected }) => (\n <svg width=\"42\" height=\"42\" 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\nconst EraseIcon: React.FC<{ isSelected?: boolean }> = ({ isSelected }) => (\n <svg width=\"50\" height=\"42\" 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\nconst StarIcon: React.FC<{ isSelected?: boolean }> = ({ isSelected }) => (\n <svg width=\"42\" height=\"42\" 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 {/* Git icon (white) */}\n <g transform=\"translate(6.5, 6) scale(0.5)\">\n <path\n d=\"M23.546 10.93L13.067 0.452c-0.604-0.603-1.582-0.603-2.188 0L8.708 2.627l2.76 2.76c0.645-0.215 1.379-0.07 1.889 0.441 0.516 0.516 0.658 1.258 0.438 1.9l2.658 2.66c0.645-0.223 1.387-0.078 1.9 0.435 0.721 0.72 0.721 1.884 0 2.604-0.719 0.719-1.881 0.719-2.6 0-0.539-0.541-0.674-1.337-0.404-1.996L12.86 8.955v6.525c0.176 0.086 0.342 0.203 0.488 0.348 0.713 0.721 0.713 1.883 0 2.6-0.719 0.721-1.889 0.721-2.609 0-0.719-0.719-0.719-1.879 0-2.598 0.182-0.18 0.387-0.316 0.605-0.406V8.835c-0.217-0.091-0.424-0.222-0.6-0.401-0.545-0.545-0.676-1.342-0.396-2.009L7.636 3.7 0.45 10.881c-0.6 0.605-0.6 1.584 0 2.189l10.48 10.477c0.604 0.604 1.582 0.604 2.186 0l10.43-10.43c0.605-0.603 0.605-1.582 0-2.187\"\n fill=\"white\"\n />\n </g>\n </svg>\n);\n\n// =============================================================================\n// Custom Toolbar Button Component\n// =============================================================================\n\ninterface ToolbarButtonProps {\n onClick: () => void;\n isSelected: boolean;\n icon: React.ReactNode;\n label: string;\n}\n\nconst ToolbarButton: React.FC<ToolbarButtonProps> = ({ onClick, isSelected, icon, label }) => {\n const handleClick = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onClick();\n };\n\n return (\n <button\n onClick={handleClick}\n title={label}\n type=\"button\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 56,\n height: 56,\n border: 'none',\n borderRadius: 11,\n backgroundColor: isSelected ? 'rgba(255,255,255,0.15)' : 'transparent',\n cursor: 'pointer',\n transition: 'background-color 0.15s ease',\n pointerEvents: 'auto',\n }}\n >\n {icon}\n </button>\n );\n};\n\n// =============================================================================\n// Custom Skema Toolbar\n// =============================================================================\n\nconst SkemaToolbar: React.FC = () => {\n const editor = useEditor();\n const tools = useTools();\n\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\n // Placeholder state (not connected to any tool)\n const [isStarSelected] = useState(false);\n\n return (\n <div\n data-skema=\"toolbar\"\n style={{\n position: 'absolute',\n bottom: 16,\n left: '50%',\n transform: 'translateX(-50%)',\n display: 'flex',\n alignItems: 'center',\n gap: 11,\n padding: '11px 17px',\n backgroundColor: 'white',\n borderRadius: 36,\n boxShadow: '0 2px 10px rgba(0,0,0,0.15)',\n pointerEvents: 'auto',\n zIndex: 99999,\n }}\n >\n <ToolbarButton\n onClick={() => editor.setCurrentTool('select')}\n isSelected={isSelectSelected}\n icon={<SelectIcon isSelected={isSelectSelected} />}\n label=\"Select (V)\"\n />\n <ToolbarButton\n onClick={() => editor.setCurrentTool('lasso-select')}\n isSelected={isLassoSelected}\n icon={<LassoIcon isSelected={isLassoSelected} />}\n label=\"Lasso Select (L)\"\n />\n <ToolbarButton\n onClick={() => editor.setCurrentTool('draw')}\n isSelected={isDrawSelected}\n icon={<DrawIcon isSelected={isDrawSelected} />}\n label=\"Draw (D)\"\n />\n <ToolbarButton\n onClick={() => editor.setCurrentTool('eraser')}\n isSelected={isEraseSelected}\n icon={<EraseIcon isSelected={isEraseSelected} />}\n label=\"Eraser (E)\"\n />\n {/* Separator */}\n <div\n style={{\n width: 3,\n height: 36,\n backgroundColor: '#C4C2C2',\n borderRadius: 1.5,\n margin: '0 6px',\n }}\n />\n {/* Placeholder button - to be implemented later */}\n <ToolbarButton\n onClick={() => {\n // Placeholder - no action yet\n console.log('Star button clicked - placeholder for future feature');\n }}\n isSelected={isStarSelected}\n icon={<StarIcon isSelected={isStarSelected} />}\n label=\"Special (Coming Soon)\"\n />\n </div>\n );\n};\n\n// Lasso overlay component - renders the lasso path while drawing\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// Custom overlays including lasso\nconst SkemaOverlays: React.FC = () => {\n return (\n <>\n <TldrawOverlays />\n <LassoOverlay />\n </>\n );\n};\n\n// Selection highlight overlay component\n// Selections are stored in document coordinates and rendered relative to page content\nconst SelectionOverlay: React.FC<{ selections: DOMSelection[] }> = ({ selections }) => {\n // Track scroll position to trigger re-renders\n const [scrollPos, setScrollPos] = useState({ x: 0, y: 0 });\n\n useEffect(() => {\n const handleScroll = () => {\n setScrollPos({ x: window.scrollX, y: window.scrollY });\n };\n // Initial position\n handleScroll();\n window.addEventListener('scroll', handleScroll, { passive: true });\n return () => window.removeEventListener('scroll', handleScroll);\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// Annotations sidebar\nconst AnnotationsSidebar: React.FC<{\n annotations: Annotation[];\n onClear: () => void;\n onExport: () => void;\n}> = ({ annotations, onClear, onExport }) => {\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' && `🎯 ${(annotation as DOMSelection).tagName}`}\n {annotation.type === 'drawing' && `✏️ ${(annotation as import('../types').DrawingAnnotation).comment || 'Drawing'}`}\n {annotation.type === '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/**\n * Main Skema component - renders tldraw as a transparent overlay\n */\nexport const Skema: React.FC<SkemaProps> = ({\n enabled = true,\n onAnnotationsChange,\n onAnnotationSubmit,\n onAnnotationDelete,\n toggleShortcut = 'mod+shift+e',\n initialAnnotations = [],\n zIndex = 99999,\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 editorRef = useRef<Editor | null>(null);\n const popupRef = useRef<AnnotationPopupHandle>(null);\n const lastDoubleClickRef = useRef<number>(0);\n const justFinishedDrawingRef = useRef<boolean>(false);\n const cleanupRef = useRef<(() => void) | null>(null);\n\n // Handle keyboard shortcut to toggle\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n const isMod = e.metaKey || e.ctrlKey;\n if (isMod && e.shiftKey && e.key.toLowerCase() === 'e') {\n e.preventDefault();\n setIsActive((prev) => !prev);\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, []);\n\n // Track scroll position to sync tldraw camera with page\n const [scrollOffset, setScrollOffset] = useState({ 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 events\n window.addEventListener('scroll', syncScroll, { passive: true });\n\n return () => {\n window.removeEventListener('scroll', syncScroll);\n };\n }, [isActive]);\n\n // Intercept wheel events and scroll the page instead of panning tldraw\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 // Notify parent of annotation changes\n useEffect(() => {\n onAnnotationsChange?.(annotations);\n }, [annotations, onAnnotationsChange]);\n\n // Helper to check if there are drawings in the current tldraw selection\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 // Handle DOM selection from picker - shows annotation popup\n const handleDOMSelect = useCallback((selection: DOMSelection) => {\n // Check if there are also drawings selected\n const selectedDrawings = getSelectedDrawings();\n const hasDrawings = selectedDrawings.length > 0;\n\n // Calculate popup position\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 // Build element description\n let elementDesc = selection.tagName;\n if (hasDrawings) {\n elementDesc = `Drawing + ${selection.tagName}`;\n }\n\n // Set pending annotation to show popup\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 // Handle multi-element selection (from lasso/brush) - shows popup for all selected\n const handleMultiDOMSelect = useCallback((selections: DOMSelection[]) => {\n if (selections.length === 0) return;\n\n // Check if there are also drawings selected\n const selectedDrawings = getSelectedDrawings();\n const hasDrawings = selectedDrawings.length > 0;\n\n // Calculate combined bounding box\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 // Build element description\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 // Add drawing info if present\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 // Submit annotation from popup\n const handleAnnotationSubmit = useCallback(async (comment: string) => {\n if (!pendingAnnotation) return;\n\n if (pendingAnnotation.annotationType === 'dom_selection' && pendingAnnotation.selections) {\n const selections = pendingAnnotation.selections;\n\n if (selections.length === 1) {\n // Single element - create simple annotation\n const selection = { ...selections[0], comment };\n setDomSelections((prev) => [...prev, selection]);\n setAnnotations((prev) => [...prev, { type: 'dom_selection' as const, ...selection }]);\n } else {\n // Multiple elements - create a single grouped annotation\n const groupedSelection: DOMSelection = {\n id: `group-${Date.now()}`,\n selector: selections.map(s => s.selector).join(', '),\n tagName: pendingAnnotation.element, // Already formatted as \"3 elements: div, span, p\"\n elementPath: selections[0].elementPath, // Use first element's path as reference\n text: selections.map(s => s.text).filter(Boolean).join(' | ').slice(0, 200),\n boundingBox: pendingAnnotation.boundingBox!,\n timestamp: Date.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\n setDomSelections((prev) => [...prev, groupedSelection]);\n setAnnotations((prev) => [...prev, { type: 'dom_selection' as const, ...groupedSelection }]);\n }\n } else if (pendingAnnotation.annotationType === 'drawing' && pendingAnnotation.shapeIds) {\n // Handle drawing annotation - extract SVG and nearby elements\n const bbox = pendingAnnotation.boundingBox!;\n\n // Get nearby DOM elements for context\n const nearbyElements = pendingAnnotation.selections?.map(s => ({\n selector: s.selector,\n tagName: s.tagName,\n text: s.text?.slice(0, 100),\n })) || [];\n\n const drawingAnnotation: Annotation = {\n id: `drawing-${Date.now()}`,\n type: 'drawing',\n tool: 'draw',\n shapes: pendingAnnotation.shapeIds,\n boundingBox: bbox,\n timestamp: Date.now(),\n comment,\n nearbyElements,\n };\n setAnnotations((prev) => [...prev, drawingAnnotation]);\n\n // FORENSIC LOGGING - Drawing annotation\n const drawingLog = `\n### ${annotations.length + 1}. Drawing (${pendingAnnotation.shapeIds?.length || 0} shapes)\n**Position:** x:${Math.round(bbox.x)}, y:${Math.round(bbox.y)} (${Math.round(bbox.width)}×${Math.round(bbox.height)}px)\n**Annotation at:** ${((bbox.x + bbox.width / 2) / window.innerWidth * 100).toFixed(1)}% from left, ${Math.round(bbox.y + bbox.height / 2)}px from top\n**Shape IDs:** ${pendingAnnotation.shapeIds?.join(', ') || 'none'}\n**Nearby Elements:** ${nearbyElements.map(e => e.tagName).join(', ') || 'none'}\n**Feedback:** ${comment}\n`;\n console.log(drawingLog);\n }\n\n // Log DOM selection annotations\n if (pendingAnnotation.annotationType === 'dom_selection' && pendingAnnotation.selections) {\n const selections = pendingAnnotation.selections;\n const annotationIndex = annotations.length + 1;\n\n // Build element descriptions\n const elementDescs = selections.map(s => {\n const textPreview = s.text?.slice(0, 50) || '';\n return `${s.tagName.toLowerCase()}${textPreview ? `: \"${textPreview}...\"` : ''}`;\n }).join(', ');\n\n // Get first element for detailed forensic data\n const firstSelection = selections[0];\n const firstElement = document.querySelector(firstSelection.selector) as HTMLElement | null;\n\n let computedStylesStr = 'N/A';\n let nearbyElements = 'N/A';\n\n if (firstElement) {\n // Get computed styles\n const styles = window.getComputedStyle(firstElement);\n computedStylesStr = [\n `color: ${styles.color}`,\n `border-color: ${styles.borderColor}`,\n `font-size: ${styles.fontSize}`,\n `font-weight: ${styles.fontWeight}`,\n `font-family: ${styles.fontFamily}`,\n `line-height: ${styles.lineHeight}`,\n `letter-spacing: ${styles.letterSpacing}`,\n `text-align: ${styles.textAlign}`,\n `width: ${styles.width}`,\n `height: ${styles.height}`,\n `border: ${styles.border}`,\n `display: ${styles.display}`,\n `flex-direction: ${styles.flexDirection}`,\n `opacity: ${styles.opacity}`,\n ].join('; ');\n\n // Get nearby elements (siblings)\n const parent = firstElement.parentElement;\n if (parent) {\n const siblings = Array.from(parent.children)\n .filter(el => el !== firstElement)\n .slice(0, 3)\n .map(el => el.tagName.toLowerCase());\n nearbyElements = siblings.length > 0 ? siblings.join(', ') : 'none';\n }\n }\n\n const bbox = pendingAnnotation.boundingBox!;\n const forensicLog = `\n### ${annotationIndex}. ${selections.length > 1 ? `${selections.length} elements: ` : ''}${elementDescs}\n${selections.length > 1 ? '*Forensic data shown for first element of selection*\\n' : ''}**Full DOM Path:** ${firstSelection.elementPath}\n**Position:** x:${Math.round(bbox.x)}, y:${Math.round(bbox.y)} (${Math.round(bbox.width)}×${Math.round(bbox.height)}px)\n**Annotation at:** ${((bbox.x + bbox.width / 2) / window.innerWidth * 100).toFixed(1)}% from left, ${Math.round(bbox.y + bbox.height / 2)}px from top\n**Computed Styles:** ${computedStylesStr}\n**Nearby Elements:** ${nearbyElements}\n**Feedback:** ${comment}\n`;\n console.log(forensicLog);\n }\n\n // Call onAnnotationSubmit callback for real-time integrations (e.g., Gemini)\n if (onAnnotationSubmit) {\n // Construct the annotation that was just created\n let submittedAnnotation: Annotation;\n\n if (pendingAnnotation.annotationType === 'dom_selection' && pendingAnnotation.selections) {\n const selections = pendingAnnotation.selections;\n if (selections.length === 1) {\n submittedAnnotation = { type: 'dom_selection' as const, ...selections[0], comment };\n } else {\n submittedAnnotation = {\n type: 'dom_selection' as const,\n id: `group-${Date.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: Date.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 }\n } else {\n // Drawing annotation - extract SVG, PNG image, and text from shapes\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 console.log('[Skema] Drawing annotation - shapeIds:', pendingAnnotation.shapeIds);\n\n if (editor && pendingAnnotation.shapeIds && pendingAnnotation.shapeIds.length > 0) {\n const shapeIds = pendingAnnotation.shapeIds as TLShapeId[];\n console.log('[Skema] Exporting', shapeIds.length, 'shapes for image...');\n\n try {\n // Get SVG export of the drawing shapes\n const svgResult = await editor.getSvgString(shapeIds, {\n padding: 20,\n background: false,\n });\n if (svgResult?.svg) {\n // Add grid overlay to SVG for positioning reference\n drawingSvg = addGridToSvg(svgResult.svg, gridConfig);\n console.log('[Skema] SVG export successful');\n }\n } catch (e) {\n console.warn('[Skema] Failed to export drawing SVG:', e);\n }\n\n try {\n // Get PNG image export for vision AI\n const imageResult = await editor.toImage(shapeIds, {\n format: 'png',\n padding: 20,\n background: true,\n });\n console.log('[Skema] toImage result:', imageResult ? 'got result' : 'null', imageResult?.blob ? 'has blob' : 'no blob');\n if (imageResult?.blob) {\n drawingImage = await blobToBase64(imageResult.blob);\n console.log('[Skema] Image export successful, base64 length:', drawingImage?.length);\n }\n } catch (e) {\n console.warn('[Skema] Failed to export drawing image:', e);\n }\n\n // Extract text from text/note shapes\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 // Get nearby DOM elements with computed styles for context\n const nearbyElements = pendingAnnotation.boundingBox\n ? findNearbyElementsWithStyles(pendingAnnotation.boundingBox, 5)\n : [];\n\n // Get project-level style context (CSS framework, design tokens, etc.)\n const projectStyles = extractProjectStyleContext();\n\n // Get viewport info for relative sizing context\n const viewport = getViewportInfo();\n\n submittedAnnotation = {\n id: `drawing-${Date.now()}`,\n type: 'drawing',\n tool: 'draw',\n shapes: pendingAnnotation.shapeIds || [],\n boundingBox: pendingAnnotation.boundingBox!,\n timestamp: Date.now(),\n comment,\n drawingSvg,\n drawingImage,\n extractedText: extractedText || undefined,\n gridConfig,\n nearbyElements,\n viewport,\n projectStyles,\n };\n }\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 // Cancel annotation popup\n const handleAnnotationCancel = useCallback(() => {\n setPendingExiting(true);\n setTimeout(() => {\n setPendingAnnotation(null);\n setPendingExiting(false);\n }, 150);\n }, []);\n\n // Delete an annotation (when clicking on marker)\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 // Call the delete callback (for reverting Gemini changes)\n onAnnotationDelete?.(annotation.id);\n }, [onAnnotationDelete]);\n\n // Clear all annotations\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 // Export annotations\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\n // Copy to clipboard\n navigator.clipboard.writeText(JSON.stringify(exportData, null, 2));\n\n // Also log to console for development\n console.log('[Skema] Exported annotations:', exportData);\n\n alert('Annotations copied to clipboard!');\n }, [annotations]);\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 // Check if this element is not a parent of already added elements\n const isParent = elements.some((existing) => el.contains(existing));\n if (!isParent) {\n // Remove any children of this element that were already added\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 // Handle drawing annotation (triggered when drawings are selected)\n const handleDrawingAnnotation = useCallback((selectedIds: TLShapeId[]) => {\n if (!editorRef.current || selectedIds.length === 0) return;\n // Don't trigger if there's already a pending annotation\n if (pendingAnnotation) return;\n\n const editor = editorRef.current;\n const selectedShapes = selectedIds.map((id) => editor.getShape(id)).filter(Boolean);\n\n if (selectedShapes.length === 0) return;\n\n // Calculate bounds from shapes directly (more reliable than selection bounds)\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n\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\n if (minX === Infinity) return;\n\n const selectionBounds = {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n\n // Check if these are drawing shapes\n const drawingShapes = selectedShapes.filter(shape =>\n shape && ['draw', 'line', 'arrow', 'geo', 'text', 'note'].includes(shape.type)\n );\n\n if (drawingShapes.length === 0) return;\n\n // Check for DOM elements in the selection bounds\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 const domElements = findDOMElementsInBounds(viewportBounds);\n\n // Show annotation popup for drawings (and any DOM elements in bounds)\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 // Build element description\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 // Create DOM selections if there are DOM elements\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: {\n x: selectionBounds.x,\n y: selectionBounds.y,\n width: selectionBounds.width,\n height: selectionBounds.height,\n },\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 // Handle brush/drag selection to select DOM elements\n const handleBrushSelection = useCallback((brushBounds: BoundingBox) => {\n // Convert brush bounds (in document coordinates due to camera sync) to viewport coordinates\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 // Find DOM elements in bounds\n const foundElements = findDOMElementsInBounds(viewportBounds);\n\n // Filter out already selected elements\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 // Create selections and show popup\n const selections = newElements.map(el => createDOMSelection(el));\n\n if (selections.length === 1) {\n handleDOMSelect(selections[0]);\n } else {\n handleMultiDOMSelect(selections);\n }\n }, [findDOMElementsInBounds, domSelections, handleDOMSelect, handleMultiDOMSelect]);\n\n // Check if a point is inside a polygon (ray casting algorithm)\n const isPointInPolygon = useCallback((point: { x: number; y: number }, polygon: { x: number; y: number }[]): 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 // Handle lasso selection to select DOM elements that touch the lasso area\n const handleLassoSelection = useCallback((lassoPoints: { x: number; y: number }[]) => {\n if (lassoPoints.length < 3) return;\n\n // Convert lasso points from page coordinates to viewport coordinates\n const viewportPoints = lassoPoints.map(p => ({\n x: p.x - window.scrollX,\n y: p.y - window.scrollY,\n }));\n\n // Get lasso bounding box for quick intersection check\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\n // Skip tiny elements\n if (rect.width < 10 || rect.height < 10) return;\n\n // Check if element bounding box overlaps with lasso bounding box (any touch = selected)\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 // Check if this element is not a parent of already added elements\n const isParent = foundElements.some((existing) => el.contains(existing));\n if (!isParent) {\n // Remove any children of this element that were already added\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 // Filter out already selected elements\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 // Create selections and show popup\n const selections = newElements.map(el => createDOMSelection(el));\n\n if (selections.length === 1) {\n handleDOMSelect(selections[0]);\n } else {\n handleMultiDOMSelect(selections);\n }\n }, [isPointInPolygon, domSelections, handleDOMSelect, handleMultiDOMSelect]);\n\n // Editor mount handler\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 to disable text creation and select DOM elements\n // See: https://tldraw.dev/examples/custom-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 // Handle double-click on canvas (for DOM elements)\n selectIdleState.handleDoubleClickOnCanvas = (info) => {\n // Record double click time to prevent immediate clearing by pointerdown handler\n lastDoubleClickRef.current = Date.now();\n\n // Find DOM element at the clicked position\n const point = editor.pageToViewport(info.point);\n const elements = document.elementsFromPoint(point.x, point.y);\n\n // Find the first valid DOM element (ignoring overlay/UI)\n const target = elements.find(el =>\n el instanceof HTMLElement && !shouldIgnoreElement(el as HTMLElement)\n ) as HTMLElement | undefined;\n\n if (target) {\n // NOTE: We no longer clear existing annotations on double-click.\n // Annotations persist until explicitly deleted by the user.\n\n // Create selection and show popup\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 }\n } catch (e) {\n console.warn('Failed to override double click behavior', e);\n }\n\n // Set initial camera to match current scroll position\n editor.setCamera({ x: -window.scrollX, y: -window.scrollY, z: 1 });\n\n // Prevent zoom changes (only allow position changes for scroll sync)\n editor.sideEffects.registerAfterChangeHandler('camera', () => {\n const camera = editor.getCamera();\n // Only reset if zoom changed, allow position changes for scroll sync\n if (camera.z !== 1) {\n editor.setCamera({ x: camera.x, y: camera.y, z: 1 });\n }\n });\n\n\n\n // Get the lasso select tool instance and set callbacks\n const lassoSelectTool = editor.root.children?.['lasso-select'] as LassoSelectTool | undefined;\n if (lassoSelectTool) {\n // NOTE: We no longer clear annotations on single click.\n // Annotations persist until explicitly deleted by the user.\n\n // Set lasso complete callback (for selecting DOM elements)\n if ('setOnLassoComplete' in lassoSelectTool) {\n lassoSelectTool.setOnLassoComplete((points) => {\n handleLassoSelection(points);\n });\n }\n }\n\n // Track brush selection for drag-selecting DOM elements\n let lastBrush: { x: number; y: number; w: number; h: number } | null = null;\n\n editor.sideEffects.registerAfterChangeHandler('instance', (prev, next) => {\n // Check if brush selection just ended\n if (prev.brush && !next.brush && lastBrush) {\n // Brush selection completed - find DOM elements in the brush area\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 // Store the current brush bounds\n lastBrush = next.brush;\n }\n return;\n });\n\n // Note: Auto-select after drawing is disabled\n // Users must manually select their drawings to annotate them\n }, [handleDOMSelect, handleBrushSelection, handleLassoSelection, handleMultiDOMSelect, handleDrawingAnnotation]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (cleanupRef.current) {\n cleanupRef.current();\n }\n };\n }, []);\n\n // Handle single click to clear DOM selections or shake popup\n useEffect(() => {\n if (!isActive) return;\n\n const handlePointerDown = (e: PointerEvent) => {\n // Only handle left clicks\n if (e.button !== 0) return;\n\n const target = e.target as HTMLElement;\n\n // If clicking on the popup, don't do anything\n if (target.closest('[data-skema=\"annotation-popup\"]')) return;\n\n // If there's a pending annotation and clicking elsewhere, cancel it\n if (pendingAnnotation) {\n e.preventDefault();\n e.stopPropagation();\n handleAnnotationCancel();\n return;\n }\n\n // If shift key is pressed, don't clear selections (preserve multi-select intent)\n if (e.shiftKey) return;\n\n // Check if clicking on tldraw canvas (not on UI elements)\n if (!target.closest('.tl-canvas')) return;\n\n // NOTE: We intentionally do NOT clear annotations on click.\n // Annotations persist until explicitly deleted by the user (via marker click).\n // This ensures that once a user submits an annotation, it stays visible.\n };\n\n document.addEventListener('pointerdown', handlePointerDown, { capture: true });\n return () => document.removeEventListener('pointerdown', handlePointerDown, { capture: true });\n }, [isActive, pendingAnnotation, handleAnnotationCancel]);\n\n // Custom components\n // Reference: https://tldraw.dev/examples/ui-components-hidden\n const components: 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 // UI overrides to add DOM picker and lasso select tools\n const overrides: TLUiOverrides = {\n tools(editor, tools) {\n return {\n ...tools,\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 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's \"Back to Content\" button */}\n <style>{`\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 `}</style>\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={components}\n overrides={overrides}\n onMount={handleMount}\n hideUi={false}\n inferDarkMode={false}\n options={{\n // Disable camera constraints that would interfere with overlay mode\n maxPages: 1,\n }}\n >\n <SkemaToolbar />\n </Tldraw>\n </div>\n\n {/* DOM selection highlights */}\n <SelectionOverlay selections={domSelections} />\n\n {/* Annotation markers (numbered indicators) */}\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 {/* Highlight outline for pending selection */}\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 {/* Annotation popup */}\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 // Position popup centered horizontally\n left: Math.max(\n 160,\n Math.min(\n window.innerWidth - 160,\n (pendingAnnotation.x / 100) * window.innerWidth\n )\n ),\n // Position above or below based on viewport space\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 </div>\n );\n};\n\nexport default Skema;\n"]}