made-refine 0.1.2 → 0.1.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/provider.tsx","../src/portal-container.tsx","styles.css","../src/utils.ts","../src/ui/color-utils.ts","../src/mcp-client.ts","../src/panel.tsx","../src/ui/button.tsx","../src/cn.ts","../src/ui/input.tsx","../src/ui/tooltip.tsx","../src/ui/select.tsx","../src/ui/color-picker.tsx","../src/ui/slider.tsx","../src/use-measurement.ts","../src/measurement-overlay.tsx","../src/use-move.ts","../src/use-guidelines.ts","../src/move-overlay.tsx","../src/selection-overlay.tsx","../src/comment-overlay.tsx","../src/toolbar.tsx","../src/rulers-overlay.tsx","../src/use-toolbar-dock.ts","../src/direct-edit.tsx","../src/demo.tsx"],"sourcesContent":["import * as React from 'react'\nimport { PortalContainerProvider, usePortalContainer } from './portal-container'\nimport type {\n DirectEditState,\n SpacingPropertyKey,\n BorderRadiusPropertyKey,\n BorderPropertyKey,\n BorderProperties,\n FlexPropertyKey,\n SizingPropertyKey,\n TypographyPropertyKey,\n CSSPropertyValue,\n SizingValue,\n ColorPropertyKey,\n ColorValue,\n UndoEntry,\n ActiveTool,\n Theme,\n Comment,\n SessionEdit,\n} from './types'\nimport type { MoveInfo } from './use-move'\nimport {\n getComputedStyles,\n getComputedBorderStyles,\n getOriginalInlineStyles,\n getElementInfo,\n formatPropertyValue,\n propertyToCSSMap,\n borderRadiusPropertyToCSSMap,\n borderPropertyToCSSMap,\n flexPropertyToCSSMap,\n sizingPropertyToCSSMap,\n typographyPropertyToCSSMap,\n getComputedSizing,\n sizingValueToCSS,\n getComputedColorStyles,\n colorPropertyToCSSMap,\n getComputedTypography,\n buildElementContext,\n buildEditExport,\n buildCommentExport,\n buildSessionExport,\n getElementDisplayName,\n getElementLocator,\n stylesToTailwind,\n isTextElement,\n} from './utils'\nimport { formatColorValue } from './ui/color-utils'\nimport { sendEditToAgent as postEditToAgent, sendCommentToAgent as postCommentToAgent } from './mcp-client'\n\nexport interface DirectEditContextValue extends DirectEditState {\n selectElement: (element: HTMLElement) => void\n selectParent: () => void\n selectChild: () => void\n closePanel: () => void\n updateSpacingProperty: (key: SpacingPropertyKey, value: CSSPropertyValue) => void\n updateBorderRadiusProperty: (key: BorderRadiusPropertyKey, value: CSSPropertyValue) => void\n updateBorderProperty: (key: BorderPropertyKey, value: BorderProperties[BorderPropertyKey]) => void\n updateBorderProperties: (changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]>) => void\n updateFlexProperty: (key: FlexPropertyKey, value: string) => void\n toggleFlexLayout: () => void\n updateSizingProperty: (key: SizingPropertyKey, value: SizingValue) => void\n updateColorProperty: (key: ColorPropertyKey, value: ColorValue) => void\n updateTypographyProperty: (key: TypographyPropertyKey, value: CSSPropertyValue | string) => void\n resetToOriginal: () => void\n exportEdits: () => Promise<boolean>\n toggleEditMode: () => void\n undo: () => void\n handleMoveComplete: (element: HTMLElement, moveInfo: MoveInfo | null) => void\n setActiveTool: (tool: ActiveTool) => void\n setTheme: (theme: Theme) => void\n addComment: (element: HTMLElement, clickPosition: { x: number; y: number }) => void\n updateCommentText: (id: string, text: string) => void\n addCommentReply: (id: string, text: string) => void\n deleteComment: (id: string) => void\n exportComment: (id: string) => Promise<boolean>\n sendEditToAgent: () => Promise<boolean>\n sendCommentToAgent: (id: string) => Promise<boolean>\n setActiveCommentId: (id: string | null) => void\n sessionEditCount: number\n getSessionEdits: () => SessionEdit[]\n exportAllEdits: () => Promise<boolean>\n clearSessionEdits: () => void\n removeSessionEdit: (element: HTMLElement) => void\n startTextEditing: (element: HTMLElement) => void\n commitTextEditing: () => void\n}\n\nconst DirectEditContext = React.createContext<DirectEditContextValue | null>(null)\n\nexport function useDirectEdit(): DirectEditContextValue {\n const context = React.useContext(DirectEditContext)\n if (!context) {\n throw new Error('useDirectEdit must be used within a DirectEditProvider')\n }\n return context\n}\n\ninterface DirectEditProviderProps {\n children: React.ReactNode\n}\n\nexport function DirectEditProvider({ children }: DirectEditProviderProps) {\n\n const [state, setState] = React.useState<DirectEditState>({\n isOpen: false,\n selectedElement: null,\n elementInfo: null,\n computedSpacing: null,\n computedBorderRadius: null,\n computedBorder: null,\n computedFlex: null,\n computedSizing: null,\n computedColor: null,\n computedTypography: null,\n originalStyles: {},\n pendingStyles: {},\n editModeActive: false,\n activeTool: 'select',\n theme: 'system',\n comments: [],\n activeCommentId: null,\n textEditingElement: null,\n })\n\n // Read persisted theme on mount (SSR-safe)\n React.useEffect(() => {\n try {\n const stored = localStorage.getItem('direct-edit-theme')\n if (stored === 'light' || stored === 'dark' || stored === 'system') {\n setState((prev) => ({ ...prev, theme: stored }))\n }\n } catch {}\n }, [])\n\n const undoStackRef = React.useRef<UndoEntry[]>([])\n const sessionEditsRef = React.useRef<Map<HTMLElement, SessionEdit>>(new Map())\n const removedSessionEditsRef = React.useRef<WeakSet<HTMLElement>>(new WeakSet())\n const [sessionEditCount, setSessionEditCount] = React.useState(0)\n const stateRef = React.useRef(state)\n React.useEffect(() => {\n stateRef.current = state\n })\n\n const pushUndo = React.useCallback((entry: UndoEntry) => {\n undoStackRef.current.push(entry)\n if (undoStackRef.current.length > 50) {\n undoStackRef.current = undoStackRef.current.slice(-50)\n }\n if (entry.type === 'edit' || entry.type === 'move' || entry.type === 'textEdit') {\n removedSessionEditsRef.current.delete(entry.element)\n }\n }, [])\n\n const saveCurrentToSession = React.useCallback(() => {\n const current = stateRef.current\n const el = current.selectedElement\n if (!el) return\n if (removedSessionEditsRef.current.has(el)) return\n\n const existing = sessionEditsRef.current.get(el)\n const pendingStyles = { ...current.pendingStyles }\n const hasPendingStyles = Object.keys(pendingStyles).length > 0\n const hasMove = Boolean(existing?.move)\n const hasTextEdit = Boolean(existing?.textEdit)\n\n if (!hasPendingStyles && !hasMove && !hasTextEdit) {\n if (sessionEditsRef.current.delete(el)) {\n setSessionEditCount(sessionEditsRef.current.size)\n }\n return\n }\n\n const locator = getElementLocator(el)\n sessionEditsRef.current.set(el, {\n element: el,\n locator,\n originalStyles: existing?.originalStyles ?? { ...current.originalStyles },\n pendingStyles,\n move: existing?.move ?? null,\n textEdit: existing?.textEdit ?? null,\n })\n setSessionEditCount(sessionEditsRef.current.size)\n }, [])\n\n React.useEffect(() => {\n if (!state.selectedElement) return\n saveCurrentToSession()\n }, [state.selectedElement, state.pendingStyles, saveCurrentToSession])\n\n const selectElement = React.useCallback((element: HTMLElement) => {\n saveCurrentToSession()\n const current = stateRef.current\n if (current.selectedElement || current.isOpen) {\n pushUndo({\n type: 'selection',\n previousElement: current.selectedElement,\n previousOriginalStyles: { ...current.originalStyles },\n previousPendingStyles: { ...current.pendingStyles },\n })\n }\n\n const { spacing, borderRadius, flex } = getComputedStyles(element)\n const border = getComputedBorderStyles(element)\n const sizing = getComputedSizing(element)\n const color = getComputedColorStyles(element)\n const typography = getComputedTypography(element)\n const originalStyles = getOriginalInlineStyles(element)\n const elementInfo = getElementInfo(element)\n\n setState((prev) => ({\n isOpen: true,\n selectedElement: element,\n elementInfo,\n computedSpacing: spacing,\n computedBorderRadius: borderRadius,\n computedBorder: border,\n computedFlex: flex,\n computedSizing: sizing,\n computedColor: color,\n computedTypography: typography,\n originalStyles,\n pendingStyles: {},\n editModeActive: prev.editModeActive,\n activeTool: prev.activeTool,\n theme: prev.theme,\n comments: prev.comments,\n activeCommentId: prev.activeCommentId,\n textEditingElement: null,\n }))\n\n // Auto-copy element context to clipboard on selection\n const locator = getElementLocator(element)\n const context = buildElementContext(locator)\n navigator.clipboard.writeText(`implement the visual edits\\n\\n${context}`).catch(() => {})\n }, [pushUndo, saveCurrentToSession])\n\n const finalizeTextEditing = React.useCallback((editingElement: HTMLElement) => {\n const newText = editingElement.textContent ?? ''\n const existing = sessionEditsRef.current.get(editingElement)\n const originalText = existing?.textEdit?.originalText\n ?? editingElement.getAttribute('data-direct-edit-original-text')\n ?? newText\n const previousText = existing?.textEdit?.newText ?? originalText\n\n editingElement.removeAttribute('contenteditable')\n editingElement.removeAttribute('data-direct-edit-original-text')\n editingElement.style.outline = ''\n editingElement.style.outlineOffset = ''\n editingElement.blur()\n\n if (newText !== previousText) {\n pushUndo({ type: 'textEdit', element: editingElement, originalText, previousText })\n removedSessionEditsRef.current.delete(editingElement)\n\n if (newText === originalText) {\n // Reverted to original - remove textEdit from session\n if (existing) {\n if (Object.keys(existing.pendingStyles).length > 0 || existing.move) {\n sessionEditsRef.current.set(editingElement, { ...existing, textEdit: null })\n } else {\n sessionEditsRef.current.delete(editingElement)\n }\n }\n } else {\n const current = stateRef.current\n const locator = existing?.locator ?? getElementLocator(editingElement)\n const originalStyles = existing?.originalStyles\n ?? (current.selectedElement === editingElement ? { ...current.originalStyles } : {})\n const pendingStyles = existing?.pendingStyles\n ?? (current.selectedElement === editingElement ? { ...current.pendingStyles } : {})\n sessionEditsRef.current.set(editingElement, {\n element: editingElement,\n locator,\n originalStyles,\n pendingStyles,\n move: existing?.move ?? null,\n textEdit: { originalText, newText },\n })\n }\n setSessionEditCount(sessionEditsRef.current.size)\n }\n\n setState((prev) => (prev.textEditingElement ? { ...prev, textEditingElement: null } : prev))\n }, [pushUndo])\n\n const closePanel = React.useCallback(() => {\n setState((prev) => ({\n ...prev,\n isOpen: false,\n }))\n }, [])\n\n const toggleEditMode = React.useCallback(() => {\n const current = stateRef.current\n if (current.editModeActive && current.textEditingElement) {\n finalizeTextEditing(current.textEditingElement)\n }\n\n setState((prev) => ({\n ...prev,\n editModeActive: !prev.editModeActive,\n activeTool: prev.editModeActive ? 'select' : prev.activeTool,\n activeCommentId: prev.editModeActive ? null : prev.activeCommentId,\n }))\n }, [finalizeTextEditing])\n\n const selectParent = React.useCallback(() => {\n if (state.selectedElement?.parentElement) {\n selectElement(state.selectedElement.parentElement)\n }\n }, [state.selectedElement, selectElement])\n\n const selectChild = React.useCallback(() => {\n const firstChild = state.selectedElement?.firstElementChild as HTMLElement | null\n if (firstChild) {\n selectElement(firstChild)\n }\n }, [state.selectedElement, selectElement])\n\n const updateSpacingProperty = React.useCallback(\n (key: SpacingPropertyKey, value: CSSPropertyValue) => {\n if (!state.selectedElement) return\n\n const cssProperty = propertyToCSSMap[key]\n const cssValue = formatPropertyValue(value)\n\n const previousValue = state.selectedElement.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: state.selectedElement, properties: [{ cssProperty, previousValue }] })\n\n state.selectedElement.style.setProperty(cssProperty, cssValue)\n\n setState((prev) => ({\n ...prev,\n computedSpacing: prev.computedSpacing\n ? {\n ...prev.computedSpacing,\n [key]: value,\n }\n : null,\n pendingStyles: {\n ...prev.pendingStyles,\n [cssProperty]: cssValue,\n },\n }))\n },\n [state.selectedElement, pushUndo]\n )\n\n const updateBorderRadiusProperty = React.useCallback(\n (key: BorderRadiusPropertyKey, value: CSSPropertyValue) => {\n if (!state.selectedElement) return\n\n const cssProperty = borderRadiusPropertyToCSSMap[key]\n const cssValue = formatPropertyValue(value)\n\n const previousValue = state.selectedElement.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: state.selectedElement, properties: [{ cssProperty, previousValue }] })\n\n state.selectedElement.style.setProperty(cssProperty, cssValue)\n\n setState((prev) => ({\n ...prev,\n computedBorderRadius: prev.computedBorderRadius\n ? {\n ...prev.computedBorderRadius,\n [key]: value,\n }\n : null,\n pendingStyles: {\n ...prev.pendingStyles,\n [cssProperty]: cssValue,\n },\n }))\n },\n [state.selectedElement, pushUndo]\n )\n\n const updateBorderProperty = React.useCallback(\n (key: BorderPropertyKey, value: BorderProperties[BorderPropertyKey]) => {\n if (!state.selectedElement) return\n\n const cssProperty = borderPropertyToCSSMap[key]\n const cssValue = typeof value === 'string' ? value : formatPropertyValue(value)\n\n const previousValue = state.selectedElement.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: state.selectedElement, properties: [{ cssProperty, previousValue }] })\n\n state.selectedElement.style.setProperty(cssProperty, cssValue)\n\n const border = getComputedBorderStyles(state.selectedElement)\n const color = getComputedColorStyles(state.selectedElement)\n\n setState((prev) => ({\n ...prev,\n computedBorder: border,\n computedColor: color,\n pendingStyles: {\n ...prev.pendingStyles,\n [cssProperty]: cssValue,\n },\n }))\n },\n [state.selectedElement, pushUndo]\n )\n\n const updateBorderProperties = React.useCallback(\n (changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]>) => {\n if (!state.selectedElement || changes.length === 0) return\n\n const properties: Array<{ cssProperty: string; previousValue: string | null }> = []\n const pendingUpdates: Record<string, string> = {}\n\n for (const [key, value] of changes) {\n const cssProperty = borderPropertyToCSSMap[key]\n const cssValue = typeof value === 'string' ? value : formatPropertyValue(value)\n\n const previousValue = state.selectedElement.style.getPropertyValue(cssProperty) || null\n properties.push({ cssProperty, previousValue })\n\n state.selectedElement.style.setProperty(cssProperty, cssValue)\n pendingUpdates[cssProperty] = cssValue\n }\n\n pushUndo({ type: 'edit', element: state.selectedElement, properties })\n\n const border = getComputedBorderStyles(state.selectedElement)\n const color = getComputedColorStyles(state.selectedElement)\n\n setState((prev) => ({\n ...prev,\n computedBorder: border,\n computedColor: color,\n pendingStyles: {\n ...prev.pendingStyles,\n ...pendingUpdates,\n },\n }))\n },\n [state.selectedElement, pushUndo]\n )\n\n const updateFlexProperty = React.useCallback(\n (key: FlexPropertyKey, value: string) => {\n if (!state.selectedElement) return\n\n const cssProperty = flexPropertyToCSSMap[key]\n\n const previousValue = state.selectedElement.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: state.selectedElement, properties: [{ cssProperty, previousValue }] })\n\n state.selectedElement.style.setProperty(cssProperty, value)\n\n setState((prev) => ({\n ...prev,\n computedFlex: prev.computedFlex\n ? {\n ...prev.computedFlex,\n [key]: value,\n }\n : null,\n pendingStyles: {\n ...prev.pendingStyles,\n [cssProperty]: value,\n },\n }))\n },\n [state.selectedElement, pushUndo]\n )\n\n const toggleFlexLayout = React.useCallback(() => {\n if (!state.selectedElement) return\n\n const element = state.selectedElement\n const flexProps = ['display', 'flex-direction', 'justify-content', 'align-items'] as const\n const properties = flexProps.map((cssProperty) => ({\n cssProperty,\n previousValue: element.style.getPropertyValue(cssProperty) || null,\n }))\n\n pushUndo({ type: 'edit', element, properties })\n\n const isCurrentlyFlex = state.elementInfo?.isFlexContainer ?? false\n\n if (isCurrentlyFlex) {\n for (const cssProperty of flexProps) {\n element.style.removeProperty(cssProperty)\n }\n } else {\n element.style.setProperty('display', 'flex')\n }\n\n const { spacing, borderRadius, flex } = getComputedStyles(element)\n const sizing = getComputedSizing(element)\n const elementInfo = getElementInfo(element)\n\n const newPending = { ...stateRef.current.pendingStyles }\n if (isCurrentlyFlex) {\n for (const cssProperty of flexProps) {\n delete newPending[cssProperty]\n }\n } else {\n newPending['display'] = 'flex'\n }\n\n setState((prev) => ({\n ...prev,\n computedFlex: flex,\n computedSpacing: spacing,\n computedBorderRadius: borderRadius,\n computedSizing: sizing,\n elementInfo,\n pendingStyles: newPending,\n }))\n }, [state.selectedElement, state.elementInfo, pushUndo])\n\n const updateSizingProperty = React.useCallback(\n (key: SizingPropertyKey, value: SizingValue) => {\n if (!state.selectedElement) return\n\n const cssProperty = sizingPropertyToCSSMap[key]\n const cssValue = sizingValueToCSS(value)\n\n const previousValue = state.selectedElement.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: state.selectedElement, properties: [{ cssProperty, previousValue }] })\n\n state.selectedElement.style.setProperty(cssProperty, cssValue)\n\n setState((prev) => ({\n ...prev,\n computedSizing: prev.computedSizing\n ? {\n ...prev.computedSizing,\n [key]: value,\n }\n : null,\n pendingStyles: {\n ...prev.pendingStyles,\n [cssProperty]: cssValue,\n },\n }))\n },\n [state.selectedElement, pushUndo]\n )\n\n const updateColorProperty = React.useCallback(\n (key: ColorPropertyKey, value: ColorValue) => {\n if (!state.selectedElement) return\n\n const cssProperty = colorPropertyToCSSMap[key]\n const cssValue = formatColorValue(value)\n\n const previousValue = state.selectedElement.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: state.selectedElement, properties: [{ cssProperty, previousValue }] })\n\n state.selectedElement.style.setProperty(cssProperty, cssValue)\n\n setState((prev) => ({\n ...prev,\n computedColor: prev.computedColor\n ? {\n ...prev.computedColor,\n [key]: value,\n }\n : null,\n pendingStyles: {\n ...prev.pendingStyles,\n [cssProperty]: cssValue,\n },\n }))\n },\n [state.selectedElement, pushUndo]\n )\n\n const updateTypographyProperty = React.useCallback(\n (key: TypographyPropertyKey, value: CSSPropertyValue | string) => {\n if (!state.selectedElement) return\n\n const cssProperty = typographyPropertyToCSSMap[key]\n const cssValue = typeof value === 'string' ? value : formatPropertyValue(value)\n\n if (key === 'textVerticalAlign') {\n const prevDisplay = state.selectedElement.style.getPropertyValue('display') || null\n const prevAlignItems = state.selectedElement.style.getPropertyValue('align-items') || null\n pushUndo({\n type: 'edit',\n element: state.selectedElement,\n properties: [\n { cssProperty: 'display', previousValue: prevDisplay },\n { cssProperty: 'align-items', previousValue: prevAlignItems },\n ],\n })\n\n const computed = window.getComputedStyle(state.selectedElement)\n const isInline = computed.display === 'inline' || computed.display === 'inline-block'\n const displayValue = isInline ? 'inline-flex' : 'flex'\n state.selectedElement.style.setProperty('display', displayValue)\n state.selectedElement.style.setProperty('align-items', cssValue)\n } else {\n const previousValue = state.selectedElement.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: state.selectedElement, properties: [{ cssProperty, previousValue }] })\n\n state.selectedElement.style.setProperty(cssProperty, cssValue)\n }\n\n setState((prev) => {\n let displayValue = 'flex'\n if (key === 'textVerticalAlign' && state.selectedElement) {\n const computed = window.getComputedStyle(state.selectedElement)\n const isInline = computed.display === 'inline-flex' || prev.pendingStyles.display === 'inline-flex'\n displayValue = isInline ? 'inline-flex' : 'flex'\n }\n\n return {\n ...prev,\n computedTypography: prev.computedTypography\n ? {\n ...prev.computedTypography,\n [key]: value,\n }\n : null,\n pendingStyles: {\n ...prev.pendingStyles,\n ...(key === 'textVerticalAlign'\n ? { display: displayValue, 'align-items': cssValue }\n : { [cssProperty]: cssValue }),\n },\n }\n })\n },\n [state.selectedElement, pushUndo]\n )\n\n const resetToOriginal = React.useCallback(() => {\n if (!state.selectedElement) return\n\n const el = state.selectedElement\n const sessionEntry = sessionEditsRef.current.get(el)\n if (sessionEntry?.textEdit) {\n el.textContent = sessionEntry.textEdit.originalText\n }\n if (sessionEntry?.move) {\n sessionEditsRef.current.set(el, { ...sessionEntry, pendingStyles: {}, textEdit: null })\n } else {\n sessionEditsRef.current.delete(el)\n }\n setSessionEditCount(sessionEditsRef.current.size)\n undoStackRef.current = undoStackRef.current.filter(\n (entry) => !((entry.type === 'edit' || entry.type === 'textEdit') && entry.element === el)\n )\n\n const allCSSProps = [\n ...Object.values(propertyToCSSMap),\n ...Object.values(borderRadiusPropertyToCSSMap),\n ...Object.values(borderPropertyToCSSMap),\n ...Object.values(flexPropertyToCSSMap),\n ...Object.values(sizingPropertyToCSSMap),\n ...Object.values(colorPropertyToCSSMap),\n ...Object.values(typographyPropertyToCSSMap),\n ]\n\n for (const prop of allCSSProps) {\n state.selectedElement.style.removeProperty(prop)\n }\n\n for (const [prop, value] of Object.entries(state.originalStyles)) {\n state.selectedElement.style.setProperty(prop, value)\n }\n\n const { spacing, borderRadius, flex } = getComputedStyles(state.selectedElement)\n const border = getComputedBorderStyles(state.selectedElement)\n const sizing = getComputedSizing(state.selectedElement)\n const color = getComputedColorStyles(state.selectedElement)\n const typography = getComputedTypography(state.selectedElement)\n\n setState((prev) => ({\n ...prev,\n computedSpacing: spacing,\n computedBorderRadius: borderRadius,\n computedBorder: border,\n computedFlex: flex,\n computedSizing: sizing,\n computedColor: color,\n computedTypography: typography,\n pendingStyles: {},\n }))\n }, [state.selectedElement, state.originalStyles])\n\n const undo = React.useCallback(() => {\n const entry = undoStackRef.current.pop()\n if (!entry) return\n\n switch (entry.type) {\n case 'edit': {\n if (!entry.element.isConnected) return\n for (const { cssProperty, previousValue } of entry.properties) {\n if (previousValue === null) {\n entry.element.style.removeProperty(cssProperty)\n } else {\n entry.element.style.setProperty(cssProperty, previousValue)\n }\n }\n const current = stateRef.current\n if (current.selectedElement === entry.element) {\n const { spacing, borderRadius, flex } = getComputedStyles(entry.element)\n const border = getComputedBorderStyles(entry.element)\n const sizing = getComputedSizing(entry.element)\n const color = getComputedColorStyles(entry.element)\n const typography = getComputedTypography(entry.element)\n const elementInfo = getElementInfo(entry.element)\n const newPending = { ...current.pendingStyles }\n for (const { cssProperty, previousValue } of entry.properties) {\n if (previousValue === null) {\n delete newPending[cssProperty]\n } else {\n newPending[cssProperty] = previousValue\n }\n }\n setState((prev) => ({\n ...prev,\n computedSpacing: spacing,\n computedBorderRadius: borderRadius,\n computedBorder: border,\n computedFlex: flex,\n computedSizing: sizing,\n computedColor: color,\n computedTypography: typography,\n elementInfo,\n pendingStyles: newPending,\n }))\n }\n break\n }\n case 'selection': {\n const prevEl = entry.previousElement\n if (prevEl && !prevEl.isConnected) return\n if (prevEl) {\n for (const [prop, value] of Object.entries(entry.previousPendingStyles)) {\n prevEl.style.setProperty(prop, value)\n }\n const { spacing, borderRadius, flex } = getComputedStyles(prevEl)\n const border = getComputedBorderStyles(prevEl)\n const sizing = getComputedSizing(prevEl)\n const color = getComputedColorStyles(prevEl)\n const typography = getComputedTypography(prevEl)\n const elementInfo = getElementInfo(prevEl)\n setState((prev) => ({\n isOpen: true,\n selectedElement: prevEl,\n elementInfo,\n computedSpacing: spacing,\n computedBorderRadius: borderRadius,\n computedBorder: border,\n computedFlex: flex,\n computedSizing: sizing,\n computedColor: color,\n computedTypography: typography,\n originalStyles: entry.previousOriginalStyles,\n pendingStyles: entry.previousPendingStyles,\n editModeActive: prev.editModeActive,\n activeTool: prev.activeTool,\n theme: prev.theme,\n comments: prev.comments,\n activeCommentId: prev.activeCommentId,\n textEditingElement: null,\n }))\n } else {\n setState((prev) => ({\n ...prev,\n isOpen: false,\n selectedElement: null,\n elementInfo: null,\n computedSpacing: null,\n computedBorderRadius: null,\n computedBorder: null,\n computedFlex: null,\n computedSizing: null,\n computedColor: null,\n computedTypography: null,\n originalStyles: {},\n pendingStyles: {},\n }))\n }\n break\n }\n case 'move': {\n if (!entry.element.isConnected) return\n try {\n if (entry.originalNextSibling) {\n entry.originalParent.insertBefore(entry.element, entry.originalNextSibling)\n } else {\n entry.originalParent.appendChild(entry.element)\n }\n } catch {\n // Ignore invalid DOM moves\n }\n const sessionEntry = sessionEditsRef.current.get(entry.element)\n if (sessionEntry) {\n const restoredMove = entry.previousSessionMove\n if (Object.keys(sessionEntry.pendingStyles).length > 0 || restoredMove || sessionEntry.textEdit) {\n sessionEditsRef.current.set(entry.element, { ...sessionEntry, move: restoredMove })\n } else {\n sessionEditsRef.current.delete(entry.element)\n }\n setSessionEditCount(sessionEditsRef.current.size)\n }\n const current = stateRef.current\n if (current.selectedElement === entry.element) {\n const elementInfo = getElementInfo(entry.element)\n setState((prev) => ({ ...prev, elementInfo }))\n }\n break\n }\n case 'textEdit': {\n if (!entry.element.isConnected) return\n entry.element.textContent = entry.previousText\n\n const desiredTextEdit = entry.previousText === entry.originalText\n ? null\n : { originalText: entry.originalText, newText: entry.previousText }\n const sessionEntry = sessionEditsRef.current.get(entry.element)\n\n if (sessionEntry) {\n if (desiredTextEdit) {\n sessionEditsRef.current.set(entry.element, {\n ...sessionEntry,\n textEdit: desiredTextEdit,\n })\n } else if (Object.keys(sessionEntry.pendingStyles).length > 0 || sessionEntry.move) {\n sessionEditsRef.current.set(entry.element, { ...sessionEntry, textEdit: null })\n } else {\n sessionEditsRef.current.delete(entry.element)\n }\n } else if (desiredTextEdit) {\n const current = stateRef.current\n sessionEditsRef.current.set(entry.element, {\n element: entry.element,\n locator: getElementLocator(entry.element),\n originalStyles: current.selectedElement === entry.element ? { ...current.originalStyles } : {},\n pendingStyles: current.selectedElement === entry.element ? { ...current.pendingStyles } : {},\n move: null,\n textEdit: desiredTextEdit,\n })\n }\n\n setSessionEditCount(sessionEditsRef.current.size)\n break\n }\n }\n }, [])\n\n const handleMoveComplete = React.useCallback(\n (element: HTMLElement, moveInfo: MoveInfo | null) => {\n if (moveInfo) {\n const existing = sessionEditsRef.current.get(element)\n pushUndo({\n type: 'move',\n element,\n originalParent: moveInfo.originalParent,\n originalNextSibling: moveInfo.originalNextSibling,\n previousSessionMove: existing?.move ?? null,\n })\n const locator = existing?.locator ?? getElementLocator(element)\n const newParent = element.parentElement\n\n // Preserve initial from* from the first move; only update to* on later moves\n const fromFields = existing?.move\n ? {\n fromParentName: existing.move.fromParentName,\n fromSiblingBefore: existing.move.fromSiblingBefore,\n fromSiblingAfter: existing.move.fromSiblingAfter,\n }\n : {\n fromParentName: getElementDisplayName(moveInfo.originalParent),\n fromSiblingBefore: moveInfo.originalPreviousSibling\n ? getElementDisplayName(moveInfo.originalPreviousSibling)\n : null,\n fromSiblingAfter: moveInfo.originalNextSibling\n ? getElementDisplayName(moveInfo.originalNextSibling)\n : null,\n }\n\n sessionEditsRef.current.set(element, {\n element,\n locator,\n originalStyles: existing?.originalStyles ?? { ...stateRef.current.originalStyles },\n pendingStyles: existing?.pendingStyles ?? { ...stateRef.current.pendingStyles },\n textEdit: existing?.textEdit ?? null,\n move: newParent\n ? {\n ...fromFields,\n toParentName: getElementDisplayName(newParent),\n toSiblingBefore: element.previousElementSibling\n ? getElementDisplayName(element.previousElementSibling as HTMLElement)\n : null,\n toSiblingAfter: element.nextElementSibling\n ? getElementDisplayName(element.nextElementSibling as HTMLElement)\n : null,\n }\n : null,\n })\n setSessionEditCount(sessionEditsRef.current.size)\n }\n // Refresh element state without going through selectElement,\n // which would push an extra selection undo entry.\n const { spacing, borderRadius, flex } = getComputedStyles(element)\n const border = getComputedBorderStyles(element)\n const sizing = getComputedSizing(element)\n const color = getComputedColorStyles(element)\n const typography = getComputedTypography(element)\n const elementInfo = getElementInfo(element)\n\n setState((prev) => ({\n isOpen: true,\n selectedElement: element,\n elementInfo,\n computedSpacing: spacing,\n computedBorderRadius: borderRadius,\n computedBorder: border,\n computedFlex: flex,\n computedSizing: sizing,\n computedColor: color,\n computedTypography: typography,\n originalStyles: prev.originalStyles,\n pendingStyles: prev.pendingStyles,\n editModeActive: prev.editModeActive,\n activeTool: prev.activeTool,\n theme: prev.theme,\n comments: prev.comments,\n activeCommentId: prev.activeCommentId,\n textEditingElement: null,\n }))\n },\n [pushUndo]\n )\n\n const setActiveTool = React.useCallback((tool: ActiveTool) => {\n setState((prev) => ({\n ...prev,\n activeTool: tool,\n activeCommentId: null,\n }))\n }, [])\n\n const setTheme = React.useCallback((theme: Theme) => {\n setState((prev) => ({ ...prev, theme }))\n try { localStorage.setItem('direct-edit-theme', theme) } catch {}\n }, [])\n\n const addComment = React.useCallback((element: HTMLElement, clickPosition: { x: number; y: number }) => {\n const locator = getElementLocator(element)\n const rect = element.getBoundingClientRect()\n const relativePosition = {\n x: clickPosition.x - rect.left,\n y: clickPosition.y - rect.top,\n }\n const id = `comment-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`\n const comment: Comment = {\n id,\n element,\n locator,\n clickPosition,\n relativePosition,\n text: '',\n createdAt: Date.now(),\n replies: [],\n }\n setState((prev) => ({\n ...prev,\n comments: [...prev.comments, comment],\n activeCommentId: id,\n }))\n }, [])\n\n const updateCommentText = React.useCallback((id: string, text: string) => {\n setState((prev) => ({\n ...prev,\n comments: prev.comments.map((c) => (c.id === id ? { ...c, text } : c)),\n }))\n }, [])\n\n const addCommentReply = React.useCallback((id: string, text: string) => {\n setState((prev) => ({\n ...prev,\n comments: prev.comments.map((c) =>\n c.id === id\n ? { ...c, replies: [...c.replies, { text, createdAt: Date.now() }] }\n : c\n ),\n }))\n }, [])\n\n const deleteComment = React.useCallback((id: string) => {\n setState((prev) => ({\n ...prev,\n comments: prev.comments.filter((c) => c.id !== id),\n activeCommentId: prev.activeCommentId === id ? null : prev.activeCommentId,\n }))\n }, [])\n\n const exportComment = React.useCallback(async (id: string) => {\n const comment = stateRef.current.comments.find((c) => c.id === id)\n if (!comment) return false\n\n const exportMarkdown = buildCommentExport(comment.locator, comment.text, comment.replies)\n try {\n await navigator.clipboard.writeText(`implement the visual edits\\n\\n${exportMarkdown}`)\n return true\n } catch {\n return false\n }\n }, [])\n\n const setActiveCommentId = React.useCallback((id: string | null) => {\n setState((prev) => {\n let comments = prev.comments\n if (prev.activeCommentId && prev.activeCommentId !== id) {\n const active = comments.find((c) => c.id === prev.activeCommentId)\n if (active && active.text === '') {\n comments = comments.filter((c) => c.id !== prev.activeCommentId)\n }\n }\n return { ...prev, comments, activeCommentId: id }\n })\n }, [])\n\n const startTextEditing = React.useCallback((element: HTMLElement) => {\n if (!isTextElement(element)) return\n if (stateRef.current.textEditingElement) return\n\n // Determine original text: prefer existing session edit's original\n const existing = sessionEditsRef.current.get(element)\n const originalText = existing?.textEdit?.originalText ?? (element.textContent ?? '')\n element.setAttribute('data-direct-edit-original-text', originalText)\n\n element.setAttribute('contenteditable', 'true')\n element.style.outline = '1px solid #0D99FF'\n element.style.outlineOffset = '0px'\n element.focus()\n\n // Select all text for easy replacement\n const selection = window.getSelection()\n if (selection) {\n const range = document.createRange()\n range.selectNodeContents(element)\n selection.removeAllRanges()\n selection.addRange(range)\n }\n\n setState((prev) => ({ ...prev, textEditingElement: element }))\n }, [])\n\n const commitTextEditing = React.useCallback(() => {\n const editingElement = stateRef.current.textEditingElement\n if (!editingElement) return\n\n finalizeTextEditing(editingElement)\n }, [finalizeTextEditing])\n\n // Click-outside listener for text editing\n React.useEffect(() => {\n const editingElement = state.textEditingElement\n if (!editingElement) return\n\n function handleMouseDown(e: MouseEvent) {\n if (!editingElement!.contains(e.target as Node)) {\n commitTextEditing()\n }\n }\n\n // Delay to avoid catching the double-click that started editing\n const rafId = requestAnimationFrame(() => {\n document.addEventListener('mousedown', handleMouseDown, true)\n })\n\n return () => {\n cancelAnimationFrame(rafId)\n document.removeEventListener('mousedown', handleMouseDown, true)\n }\n }, [state.textEditingElement, commitTextEditing])\n\n const getSessionEdits = React.useCallback((): SessionEdit[] => {\n saveCurrentToSession()\n const edits: SessionEdit[] = []\n for (const edit of sessionEditsRef.current.values()) {\n if (!edit.element.isConnected) {\n sessionEditsRef.current.delete(edit.element)\n continue\n }\n edits.push(edit)\n }\n setSessionEditCount(sessionEditsRef.current.size)\n return edits\n }, [saveCurrentToSession])\n\n const exportAllEdits = React.useCallback(async (): Promise<boolean> => {\n const edits = getSessionEdits()\n if (edits.length === 0) return false\n const text = buildSessionExport(edits)\n try {\n await navigator.clipboard.writeText(`implement the visual edits\\n\\n${text}`)\n return true\n } catch {\n return false\n }\n }, [getSessionEdits])\n\n const revertElementStyles = React.useCallback((element: HTMLElement, sessionEdit: SessionEdit) => {\n for (const prop of Object.keys(sessionEdit.pendingStyles)) {\n element.style.removeProperty(prop)\n }\n for (const [prop, value] of Object.entries(sessionEdit.originalStyles)) {\n element.style.setProperty(prop, value)\n }\n }, [])\n\n const refreshSelectedElement = React.useCallback(() => {\n const current = stateRef.current\n if (!current.selectedElement) return\n const el = current.selectedElement\n const { spacing, borderRadius, flex } = getComputedStyles(el)\n const sizing = getComputedSizing(el)\n const color = getComputedColorStyles(el)\n const typography = getComputedTypography(el)\n const border = getComputedBorderStyles(el)\n setState((prev) => ({\n ...prev,\n computedSpacing: spacing,\n computedBorderRadius: borderRadius,\n computedFlex: flex,\n computedSizing: sizing,\n computedColor: color,\n computedTypography: typography,\n computedBorder: border,\n originalStyles: getOriginalInlineStyles(el),\n pendingStyles: {},\n }))\n }, [])\n\n const removeSessionEdit = React.useCallback((element: HTMLElement) => {\n const sessionEdit = sessionEditsRef.current.get(element)\n if (sessionEdit) {\n revertElementStyles(element, sessionEdit)\n if (sessionEdit.textEdit) {\n element.textContent = sessionEdit.textEdit.originalText\n }\n }\n sessionEditsRef.current.delete(element)\n removedSessionEditsRef.current.add(element)\n setSessionEditCount(sessionEditsRef.current.size)\n if (stateRef.current.selectedElement === element) {\n refreshSelectedElement()\n }\n }, [revertElementStyles, refreshSelectedElement])\n\n const clearSessionEdits = React.useCallback(() => {\n for (const [el, sessionEdit] of sessionEditsRef.current.entries()) {\n revertElementStyles(el, sessionEdit)\n if (sessionEdit.textEdit) {\n el.textContent = sessionEdit.textEdit.originalText\n }\n removedSessionEditsRef.current.add(el)\n }\n const current = stateRef.current\n if (current.selectedElement) {\n // Also revert pending styles not yet saved to session\n if (!sessionEditsRef.current.has(current.selectedElement)) {\n for (const prop of Object.keys(current.pendingStyles)) {\n current.selectedElement.style.removeProperty(prop)\n }\n for (const [prop, value] of Object.entries(current.originalStyles)) {\n current.selectedElement.style.setProperty(prop, value)\n }\n }\n removedSessionEditsRef.current.add(current.selectedElement)\n }\n sessionEditsRef.current.clear()\n setSessionEditCount(0)\n refreshSelectedElement()\n }, [revertElementStyles, refreshSelectedElement])\n\n const exportEdits = React.useCallback(async () => {\n if (!state.selectedElement || !state.elementInfo) return false\n const sessionEdit = sessionEditsRef.current.get(state.selectedElement)\n const hasPendingStyles = Object.keys(state.pendingStyles).length > 0\n const hasTextEdit = Boolean(sessionEdit?.textEdit)\n\n const locator = getElementLocator(state.selectedElement)\n const exportMarkdown = hasPendingStyles || hasTextEdit\n ? buildEditExport(locator, state.pendingStyles, sessionEdit?.textEdit)\n : buildElementContext(locator)\n try {\n await navigator.clipboard.writeText(`implement the visual edits\\n\\n${exportMarkdown}`)\n return true\n } catch {\n return false\n }\n }, [\n state.selectedElement,\n state.elementInfo,\n state.pendingStyles,\n sessionEditCount,\n ])\n\n const sendEditToAgent = React.useCallback(async () => {\n if (!state.selectedElement || !state.elementInfo) return false\n const sessionEdit = sessionEditsRef.current.get(state.selectedElement)\n const hasPendingStyles = Object.keys(state.pendingStyles).length > 0\n const hasTextEdit = Boolean(sessionEdit?.textEdit)\n if (!hasPendingStyles && !hasTextEdit) return false\n\n const locator = getElementLocator(state.selectedElement)\n const exportMarkdown = buildEditExport(locator, state.pendingStyles, sessionEdit?.textEdit)\n const changes = Object.entries(state.pendingStyles).map(([cssProperty, cssValue]) => ({\n cssProperty,\n cssValue,\n tailwindClass: stylesToTailwind({ [cssProperty]: cssValue }),\n }))\n\n try {\n const result = await postEditToAgent({\n element: {\n tagName: locator.tagName,\n id: locator.id,\n classList: locator.classList,\n domSelector: locator.domSelector,\n targetHtml: locator.targetHtml,\n textPreview: locator.textPreview,\n },\n source: locator.domSource || null,\n reactStack: locator.reactStack,\n changes,\n textChange: sessionEdit?.textEdit ?? null,\n exportMarkdown,\n })\n return result.ok\n } catch {\n return false\n }\n }, [\n state.selectedElement,\n state.elementInfo,\n state.pendingStyles,\n sessionEditCount,\n ])\n\n const sendCommentToAgent = React.useCallback(async (id: string) => {\n const comment = stateRef.current.comments.find((c) => c.id === id)\n if (!comment) return false\n\n const exportMarkdown = buildCommentExport(comment.locator, comment.text, comment.replies)\n\n try {\n const result = await postCommentToAgent({\n element: {\n tagName: comment.locator.tagName,\n id: comment.locator.id,\n classList: comment.locator.classList,\n domSelector: comment.locator.domSelector,\n targetHtml: comment.locator.targetHtml,\n textPreview: comment.locator.textPreview,\n },\n source: comment.locator.domSource || null,\n reactStack: comment.locator.reactStack,\n commentText: comment.text,\n replies: comment.replies,\n exportMarkdown,\n })\n return result.ok\n } catch {\n return false\n }\n }, [])\n\n // Toggle edit mode: plain Cmd/Ctrl + Period\n // Uses capture phase so it fires before any stopPropagation() in the host app (e.g. Tauri webview)\n // Uses e.code for layout independence (fallback to e.key for virtual keyboards)\n React.useEffect(() => {\n function handleToggle(e: KeyboardEvent) {\n if ((e.metaKey || e.ctrlKey) && !e.shiftKey && !e.altKey && (e.code === 'Period' || e.key === '.')) {\n e.preventDefault()\n toggleEditMode()\n }\n }\n window.addEventListener('keydown', handleToggle, true)\n return () => window.removeEventListener('keydown', handleToggle, true)\n }, [toggleEditMode])\n\n React.useEffect(() => {\n function handleKeyDown(e: KeyboardEvent) {\n if ((e.metaKey || e.ctrlKey) && e.key === 'z' && !e.shiftKey) {\n if (state.textEditingElement) return // let browser handle contenteditable undo\n e.preventDefault()\n undo()\n return\n }\n\n if (e.key === 'C' && e.shiftKey && !e.metaKey && !e.ctrlKey && !e.altKey && state.editModeActive) {\n const active = document.activeElement\n const isInput = active instanceof HTMLInputElement || active instanceof HTMLTextAreaElement || (active instanceof HTMLElement && active.isContentEditable)\n if (!isInput) {\n e.preventDefault()\n setState((prev) => {\n let comments = prev.comments\n if (prev.activeCommentId) {\n const active = comments.find((c) => c.id === prev.activeCommentId)\n if (active && active.text === '') {\n comments = comments.filter((c) => c.id !== prev.activeCommentId)\n }\n }\n return {\n ...prev,\n comments,\n activeTool: prev.activeTool === 'comment' ? 'select' : 'comment',\n activeCommentId: null,\n }\n })\n return\n }\n }\n\n if (e.key === 'A' && e.shiftKey && !e.metaKey && !e.ctrlKey && !e.altKey && state.editModeActive && state.selectedElement) {\n const active = document.activeElement\n const isInput = active instanceof HTMLInputElement || active instanceof HTMLTextAreaElement || (active instanceof HTMLElement && active.isContentEditable)\n if (!isInput) {\n e.preventDefault()\n toggleFlexLayout()\n return\n }\n }\n\n if (e.key === 'Enter' && state.editModeActive && !state.textEditingElement && state.selectedElement) {\n const active = document.activeElement\n const isInput = active instanceof HTMLInputElement || active instanceof HTMLTextAreaElement || (active instanceof HTMLElement && active.isContentEditable)\n if (!isInput && isTextElement(state.selectedElement)) {\n e.preventDefault()\n startTextEditing(state.selectedElement)\n return\n }\n }\n\n if (e.key === 'Escape') {\n if (state.textEditingElement) {\n commitTextEditing()\n return\n }\n if (state.activeCommentId) {\n setState((prev) => {\n let comments = prev.comments\n const active = comments.find((c) => c.id === prev.activeCommentId)\n if (active && active.text === '') {\n comments = comments.filter((c) => c.id !== prev.activeCommentId)\n }\n return { ...prev, comments, activeCommentId: null }\n })\n } else if (state.activeTool === 'comment') {\n setState((prev) => ({ ...prev, activeTool: 'select' }))\n } else if (state.isOpen) {\n closePanel()\n } else if (state.editModeActive) {\n toggleEditMode()\n }\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [state.isOpen, state.editModeActive, state.activeCommentId, state.activeTool, state.textEditingElement, state.selectedElement, closePanel, toggleEditMode, toggleFlexLayout, undo, commitTextEditing, startTextEditing])\n\n const contextValue = React.useMemo<DirectEditContextValue>(() => ({\n ...state,\n selectElement,\n selectParent,\n selectChild,\n closePanel,\n updateSpacingProperty,\n updateBorderRadiusProperty,\n updateBorderProperty,\n updateBorderProperties,\n updateFlexProperty,\n toggleFlexLayout,\n updateSizingProperty,\n updateColorProperty,\n updateTypographyProperty,\n resetToOriginal,\n exportEdits,\n sendEditToAgent,\n sendCommentToAgent,\n toggleEditMode,\n undo,\n handleMoveComplete,\n setActiveTool,\n setTheme,\n addComment,\n updateCommentText,\n addCommentReply,\n deleteComment,\n exportComment,\n setActiveCommentId,\n sessionEditCount,\n getSessionEdits,\n exportAllEdits,\n clearSessionEdits,\n removeSessionEdit,\n startTextEditing,\n commitTextEditing,\n }), [\n state,\n selectElement,\n selectParent,\n selectChild,\n closePanel,\n updateSpacingProperty,\n updateBorderRadiusProperty,\n updateBorderProperty,\n updateBorderProperties,\n updateFlexProperty,\n updateSizingProperty,\n updateColorProperty,\n updateTypographyProperty,\n resetToOriginal,\n exportEdits,\n sendEditToAgent,\n sendCommentToAgent,\n toggleEditMode,\n undo,\n handleMoveComplete,\n setActiveTool,\n setTheme,\n addComment,\n updateCommentText,\n addCommentReply,\n deleteComment,\n exportComment,\n setActiveCommentId,\n sessionEditCount,\n getSessionEdits,\n exportAllEdits,\n clearSessionEdits,\n removeSessionEdit,\n startTextEditing,\n commitTextEditing,\n ])\n\n return (\n <PortalContainerProvider>\n <DirectEditContext.Provider value={contextValue}>\n <ThemeApplier />\n {children}\n </DirectEditContext.Provider>\n </PortalContainerProvider>\n )\n}\n\nfunction ThemeApplier() {\n const { theme } = useDirectEdit()\n const container = usePortalContainer()\n\n React.useEffect(() => {\n if (!container) return\n const host = (container.getRootNode() as ShadowRoot).host as HTMLElement\n if (theme === 'system') {\n host.removeAttribute('data-theme')\n } else {\n host.setAttribute('data-theme', theme)\n }\n }, [container, theme])\n\n return null\n}\n","import * as React from 'react'\n// @ts-expect-error - CSS imported as raw text (Vite: ?raw suffix, tsup: esbuild plugin)\nimport cssText from '../dist/styles.css?raw'\n\nconst PortalContainerContext = React.createContext<HTMLElement | null>(null)\n\nexport function usePortalContainer() {\n return React.useContext(PortalContainerContext)\n}\n\nexport function PortalContainerProvider({ children }: { children: React.ReactNode }) {\n const [container, setContainer] = React.useState<HTMLElement | null>(null)\n\n React.useEffect(() => {\n const disableInlineStyles = document.documentElement.hasAttribute('data-direct-edit-disable-styles')\n const host = document.createElement('div')\n host.setAttribute('data-direct-edit-host', '')\n Object.assign(host.style, {\n position: 'fixed',\n inset: '0',\n zIndex: '2147483646',\n pointerEvents: 'none',\n })\n\n const shadow = host.attachShadow({ mode: 'open' })\n if (!disableInlineStyles) {\n const style = document.createElement('style')\n style.textContent = cssText\n shadow.appendChild(style)\n }\n\n const root = document.createElement('div')\n root.setAttribute('data-direct-edit-root', '')\n shadow.appendChild(root)\n\n document.body.appendChild(host)\n setContainer(root)\n\n return () => { host.remove() }\n }, [])\n\n return (\n <PortalContainerContext.Provider value={container}>\n {children}\n </PortalContainerContext.Provider>\n )\n}\n","/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;--color-red-500:oklch(63.7% .237 25.331);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height:calc(1.5/1);--font-weight-thin:100;--font-weight-extralight:200;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--leading-relaxed:1.625;--radius-sm:calc(.5rem - 4px);--radius-md:calc(.5rem - 2px);--radius-lg:.5rem;--radius-xl:.75rem;--ease-out:cubic-bezier(0,0,.2,1);--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-xl:24px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-border:#e6e6e6;--color-ring:#262626;--color-background:#fff;--color-foreground:#171717;--color-primary:#171717;--color-primary-foreground:#fafafa;--color-secondary-foreground:#171717;--color-destructive:#ef4444;--color-destructive-foreground:#fafafa;--color-muted:#f2f2f2;--color-muted-foreground:#737373;--color-popover:#fff;--color-popover-foreground:#171717}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:root,:host{color-scheme:light;color:var(--color-foreground)}@media (prefers-color-scheme:dark){:root,:host(:not([data-theme])),:host([data-theme=system]){color-scheme:dark;color:var(--color-foreground);--color-border:#2e2e2e;--color-input:#2e2e2e;--color-ring:#d4d4d4;--color-background:#121212;--color-foreground:#fafafa;--color-primary:#fafafa;--color-primary-foreground:#171717;--color-secondary:#262626;--color-secondary-foreground:#fafafa;--color-destructive:#7f1d1d;--color-destructive-foreground:#fafafa;--color-muted:#262626;--color-muted-foreground:#a3a3a3;--color-accent:#262626;--color-accent-foreground:#fafafa;--color-popover:#171717;--color-popover-foreground:#fafafa}}:host([data-theme=dark]){color-scheme:dark;color:var(--color-foreground);--color-border:#2e2e2e;--color-input:#2e2e2e;--color-ring:#d4d4d4;--color-background:#121212;--color-foreground:#fafafa;--color-primary:#fafafa;--color-primary-foreground:#171717;--color-secondary:#262626;--color-secondary-foreground:#fafafa;--color-destructive:#7f1d1d;--color-destructive-foreground:#fafafa;--color-muted:#262626;--color-muted-foreground:#a3a3a3;--color-accent:#262626;--color-accent-foreground:#fafafa;--color-popover:#171717;--color-popover-foreground:#fafafa}*,:before,:after{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:var(--color-background);--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;border-color:var(--color-border)}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing)*0)}.top-1\\/2{top:50%}.left-1\\.5{left:calc(var(--spacing)*1.5)}.left-1\\/2{left:50%}.left-2{left:calc(var(--spacing)*2)}.z-\\[99990\\]{z-index:99990}.z-\\[99991\\]{z-index:99991}.z-\\[99998\\]{z-index:99998}.z-\\[99999\\]{z-index:99999}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-0\\.5{margin-inline:calc(var(--spacing)*.5)}.mx-1\\.5{margin-inline:calc(var(--spacing)*1.5)}.my-0\\.5{margin-block:calc(var(--spacing)*.5)}.my-1{margin-block:calc(var(--spacing)*1)}.mt-0{margin-top:calc(var(--spacing)*0)}.mt-0\\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2\\.5{margin-top:calc(var(--spacing)*2.5)}.mr-1{margin-right:calc(var(--spacing)*1)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.ml-0{margin-left:calc(var(--spacing)*0)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-1\\.5{margin-left:calc(var(--spacing)*1.5)}.ml-2{margin-left:calc(var(--spacing)*2)}.block{display:block}.flex{display:flex}.flow-root{display:flow-root}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.list-item{display:list-item}.size-1{width:calc(var(--spacing)*1);height:calc(var(--spacing)*1)}.size-2\\.5{width:calc(var(--spacing)*2.5);height:calc(var(--spacing)*2.5)}.size-3{width:calc(var(--spacing)*3);height:calc(var(--spacing)*3)}.size-3\\.5{width:calc(var(--spacing)*3.5);height:calc(var(--spacing)*3.5)}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-5{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5)}.size-6{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.size-7{width:calc(var(--spacing)*7);height:calc(var(--spacing)*7)}.size-full{width:100%;height:100%}.h-0\\.5{height:calc(var(--spacing)*.5)}.h-2{height:calc(var(--spacing)*2)}.h-3\\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-11{height:calc(var(--spacing)*11)}.h-\\[150px\\]{height:150px}.h-auto{height:auto}.h-fit{height:fit-content}.h-full{height:100%}.max-h-0{max-height:calc(var(--spacing)*0)}.max-h-3{max-height:calc(var(--spacing)*3)}.max-h-48{max-height:calc(var(--spacing)*48)}.max-h-\\[220px\\]{max-height:220px}.max-h-\\[240px\\]{max-height:240px}.min-h-\\[18px\\]{min-height:18px}.w-0\\.5{width:calc(var(--spacing)*.5)}.w-2{width:calc(var(--spacing)*2)}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-10{width:calc(var(--spacing)*10)}.w-14{width:calc(var(--spacing)*14)}.w-\\[1\\.5px\\]{width:1.5px}.w-\\[60px\\]{width:60px}.w-\\[68px\\]{width:68px}.w-\\[80px\\]{width:80px}.w-\\[200px\\]{width:200px}.w-\\[220px\\]{width:220px}.w-\\[260px\\]{width:260px}.w-\\[280px\\]{width:280px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.max-w-0{max-width:calc(var(--spacing)*0)}.max-w-3{max-width:calc(var(--spacing)*3)}.max-w-\\[200px\\]{max-width:200px}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\\[20px\\]{min-width:20px}.min-w-\\[90px\\]{min-width:90px}.min-w-\\[100px\\]{min-width:100px}.min-w-\\[120px\\]{min-width:120px}.min-w-\\[140px\\]{min-width:140px}.min-w-\\[180px\\]{min-width:180px}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-x-1\\/2{--tw-translate-x:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\\/2{--tw-translate-y:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-crosshair{cursor:crosshair}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.\\[appearance\\:textfield\\]{appearance:textfield}.appearance-none{appearance:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-around{justify-content:space-around}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-evenly{justify-content:space-evenly}.justify-start{justify-content:flex-start}.gap-0\\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-\\[2px\\]{gap:2px}:where(.space-y-1\\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\\[8px\\]{border-radius:8px}.rounded-\\[14px\\]{border-radius:14px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-tl{border-top-left-radius:.25rem}.rounded-tr{border-top-right-radius:.25rem}.rounded-br{border-bottom-right-radius:.25rem}.rounded-bl{border-bottom-left-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-dotted{--tw-border-style:dotted;border-style:dotted}.border-double{--tw-border-style:double;border-style:double}.border-none{--tw-border-style:none;border-style:none}.border-solid{--tw-border-style:solid;border-style:solid}.\\[border-top-style\\:solid\\]{border-top-style:solid}.\\[border-right-style\\:dashed\\]{border-right-style:dashed}.\\[border-bottom-style\\:dashed\\]{border-bottom-style:dashed}.\\[border-bottom-style\\:dotted\\]{border-bottom-style:dotted}.\\[border-bottom-style\\:solid\\]{border-bottom-style:solid}.\\[border-left-style\\:double\\]{border-left-style:double}.\\[border-left-style\\:solid\\]{border-left-style:solid}.border-border\\/30{border-color:#e6e6e64d}@supports (color:color-mix(in lab, red, red)){.border-border\\/30{border-color:color-mix(in oklab,var(--color-border)30%,transparent)}}.border-border\\/50{border-color:#e6e6e680}@supports (color:color-mix(in lab, red, red)){.border-border\\/50{border-color:color-mix(in oklab,var(--color-border)50%,transparent)}}.border-foreground\\/10{border-color:#1717171a}@supports (color:color-mix(in lab, red, red)){.border-foreground\\/10{border-color:color-mix(in oklab,var(--color-foreground)10%,transparent)}}.border-white{border-color:var(--color-white)}.bg-\\[\\#171717\\]{background-color:#171717}.bg-background{background-color:var(--color-background)}.bg-background\\/60{background-color:#fff9}@supports (color:color-mix(in lab, red, red)){.bg-background\\/60{background-color:color-mix(in oklab,var(--color-background)60%,transparent)}}.bg-blue-500{background-color:var(--color-blue-500)}.bg-destructive{background-color:var(--color-destructive)}.bg-foreground{background-color:var(--color-foreground)}.bg-foreground\\/25{background-color:#17171740}@supports (color:color-mix(in lab, red, red)){.bg-foreground\\/25{background-color:color-mix(in oklab,var(--color-foreground)25%,transparent)}}.bg-muted{background-color:var(--color-muted)}.bg-muted-foreground\\/30{background-color:#7373734d}@supports (color:color-mix(in lab, red, red)){.bg-muted-foreground\\/30{background-color:color-mix(in oklab,var(--color-muted-foreground)30%,transparent)}}.bg-muted\\/20{background-color:#f2f2f233}@supports (color:color-mix(in lab, red, red)){.bg-muted\\/20{background-color:color-mix(in oklab,var(--color-muted)20%,transparent)}}.bg-popover{background-color:var(--color-popover)}.bg-primary{background-color:var(--color-primary)}.bg-transparent{background-color:#0000}.bg-white\\/20{background-color:#fff3}@supports (color:color-mix(in lab, red, red)){.bg-white\\/20{background-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fill-border{fill:var(--color-border)}.p-0{padding:calc(var(--spacing)*0)}.p-0\\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:calc(var(--spacing)*1)}.p-1\\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.px-0{padding-inline:calc(var(--spacing)*0)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-8{padding-inline:calc(var(--spacing)*8)}.py-0{padding-block:calc(var(--spacing)*0)}.py-0\\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-3\\.5{padding-block:calc(var(--spacing)*3.5)}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-1\\.5{padding-top:calc(var(--spacing)*1.5)}.pt-2\\.5{padding-top:calc(var(--spacing)*2.5)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-\\[13px\\]{padding-top:13px}.pr-1{padding-right:calc(var(--spacing)*1)}.pr-1\\.5{padding-right:calc(var(--spacing)*1.5)}.pr-2{padding-right:calc(var(--spacing)*2)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-1\\.5{padding-bottom:calc(var(--spacing)*1.5)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pl-0{padding-left:calc(var(--spacing)*0)}.pl-6{padding-left:calc(var(--spacing)*6)}.pl-7{padding-left:calc(var(--spacing)*7)}.text-center{text-align:center}.text-justify{text-align:justify}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\[7px\\]{font-size:7px}.text-\\[10px\\]{font-size:10px}.text-\\[11px\\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-extralight{--tw-font-weight:var(--font-weight-extralight);font-weight:var(--font-weight-extralight)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.font-thin{--tw-font-weight:var(--font-weight-thin);font-weight:var(--font-weight-thin)}.whitespace-nowrap{white-space:nowrap}.text-\\[\\#fafafa\\]{color:#fafafa}.text-background{color:var(--color-background)}.text-blue-500{color:var(--color-blue-500)}.text-destructive-foreground{color:var(--color-destructive-foreground)}.text-foreground{color:var(--color-foreground)}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-popover-foreground{color:var(--color-popover-foreground)}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-red-500{color:var(--color-red-500)}.text-secondary-foreground{color:var(--color-secondary-foreground)}.text-white{color:var(--color-white)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\\[0_0_0_1px_rgba\\(0\\,0\\,0\\,0\\.3\\)\\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,#0000004d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\\[inset_0_0_0_1px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:inset 0 0 0 1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-white{--tw-ring-color:var(--color-white)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[max-width\\,max-height\\,margin\\,opacity\\]{transition-property:max-width,max-height,margin,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[max-width\\,max-height\\,padding\\,opacity\\]{transition-property:max-width,max-height,padding,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.animate-in{--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial;animation-name:enter;animation-duration:.15s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.duration-200{animation-duration:.2s}.duration-300{animation-duration:.3s}.ease-out{animation-timing-function:cubic-bezier(0,0,.2,1)}.fade-in-0{--tw-enter-opacity:0}.running{animation-play-state:running}.zoom-in-95{--tw-enter-scale:.95}@media (hover:hover){.group-hover\\:max-h-3:is(:where(.group):hover *){max-height:calc(var(--spacing)*3)}.group-hover\\:max-w-3:is(:where(.group):hover *){max-width:calc(var(--spacing)*3)}.group-hover\\:pt-0:is(:where(.group):hover *){padding-top:calc(var(--spacing)*0)}.group-hover\\:pr-1\\.5:is(:where(.group):hover *){padding-right:calc(var(--spacing)*1.5)}.group-hover\\:pb-1\\.5:is(:where(.group):hover *){padding-bottom:calc(var(--spacing)*1.5)}.group-hover\\:pl-0:is(:where(.group):hover *){padding-left:calc(var(--spacing)*0)}.group-hover\\:opacity-100:is(:where(.group):hover *){opacity:1}.group-hover\\/pin\\:inline:is(:where(.group\\/pin):hover *){display:inline}}.file\\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\\:bg-transparent::file-selector-button{background-color:#0000}.file\\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\\:text-foreground::file-selector-button{color:var(--color-foreground)}.placeholder\\:text-muted-foreground::placeholder{color:var(--color-muted-foreground)}@media (hover:hover){.hover\\:scale-\\[1\\.67\\]:hover{scale:1.67}.hover\\:bg-blue-600:hover{background-color:var(--color-blue-600)}.hover\\:bg-destructive\\/90:hover{background-color:#ef4444e6}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-destructive\\/90:hover{background-color:color-mix(in oklab,var(--color-destructive)90%,transparent)}}.hover\\:bg-foreground\\/80:hover{background-color:#171717cc}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-foreground\\/80:hover{background-color:color-mix(in oklab,var(--color-foreground)80%,transparent)}}.hover\\:bg-muted:hover{background-color:var(--color-muted)}.hover\\:bg-muted-foreground\\/10:hover{background-color:#7373731a}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted-foreground\\/10:hover{background-color:color-mix(in oklab,var(--color-muted-foreground)10%,transparent)}}.hover\\:bg-muted\\/50:hover{background-color:#f2f2f280}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted\\/50:hover{background-color:color-mix(in oklab,var(--color-muted)50%,transparent)}}.hover\\:bg-primary\\/90:hover{background-color:#171717e6}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab,var(--color-primary)90%,transparent)}}.hover\\:text-foreground:hover{color:var(--color-foreground)}.hover\\:underline:hover{text-decoration-line:underline}.hover\\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\\:ring-ring:focus-visible{--tw-ring-color:var(--color-ring)}.focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\\:cursor-grabbing:active{cursor:grabbing}.disabled\\:pointer-events-none:disabled{pointer-events:none}.disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:opacity-50:disabled{opacity:.5}.data-\\[closed\\]\\:animate-out[data-closed]{--tw-exit-opacity:initial;--tw-exit-scale:initial;--tw-exit-rotate:initial;--tw-exit-translate-x:initial;--tw-exit-translate-y:initial;animation-name:exit;animation-duration:.15s}.data-\\[closed\\]\\:fade-out-0[data-closed]{--tw-exit-opacity:0}.data-\\[closed\\]\\:zoom-out-95[data-closed]{--tw-exit-scale:.95}.data-\\[highlighted\\]\\:bg-muted[data-highlighted]{background-color:var(--color-muted)}.data-\\[highlighted\\]\\:text-foreground[data-highlighted]{color:var(--color-foreground)}.data-\\[side\\=bottom\\]\\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:-.5rem}.data-\\[side\\=left\\]\\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:.5rem}.data-\\[side\\=right\\]\\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:-.5rem}.data-\\[side\\=top\\]\\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:.5rem}@media (min-width:48rem){.md\\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.\\[\\&_svg\\]\\:size-4 svg{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.\\[\\&\\:\\:-webkit-inner-spin-button\\]\\:appearance-none::-webkit-inner-spin-button{appearance:none}.\\[\\&\\:\\:-webkit-outer-spin-button\\]\\:appearance-none::-webkit-outer-spin-button{appearance:none}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0))}}@property --tw-translate-x{syntax:\"*\";inherits:false;initial-value:0}@property --tw-translate-y{syntax:\"*\";inherits:false;initial-value:0}@property --tw-translate-z{syntax:\"*\";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:\"*\";inherits:false}@property --tw-rotate-y{syntax:\"*\";inherits:false}@property --tw-rotate-z{syntax:\"*\";inherits:false}@property --tw-skew-x{syntax:\"*\";inherits:false}@property --tw-skew-y{syntax:\"*\";inherits:false}@property --tw-space-y-reverse{syntax:\"*\";inherits:false;initial-value:0}@property --tw-border-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-leading{syntax:\"*\";inherits:false}@property --tw-font-weight{syntax:\"*\";inherits:false}@property --tw-ordinal{syntax:\"*\";inherits:false}@property --tw-slashed-zero{syntax:\"*\";inherits:false}@property --tw-numeric-figure{syntax:\"*\";inherits:false}@property --tw-numeric-spacing{syntax:\"*\";inherits:false}@property --tw-numeric-fraction{syntax:\"*\";inherits:false}@property --tw-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:\"*\";inherits:false}@property --tw-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:\"*\";inherits:false}@property --tw-inset-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:\"*\";inherits:false}@property --tw-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:\"*\";inherits:false}@property --tw-inset-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:\"*\";inherits:false}@property --tw-ring-offset-width{syntax:\"<length>\";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:\"*\";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-blur{syntax:\"*\";inherits:false}@property --tw-brightness{syntax:\"*\";inherits:false}@property --tw-contrast{syntax:\"*\";inherits:false}@property --tw-grayscale{syntax:\"*\";inherits:false}@property --tw-hue-rotate{syntax:\"*\";inherits:false}@property --tw-invert{syntax:\"*\";inherits:false}@property --tw-opacity{syntax:\"*\";inherits:false}@property --tw-saturate{syntax:\"*\";inherits:false}@property --tw-sepia{syntax:\"*\";inherits:false}@property --tw-drop-shadow{syntax:\"*\";inherits:false}@property --tw-drop-shadow-color{syntax:\"*\";inherits:false}@property --tw-drop-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:\"*\";inherits:false}@property --tw-backdrop-blur{syntax:\"*\";inherits:false}@property --tw-backdrop-brightness{syntax:\"*\";inherits:false}@property --tw-backdrop-contrast{syntax:\"*\";inherits:false}@property --tw-backdrop-grayscale{syntax:\"*\";inherits:false}@property --tw-backdrop-hue-rotate{syntax:\"*\";inherits:false}@property --tw-backdrop-invert{syntax:\"*\";inherits:false}@property --tw-backdrop-opacity{syntax:\"*\";inherits:false}@property --tw-backdrop-saturate{syntax:\"*\";inherits:false}@property --tw-backdrop-sepia{syntax:\"*\";inherits:false}@property --tw-duration{syntax:\"*\";inherits:false}@property --tw-ease{syntax:\"*\";inherits:false}@keyframes pulse{50%{opacity:.5}}","import type {\n CSSPropertyValue,\n SpacingProperties,\n BorderRadiusProperties,\n BorderStyle,\n BorderProperties,\n FlexProperties,\n SizingProperties,\n SizingValue,\n SizingMode,\n SpacingPropertyKey,\n BorderRadiusPropertyKey,\n BorderPropertyKey,\n FlexPropertyKey,\n SizingPropertyKey,\n TypographyPropertyKey,\n TypographyProperties,\n ElementInfo,\n ReactComponentFrame,\n ElementLocator,\n DomSourceLocation,\n ColorValue,\n ColorProperties,\n ColorPropertyKey,\n MeasurementLine,\n Guideline,\n DropIndicator,\n SessionEdit,\n} from './types'\n\ndeclare global {\n interface Window {\n __DIRECT_EDIT_DEVTOOLS__?: {\n getFiberForElement: (element: HTMLElement) => unknown | null\n hasHook?: boolean\n }\n }\n}\n\nexport function parsePropertyValue(value: string): CSSPropertyValue {\n const raw = value.trim()\n const match = raw.match(/^(-?\\d*\\.?\\d+)(px|rem|em|%)?$/)\n\n if (match) {\n return {\n numericValue: parseFloat(match[1]),\n unit: (match[2] as CSSPropertyValue['unit']) || 'px',\n raw,\n }\n }\n\n return {\n numericValue: 0,\n unit: 'px',\n raw,\n }\n}\n\nexport function formatPropertyValue(value: CSSPropertyValue): string {\n if (value.raw === 'auto' || value.raw === 'inherit' || value.raw === 'initial') {\n return value.raw\n }\n return `${value.numericValue}${value.unit}`\n}\n\nexport function getComputedStyles(element: HTMLElement): {\n spacing: SpacingProperties\n borderRadius: BorderRadiusProperties\n flex: FlexProperties\n} {\n const computed = window.getComputedStyle(element)\n\n return {\n spacing: {\n paddingTop: parsePropertyValue(computed.paddingTop),\n paddingRight: parsePropertyValue(computed.paddingRight),\n paddingBottom: parsePropertyValue(computed.paddingBottom),\n paddingLeft: parsePropertyValue(computed.paddingLeft),\n marginTop: parsePropertyValue(computed.marginTop),\n marginRight: parsePropertyValue(computed.marginRight),\n marginBottom: parsePropertyValue(computed.marginBottom),\n marginLeft: parsePropertyValue(computed.marginLeft),\n gap: parsePropertyValue(computed.gap || '0px'),\n },\n borderRadius: {\n borderTopLeftRadius: parsePropertyValue(computed.borderTopLeftRadius),\n borderTopRightRadius: parsePropertyValue(computed.borderTopRightRadius),\n borderBottomRightRadius: parsePropertyValue(computed.borderBottomRightRadius),\n borderBottomLeftRadius: parsePropertyValue(computed.borderBottomLeftRadius),\n },\n flex: {\n display: computed.display,\n flexDirection: computed.flexDirection as FlexProperties['flexDirection'],\n justifyContent: computed.justifyContent,\n alignItems: computed.alignItems,\n },\n }\n}\n\nexport function getComputedBorderStyles(element: HTMLElement): BorderProperties {\n const computed = window.getComputedStyle(element)\n\n const topStyle = computed.borderTopStyle as BorderStyle\n const rightStyle = computed.borderRightStyle as BorderStyle\n const bottomStyle = computed.borderBottomStyle as BorderStyle\n const leftStyle = computed.borderLeftStyle as BorderStyle\n\n const topWidth = parsePropertyValue(computed.borderTopWidth)\n const rightWidth = parsePropertyValue(computed.borderRightWidth)\n const bottomWidth = parsePropertyValue(computed.borderBottomWidth)\n const leftWidth = parsePropertyValue(computed.borderLeftWidth)\n\n return {\n borderTopStyle: topStyle,\n borderTopWidth: topWidth,\n borderRightStyle: rightStyle,\n borderRightWidth: rightWidth,\n borderBottomStyle: bottomStyle,\n borderBottomWidth: bottomWidth,\n borderLeftStyle: leftStyle,\n borderLeftWidth: leftWidth,\n }\n}\n\nexport function getOriginalInlineStyles(element: HTMLElement): Record<string, string> {\n const styles: Record<string, string> = {}\n const relevantProps = [\n 'padding-top',\n 'padding-right',\n 'padding-bottom',\n 'padding-left',\n 'padding',\n 'margin-top',\n 'margin-right',\n 'margin-bottom',\n 'margin-left',\n 'margin',\n 'gap',\n 'border-radius',\n 'border-top-left-radius',\n 'border-top-right-radius',\n 'border-bottom-right-radius',\n 'border-bottom-left-radius',\n 'border',\n 'border-style',\n 'border-width',\n 'border-top-style',\n 'border-top-width',\n 'border-right-style',\n 'border-right-width',\n 'border-bottom-style',\n 'border-bottom-width',\n 'border-left-style',\n 'border-left-width',\n 'display',\n 'flex-direction',\n 'justify-content',\n 'align-items',\n 'width',\n 'height',\n 'background-color',\n 'color',\n 'border-color',\n 'outline-color',\n 'font-family',\n 'font-weight',\n 'font-size',\n 'line-height',\n 'letter-spacing',\n 'text-align',\n ]\n\n for (const prop of relevantProps) {\n const value = element.style.getPropertyValue(prop)\n if (value) {\n styles[prop] = value\n }\n }\n\n return styles\n}\n\nconst tailwindClassMap: Record<string, { prefix: string; scale: Record<number, string> }> = {\n 'padding-top': {\n prefix: 'pt',\n scale: { 0: '0', 1: 'px', 2: '0.5', 4: '1', 8: '2', 12: '3', 16: '4', 20: '5', 24: '6', 32: '8' },\n },\n 'padding-right': {\n prefix: 'pr',\n scale: { 0: '0', 1: 'px', 2: '0.5', 4: '1', 8: '2', 12: '3', 16: '4', 20: '5', 24: '6', 32: '8' },\n },\n 'padding-bottom': {\n prefix: 'pb',\n scale: { 0: '0', 1: 'px', 2: '0.5', 4: '1', 8: '2', 12: '3', 16: '4', 20: '5', 24: '6', 32: '8' },\n },\n 'padding-left': {\n prefix: 'pl',\n scale: { 0: '0', 1: 'px', 2: '0.5', 4: '1', 8: '2', 12: '3', 16: '4', 20: '5', 24: '6', 32: '8' },\n },\n 'margin-top': {\n prefix: 'mt',\n scale: { 0: '0', 1: 'px', 2: '0.5', 4: '1', 8: '2', 12: '3', 16: '4', 20: '5', 24: '6', 32: '8' },\n },\n 'margin-right': {\n prefix: 'mr',\n scale: { 0: '0', 1: 'px', 2: '0.5', 4: '1', 8: '2', 12: '3', 16: '4', 20: '5', 24: '6', 32: '8' },\n },\n 'margin-bottom': {\n prefix: 'mb',\n scale: { 0: '0', 1: 'px', 2: '0.5', 4: '1', 8: '2', 12: '3', 16: '4', 20: '5', 24: '6', 32: '8' },\n },\n 'margin-left': {\n prefix: 'ml',\n scale: { 0: '0', 1: 'px', 2: '0.5', 4: '1', 8: '2', 12: '3', 16: '4', 20: '5', 24: '6', 32: '8' },\n },\n gap: {\n prefix: 'gap',\n scale: { 0: '0', 1: 'px', 2: '0.5', 4: '1', 8: '2', 12: '3', 16: '4', 20: '5', 24: '6', 32: '8' },\n },\n 'border-width': {\n prefix: 'border',\n scale: { 0: '0', 1: '', 2: '2', 4: '4', 8: '8' },\n },\n 'border-top-width': {\n prefix: 'border-t',\n scale: { 0: '0', 1: '', 2: '2', 4: '4', 8: '8' },\n },\n 'border-right-width': {\n prefix: 'border-r',\n scale: { 0: '0', 1: '', 2: '2', 4: '4', 8: '8' },\n },\n 'border-bottom-width': {\n prefix: 'border-b',\n scale: { 0: '0', 1: '', 2: '2', 4: '4', 8: '8' },\n },\n 'border-left-width': {\n prefix: 'border-l',\n scale: { 0: '0', 1: '', 2: '2', 4: '4', 8: '8' },\n },\n 'border-radius': {\n prefix: 'rounded',\n scale: { 0: 'none', 2: 'sm', 4: '', 6: 'md', 8: 'lg', 12: 'xl', 16: '2xl', 24: '3xl', 9999: 'full' },\n },\n 'border-top-left-radius': {\n prefix: 'rounded-tl',\n scale: { 0: 'none', 2: 'sm', 4: '', 6: 'md', 8: 'lg', 12: 'xl', 16: '2xl', 24: '3xl', 9999: 'full' },\n },\n 'border-top-right-radius': {\n prefix: 'rounded-tr',\n scale: { 0: 'none', 2: 'sm', 4: '', 6: 'md', 8: 'lg', 12: 'xl', 16: '2xl', 24: '3xl', 9999: 'full' },\n },\n 'border-bottom-right-radius': {\n prefix: 'rounded-br',\n scale: { 0: 'none', 2: 'sm', 4: '', 6: 'md', 8: 'lg', 12: 'xl', 16: '2xl', 24: '3xl', 9999: 'full' },\n },\n 'border-bottom-left-radius': {\n prefix: 'rounded-bl',\n scale: { 0: 'none', 2: 'sm', 4: '', 6: 'md', 8: 'lg', 12: 'xl', 16: '2xl', 24: '3xl', 9999: 'full' },\n },\n}\n\nconst flexDirectionMap: Record<string, string> = {\n row: 'flex-row',\n 'row-reverse': 'flex-row-reverse',\n column: 'flex-col',\n 'column-reverse': 'flex-col-reverse',\n}\n\nconst justifyContentMap: Record<string, string> = {\n 'flex-start': 'justify-start',\n 'flex-end': 'justify-end',\n center: 'justify-center',\n 'space-between': 'justify-between',\n 'space-around': 'justify-around',\n 'space-evenly': 'justify-evenly',\n start: 'justify-start',\n end: 'justify-end',\n}\n\nconst alignItemsMap: Record<string, string> = {\n 'flex-start': 'items-start',\n 'flex-end': 'items-end',\n center: 'items-center',\n baseline: 'items-baseline',\n stretch: 'items-stretch',\n start: 'items-start',\n end: 'items-end',\n}\n\nfunction getExactScaleValue(value: number, scale: Record<number, string>): string | null {\n if (Object.prototype.hasOwnProperty.call(scale, value)) {\n return scale[value]\n }\n return null\n}\n\nexport function stylesToTailwind(styles: Record<string, string>): string {\n const classes: string[] = []\n\n for (const [prop, value] of Object.entries(styles)) {\n if (tailwindClassMap[prop]) {\n const parsed = parsePropertyValue(value)\n const mapping = tailwindClassMap[prop]\n if (value === 'auto') {\n classes.push(`${mapping.prefix}-auto`)\n continue\n }\n if (parsed.unit === 'px') {\n const exactScale = getExactScaleValue(parsed.numericValue, mapping.scale)\n if (exactScale !== null) {\n if (exactScale === '') {\n classes.push(mapping.prefix)\n } else {\n classes.push(`${mapping.prefix}-${exactScale}`)\n }\n continue\n }\n }\n classes.push(`${mapping.prefix}-[${value}]`)\n continue\n }\n\n if (prop === 'flex-direction' && flexDirectionMap[value]) {\n classes.push(flexDirectionMap[value])\n continue\n }\n\n if (prop === 'justify-content' && justifyContentMap[value]) {\n classes.push(justifyContentMap[value])\n continue\n }\n\n if (prop === 'align-items' && alignItemsMap[value]) {\n classes.push(alignItemsMap[value])\n continue\n }\n\n if (prop === 'display') {\n if (value === 'flex') classes.push('flex')\n else if (value === 'inline-flex') classes.push('inline-flex')\n else if (value === 'grid') classes.push('grid')\n else if (value === 'block') classes.push('block')\n else if (value === 'inline-block') classes.push('inline-block')\n else if (value === 'none') classes.push('hidden')\n continue\n }\n\n if (prop === 'width') {\n if (value === '100%') classes.push('w-full')\n else if (value === 'fit-content') classes.push('w-fit')\n else if (value === 'auto') classes.push('w-auto')\n else classes.push(`w-[${value}]`)\n continue\n }\n\n if (prop === 'height') {\n if (value === '100%') classes.push('h-full')\n else if (value === 'fit-content') classes.push('h-fit')\n else if (value === 'auto') classes.push('h-auto')\n else classes.push(`h-[${value}]`)\n continue\n }\n\n if (prop === 'background-color') {\n const colorValue = parseColorValue(value)\n classes.push(colorToTailwind('backgroundColor', colorValue))\n continue\n }\n\n if (prop === 'color') {\n const colorValue = parseColorValue(value)\n classes.push(colorToTailwind('color', colorValue))\n continue\n }\n\n if (prop === 'border-color') {\n const colorValue = parseColorValue(value)\n classes.push(colorToTailwind('borderColor', colorValue))\n continue\n }\n\n if (prop === 'border-style') {\n const styleMap: Record<string, string> = {\n none: 'border-none',\n solid: 'border-solid',\n dashed: 'border-dashed',\n dotted: 'border-dotted',\n double: 'border-double',\n }\n classes.push(styleMap[value] || `[border-style:${value}]`)\n continue\n }\n\n // Tailwind has no per-side border-style utilities — consolidate when all sides match\n if (prop === 'border-top-style' || prop === 'border-right-style' || prop === 'border-bottom-style' || prop === 'border-left-style') {\n const allPresent =\n 'border-top-style' in styles &&\n 'border-right-style' in styles &&\n 'border-bottom-style' in styles &&\n 'border-left-style' in styles\n if (allPresent) {\n // Only emit once (from border-top-style) when all four sides are present\n if (prop === 'border-top-style') {\n const allSame =\n styles['border-top-style'] === styles['border-right-style'] &&\n styles['border-top-style'] === styles['border-bottom-style'] &&\n styles['border-top-style'] === styles['border-left-style']\n if (allSame) {\n const styleMap: Record<string, string> = {\n none: 'border-none',\n solid: 'border-solid',\n dashed: 'border-dashed',\n dotted: 'border-dotted',\n double: 'border-double',\n }\n classes.push(styleMap[value] || `[border-style:${value}]`)\n } else {\n // Sides differ — emit each side individually\n classes.push(`[border-top-style:${styles['border-top-style']}]`)\n classes.push(`[border-right-style:${styles['border-right-style']}]`)\n classes.push(`[border-bottom-style:${styles['border-bottom-style']}]`)\n classes.push(`[border-left-style:${styles['border-left-style']}]`)\n }\n }\n } else {\n // Emit arbitrary-property syntax for individual side styles\n classes.push(`[${prop}:${value}]`)\n }\n continue\n }\n\n if (prop === 'outline-color') {\n const colorValue = parseColorValue(value)\n classes.push(colorToTailwind('outlineColor', colorValue))\n continue\n }\n\n if (prop === 'font-size') {\n classes.push(`text-[${value}]`)\n continue\n }\n\n if (prop === 'font-weight') {\n const weightMap: Record<string, string> = {\n '100': 'font-thin',\n '200': 'font-extralight',\n '300': 'font-light',\n '400': 'font-normal',\n '500': 'font-medium',\n '600': 'font-semibold',\n '700': 'font-bold',\n '800': 'font-extrabold',\n '900': 'font-black',\n }\n classes.push(weightMap[value] || `font-[${value}]`)\n continue\n }\n\n if (prop === 'line-height') {\n classes.push(`leading-[${value}]`)\n continue\n }\n\n if (prop === 'letter-spacing') {\n classes.push(`tracking-[${value}]`)\n continue\n }\n\n if (prop === 'text-align') {\n const alignMap: Record<string, string> = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n justify: 'text-justify',\n }\n if (alignMap[value]) classes.push(alignMap[value])\n continue\n }\n\n if (prop === 'font-family') {\n classes.push(`font-[${value.replace(/\\s+/g, '_')}]`)\n continue\n }\n }\n\n return classes.join(' ')\n}\n\nexport const propertyToCSSMap: Record<SpacingPropertyKey, string> = {\n paddingTop: 'padding-top',\n paddingRight: 'padding-right',\n paddingBottom: 'padding-bottom',\n paddingLeft: 'padding-left',\n marginTop: 'margin-top',\n marginRight: 'margin-right',\n marginBottom: 'margin-bottom',\n marginLeft: 'margin-left',\n gap: 'gap',\n}\n\nexport const borderRadiusPropertyToCSSMap: Record<BorderRadiusPropertyKey, string> = {\n borderTopLeftRadius: 'border-top-left-radius',\n borderTopRightRadius: 'border-top-right-radius',\n borderBottomRightRadius: 'border-bottom-right-radius',\n borderBottomLeftRadius: 'border-bottom-left-radius',\n}\n\nexport const borderPropertyToCSSMap: Record<BorderPropertyKey, string> = {\n borderTopStyle: 'border-top-style',\n borderTopWidth: 'border-top-width',\n borderRightStyle: 'border-right-style',\n borderRightWidth: 'border-right-width',\n borderBottomStyle: 'border-bottom-style',\n borderBottomWidth: 'border-bottom-width',\n borderLeftStyle: 'border-left-style',\n borderLeftWidth: 'border-left-width',\n}\n\nexport const flexPropertyToCSSMap: Record<FlexPropertyKey, string> = {\n display: 'display',\n flexDirection: 'flex-direction',\n justifyContent: 'justify-content',\n alignItems: 'align-items',\n}\n\nexport const sizingPropertyToCSSMap: Record<SizingPropertyKey, string> = {\n width: 'width',\n height: 'height',\n}\n\nexport const typographyPropertyToCSSMap: Record<TypographyPropertyKey, string> = {\n fontFamily: 'font-family',\n fontWeight: 'font-weight',\n fontSize: 'font-size',\n lineHeight: 'line-height',\n letterSpacing: 'letter-spacing',\n textAlign: 'text-align',\n textVerticalAlign: 'align-items',\n}\n\nconst TEXT_ELEMENT_TAGS = new Set([\n 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\n 'span', 'label', 'a', 'strong', 'em', 'small',\n 'blockquote', 'li', 'td', 'th', 'caption', 'figcaption',\n 'legend', 'dt', 'dd', 'abbr', 'cite', 'code', 'pre',\n])\n\nfunction hasDirectNonWhitespaceText(element: HTMLElement): boolean {\n return Array.from(element.childNodes).some(\n (node) => node.nodeType === Node.TEXT_NODE && Boolean(node.textContent?.trim())\n )\n}\n\nexport function isTextElement(element: HTMLElement): boolean {\n const tagName = element.tagName.toLowerCase()\n if (TEXT_ELEMENT_TAGS.has(tagName)) {\n return true\n }\n if (hasDirectNonWhitespaceText(element)) {\n return true\n }\n if (element.children.length === 0 && element.textContent?.trim()) {\n return true\n }\n return false\n}\n\nexport function getComputedTypography(element: HTMLElement): TypographyProperties {\n const computed = window.getComputedStyle(element)\n\n let textVerticalAlign: TypographyProperties['textVerticalAlign'] = 'flex-start'\n if (computed.display === 'flex' || computed.display === 'inline-flex') {\n const alignItems = computed.alignItems\n if (alignItems === 'center') textVerticalAlign = 'center'\n else if (alignItems === 'flex-end' || alignItems === 'end') textVerticalAlign = 'flex-end'\n }\n\n // Handle \"normal\" keyword for line-height (use font-size as approximation)\n const lineHeight = computed.lineHeight === 'normal'\n ? { numericValue: parseFloat(computed.fontSize) * 1.2, unit: 'px' as const, raw: `${Math.round(parseFloat(computed.fontSize) * 1.2)}px` }\n : parsePropertyValue(computed.lineHeight)\n\n // Handle letter-spacing: convert px to em for consistent editing\n const fontSize = parseFloat(computed.fontSize)\n let letterSpacing: CSSPropertyValue\n if (computed.letterSpacing === 'normal') {\n letterSpacing = { numericValue: 0, unit: 'em' as const, raw: '0em' }\n } else {\n const parsed = parsePropertyValue(computed.letterSpacing)\n if (parsed.unit === 'px' && fontSize > 0) {\n const emValue = Math.round((parsed.numericValue / fontSize) * 100) / 100\n letterSpacing = { numericValue: emValue, unit: 'em' as const, raw: `${emValue}em` }\n } else {\n letterSpacing = parsed\n }\n }\n\n return {\n fontFamily: computed.fontFamily,\n fontWeight: computed.fontWeight,\n fontSize: parsePropertyValue(computed.fontSize),\n lineHeight,\n letterSpacing,\n textAlign: computed.textAlign as TypographyProperties['textAlign'],\n textVerticalAlign,\n }\n}\n\nexport function detectSizingMode(\n element: HTMLElement,\n dimension: 'width' | 'height'\n): SizingMode {\n const computed = window.getComputedStyle(element)\n const inlineValue = element.style[dimension]\n\n if (inlineValue === '100%') return 'fill'\n if (inlineValue === 'auto' || inlineValue === 'fit-content') return 'fit'\n\n const computedValue = computed[dimension]\n\n if (computedValue === '100%') return 'fill'\n if (\n computedValue === 'auto' ||\n computedValue === 'fit-content' ||\n computedValue === 'max-content'\n ) {\n return 'fit'\n }\n\n const parent = element.parentElement\n if (parent) {\n const parentComputed = window.getComputedStyle(parent)\n if (parentComputed.display === 'flex' || parentComputed.display === 'inline-flex') {\n const flexGrow = computed.flexGrow\n if (flexGrow !== '0') {\n return 'fill'\n }\n }\n }\n\n if (dimension === 'width') {\n if (computed.display === 'block' && !inlineValue) {\n return 'fill'\n }\n if (\n computed.display === 'inline-block' ||\n computed.display === 'inline-flex' ||\n computed.display === 'inline'\n ) {\n return 'fit'\n }\n }\n\n if (dimension === 'height') {\n if (!inlineValue) {\n return 'fit'\n }\n }\n\n return 'fixed'\n}\n\nexport function getSizingValue(element: HTMLElement, dimension: 'width' | 'height'): SizingValue {\n const mode = detectSizingMode(element, dimension)\n const rect = element.getBoundingClientRect()\n const numericValue = Math.round(dimension === 'width' ? rect.width : rect.height)\n\n return {\n mode,\n value: {\n numericValue,\n unit: 'px',\n raw: `${numericValue}px`,\n },\n }\n}\n\nexport function getComputedSizing(element: HTMLElement): SizingProperties {\n return {\n width: getSizingValue(element, 'width'),\n height: getSizingValue(element, 'height'),\n }\n}\n\nexport function sizingValueToCSS(sizing: SizingValue): string {\n switch (sizing.mode) {\n case 'fill':\n return '100%'\n case 'fit':\n return 'fit-content'\n case 'fixed':\n return `${sizing.value.numericValue}${sizing.value.unit}`\n }\n}\n\nexport function sizingToTailwind(dimension: 'width' | 'height', sizing: SizingValue): string {\n const prefix = dimension === 'width' ? 'w' : 'h'\n\n switch (sizing.mode) {\n case 'fill':\n return `${prefix}-full`\n case 'fit':\n return `${prefix}-fit`\n case 'fixed':\n return `${prefix}-[${sizing.value.numericValue}${sizing.value.unit}]`\n }\n}\n\nfunction parseHexColor(hex: string): ColorValue {\n const raw = hex\n let h = hex.replace('#', '')\n\n // Expand shorthand (#RGB -> #RRGGBB)\n if (h.length === 3) {\n h = h\n .split('')\n .map((c) => c + c)\n .join('')\n }\n\n // Handle 8-digit hex with alpha\n if (h.length === 8) {\n const alpha = Math.round((parseInt(h.slice(6, 8), 16) / 255) * 100)\n return { hex: h.slice(0, 6).toUpperCase(), alpha, raw }\n }\n\n return { hex: h.toUpperCase(), alpha: 100, raw }\n}\n\nfunction parseRgbaColor(rgba: string): ColorValue {\n const match = rgba.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([\\d.]+))?\\)/)\n if (!match) {\n return { hex: '000000', alpha: 100, raw: rgba }\n }\n\n const r = parseInt(match[1])\n const g = parseInt(match[2])\n const b = parseInt(match[3])\n const a = match[4] ? parseFloat(match[4]) : 1\n\n const hex = [r, g, b]\n .map((v) => v.toString(16).padStart(2, '0'))\n .join('')\n .toUpperCase()\n const alpha = Math.round(a * 100)\n\n return { hex, alpha, raw: rgba }\n}\n\nfunction parseNamedColor(name: string): ColorValue {\n // Use a temporary canvas to convert named colors\n const ctx = document.createElement('canvas').getContext('2d')\n if (!ctx) {\n return { hex: '000000', alpha: 100, raw: name }\n }\n\n ctx.fillStyle = name\n const computed = ctx.fillStyle\n\n if (computed.startsWith('#')) {\n return parseHexColor(computed)\n }\n return parseRgbaColor(computed)\n}\n\nexport function parseColorValue(cssValue: string): ColorValue {\n const raw = cssValue.trim()\n\n // Handle transparent\n if (raw === 'transparent') {\n return { hex: '000000', alpha: 0, raw }\n }\n\n // Handle hex colors\n if (raw.startsWith('#')) {\n return parseHexColor(raw)\n }\n\n // Handle rgb/rgba\n if (raw.startsWith('rgb')) {\n return parseRgbaColor(raw)\n }\n\n // Fallback: use canvas to convert named colors\n return parseNamedColor(raw)\n}\n\nconst TRANSPARENT_COLOR: ColorValue = { hex: '000000', alpha: 0, raw: 'transparent' }\n\nexport function getComputedColorStyles(element: HTMLElement): ColorProperties {\n const computed = window.getComputedStyle(element)\n\n const borderSides = [\n { style: computed.borderTopStyle, width: computed.borderTopWidth, color: computed.borderTopColor },\n { style: computed.borderRightStyle, width: computed.borderRightWidth, color: computed.borderRightColor },\n { style: computed.borderBottomStyle, width: computed.borderBottomWidth, color: computed.borderBottomColor },\n { style: computed.borderLeftStyle, width: computed.borderLeftWidth, color: computed.borderLeftColor },\n ]\n const visibleBorderSide = borderSides.find(\n (side) => side.style !== 'none' && side.style !== 'hidden' && parseFloat(side.width) > 0\n )\n const hasBorder = Boolean(visibleBorderSide)\n const hasOutline =\n computed.outlineStyle !== 'none' && parseFloat(computed.outlineWidth) > 0\n\n return {\n backgroundColor: parseColorValue(computed.backgroundColor),\n color: parseColorValue(computed.color),\n borderColor: hasBorder && visibleBorderSide ? parseColorValue(visibleBorderSide.color) : TRANSPARENT_COLOR,\n outlineColor: hasOutline ? parseColorValue(computed.outlineColor) : TRANSPARENT_COLOR,\n }\n}\n\nexport const colorPropertyToCSSMap: Record<ColorPropertyKey, string> = {\n backgroundColor: 'background-color',\n color: 'color',\n borderColor: 'border-color',\n outlineColor: 'outline-color',\n}\n\nconst colorTailwindPrefixMap: Record<ColorPropertyKey, string> = {\n backgroundColor: 'bg',\n color: 'text',\n borderColor: 'border',\n outlineColor: 'outline',\n}\n\nexport function colorToTailwind(\n property: ColorPropertyKey,\n colorValue: ColorValue\n): string {\n const prefix = colorTailwindPrefixMap[property]\n\n // Use arbitrary hex value\n if (colorValue.alpha === 100) {\n return `${prefix}-[#${colorValue.hex}]`\n }\n return `${prefix}-[#${colorValue.hex}]/${colorValue.alpha}`\n}\n\nexport function getElementInfo(element: HTMLElement): ElementInfo {\n const computed = window.getComputedStyle(element)\n const parentElement = element.parentElement\n\n const isFlexContainer = computed.display === 'flex' || computed.display === 'inline-flex'\n\n let isFlexItem = false\n if (parentElement) {\n const parentComputed = window.getComputedStyle(parentElement)\n isFlexItem = parentComputed.display === 'flex' || parentComputed.display === 'inline-flex'\n }\n\n return {\n tagName: element.tagName.toLowerCase(),\n id: element.id || null,\n classList: Array.from(element.classList),\n isFlexContainer,\n isFlexItem,\n isTextElement: isTextElement(element),\n parentElement,\n hasChildren: element.children.length > 0,\n }\n}\n\ninterface DimensionDisplay {\n width: string\n height: string\n}\n\nfunction isFitSizing(element: HTMLElement, dimension: 'width' | 'height'): boolean {\n const computed = window.getComputedStyle(element)\n const inlineValue = element.style[dimension]\n\n if (inlineValue === 'auto') return true\n\n const computedValue = computed[dimension]\n\n if (!inlineValue) {\n const parent = element.parentElement\n if (parent) {\n const parentComputed = window.getComputedStyle(parent)\n if (parentComputed.display === 'flex' || parentComputed.display === 'inline-flex') {\n const flexBasis = computed.flexBasis\n const flexGrow = computed.flexGrow\n if (flexBasis === 'auto' && flexGrow === '0') {\n return true\n }\n }\n }\n\n if (dimension === 'width') {\n if (computed.display === 'block' && !inlineValue) {\n return false\n }\n if (\n computed.display === 'inline-block' ||\n computed.display === 'inline-flex' ||\n computed.display === 'inline'\n ) {\n return true\n }\n }\n\n if (dimension === 'height') {\n return !inlineValue\n }\n }\n\n if (computedValue.includes('fit-content') || computedValue.includes('max-content')) {\n return true\n }\n\n return false\n}\n\nexport function getDimensionDisplay(element: HTMLElement): DimensionDisplay {\n const rect = element.getBoundingClientRect()\n const width = Math.round(rect.width)\n const height = Math.round(rect.height)\n\n const widthIsFit = isFitSizing(element, 'width')\n const heightIsFit = isFitSizing(element, 'height')\n\n return {\n width: widthIsFit ? `Fit ${width}` : `${width}`,\n height: heightIsFit ? `Fit ${height}` : `${height}`,\n }\n}\n\n\nexport function calculateParentMeasurements(element: HTMLElement, container?: HTMLElement): MeasurementLine[] {\n const parent = container ?? element.parentElement\n if (!parent) return []\n\n const elementRect = element.getBoundingClientRect()\n const parentRect = parent.getBoundingClientRect()\n\n // Use clientLeft/clientTop for reliable border widths, clientWidth/clientHeight\n // for inner dimensions (handles scrollbars correctly)\n const paddingBoxLeft = parentRect.left + parent.clientLeft\n const paddingBoxTop = parentRect.top + parent.clientTop\n const paddingBoxRight = parentRect.left + parent.clientLeft + parent.clientWidth\n const paddingBoxBottom = parentRect.top + parent.clientTop + parent.clientHeight\n\n let parentInnerLeft: number\n let parentInnerTop: number\n let parentInnerRight: number\n let parentInnerBottom: number\n\n if (container) {\n // Ancestor case: measure from padding-box (inside border, outside padding).\n // The ancestor's padding doesn't directly position the child — intermediate\n // elements do — so the visually correct edge is inside the border only.\n parentInnerLeft = paddingBoxLeft\n parentInnerTop = paddingBoxTop\n parentInnerRight = paddingBoxRight\n parentInnerBottom = paddingBoxBottom\n } else {\n // Direct parent case: measure from content-box (inside border and padding).\n // The parent's padding IS the gap between its edge and the child's layout area.\n const parentStyles = window.getComputedStyle(parent)\n parentInnerLeft = paddingBoxLeft + (parseFloat(parentStyles.paddingLeft) || 0)\n parentInnerTop = paddingBoxTop + (parseFloat(parentStyles.paddingTop) || 0)\n parentInnerRight = paddingBoxRight - (parseFloat(parentStyles.paddingRight) || 0)\n parentInnerBottom = paddingBoxBottom - (parseFloat(parentStyles.paddingBottom) || 0)\n }\n\n const measurements: MeasurementLine[] = []\n\n const topDistance = Math.round(elementRect.top - parentInnerTop)\n if (topDistance > 0) {\n const midX = elementRect.left + elementRect.width / 2\n measurements.push({\n direction: 'vertical',\n x1: midX,\n y1: parentInnerTop,\n x2: midX,\n y2: elementRect.top,\n distance: topDistance,\n labelPosition: { x: midX, y: (parentInnerTop + elementRect.top) / 2 },\n })\n }\n\n const bottomDistance = Math.round(parentInnerBottom - elementRect.bottom)\n if (bottomDistance > 0) {\n const midX = elementRect.left + elementRect.width / 2\n measurements.push({\n direction: 'vertical',\n x1: midX,\n y1: elementRect.bottom,\n x2: midX,\n y2: parentInnerBottom,\n distance: bottomDistance,\n labelPosition: { x: midX, y: (elementRect.bottom + parentInnerBottom) / 2 },\n })\n }\n\n const leftDistance = Math.round(elementRect.left - parentInnerLeft)\n if (leftDistance > 0) {\n const midY = elementRect.top + elementRect.height / 2\n measurements.push({\n direction: 'horizontal',\n x1: parentInnerLeft,\n y1: midY,\n x2: elementRect.left,\n y2: midY,\n distance: leftDistance,\n labelPosition: { x: (parentInnerLeft + elementRect.left) / 2, y: midY },\n })\n }\n\n const rightDistance = Math.round(parentInnerRight - elementRect.right)\n if (rightDistance > 0) {\n const midY = elementRect.top + elementRect.height / 2\n measurements.push({\n direction: 'horizontal',\n x1: elementRect.right,\n y1: midY,\n x2: parentInnerRight,\n y2: midY,\n distance: rightDistance,\n labelPosition: { x: (elementRect.right + parentInnerRight) / 2, y: midY },\n })\n }\n\n return measurements\n}\n\nexport function calculateElementMeasurements(\n from: HTMLElement,\n to: HTMLElement\n): MeasurementLine[] {\n const fromRect = from.getBoundingClientRect()\n const toRect = to.getBoundingClientRect()\n const measurements: MeasurementLine[] = []\n\n const horizontalOverlap =\n fromRect.left < toRect.right && fromRect.right > toRect.left\n const verticalOverlap =\n fromRect.top < toRect.bottom && fromRect.bottom > toRect.top\n\n if (verticalOverlap) {\n const overlapTop = Math.max(fromRect.top, toRect.top)\n const overlapBottom = Math.min(fromRect.bottom, toRect.bottom)\n const midY = (overlapTop + overlapBottom) / 2\n\n if (fromRect.right <= toRect.left) {\n const distance = Math.round(toRect.left - fromRect.right)\n measurements.push({\n direction: 'horizontal',\n x1: fromRect.right,\n y1: midY,\n x2: toRect.left,\n y2: midY,\n distance,\n labelPosition: { x: (fromRect.right + toRect.left) / 2, y: midY },\n })\n } else if (fromRect.left >= toRect.right) {\n const distance = Math.round(fromRect.left - toRect.right)\n measurements.push({\n direction: 'horizontal',\n x1: toRect.right,\n y1: midY,\n x2: fromRect.left,\n y2: midY,\n distance,\n labelPosition: { x: (toRect.right + fromRect.left) / 2, y: midY },\n })\n }\n }\n\n if (horizontalOverlap) {\n const overlapLeft = Math.max(fromRect.left, toRect.left)\n const overlapRight = Math.min(fromRect.right, toRect.right)\n const midX = (overlapLeft + overlapRight) / 2\n\n if (fromRect.bottom <= toRect.top) {\n const distance = Math.round(toRect.top - fromRect.bottom)\n measurements.push({\n direction: 'vertical',\n x1: midX,\n y1: fromRect.bottom,\n x2: midX,\n y2: toRect.top,\n distance,\n labelPosition: { x: midX, y: (fromRect.bottom + toRect.top) / 2 },\n })\n } else if (fromRect.top >= toRect.bottom) {\n const distance = Math.round(fromRect.top - toRect.bottom)\n measurements.push({\n direction: 'vertical',\n x1: midX,\n y1: toRect.bottom,\n x2: midX,\n y2: fromRect.top,\n distance,\n labelPosition: { x: midX, y: (toRect.bottom + fromRect.top) / 2 },\n })\n }\n }\n\n if (!horizontalOverlap && !verticalOverlap) {\n const fromCenterX = fromRect.left + fromRect.width / 2\n const fromCenterY = fromRect.top + fromRect.height / 2\n const toCenterX = toRect.left + toRect.width / 2\n const toCenterY = toRect.top + toRect.height / 2\n\n const hDistance = toCenterX > fromCenterX\n ? Math.round(toRect.left - fromRect.right)\n : Math.round(fromRect.left - toRect.right)\n\n if (hDistance > 0) {\n const startX = toCenterX > fromCenterX ? fromRect.right : fromRect.left\n const endX = toCenterX > fromCenterX ? toRect.left : toRect.right\n const y = (fromCenterY + toCenterY) / 2\n measurements.push({\n direction: 'horizontal',\n x1: startX,\n y1: y,\n x2: endX,\n y2: y,\n distance: hDistance,\n labelPosition: { x: (startX + endX) / 2, y },\n })\n }\n\n const vDistance = toCenterY > fromCenterY\n ? Math.round(toRect.top - fromRect.bottom)\n : Math.round(fromRect.top - toRect.bottom)\n\n if (vDistance > 0) {\n const x = (fromCenterX + toCenterX) / 2\n const startY = toCenterY > fromCenterY ? fromRect.bottom : fromRect.top\n const endY = toCenterY > fromCenterY ? toRect.top : toRect.bottom\n measurements.push({\n direction: 'vertical',\n x1: x,\n y1: startY,\n x2: x,\n y2: endY,\n distance: vDistance,\n labelPosition: { x, y: (startY + endY) / 2 },\n })\n }\n }\n\n return measurements\n}\n\nconst GUIDELINE_PROXIMITY = 80\n\nexport function calculateGuidelineMeasurements(\n element: HTMLElement,\n guidelines: Guideline[],\n mousePosition?: { x: number; y: number } | null,\n): MeasurementLine[] {\n if (guidelines.length === 0) return []\n\n const rect = element.getBoundingClientRect()\n const scrollX = window.scrollX\n const scrollY = window.scrollY\n const measurements: MeasurementLine[] = []\n\n for (const g of guidelines) {\n if (g.orientation === 'horizontal') {\n const gy = g.position - scrollY\n const midX = rect.left + rect.width / 2\n\n // Only show when mouse is near this guideline's Y position\n if (mousePosition && Math.abs(mousePosition.y - gy) > GUIDELINE_PROXIMITY) continue\n\n if (gy < rect.top) {\n const distance = Math.round(rect.top - gy)\n if (distance > 0) {\n measurements.push({\n direction: 'vertical',\n x1: midX,\n y1: gy,\n x2: midX,\n y2: rect.top,\n distance,\n labelPosition: { x: midX, y: (gy + rect.top) / 2 },\n })\n }\n } else if (gy > rect.bottom) {\n const distance = Math.round(gy - rect.bottom)\n if (distance > 0) {\n measurements.push({\n direction: 'vertical',\n x1: midX,\n y1: rect.bottom,\n x2: midX,\n y2: gy,\n distance,\n labelPosition: { x: midX, y: (rect.bottom + gy) / 2 },\n })\n }\n }\n } else {\n const gx = g.position - scrollX\n const midY = rect.top + rect.height / 2\n\n // Only show when mouse is near this guideline's X position\n if (mousePosition && Math.abs(mousePosition.x - gx) > GUIDELINE_PROXIMITY) continue\n\n if (gx < rect.left) {\n const distance = Math.round(rect.left - gx)\n if (distance > 0) {\n measurements.push({\n direction: 'horizontal',\n x1: gx,\n y1: midY,\n x2: rect.left,\n y2: midY,\n distance,\n labelPosition: { x: (gx + rect.left) / 2, y: midY },\n })\n }\n } else if (gx > rect.right) {\n const distance = Math.round(gx - rect.right)\n if (distance > 0) {\n measurements.push({\n direction: 'horizontal',\n x1: rect.right,\n y1: midY,\n x2: gx,\n y2: midY,\n distance,\n labelPosition: { x: (rect.right + gx) / 2, y: midY },\n })\n }\n }\n }\n }\n\n return measurements\n}\n\nexport function isFlexContainer(element: HTMLElement): boolean {\n const computed = window.getComputedStyle(element)\n return computed.display === 'flex' || computed.display === 'inline-flex'\n}\n\nexport function getFlexDirection(\n element: HTMLElement\n): 'row' | 'row-reverse' | 'column' | 'column-reverse' {\n const computed = window.getComputedStyle(element)\n return computed.flexDirection as 'row' | 'row-reverse' | 'column' | 'column-reverse'\n}\n\nexport function detectChildrenDirection(\n container: HTMLElement,\n exclude: HTMLElement | null\n): { axis: 'horizontal' | 'vertical'; reversed: boolean } {\n const computed = window.getComputedStyle(container)\n\n // Flex: trust CSS for accuracy (especially reverse)\n if (computed.display === 'flex' || computed.display === 'inline-flex') {\n const dir = computed.flexDirection\n return {\n axis: (dir === 'row' || dir === 'row-reverse') ? 'horizontal' : 'vertical',\n reversed: dir === 'row-reverse' || dir === 'column-reverse',\n }\n }\n\n // Non-flex: examine first two visible, in-flow children\n const visible: HTMLElement[] = []\n for (const c of container.children) {\n if (!(c instanceof HTMLElement) || c === exclude) continue\n const cs = window.getComputedStyle(c)\n if (cs.display === 'none' || cs.position === 'absolute' || cs.position === 'fixed') continue\n visible.push(c)\n if (visible.length === 2) break\n }\n\n if (visible.length < 2) return { axis: 'vertical', reversed: false }\n\n const first = visible[0].getBoundingClientRect()\n const second = visible[1].getBoundingClientRect()\n const yOverlap = first.bottom - 2 > second.top && second.bottom - 2 > first.top\n\n if (yOverlap) {\n return { axis: 'horizontal', reversed: second.right < first.left }\n }\n return { axis: 'vertical', reversed: second.bottom < first.top }\n}\n\nfunction htmlChildren(el: HTMLElement): HTMLElement[] {\n return Array.from(el.children).filter(\n (child): child is HTMLElement => child instanceof HTMLElement\n )\n}\n\n/** Walk up from `element` to find the nearest flex/inline-flex ancestor, stopping at `boundary`. */\nfunction findFlexAncestor(\n element: HTMLElement,\n boundary: HTMLElement | null,\n): { flexParent: HTMLElement; child: HTMLElement } | null {\n let current: HTMLElement | null = element\n while (current && current !== document.body) {\n const parent: HTMLElement | null = current.parentElement\n if (!parent) break\n const display = getComputedStyle(parent).display\n if (display === 'flex' || display === 'inline-flex') {\n return { flexParent: parent, child: current }\n }\n if (boundary && parent === boundary) break\n current = parent\n }\n return null\n}\n\nexport function computeHoverHighlight(\n elementUnder: HTMLElement | null,\n selectedElement: HTMLElement | null,\n): { flexContainer: HTMLElement; children: HTMLElement[] } | null {\n if (\n !elementUnder ||\n elementUnder === document.body ||\n elementUnder === document.documentElement ||\n elementUnder.closest('[data-direct-edit]') ||\n elementUnder.closest('[data-direct-edit-host]') ||\n elementUnder === selectedElement\n ) {\n return null\n }\n\n // When hovering descendants of the selected element, stop walk-up at the boundary\n const boundary = selectedElement?.contains(elementUnder) ? selectedElement : null\n\n const ownDisplay = getComputedStyle(elementUnder).display\n if (ownDisplay === 'flex' || ownDisplay === 'inline-flex') {\n return { flexContainer: elementUnder, children: htmlChildren(elementUnder) }\n }\n\n const found = findFlexAncestor(elementUnder, boundary)\n if (found) {\n return { flexContainer: found.flexParent, children: htmlChildren(found.flexParent) }\n }\n\n return { flexContainer: elementUnder, children: [] }\n}\n\nexport function resolveElementTarget(\n elementUnder: HTMLElement,\n selectedElement: HTMLElement | null,\n): HTMLElement {\n const boundary = selectedElement?.contains(elementUnder) ? selectedElement : null\n const found = findFlexAncestor(elementUnder, boundary)\n if (found && found.flexParent === boundary) return elementUnder\n return found?.child ?? elementUnder\n}\n\n/** Finds the text-owning element at a point within `boundary` using browser caret hit-testing. */\nexport function findTextOwnerAtPoint(\n boundary: HTMLElement,\n clientX: number,\n clientY: number,\n): HTMLElement | null {\n const doc = document as Document & {\n caretPositionFromPoint?: (x: number, y: number) => { offsetNode: Node } | null\n caretRangeFromPoint?: (x: number, y: number) => Range | null\n }\n\n const caretNode =\n doc.caretPositionFromPoint?.(clientX, clientY)?.offsetNode\n ?? doc.caretRangeFromPoint?.(clientX, clientY)?.startContainer\n ?? null\n if (!caretNode || caretNode.nodeType !== Node.TEXT_NODE) return null\n\n const textNode = caretNode as Text\n if (!(textNode.nodeValue ?? '').trim()) return null\n\n const owner = textNode.parentElement\n if (!owner || !boundary.contains(owner)) return null\n if (owner.closest('[data-direct-edit]') || owner.closest('[data-direct-edit-host]')) return null\n\n // Guard against caret APIs returning nearby text nodes.\n const range = document.createRange()\n range.selectNodeContents(textNode)\n const hitsText = Array.from(range.getClientRects()).some(\n (r) => clientX >= r.left && clientX <= r.right && clientY >= r.top && clientY <= r.bottom\n )\n range.detach?.()\n return hitsText ? owner : null\n}\n\n/** Fallback text hit-testing by scanning text nodes and rendered rects within `boundary`. */\nexport function findTextOwnerByRangeScan(\n boundary: HTMLElement,\n clientX: number,\n clientY: number,\n): HTMLElement | null {\n const walker = document.createTreeWalker(boundary, NodeFilter.SHOW_TEXT)\n let current: Node | null = walker.nextNode()\n\n while (current) {\n const textNode = current as Text\n if ((textNode.nodeValue ?? '').trim()) {\n const owner = textNode.parentElement\n if (\n owner &&\n boundary.contains(owner) &&\n !owner.closest('[data-direct-edit]') &&\n !owner.closest('[data-direct-edit-host]')\n ) {\n const range = document.createRange()\n range.selectNodeContents(textNode)\n const hitsText = Array.from(range.getClientRects()).some(\n (r) => clientX >= r.left && clientX <= r.right && clientY >= r.top && clientY <= r.bottom\n )\n range.detach?.()\n if (hitsText) return owner\n }\n }\n current = walker.nextNode()\n }\n\n return null\n}\n\n/** Wrap the direct text node under the point into a span so it becomes independently selectable. */\nexport function ensureDirectTextSpanAtPoint(\n parent: HTMLElement,\n clientX: number,\n clientY: number,\n): HTMLElement | null {\n const directTextNodes = Array.from(parent.childNodes).filter(\n (node): node is Text => node.nodeType === Node.TEXT_NODE && Boolean(node.textContent?.trim())\n )\n\n for (const textNode of directTextNodes) {\n const range = document.createRange()\n range.selectNodeContents(textNode)\n const hitsText = Array.from(range.getClientRects()).some(\n (r) => clientX >= r.left && clientX <= r.right && clientY >= r.top && clientY <= r.bottom\n )\n range.detach?.()\n\n if (!hitsText) continue\n\n const span = document.createElement('span')\n span.setAttribute('data-direct-edit-generated', 'text-span')\n span.textContent = textNode.textContent ?? ''\n parent.replaceChild(span, textNode)\n return span\n }\n\n return null\n}\n\n/** When elementFromPoint returns the selected element (bare text, padding, gap),\n * find the best child element to drill into at the given coordinates. */\nexport function findChildAtPoint(\n parent: HTMLElement,\n clientX: number,\n clientY: number,\n): HTMLElement | null {\n const children = htmlChildren(parent)\n if (children.length === 0) return null\n\n // Direct hit: child whose bbox contains the click\n const hit = children.find((child) => {\n const r = child.getBoundingClientRect()\n return clientX >= r.left && clientX <= r.right && clientY >= r.top && clientY <= r.bottom\n })\n if (hit) return hit\n\n // Single-child fallback should not steal clicks from parent's direct text.\n if (children.length === 1 && !hasDirectNonWhitespaceText(parent)) return children[0]\n\n return null\n}\n\nexport function elementFromPointWithoutOverlays(x: number, y: number): HTMLElement | null {\n const host = document.querySelector<HTMLElement>('[data-direct-edit-host]')\n if (host) host.style.display = 'none'\n const el = document.elementFromPoint(x, y) as HTMLElement | null\n if (host) host.style.display = ''\n return el\n}\n\nfunction isLayoutContainer(element: HTMLElement): boolean {\n const display = window.getComputedStyle(element).display\n return (\n display === 'flex' ||\n display === 'inline-flex' ||\n display === 'grid' ||\n display === 'inline-grid'\n )\n}\n\nfunction isBlockContainer(element: HTMLElement): boolean {\n const display = window.getComputedStyle(element).display\n return display === 'block' || display === 'flow-root'\n || display === 'inline-block' || display === 'list-item'\n}\n\nfunction skipElement(el: HTMLElement, exclude: HTMLElement | null): boolean {\n if (exclude && exclude.contains(el)) return true\n if (el === document.body || el === document.documentElement) return true\n if (el.closest('[data-direct-edit]') || el.closest('[data-direct-edit-host]')) return true\n return false\n}\n\nfunction findContainerViaTraversal(x: number, y: number, exclude: HTMLElement | null): HTMLElement | null {\n const el = elementFromPointWithoutOverlays(x, y)\n if (!el) return null\n let current: HTMLElement | null = el\n while (current) {\n if (!skipElement(current, exclude)) {\n if (isLayoutContainer(current) || isBlockContainer(current)) return current\n }\n current = current.parentElement\n }\n return null\n}\n\nexport function findContainerAtPoint(\n x: number,\n y: number,\n exclude: HTMLElement | null,\n preferredParent?: HTMLElement | null\n): HTMLElement | null {\n const host = document.querySelector<HTMLElement>('[data-direct-edit-host]')\n if (host) host.style.display = 'none'\n\n const elements = document.elementsFromPoint(x, y) as HTMLElement[]\n\n if (host) host.style.display = ''\n\n // Find most specific container (front-to-back = most nested first)\n for (const el of elements) {\n if (skipElement(el, exclude)) continue\n if (isLayoutContainer(el) || isBlockContainer(el)) return el\n }\n\n // Fallback: preferredParent for gap/padding areas\n if (preferredParent && (isLayoutContainer(preferredParent) || isBlockContainer(preferredParent))) {\n for (const el of elements) {\n if (el === preferredParent) return preferredParent\n }\n }\n\n // Last resort: walk up DOM\n return findContainerViaTraversal(x, y, exclude)\n}\n\nexport function calculateDropPosition(\n container: HTMLElement,\n pointerX: number,\n pointerY: number,\n draggedElement: HTMLElement\n): { insertBefore: HTMLElement | null; indicator: DropIndicator } | null {\n const { axis, reversed: isReversed } = detectChildrenDirection(container, draggedElement)\n const isHorizontal = axis === 'horizontal'\n\n const children = Array.from(container.children).filter(\n (child) => child !== draggedElement && child instanceof HTMLElement\n ) as HTMLElement[]\n\n if (children.length === 0) {\n const containerRect = container.getBoundingClientRect()\n return {\n insertBefore: null,\n indicator: {\n x: containerRect.left + 4,\n y: containerRect.top + 4,\n width: isHorizontal ? 1 : containerRect.width - 8,\n height: isHorizontal ? containerRect.height - 8 : 1,\n },\n }\n }\n\n const containerRect = container.getBoundingClientRect()\n let insertBefore: HTMLElement | null = null\n let indicatorPosition = 0\n\n for (let i = 0; i < children.length; i++) {\n const child = children[i]\n const rect = child.getBoundingClientRect()\n const midpoint = isHorizontal\n ? rect.left + rect.width / 2\n : rect.top + rect.height / 2\n\n const pointer = isHorizontal ? pointerX : pointerY\n\n const beforeMidpoint = isReversed ? pointer > midpoint : pointer < midpoint\n\n if (beforeMidpoint) {\n insertBefore = child\n indicatorPosition = isHorizontal ? rect.left : rect.top\n break\n }\n }\n\n if (!insertBefore) {\n const lastChild = children[children.length - 1]\n const lastRect = lastChild.getBoundingClientRect()\n indicatorPosition = isHorizontal ? lastRect.right : lastRect.bottom\n }\n\n const indicator: DropIndicator = isHorizontal\n ? {\n x: indicatorPosition,\n y: containerRect.top + 4,\n width: 2,\n height: containerRect.height - 8,\n }\n : {\n x: containerRect.left + 4,\n y: indicatorPosition,\n width: containerRect.width - 8,\n height: 2,\n }\n\n return { insertBefore, indicator }\n}\n\n// Accesses React fiber internals to find the component stack. This is an undocumented\n// API that could change between React versions, but is a common pattern for dev tools.\n// Returns an empty array gracefully if React internals are unavailable.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getFiberForElement(element: HTMLElement): any | null {\n if (typeof window !== 'undefined') {\n const devtools = window.__DIRECT_EDIT_DEVTOOLS__\n if (devtools?.getFiberForElement) {\n const fiber = devtools.getFiberForElement(element)\n if (fiber) return fiber as any\n }\n }\n\n const fiberKey = Object.keys(element).find(\n (key) => key.startsWith('__reactFiber$') || key.startsWith('__reactInternalInstance$')\n )\n\n if (!fiberKey) return null\n return (element as any)[fiberKey] || null\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getSourceFromFiber(fiber: any):\n | {\n fileName?: string\n lineNumber?: number\n columnNumber?: number\n }\n | null {\n const debugSource = fiber?._debugSource\n if (debugSource?.fileName) return debugSource\n\n const owner = fiber?._debugOwner\n const ownerPending = owner?.pendingProps?.__source\n if (ownerPending?.fileName) return ownerPending\n\n const ownerMemo = owner?.memoizedProps?.__source\n if (ownerMemo?.fileName) return ownerMemo\n\n const pending = fiber?.pendingProps?.__source\n if (pending?.fileName) return pending\n\n const memo = fiber?.memoizedProps?.__source\n if (memo?.fileName) return memo\n\n return null\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction buildFrame(fiber: any): ReactComponentFrame | null {\n const type = fiber?.type\n if (typeof type !== 'function' && typeof type !== 'object') return null\n\n const name = type?.displayName || type?.name || null\n if (!name || name === 'Fragment') return null\n\n const frame: ReactComponentFrame = { name }\n const source = getSourceFromFiber(fiber)\n if (source?.fileName) {\n frame.file = source.fileName\n if (typeof source.lineNumber === 'number') {\n frame.line = source.lineNumber\n }\n if (typeof source.columnNumber === 'number') {\n frame.column = source.columnNumber\n }\n }\n\n return frame\n}\n\nfunction shouldIncludeFrame(\n frame: ReactComponentFrame,\n lastFrame: ReactComponentFrame | null\n): boolean {\n if (!lastFrame) return true\n if (frame.name !== lastFrame.name) return true\n if (!lastFrame.file && frame.file) return true\n if (lastFrame.file && frame.file && lastFrame.line == null && frame.line != null) return true\n if (\n lastFrame.file &&\n frame.file &&\n lastFrame.line != null &&\n frame.line != null &&\n lastFrame.column == null &&\n frame.column != null\n ) {\n return true\n }\n return false\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getOwnerStack(fiber: any): ReactComponentFrame[] {\n const frames: ReactComponentFrame[] = []\n let current = fiber\n let lastFrame: ReactComponentFrame | null = null\n\n while (current) {\n const frame = buildFrame(current)\n if (frame && shouldIncludeFrame(frame, lastFrame)) {\n frames.push(frame)\n lastFrame = frame\n }\n current = current._debugOwner\n }\n\n return frames\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getRenderStack(fiber: any): ReactComponentFrame[] {\n const frames: ReactComponentFrame[] = []\n let current = fiber\n let lastFrame: ReactComponentFrame | null = null\n\n while (current) {\n const frame = buildFrame(current)\n if (frame && shouldIncludeFrame(frame, lastFrame)) {\n frames.push(frame)\n lastFrame = frame\n }\n current = current.return\n }\n\n return frames\n}\n\nfunction getReactComponentStack(element: HTMLElement): ReactComponentFrame[] {\n const fiber = getFiberForElement(element)\n if (!fiber) return []\n\n const ownerStack = getOwnerStack(fiber)\n if (ownerStack.length > 0) {\n return ownerStack\n }\n\n return getRenderStack(fiber)\n}\n\nexport function getElementDisplayName(element: HTMLElement): string {\n return element.tagName.toLowerCase()\n}\n\nconst STABLE_ATTRIBUTES = ['data-testid', 'data-qa', 'data-cy', 'aria-label', 'role'] as const\nconst MAX_SELECTOR_DEPTH = 4\n\nfunction escapeCssIdentifier(value: string): string {\n if (typeof CSS !== 'undefined' && typeof CSS.escape === 'function') {\n return CSS.escape(value)\n }\n return value.replace(/[^a-zA-Z0-9_-]/g, (char) => `\\\\${char}`)\n}\n\nfunction escapeAttributeValue(value: string): string {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')\n}\n\nfunction isUniqueSelector(selector: string): boolean {\n if (typeof document === 'undefined') return false\n try {\n return document.querySelectorAll(selector).length === 1\n } catch {\n return false\n }\n}\n\nfunction getUniqueIdSelector(element: HTMLElement): string | null {\n if (!element.id) return null\n const selector = `#${escapeCssIdentifier(element.id)}`\n return isUniqueSelector(selector) ? selector : null\n}\n\nfunction getStableAttributeSelector(element: HTMLElement): string | null {\n const tagName = element.tagName.toLowerCase()\n for (const attr of STABLE_ATTRIBUTES) {\n const value = element.getAttribute(attr)\n if (!value) continue\n const selector = `${tagName}[${attr}=\"${escapeAttributeValue(value)}\"]`\n if (isUniqueSelector(selector)) {\n return selector\n }\n }\n return null\n}\n\nfunction getNthOfTypeSelector(element: HTMLElement): string {\n const tagName = element.tagName.toLowerCase()\n const classes = Array.from(element.classList)\n .filter((className) => className && !className.startsWith('direct-edit'))\n .slice(0, 2)\n const classSelector = classes.map((className) => `.${escapeCssIdentifier(className)}`).join('')\n\n let nthOfType = ''\n const parent = element.parentElement\n if (parent) {\n const siblings = Array.from(parent.children).filter(\n (child) => (child as HTMLElement).tagName.toLowerCase() === tagName\n )\n if (siblings.length > 1) {\n const index = siblings.indexOf(element) + 1\n nthOfType = `:nth-of-type(${index})`\n }\n }\n\n return `${tagName}${classSelector}${nthOfType}`\n}\n\nfunction buildDomSelector(element: HTMLElement): string {\n if (typeof document === 'undefined') {\n return element.tagName.toLowerCase()\n }\n if (element.closest('[data-direct-edit]')) return ''\n\n const uniqueId = getUniqueIdSelector(element)\n if (uniqueId) return uniqueId\n\n const stableAttribute = getStableAttributeSelector(element)\n if (stableAttribute) return stableAttribute\n\n const segments: string[] = []\n let current: HTMLElement | null = element\n let depth = 0\n\n while (current && current !== document.body && depth < MAX_SELECTOR_DEPTH) {\n if (current.hasAttribute('data-direct-edit')) {\n current = current.parentElement\n continue\n }\n\n if (depth > 0) {\n const parentId = getUniqueIdSelector(current)\n if (parentId) {\n segments.unshift(parentId)\n break\n }\n const parentStableAttr = getStableAttributeSelector(current)\n if (parentStableAttr) {\n segments.unshift(parentStableAttr)\n break\n }\n }\n\n segments.unshift(getNthOfTypeSelector(current))\n current = current.parentElement\n depth += 1\n }\n\n return segments.join(' > ')\n}\n\nfunction stripDirectEditNodes(root: Element) {\n const nodes = root.querySelectorAll('[data-direct-edit]')\n nodes.forEach((node) => node.remove())\n}\n\nfunction buildTargetHtml(element: HTMLElement): string {\n const tagName = element.tagName.toLowerCase()\n const attrs: string[] = []\n const allowList = [\n 'id',\n 'class',\n 'href',\n 'src',\n 'alt',\n 'aria-label',\n 'role',\n 'data-testid',\n ]\n const maxAttrLength = 48\n\n for (const attr of allowList) {\n const value = element.getAttribute(attr)\n if (!value) continue\n const trimmed = value.length > maxAttrLength ? `${value.slice(0, maxAttrLength - 3)}...` : value\n attrs.push(`${attr}=\"${escapeAttributeValue(trimmed)}\"`)\n }\n\n const text = getTextPreview(element)\n const attrString = attrs.length > 0 ? ` ${attrs.join(' ')}` : ''\n\n if (text) {\n return `<${tagName}${attrString}>\\n ${escapeHtml(text)}\\n</${tagName}>`\n }\n\n return `<${tagName}${attrString}></${tagName}>`\n}\n\nfunction formatSourcePath(file: string): string {\n const normalized = file\n .replace(/\\\\/g, '/')\n .replace(/^webpack:\\/\\/\\//, '')\n .replace(/^webpack:\\/\\//, '')\n .replace(/^file:\\/\\//, '')\n .replace(/^_N_E\\//, '')\n .replace(/^\\.\\/+/, '')\n const packagesIndex = normalized.indexOf('/packages/')\n if (packagesIndex !== -1) {\n return `/[project]${normalized.slice(packagesIndex)}`\n }\n const appIndex = normalized.indexOf('/app/')\n if (appIndex !== -1) {\n return `/[project]${normalized.slice(appIndex)}`\n }\n const srcIndex = normalized.indexOf('/src/')\n if (srcIndex !== -1) {\n return `/[project]${normalized.slice(srcIndex)}`\n }\n return normalized\n}\n\nfunction formatSourceLocation(file: string, line?: number, column?: number): string {\n const formatted = formatSourcePath(file)\n if (typeof line === 'number') {\n const columnSuffix = typeof column === 'number' ? `:${column}` : ''\n return `${formatted}:${line}${columnSuffix}`\n }\n return formatted\n}\n\nfunction isUserlandSource(file: string): boolean {\n const normalized = file.replace(/\\\\/g, '/')\n if (\n normalized.includes('node_modules') ||\n normalized.includes('next/dist') ||\n normalized.includes('react') ||\n normalized.includes('react-dom') ||\n normalized.includes('direct-edit')\n ) {\n return false\n }\n return (\n normalized.includes('/app/') ||\n normalized.includes('/src/') ||\n normalized.includes('/packages/') ||\n normalized.startsWith('./')\n )\n}\n\nfunction getPrimaryFrame(locator: ElementLocator): ReactComponentFrame | null {\n for (const frame of locator.reactStack) {\n if (frame.file && isUserlandSource(frame.file)) {\n return frame\n }\n }\n for (const frame of locator.reactStack) {\n if (frame.file) {\n return frame\n }\n }\n return locator.reactStack[0] ?? null\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;')\n}\n\nfunction buildDomContextHtml(\n element: HTMLElement,\n options?: { siblingCount?: number }\n): string {\n const parent = element.parentElement\n if (!parent) {\n return element.outerHTML\n }\n\n const parentClone = parent.cloneNode(false) as HTMLElement\n const siblings = Array.from(parent.children) as HTMLElement[]\n const selectedIndex = siblings.indexOf(element)\n let slice = siblings\n\n if (options?.siblingCount && options.siblingCount > 0 && selectedIndex >= 0) {\n const start = Math.max(0, selectedIndex - options.siblingCount)\n const end = Math.min(siblings.length, selectedIndex + options.siblingCount + 1)\n slice = siblings.slice(start, end)\n }\n\n for (const sibling of slice) {\n if (sibling.closest('[data-direct-edit]')) continue\n const clone = sibling.cloneNode(true) as HTMLElement\n if (sibling === element) {\n clone.setAttribute('data-direct-edit-target', 'true')\n }\n stripDirectEditNodes(clone)\n parentClone.appendChild(clone)\n }\n\n return parentClone.outerHTML\n}\n\nfunction getTextPreview(element: HTMLElement): string {\n const text = element.textContent ?? ''\n const cleaned = text.replace(/\\s+/g, ' ').trim()\n if (cleaned.length <= 120) {\n return cleaned\n }\n return `${cleaned.slice(0, 117)}...`\n}\n\nfunction parseDomSource(element: HTMLElement): DomSourceLocation | null {\n const value = element.getAttribute('data-direct-edit-source')\n if (!value) return null\n\n let file = value\n let line: number | undefined\n let column: number | undefined\n\n const lastColon = value.lastIndexOf(':')\n if (lastColon !== -1) {\n const maybeColumn = Number(value.slice(lastColon + 1))\n if (!Number.isNaN(maybeColumn)) {\n column = maybeColumn\n file = value.slice(0, lastColon)\n\n const prevColon = file.lastIndexOf(':')\n if (prevColon !== -1) {\n const maybeLine = Number(file.slice(prevColon + 1))\n if (!Number.isNaN(maybeLine)) {\n line = maybeLine\n file = file.slice(0, prevColon)\n }\n }\n }\n }\n\n return { file, line, column }\n}\n\nexport function getElementLocator(element: HTMLElement): ElementLocator {\n const elementInfo = getElementInfo(element)\n let domSource = parseDomSource(element)\n\n // Fallback: get source from the element's own React fiber when\n // the Vite plugin attribute is not present\n if (!domSource) {\n const fiber = getFiberForElement(element)\n if (fiber) {\n const fiberSource = getSourceFromFiber(fiber)\n if (fiberSource?.fileName) {\n domSource = {\n file: fiberSource.fileName,\n line: fiberSource.lineNumber,\n column: fiberSource.columnNumber,\n }\n }\n }\n }\n\n return {\n reactStack: getReactComponentStack(element),\n domSelector: buildDomSelector(element),\n domContextHtml: buildDomContextHtml(element),\n targetHtml: buildTargetHtml(element),\n textPreview: getTextPreview(element),\n tagName: elementInfo.tagName,\n id: elementInfo.id,\n classList: elementInfo.classList,\n domSource: domSource ?? undefined,\n }\n}\n\ninterface ExportChange {\n property: string\n value: string\n tailwind: string\n}\n\nexport function buildElementContext(locator: ElementLocator): string {\n const lines: string[] = []\n\n const primaryFrame = getPrimaryFrame(locator)\n const componentLabel = primaryFrame?.name ? primaryFrame.name : locator.tagName\n const formattedSource = locator.domSource?.file\n ? formatSourceLocation(locator.domSource.file, locator.domSource.line, locator.domSource.column)\n : primaryFrame?.file\n ? formatSourceLocation(primaryFrame.file, primaryFrame.line, primaryFrame.column)\n : null\n\n lines.push(`@<${componentLabel}>`)\n lines.push('')\n lines.push(locator.targetHtml || locator.domContextHtml || '')\n lines.push(`in ${formattedSource ?? '(file not available)'}`)\n\n if (!formattedSource) {\n const selector = locator.domSelector?.trim()\n const text = locator.textPreview?.trim()\n if (selector) {\n lines.push(`selector: ${selector}`)\n }\n if (text) {\n lines.push(`text: ${text}`)\n }\n }\n\n return lines.join('\\n')\n}\n\nexport function buildEditExport(\n locator: ElementLocator,\n pendingStyles: Record<string, string>,\n textEdit?: { originalText: string; newText: string } | null\n): string\nexport function buildEditExport(\n element: HTMLElement | null,\n elementInfo: ElementInfo,\n computedSpacing: SpacingProperties | null,\n computedBorderRadius: BorderRadiusProperties | null,\n computedFlex: FlexProperties | null,\n computedSizing: SizingProperties | null,\n pendingStyles: Record<string, string>\n): string\nexport function buildEditExport(\n arg1: ElementLocator | HTMLElement | null,\n arg2: ElementInfo | Record<string, string>,\n arg3?: SpacingProperties | null | { originalText: string; newText: string },\n arg4?: BorderRadiusProperties | null,\n arg5?: FlexProperties | null,\n arg6?: SizingProperties | null,\n arg7?: Record<string, string>\n): string {\n const isLocator = Boolean(arg1 && typeof arg1 === 'object' && 'domSelector' in arg1)\n if (!isLocator) {\n void arg4\n void arg5\n void arg6\n }\n const pendingStyles = (isLocator ? (arg2 as Record<string, string>) : arg7) || {}\n const textEdit = isLocator && arg3 && typeof arg3 === 'object' && 'originalText' in arg3\n ? (arg3 as { originalText: string; newText: string })\n : null\n let locator: ElementLocator\n\n if (isLocator) {\n locator = arg1 as ElementLocator\n } else {\n const element = arg1 as HTMLElement | null\n const elementInfo = arg2 as ElementInfo\n locator = element\n ? getElementLocator(element)\n : {\n reactStack: [],\n domSelector: elementInfo.id ? `#${elementInfo.id}` : elementInfo.tagName,\n domContextHtml: `<${elementInfo.tagName}${elementInfo.id ? ` id=\"${elementInfo.id}\"` : ''} data-direct-edit-target=\"true\"></${elementInfo.tagName}>`,\n targetHtml: `<${elementInfo.tagName}${elementInfo.id ? ` id=\"${elementInfo.id}\"` : ''}></${elementInfo.tagName}>`,\n textPreview: '',\n tagName: elementInfo.tagName,\n id: elementInfo.id,\n classList: elementInfo.classList,\n }\n }\n\n const changes: ExportChange[] = []\n\n for (const [property, value] of Object.entries(pendingStyles)) {\n const tailwindClass = stylesToTailwind({ [property]: value })\n changes.push({\n property,\n value,\n tailwind: tailwindClass,\n })\n }\n\n const lines: string[] = []\n\n const primaryFrame = getPrimaryFrame(locator)\n const componentLabel = primaryFrame?.name ? primaryFrame.name : locator.tagName\n const formattedSource = locator.domSource?.file\n ? formatSourceLocation(locator.domSource.file, locator.domSource.line, locator.domSource.column)\n : primaryFrame?.file\n ? formatSourceLocation(primaryFrame.file, primaryFrame.line, primaryFrame.column)\n : null\n\n lines.push(`@<${componentLabel}>`)\n lines.push('')\n lines.push(locator.targetHtml || locator.domContextHtml || '')\n lines.push(`in ${formattedSource ?? '(file not available)'}`)\n\n if (!formattedSource) {\n const selector = locator.domSelector?.trim()\n const text = locator.textPreview?.trim()\n if (selector) {\n lines.push(`selector: ${selector}`)\n }\n if (text) {\n lines.push(`text: ${text}`)\n }\n }\n\n lines.push('')\n if (changes.length > 0) {\n lines.push('edits:')\n for (const change of changes) {\n const tailwind = change.tailwind ? ` (${change.tailwind})` : ''\n lines.push(`${change.property}: ${change.value}${tailwind}`)\n }\n }\n\n if (textEdit) {\n lines.push('text content changed:')\n lines.push(`from: \"${textEdit.originalText}\"`)\n lines.push(`to: \"${textEdit.newText}\"`)\n }\n\n return lines.join('\\n')\n}\n\nexport function buildCommentExport(\n locator: ElementLocator,\n commentText: string,\n replies?: Array<{ text: string; createdAt: number }>\n): string {\n const lines: string[] = []\n\n const primaryFrame = getPrimaryFrame(locator)\n const componentLabel = primaryFrame?.name ? primaryFrame.name : locator.tagName\n const formattedSource = locator.domSource?.file\n ? formatSourceLocation(locator.domSource.file, locator.domSource.line, locator.domSource.column)\n : primaryFrame?.file\n ? formatSourceLocation(primaryFrame.file, primaryFrame.line, primaryFrame.column)\n : null\n\n lines.push(`@<${componentLabel}>`)\n lines.push('')\n lines.push(locator.targetHtml || locator.domContextHtml || '')\n lines.push(`in ${formattedSource ?? '(file not available)'}`)\n\n if (!formattedSource) {\n const selector = locator.domSelector?.trim()\n const text = locator.textPreview?.trim()\n if (selector) {\n lines.push(`selector: ${selector}`)\n }\n if (text) {\n lines.push(`text: ${text}`)\n }\n }\n\n lines.push('')\n lines.push(`comment: ${commentText}`)\n if (replies && replies.length > 0) {\n for (const reply of replies) {\n lines.push(`reply: ${reply.text}`)\n }\n }\n\n return lines.join('\\n')\n}\n\nfunction formatPosition(\n siblingBefore: string | null,\n siblingAfter: string | null\n): string {\n if (siblingBefore && siblingAfter) return `after <${siblingBefore}>`\n if (siblingBefore && !siblingAfter) return `after <${siblingBefore}> (last)`\n if (!siblingBefore && siblingAfter) return `before <${siblingAfter}> (first)`\n return '(only child)'\n}\n\nexport function buildSessionExport(edits: SessionEdit[]): string {\n const blocks: string[] = []\n\n for (const edit of edits) {\n let block = buildEditExport(edit.locator, edit.pendingStyles, edit.textEdit)\n if (edit.move) {\n const fromPosition = formatPosition(edit.move.fromSiblingBefore, edit.move.fromSiblingAfter)\n const toPosition = formatPosition(edit.move.toSiblingBefore, edit.move.toSiblingAfter)\n if (edit.move.fromParentName === edit.move.toParentName) {\n block += `\\nmoved: in <${edit.move.toParentName}>, from ${fromPosition} to ${toPosition}`\n } else {\n block += `\\nmoved: from <${edit.move.fromParentName}> ${fromPosition} to <${edit.move.toParentName}> ${toPosition}`\n }\n }\n blocks.push(block)\n }\n\n return blocks.join('\\n\\n---\\n\\n')\n}\n\nexport type {\n ElementInfo,\n CSSPropertyValue,\n SpacingProperties,\n BorderRadiusProperties,\n BorderStyle,\n BorderProperties,\n FlexProperties,\n DirectEditState,\n SpacingPropertyKey,\n BorderRadiusPropertyKey,\n BorderPropertyKey,\n FlexPropertyKey,\n MeasurementLine,\n MeasurementState,\n ColorValue,\n ColorProperties,\n ColorPropertyKey,\n SizingProperties,\n SizingPropertyKey,\n SizingMode,\n SizingValue,\n TypographyProperties,\n TypographyPropertyKey,\n ReactComponentFrame,\n ElementLocator,\n DragState,\n DropTarget,\n DropIndicator,\n} from './types'\n","import type { ColorValue } from '../types'\n\nexport function formatColorValue(color: ColorValue): string {\n const r = parseInt(color.hex.slice(0, 2), 16)\n const g = parseInt(color.hex.slice(2, 4), 16)\n const b = parseInt(color.hex.slice(4, 6), 16)\n const a = color.alpha / 100\n\n if (a === 1) {\n return `#${color.hex}`\n }\n return `rgba(${r}, ${g}, ${b}, ${a})`\n}\n\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } {\n const h = hex.replace('#', '')\n return {\n r: parseInt(h.slice(0, 2), 16),\n g: parseInt(h.slice(2, 4), 16),\n b: parseInt(h.slice(4, 6), 16),\n }\n}\n\nexport function rgbToHex(r: number, g: number, b: number): string {\n return [r, g, b].map((v) => Math.round(v).toString(16).padStart(2, '0')).join('').toUpperCase()\n}\n\nexport function rgbToHsv(r: number, g: number, b: number): { h: number; s: number; v: number } {\n r /= 255\n g /= 255\n b /= 255\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n const d = max - min\n let h = 0\n const s = max === 0 ? 0 : (d / max) * 100\n const v = max * 100\n if (d !== 0) {\n switch (max) {\n case r: h = ((g - b) / d + (g < b ? 6 : 0)) * 60; break\n case g: h = ((b - r) / d + 2) * 60; break\n case b: h = ((r - g) / d + 4) * 60; break\n }\n }\n return { h, s, v }\n}\n\nexport function hsvToRgb(h: number, s: number, v: number): { r: number; g: number; b: number } {\n s /= 100\n v /= 100\n const c = v * s\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1))\n const m = v - c\n let r = 0, g = 0, b = 0\n if (h < 60) { r = c; g = x }\n else if (h < 120) { r = x; g = c }\n else if (h < 180) { g = c; b = x }\n else if (h < 240) { g = x; b = c }\n else if (h < 300) { r = x; b = c }\n else { r = c; b = x }\n return {\n r: Math.round((r + m) * 255),\n g: Math.round((g + m) * 255),\n b: Math.round((b + m) * 255),\n }\n}\n\nexport function rgbToHsl(r: number, g: number, b: number): { h: number; s: number; l: number } {\n r /= 255\n g /= 255\n b /= 255\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n const l = (max + min) / 2\n let h = 0\n let s = 0\n if (max !== min) {\n const d = max - min\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\n switch (max) {\n case r: h = ((g - b) / d + (g < b ? 6 : 0)) * 60; break\n case g: h = ((b - r) / d + 2) * 60; break\n case b: h = ((r - g) / d + 4) * 60; break\n }\n }\n return { h, s: s * 100, l: l * 100 }\n}\n\nexport function hslToRgb(h: number, s: number, l: number): { r: number; g: number; b: number } {\n s /= 100\n l /= 100\n const c = (1 - Math.abs(2 * l - 1)) * s\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1))\n const m = l - c / 2\n let r = 0, g = 0, b = 0\n if (h < 60) { r = c; g = x }\n else if (h < 120) { r = x; g = c }\n else if (h < 180) { g = c; b = x }\n else if (h < 240) { g = x; b = c }\n else if (h < 300) { r = x; b = c }\n else { r = c; b = x }\n return {\n r: Math.round((r + m) * 255),\n g: Math.round((g + m) * 255),\n b: Math.round((b + m) * 255),\n }\n}\n","const MCP_BASE = 'http://127.0.0.1:4747'\n\nlet cachedToken: string | null = null\n\nasync function getSessionToken(forceRefresh = false): Promise<string | null> {\n if (!forceRefresh && cachedToken) return cachedToken\n try {\n const res = await fetch(`${MCP_BASE}/api/health`, { signal: AbortSignal.timeout(2000) })\n if (!res.ok) return null\n const data = await res.json()\n cachedToken = typeof data.sessionToken === 'string' ? data.sessionToken : null\n return cachedToken\n } catch {\n return null\n }\n}\n\nasync function postWithSessionToken(\n path: '/api/edit' | '/api/comment',\n payload: Record<string, unknown>\n): Promise<{ ok: boolean; id: string }> {\n const send = async (token: string | null) => {\n const headers: Record<string, string> = { 'Content-Type': 'application/json' }\n if (token) headers['X-Session-Token'] = token\n return fetch(`${MCP_BASE}${path}`, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n })\n }\n\n let token = await getSessionToken()\n let res = await send(token)\n\n if (res.status === 403) {\n cachedToken = null\n token = await getSessionToken(true)\n res = await send(token)\n }\n\n return res.json()\n}\n\nexport async function sendEditToAgent(\n edit: Record<string, unknown>\n): Promise<{ ok: boolean; id: string }> {\n return postWithSessionToken('/api/edit', edit)\n}\n\nexport async function sendCommentToAgent(\n comment: Record<string, unknown>\n): Promise<{ ok: boolean; id: string }> {\n return postWithSessionToken('/api/comment', comment)\n}\n\nexport async function checkAgentConnection(): Promise<boolean> {\n try {\n const res = await fetch(`${MCP_BASE}/api/health`, { signal: AbortSignal.timeout(2000) })\n if (!res.ok) return false\n const data = await res.json()\n cachedToken = typeof data.sessionToken === 'string' ? data.sessionToken : null\n return data.ok === true\n } catch {\n return false\n }\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { usePortalContainer } from './portal-container'\nimport { useDirectEdit } from './provider'\nimport { Button } from './ui/button'\nimport { Input } from './ui/input'\nimport {\n Tooltip,\n TooltipProvider,\n TooltipTrigger,\n TooltipPortal,\n TooltipPositioner,\n TooltipPopup,\n createTooltipHandle,\n} from './ui/tooltip'\nimport {\n Select,\n SelectTrigger,\n SelectIcon,\n SelectPortal,\n SelectPositioner,\n SelectPopup,\n SelectItem,\n SelectItemIndicator,\n SelectItemText,\n} from './ui/select'\nimport { cn } from './cn'\nimport type { SpacingPropertyKey, BorderRadiusPropertyKey, BorderPropertyKey, BorderProperties, BorderStyle, CSSPropertyValue, SizingValue, SizingMode, SizingPropertyKey, ColorValue, ColorPropertyKey, TypographyPropertyKey, TypographyProperties } from './types'\nimport { formatColorValue } from './ui/color-utils'\nimport { ColorPickerPopover, ColorPickerGroup } from './ui/color-picker'\nimport { Slider } from './ui/slider'\nimport { useMeasurement } from './use-measurement'\nimport { MeasurementOverlay } from './measurement-overlay'\nimport { useMove } from './use-move'\nimport { getStoredGuidelines } from './use-guidelines'\nimport {\n calculateGuidelineMeasurements, isTextElement,\n resolveElementTarget, computeHoverHighlight,\n elementFromPointWithoutOverlays, findChildAtPoint,\n} from './utils'\nimport { MoveOverlay } from './move-overlay'\nimport { SelectionOverlay } from './selection-overlay'\nimport { CommentOverlay } from './comment-overlay'\nimport {\n X,\n Copy,\n Check,\n ChevronUp,\n ChevronDown,\n ArrowRight,\n ArrowDown,\n ArrowUp,\n ArrowLeft,\n MoveHorizontal,\n MoveVertical,\n ChevronsLeftRightEllipsis,\n Grid2x2,\n Columns2,\n ChevronsUpDown,\n Paintbrush,\n Square,\n Focus,\n Type,\n AlignLeft,\n AlignCenter,\n AlignRight,\n AlignVerticalJustifyStart,\n AlignVerticalJustifyCenter,\n AlignVerticalJustifyEnd,\n ALargeSmall,\n WrapText,\n AArrowUp,\n LetterText,\n Plus,\n Minus,\n Send,\n Link,\n Unlink,\n} from 'lucide-react'\n\nconst STORAGE_KEY = 'direct-edit-panel-position'\nconst PANEL_WIDTH = 300\nconst PANEL_HEIGHT = 420\n\nconst selectOnFocus = (e: React.FocusEvent<HTMLInputElement>) => e.target.select()\n\ninterface NumberInputProps extends Omit<React.ComponentProps<typeof Input>, 'value' | 'onChange' | 'type'> {\n value: number\n onValueChange: (value: number) => void\n}\n\nfunction NumberInput({ value: propValue, onValueChange, ...props }: NumberInputProps) {\n const [localValue, setLocalValue] = React.useState(String(propValue))\n\n React.useEffect(() => {\n setLocalValue(String(propValue))\n }, [propValue])\n\n return (\n <Input\n {...props}\n type=\"number\"\n value={localValue}\n onChange={(e) => {\n setLocalValue(e.target.value)\n const parsed = parseFloat(e.target.value)\n if (!isNaN(parsed)) onValueChange(parsed)\n }}\n onBlur={() => {\n if (localValue === '' || isNaN(parseFloat(localValue))) {\n setLocalValue(String(propValue))\n }\n }}\n onFocus={selectOnFocus}\n />\n )\n}\n\ninterface Position {\n x: number\n y: number\n}\n\nfunction getInitialPosition(): Position {\n if (typeof window === 'undefined') {\n return { x: 0, y: 0 }\n }\n\n try {\n const stored = localStorage.getItem(STORAGE_KEY)\n if (stored) {\n return JSON.parse(stored)\n }\n } catch {\n // Fall through to default\n }\n\n return {\n x: window.innerWidth - PANEL_WIDTH - 20,\n y: window.innerHeight - PANEL_HEIGHT - 20,\n }\n}\n\nconst DISTRIBUTE_MODES = ['fixed', 'space-between', 'space-around', 'space-evenly'] as const\ntype DistributeMode = typeof DISTRIBUTE_MODES[number]\nconst DISTRIBUTE_LABELS: Record<DistributeMode, string> = {\n fixed: 'Fixed',\n 'space-between': 'Between',\n 'space-around': 'Around',\n 'space-evenly': 'Evenly',\n}\n\n\ninterface PaddingInputsProps {\n values: {\n top: CSSPropertyValue\n right: CSSPropertyValue\n bottom: CSSPropertyValue\n left: CSSPropertyValue\n }\n onChange: (key: SpacingPropertyKey, value: CSSPropertyValue) => void\n}\n\nfunction PaddingInputs({ values, onChange }: PaddingInputsProps) {\n const [individual, setIndividual] = React.useState(false)\n\n const handleChange = (sides: ('top' | 'right' | 'bottom' | 'left')[], numericValue: number) => {\n const newValue: CSSPropertyValue = {\n numericValue,\n unit: 'px',\n raw: `${numericValue}px`,\n }\n\n for (const side of sides) {\n const key = `padding${side.charAt(0).toUpperCase() + side.slice(1)}` as SpacingPropertyKey\n onChange(key, newValue)\n }\n }\n\n const horizontalValue =\n values.left.numericValue === values.right.numericValue\n ? values.left.numericValue\n : values.left.numericValue\n const verticalValue =\n values.top.numericValue === values.bottom.numericValue\n ? values.top.numericValue\n : values.top.numericValue\n\n if (individual) {\n return (\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center gap-1.5\">\n <div className=\"relative flex-1\">\n <ArrowLeft className=\"absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground\" />\n <NumberInput\n value={values.left?.numericValue ?? 0}\n onValueChange={(val) => handleChange(['left'], val)}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Left\"\n />\n </div>\n <div className=\"relative flex-1\">\n <ArrowUp className=\"absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground\" />\n <NumberInput\n value={values.top?.numericValue ?? 0}\n onValueChange={(val) => handleChange(['top'], val)}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Top\"\n />\n </div>\n <Button\n variant=\"secondary\"\n size=\"icon\"\n className=\"size-7 shrink-0\"\n onClick={() => setIndividual(false)}\n title=\"Combined mode\"\n >\n <Columns2 className=\"size-3\" />\n </Button>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <div className=\"relative flex-1\">\n <ArrowRight className=\"absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground\" />\n <NumberInput\n value={values.right?.numericValue ?? 0}\n onValueChange={(val) => handleChange(['right'], val)}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Right\"\n />\n </div>\n <div className=\"relative flex-1\">\n <ArrowDown className=\"absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground\" />\n <NumberInput\n value={values.bottom?.numericValue ?? 0}\n onValueChange={(val) => handleChange(['bottom'], val)}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Bottom\"\n />\n </div>\n <div className=\"size-7 shrink-0\" />\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"flex items-center gap-1.5\">\n <div className=\"relative flex-1\">\n <MoveHorizontal className=\"absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground\" />\n <NumberInput\n value={horizontalValue}\n onValueChange={(val) => handleChange(['left', 'right'], val)}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Horizontal (left & right)\"\n />\n </div>\n <div className=\"relative flex-1\">\n <MoveVertical className=\"absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground\" />\n <NumberInput\n value={verticalValue}\n onValueChange={(val) => handleChange(['top', 'bottom'], val)}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Vertical (top & bottom)\"\n />\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 shrink-0\"\n onClick={() => setIndividual(true)}\n title=\"Individual mode\"\n >\n <Grid2x2 className=\"size-3\" />\n </Button>\n </div>\n )\n}\n\ninterface MarginInputsProps {\n values: {\n top: CSSPropertyValue\n right: CSSPropertyValue\n bottom: CSSPropertyValue\n left: CSSPropertyValue\n }\n onChange: (key: SpacingPropertyKey, value: CSSPropertyValue) => void\n}\n\nfunction MarginInputs({ values, onChange }: MarginInputsProps) {\n const [individual, setIndividual] = React.useState(false)\n\n const handleChange = (sides: ('top' | 'right' | 'bottom' | 'left')[], numericValue: number) => {\n const newValue: CSSPropertyValue = {\n numericValue,\n unit: 'px',\n raw: `${numericValue}px`,\n }\n\n for (const side of sides) {\n const key = `margin${side.charAt(0).toUpperCase() + side.slice(1)}` as SpacingPropertyKey\n onChange(key, newValue)\n }\n }\n\n const horizontalValue =\n values.left.numericValue === values.right.numericValue\n ? values.left.numericValue\n : values.left.numericValue\n const verticalValue =\n values.top.numericValue === values.bottom.numericValue\n ? values.top.numericValue\n : values.top.numericValue\n\n if (individual) {\n return (\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center gap-1.5\">\n <div className=\"relative flex-1\">\n <ArrowLeft className=\"absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground\" />\n <NumberInput\n value={values.left?.numericValue ?? 0}\n onValueChange={(val) => handleChange(['left'], val)}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Left\"\n />\n </div>\n <div className=\"relative flex-1\">\n <ArrowUp className=\"absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground\" />\n <NumberInput\n value={values.top?.numericValue ?? 0}\n onValueChange={(val) => handleChange(['top'], val)}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Top\"\n />\n </div>\n <Button\n variant=\"secondary\"\n size=\"icon\"\n className=\"size-7 shrink-0\"\n onClick={() => setIndividual(false)}\n title=\"Combined mode\"\n >\n <Columns2 className=\"size-3\" />\n </Button>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <div className=\"relative flex-1\">\n <ArrowRight className=\"absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground\" />\n <NumberInput\n value={values.right?.numericValue ?? 0}\n onValueChange={(val) => handleChange(['right'], val)}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Right\"\n />\n </div>\n <div className=\"relative flex-1\">\n <ArrowDown className=\"absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground\" />\n <NumberInput\n value={values.bottom?.numericValue ?? 0}\n onValueChange={(val) => handleChange(['bottom'], val)}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Bottom\"\n />\n </div>\n <div className=\"size-7 shrink-0\" />\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"flex items-center gap-1.5\">\n <div className=\"relative flex-1\">\n <MoveHorizontal className=\"absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground\" />\n <NumberInput\n value={horizontalValue}\n onValueChange={(val) => handleChange(['left', 'right'], val)}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Horizontal (left & right)\"\n />\n </div>\n <div className=\"relative flex-1\">\n <MoveVertical className=\"absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground\" />\n <NumberInput\n value={verticalValue}\n onValueChange={(val) => handleChange(['top', 'bottom'], val)}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Vertical (top & bottom)\"\n />\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 shrink-0\"\n onClick={() => setIndividual(true)}\n title=\"Individual mode\"\n >\n <Grid2x2 className=\"size-3\" />\n </Button>\n </div>\n )\n}\n\ninterface BorderRadiusInputsProps {\n values: {\n topLeft: CSSPropertyValue\n topRight: CSSPropertyValue\n bottomRight: CSSPropertyValue\n bottomLeft: CSSPropertyValue\n }\n onChange: (key: BorderRadiusPropertyKey, value: CSSPropertyValue) => void\n}\n\nconst BORDER_RADIUS_FULL = 9999\nconst BORDER_RADIUS_SLIDER_MAX = 49\n\n// Slider position 0-48 maps to 0-48px, position 49 maps to 9999 (Full)\nfunction sliderToValue(sliderPos: number): number {\n return sliderPos >= BORDER_RADIUS_SLIDER_MAX ? BORDER_RADIUS_FULL : sliderPos\n}\n\nfunction valueToSlider(value: number): number {\n return value >= BORDER_RADIUS_FULL ? BORDER_RADIUS_SLIDER_MAX : Math.min(value, BORDER_RADIUS_SLIDER_MAX - 1)\n}\n\nfunction RadiusCornerIcon({ corner, className }: { corner: 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight'; className?: string }) {\n const paths: Record<string, string> = {\n topLeft: 'M5 19V8a3 3 0 0 1 3-3h11',\n topRight: 'M19 19V8a3 3 0 0 0-3-3H5',\n bottomLeft: 'M5 5v11a3 3 0 0 0 3 3h11',\n bottomRight: 'M19 5v11a3 3 0 0 1-3 3H5',\n }\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" className={cn('size-3', className)}>\n <path d={paths[corner]} />\n </svg>\n )\n}\n\nfunction BorderRadiusInputs({ values, onChange }: BorderRadiusInputsProps) {\n const [individual, setIndividual] = React.useState(false)\n\n const handleChange = (\n corners: ('topLeft' | 'topRight' | 'bottomRight' | 'bottomLeft')[],\n numericValue: number\n ) => {\n const newValue: CSSPropertyValue = {\n numericValue,\n unit: 'px',\n raw: `${numericValue}px`,\n }\n\n for (const corner of corners) {\n const key = `border${corner.charAt(0).toUpperCase() + corner.slice(1)}Radius` as BorderRadiusPropertyKey\n onChange(key, newValue)\n }\n }\n\n const handleTextInputChange = (\n corners: ('topLeft' | 'topRight' | 'bottomRight' | 'bottomLeft')[],\n inputValue: string\n ) => {\n if (inputValue.toLowerCase() === 'full') {\n handleChange(corners, BORDER_RADIUS_FULL)\n } else {\n const numericValue = parseFloat(inputValue) || 0\n handleChange(corners, numericValue)\n }\n }\n\n const allSame =\n values.topLeft.numericValue === values.topRight.numericValue &&\n values.topRight.numericValue === values.bottomRight.numericValue &&\n values.bottomRight.numericValue === values.bottomLeft.numericValue\n const uniformValue = allSame ? values.topLeft.numericValue : values.topLeft.numericValue\n\n if (individual) {\n return (\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center gap-1.5\">\n <div className=\"relative flex-1\">\n <RadiusCornerIcon corner=\"topLeft\" className=\"absolute left-1.5 top-1/2 -translate-y-1/2 text-muted-foreground\" />\n <NumberInput\n value={values.topLeft?.numericValue ?? 0}\n onValueChange={(val) => handleChange(['topLeft'], val)}\n className=\"h-7 pl-6 pr-1 text-center text-xs tabular-nums\"\n title=\"Top Left\"\n />\n </div>\n <div className=\"relative flex-1\">\n <RadiusCornerIcon corner=\"topRight\" className=\"absolute left-1.5 top-1/2 -translate-y-1/2 text-muted-foreground\" />\n <NumberInput\n value={values.topRight?.numericValue ?? 0}\n onValueChange={(val) => handleChange(['topRight'], val)}\n className=\"h-7 pl-6 pr-1 text-center text-xs tabular-nums\"\n title=\"Top Right\"\n />\n </div>\n <Button\n variant=\"secondary\"\n size=\"icon\"\n className=\"size-7 shrink-0\"\n onClick={() => setIndividual(false)}\n title=\"Combined mode\"\n >\n <Columns2 className=\"size-3\" />\n </Button>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <div className=\"relative flex-1\">\n <RadiusCornerIcon corner=\"bottomLeft\" className=\"absolute left-1.5 top-1/2 -translate-y-1/2 text-muted-foreground\" />\n <NumberInput\n value={values.bottomLeft?.numericValue ?? 0}\n onValueChange={(val) => handleChange(['bottomLeft'], val)}\n className=\"h-7 pl-6 pr-1 text-center text-xs tabular-nums\"\n title=\"Bottom Left\"\n />\n </div>\n <div className=\"relative flex-1\">\n <RadiusCornerIcon corner=\"bottomRight\" className=\"absolute left-1.5 top-1/2 -translate-y-1/2 text-muted-foreground\" />\n <NumberInput\n value={values.bottomRight?.numericValue ?? 0}\n onValueChange={(val) => handleChange(['bottomRight'], val)}\n className=\"h-7 pl-6 pr-1 text-center text-xs tabular-nums\"\n title=\"Bottom Right\"\n />\n </div>\n <div className=\"size-7 shrink-0\" />\n </div>\n </div>\n )\n }\n\n const isFull = uniformValue >= BORDER_RADIUS_FULL\n const displayValue = isFull ? 'Full' : String(uniformValue)\n const sliderValue = valueToSlider(uniformValue)\n\n return (\n <div className=\"flex items-center gap-1.5\">\n <Slider\n value={sliderValue}\n onValueChange={(val) => {\n const sliderPos = typeof val === 'number' ? val : val[0]\n handleChange(\n ['topLeft', 'topRight', 'bottomRight', 'bottomLeft'],\n sliderToValue(sliderPos)\n )\n }}\n max={BORDER_RADIUS_SLIDER_MAX}\n step={1}\n className=\"flex-1\"\n />\n <Input\n type=\"text\"\n value={displayValue}\n onChange={(e) =>\n handleTextInputChange(\n ['topLeft', 'topRight', 'bottomRight', 'bottomLeft'],\n e.target.value\n )\n }\n onFocus={selectOnFocus}\n className=\"h-7 w-14 px-2 text-center text-xs tabular-nums\"\n />\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 shrink-0\"\n onClick={() => setIndividual(true)}\n title=\"Individual mode\"\n >\n <Grid2x2 className=\"size-3\" />\n </Button>\n </div>\n )\n}\n\nfunction BorderSideIcon({ side, className }: { side: 'Top' | 'Right' | 'Bottom' | 'Left'; className?: string }) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" className={cn('size-3', className)}>\n {/* Top */}\n <line x1=\"3\" y1=\"3\" x2=\"21\" y2=\"3\"\n stroke=\"currentColor\"\n strokeWidth={side === 'Top' ? 2.5 : 1.5}\n strokeDasharray={side === 'Top' ? 'none' : '3 2'}\n strokeOpacity={side === 'Top' ? 1 : 0.35}\n />\n {/* Right */}\n <line x1=\"21\" y1=\"3\" x2=\"21\" y2=\"21\"\n stroke=\"currentColor\"\n strokeWidth={side === 'Right' ? 2.5 : 1.5}\n strokeDasharray={side === 'Right' ? 'none' : '3 2'}\n strokeOpacity={side === 'Right' ? 1 : 0.35}\n />\n {/* Bottom */}\n <line x1=\"3\" y1=\"21\" x2=\"21\" y2=\"21\"\n stroke=\"currentColor\"\n strokeWidth={side === 'Bottom' ? 2.5 : 1.5}\n strokeDasharray={side === 'Bottom' ? 'none' : '3 2'}\n strokeOpacity={side === 'Bottom' ? 1 : 0.35}\n />\n {/* Left */}\n <line x1=\"3\" y1=\"3\" x2=\"3\" y2=\"21\"\n stroke=\"currentColor\"\n strokeWidth={side === 'Left' ? 2.5 : 1.5}\n strokeDasharray={side === 'Left' ? 'none' : '3 2'}\n strokeOpacity={side === 'Left' ? 1 : 0.35}\n />\n </svg>\n )\n}\n\nconst BORDER_STYLE_OPTIONS: Array<{ value: BorderStyle; label: string }> = [\n { value: 'solid', label: 'Solid' },\n { value: 'dashed', label: 'Dashed' },\n { value: 'dotted', label: 'Dotted' },\n]\n\nconst BORDER_SIDES = ['Top', 'Right', 'Bottom', 'Left'] as const\n\ninterface BorderInputsProps {\n border: BorderProperties\n borderColor?: ColorValue\n onChange: (key: BorderPropertyKey, value: BorderProperties[BorderPropertyKey]) => void\n onBatchChange: (changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]>) => void\n onBorderColorChange?: (value: ColorValue) => void\n}\n\nconst BORDER_SIDE_OPTIONS = ['All', 'Top', 'Right', 'Bottom', 'Left', 'Custom'] as const\ntype BorderSideOption = typeof BORDER_SIDE_OPTIONS[number]\n\nfunction BorderInputs({ border, borderColor, onChange, onBatchChange, onBorderColorChange }: BorderInputsProps) {\n const [selectedSide, setSelectedSide] = React.useState<BorderSideOption>('All')\n\n const activeSides = selectedSide === 'All' || selectedSide === 'Custom'\n ? BORDER_SIDES\n : [selectedSide] as const\n\n const stylesMatch = activeSides.every(\n (s) => (border[`border${s}Style` as keyof BorderProperties] as BorderStyle) === (border[`border${activeSides[0]}Style` as keyof BorderProperties] as BorderStyle),\n )\n const widthsMatch = activeSides.every((s) => {\n const w = border[`border${s}Width` as keyof BorderProperties] as CSSPropertyValue\n const first = border[`border${activeSides[0]}Width` as keyof BorderProperties] as CSSPropertyValue\n return w.numericValue === first.numericValue\n })\n\n const currentStyle = stylesMatch ? (border[`border${activeSides[0]}Style` as keyof BorderProperties] as BorderStyle) || 'solid' : 'solid'\n const currentWidth = widthsMatch ? (border[`border${activeSides[0]}Width` as keyof BorderProperties] as CSSPropertyValue) : null\n\n const handleStyleChange = (style: BorderStyle) => {\n const changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]> = []\n for (const s of activeSides) {\n const w = border[`border${s}Width` as keyof BorderProperties] as CSSPropertyValue\n if (w.numericValue <= 0) {\n changes.push([`border${s}Width` as BorderPropertyKey, { numericValue: 1, unit: 'px', raw: '1px' }])\n }\n changes.push([`border${s}Style` as BorderPropertyKey, style])\n }\n onBatchChange(changes)\n }\n\n const handleAllWidthChange = (numericValue: number) => {\n const clamped = Math.max(0, numericValue)\n const value: CSSPropertyValue = { numericValue: clamped, unit: 'px', raw: `${clamped}px` }\n const changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]> = []\n for (const s of activeSides) {\n changes.push([`border${s}Width` as BorderPropertyKey, value])\n }\n onBatchChange(changes)\n }\n\n const handleSideWidthChange = (side: string, numericValue: number) => {\n const clamped = Math.max(0, numericValue)\n onChange(`border${side}Width` as BorderPropertyKey, {\n numericValue: clamped,\n unit: 'px',\n raw: `${clamped}px`,\n })\n }\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-1.5\">\n <Select value={currentStyle} onValueChange={(val) => val && handleStyleChange(val as BorderStyle)}>\n <SelectTrigger className=\"flex h-7 w-[80px] items-center justify-between rounded-md border-0 bg-muted px-2 text-xs hover:bg-muted-foreground/10 focus:outline-none\">\n <span className=\"flex items-center gap-1.5\">\n <Square className=\"size-3.5 text-muted-foreground\" />\n <span>{BORDER_STYLE_OPTIONS.find((o) => o.value === currentStyle)?.label ?? currentStyle}</span>\n </span>\n <SelectIcon>\n <ChevronDown className=\"size-3 text-muted-foreground\" />\n </SelectIcon>\n </SelectTrigger>\n <SelectPortal>\n <SelectPositioner sideOffset={4} className=\"z-[99999]\">\n <SelectPopup className=\"min-w-[100px] overflow-hidden rounded-lg border-0 bg-popover p-1 text-popover-foreground shadow-lg animate-in fade-in-0 zoom-in-95\">\n {BORDER_STYLE_OPTIONS.map((option) => (\n <SelectItem\n key={option.value}\n value={option.value}\n className=\"relative flex cursor-default select-none items-center rounded-md py-1.5 pl-6 pr-2 text-xs outline-none hover:bg-muted data-[highlighted]:bg-muted\"\n >\n <SelectItemIndicator className=\"absolute left-1.5 flex items-center justify-center\">\n <Check className=\"size-3\" />\n </SelectItemIndicator>\n <SelectItemText>{option.label}</SelectItemText>\n </SelectItem>\n ))}\n </SelectPopup>\n </SelectPositioner>\n </SelectPortal>\n </Select>\n\n <NumberInput\n min={0}\n step={0.5}\n value={currentWidth ? Math.round(currentWidth.numericValue * 100) / 100 : 0}\n placeholder={currentWidth ? undefined : '–'}\n onValueChange={handleAllWidthChange}\n className=\"h-7 w-14 px-2 text-center text-xs tabular-nums\"\n title=\"Border width\"\n />\n\n <Select value={selectedSide} onValueChange={(val) => val && setSelectedSide(val as BorderSideOption)}>\n <SelectTrigger className=\"flex h-7 flex-1 items-center justify-between rounded-md border-0 bg-muted px-2 text-xs hover:bg-muted-foreground/10 focus:outline-none\">\n <span className=\"flex items-center gap-1.5\">\n <Square className=\"size-3 text-muted-foreground\" />\n <span>{selectedSide}</span>\n </span>\n <SelectIcon>\n <ChevronDown className=\"size-3 text-muted-foreground\" />\n </SelectIcon>\n </SelectTrigger>\n <SelectPortal>\n <SelectPositioner sideOffset={4} className=\"z-[99999]\">\n <SelectPopup className=\"min-w-[90px] overflow-hidden rounded-lg border-0 bg-popover p-1 text-popover-foreground shadow-lg animate-in fade-in-0 zoom-in-95\">\n {BORDER_SIDE_OPTIONS.map((side) => (\n <SelectItem\n key={side}\n value={side}\n className=\"relative flex cursor-default select-none items-center rounded-md py-1.5 pl-6 pr-2 text-xs outline-none hover:bg-muted data-[highlighted]:bg-muted\"\n >\n <SelectItemIndicator className=\"absolute left-1.5 flex items-center justify-center\">\n <Check className=\"size-3\" />\n </SelectItemIndicator>\n <SelectItemText>{side}</SelectItemText>\n </SelectItem>\n ))}\n </SelectPopup>\n </SelectPositioner>\n </SelectPortal>\n </Select>\n </div>\n\n {selectedSide === 'Custom' && (\n <div className=\"grid grid-cols-2 gap-1.5\">\n {BORDER_SIDES.map((side) => {\n const w = border[`border${side}Width` as keyof BorderProperties] as CSSPropertyValue\n return (\n <div key={side} className=\"relative\">\n <BorderSideIcon side={side} className=\"absolute left-2 top-1/2 -translate-y-1/2 text-muted-foreground\" />\n <NumberInput\n min={0}\n step={0.5}\n value={Math.round(w.numericValue * 100) / 100}\n onValueChange={(val) => handleSideWidthChange(side, val)}\n className=\"h-7 pl-7 pr-2 text-xs tabular-nums\"\n title={`Border ${side.toLowerCase()} width`}\n />\n </div>\n )\n })}\n </div>\n )}\n\n {borderColor && onBorderColorChange && (\n <ColorInput\n id=\"border-color\"\n label=\"Border\"\n icon={<Square className=\"size-3.5\" />}\n value={borderColor}\n onChange={onBorderColorChange}\n />\n )}\n </div>\n )\n}\n\ninterface BorderSectionProps {\n border: BorderProperties\n borderColor?: ColorValue\n onChange: (key: BorderPropertyKey, value: BorderProperties[BorderPropertyKey]) => void\n onBatchChange: (changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]>) => void\n onBorderColorChange?: (value: ColorValue) => void\n}\n\nfunction BorderSection({ border, borderColor, onChange, onBatchChange, onBorderColorChange }: BorderSectionProps) {\n const hasBorder = BORDER_SIDES.some((s) => {\n const style = border[`border${s}Style` as keyof BorderProperties] as BorderStyle\n const width = border[`border${s}Width` as keyof BorderProperties] as CSSPropertyValue\n return style !== 'none' && width.numericValue > 0\n })\n\n const handleAddBorder = () => {\n const changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]> = []\n for (const s of BORDER_SIDES) {\n changes.push([`border${s}Style` as BorderPropertyKey, 'solid'])\n const w = border[`border${s}Width` as keyof BorderProperties] as CSSPropertyValue\n if (w.numericValue <= 0) {\n changes.push([`border${s}Width` as BorderPropertyKey, { numericValue: 1, unit: 'px', raw: '1px' }])\n }\n }\n onBatchChange(changes)\n }\n\n const handleRemoveBorder = () => {\n const changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]> = []\n for (const s of BORDER_SIDES) {\n changes.push([`border${s}Style` as BorderPropertyKey, 'none'])\n changes.push([`border${s}Width` as BorderPropertyKey, { numericValue: 0, unit: 'px', raw: '0px' }])\n }\n onBatchChange(changes)\n }\n\n const headerActions = (\n <button\n type=\"button\"\n className=\"flex size-6 items-center justify-center rounded text-muted-foreground hover:bg-muted-foreground/10 hover:text-foreground\"\n onClick={hasBorder ? handleRemoveBorder : handleAddBorder}\n title={hasBorder ? 'Remove border' : 'Add border'}\n >\n {hasBorder ? <Minus className=\"size-3.5\" strokeWidth={1.5} /> : <Plus className=\"size-3.5\" strokeWidth={1.5} />}\n </button>\n )\n\n return (\n <CollapsibleSection title=\"Border\" actions={headerActions}>\n {hasBorder ? (\n <ColorPickerGroup>\n <BorderInputs\n border={border}\n borderColor={borderColor}\n onChange={onChange}\n onBatchChange={onBatchChange}\n onBorderColorChange={onBorderColorChange}\n />\n </ColorPickerGroup>\n ) : null}\n </CollapsibleSection>\n )\n}\n\ninterface AlignmentGridProps {\n justifyContent: string\n alignItems: string\n onChange: (justify: string, align: string) => void\n}\n\nfunction AlignmentGrid({ justifyContent, alignItems, onChange }: AlignmentGridProps) {\n const justifyValues = ['flex-start', 'center', 'flex-end']\n const alignValues = ['flex-start', 'center', 'flex-end']\n\n const normalizeJustify = (val: string) => {\n if (val === 'start') return 'flex-start'\n if (val === 'end') return 'flex-end'\n return val\n }\n\n const normalizeAlign = (val: string) => {\n if (val === 'start') return 'flex-start'\n if (val === 'end') return 'flex-end'\n return val\n }\n\n const currentJustify = normalizeJustify(justifyContent)\n const currentAlign = normalizeAlign(alignItems)\n\n const tooltipHandle = createTooltipHandle<{ justify: string; align: string }>()\n\n return (\n <TooltipProvider delayDuration={300} closeDelay={150}>\n <div className=\"grid grid-cols-3 gap-0.5 rounded-md bg-muted p-0.5\">\n {alignValues.map((align) =>\n justifyValues.map((justify) => {\n const isActive = currentJustify === justify && currentAlign === align\n return (\n <TooltipTrigger\n key={`${justify}-${align}`}\n handle={tooltipHandle}\n payload={{ justify, align }}\n render={\n <button\n type=\"button\"\n className={cn(\n 'flex size-7 items-center justify-center rounded transition-all',\n isActive\n ? 'bg-background shadow-sm'\n : 'hover:bg-muted-foreground/10'\n )}\n onClick={() => onChange(justify, align)}\n >\n {isActive ? (\n <div\n className=\"flex size-full gap-[2px] p-1\"\n style={{ justifyContent: justify, alignItems: align }}\n >\n <span className=\"h-2 w-[1.5px] rounded-full bg-blue-500\" />\n <span className=\"h-2 w-[1.5px] rounded-full bg-blue-500\" />\n <span className=\"h-2 w-[1.5px] rounded-full bg-blue-500\" />\n </div>\n ) : (\n <span className=\"size-1 rounded-full bg-muted-foreground/30\" />\n )}\n </button>\n }\n />\n )\n })\n )}\n </div>\n <Tooltip handle={tooltipHandle}>\n {({ payload }) => (\n <TooltipPortal>\n <TooltipPositioner side=\"bottom\" sideOffset={8} className=\"fixed z-[99999]\">\n <TooltipPopup className=\"overflow-hidden rounded-md bg-[#171717] px-3 py-1.5 text-xs text-[#fafafa] animate-in fade-in-0 zoom-in-95 data-[closed]:animate-out data-[closed]:fade-out-0 data-[closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2\">\n justify: {payload?.justify}, align: {payload?.align}\n </TooltipPopup>\n </TooltipPositioner>\n </TooltipPortal>\n )}\n </Tooltip>\n </TooltipProvider>\n )\n}\n\nconst SIZING_OPTIONS: { value: SizingMode; label: string }[] = [\n { value: 'fixed', label: 'Fixed' },\n { value: 'fill', label: 'Fill container' },\n { value: 'fit', label: 'Fit content' },\n]\n\nfunction SizingFixedInput({ value, onValueChange }: { value: number; onValueChange: (v: number) => void }) {\n const [localValue, setLocalValue] = React.useState(String(value))\n\n React.useEffect(() => {\n setLocalValue(String(value))\n }, [value])\n\n return (\n <input\n type=\"number\"\n value={localValue}\n onChange={(e) => {\n setLocalValue(e.target.value)\n const parsed = parseFloat(e.target.value)\n if (!isNaN(parsed)) onValueChange(parsed)\n }}\n onBlur={() => {\n if (localValue === '' || isNaN(parseFloat(localValue))) {\n setLocalValue(String(value))\n }\n }}\n onFocus={selectOnFocus}\n className=\"w-full min-w-0 flex-1 bg-transparent tabular-nums outline-none [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none [appearance:textfield]\"\n />\n )\n}\n\ninterface SizingDropdownProps {\n label: string\n value: SizingValue\n onChange: (value: SizingValue) => void\n}\n\nfunction SizingDropdown({ label, value, onChange }: SizingDropdownProps) {\n const handleFixedValueChange = (numericValue: number) => {\n onChange({\n mode: 'fixed',\n value: {\n numericValue,\n unit: 'px',\n raw: `${numericValue}px`,\n },\n })\n }\n\n return (\n <div className=\"flex h-7 flex-1 items-center overflow-hidden rounded-md border-0 bg-muted text-xs\">\n <span className=\"flex flex-1 items-center gap-1.5 px-2\">\n <span className=\"text-muted-foreground\">{label}</span>\n {value.mode === 'fixed' ? (\n <SizingFixedInput\n value={Math.round(value.value.numericValue)}\n onValueChange={handleFixedValueChange}\n />\n ) : (\n <span className=\"flex flex-1 items-center gap-1\">\n <span className=\"tabular-nums text-muted-foreground\">{Math.round(value.value.numericValue)}</span>\n <span>{value.mode === 'fill' ? 'Fill' : 'Fit'}</span>\n </span>\n )}\n </span>\n <Select value={value.mode} onValueChange={(val) => {\n if (val) onChange({ mode: val as SizingMode, value: value.value })\n }}>\n <SelectTrigger className=\"flex h-full items-center justify-center border-l border-border/30 px-1.5 hover:bg-muted-foreground/10\">\n <ChevronsUpDown className=\"size-3 text-muted-foreground\" />\n </SelectTrigger>\n <SelectPortal>\n <SelectPositioner side=\"bottom\" sideOffset={4} alignItemWithTrigger={false} className=\"z-[99999]\">\n <SelectPopup className=\"min-w-[100px] overflow-hidden rounded-lg border-0 bg-popover p-1 text-popover-foreground shadow-lg animate-in fade-in-0 zoom-in-95\">\n {SIZING_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value} className=\"relative flex cursor-default select-none items-center rounded-md py-1.5 pl-6 pr-2 text-xs outline-none hover:bg-muted data-[highlighted]:bg-muted\">\n <SelectItemIndicator className=\"absolute left-1.5 flex items-center justify-center\">\n <Check className=\"size-3\" />\n </SelectItemIndicator>\n <SelectItemText>{option.label}</SelectItemText>\n </SelectItem>\n ))}\n </SelectPopup>\n </SelectPositioner>\n </SelectPortal>\n </Select>\n </div>\n )\n}\n\ninterface SizingInputsProps {\n width: SizingValue\n height: SizingValue\n onWidthChange: (value: SizingValue) => void\n onHeightChange: (value: SizingValue) => void\n}\n\nfunction SizingInputs({ width, height, onWidthChange, onHeightChange }: SizingInputsProps) {\n const { selectedElement } = useDirectEdit()\n const [locked, setLocked] = React.useState(false)\n const ratioRef = React.useRef<number>(1)\n\n React.useEffect(() => {\n setLocked(false)\n }, [selectedElement])\n\n const canLock = width.mode === 'fixed' && height.mode === 'fixed' && height.value.numericValue > 0 && width.value.numericValue > 0\n\n const handleLockToggle = () => {\n if (!locked && canLock) {\n ratioRef.current = width.value.numericValue / height.value.numericValue\n }\n setLocked(!locked)\n }\n\n const handleWidthChange = (value: SizingValue) => {\n onWidthChange(value)\n if (locked && value.mode === 'fixed' && height.mode === 'fixed' && ratioRef.current > 0) {\n const newHeight = Math.round(value.value.numericValue / ratioRef.current)\n onHeightChange({\n mode: 'fixed',\n value: { numericValue: newHeight, unit: height.value.unit, raw: `${newHeight}${height.value.unit}` },\n })\n }\n }\n\n const handleHeightChange = (value: SizingValue) => {\n onHeightChange(value)\n if (locked && value.mode === 'fixed' && width.mode === 'fixed' && ratioRef.current > 0) {\n const newWidth = Math.round(value.value.numericValue * ratioRef.current)\n onWidthChange({\n mode: 'fixed',\n value: { numericValue: newWidth, unit: width.value.unit, raw: `${newWidth}${width.value.unit}` },\n })\n }\n }\n\n return (\n <div className=\"flex items-center gap-2\">\n <SizingDropdown label=\"W\" value={width} onChange={handleWidthChange} />\n <SizingDropdown label=\"H\" value={height} onChange={handleHeightChange} />\n <Button\n variant={locked ? 'secondary' : 'ghost'}\n size=\"icon\"\n className=\"size-7 shrink-0\"\n onClick={handleLockToggle}\n disabled={!canLock}\n title={locked ? 'Unlock aspect ratio' : 'Lock aspect ratio'}\n >\n {locked ? <Link className=\"size-3\" /> : <Unlink className=\"size-3\" />}\n </Button>\n </div>\n )\n}\n\ninterface ColorInputProps {\n id?: string\n label: string\n icon: React.ReactNode\n value: ColorValue\n onChange: (value: ColorValue) => void\n}\n\nfunction ColorInput({ id, label, icon, value, onChange }: ColorInputProps) {\n const [hexInput, setHexInput] = React.useState(value.hex)\n const [alphaInput, setAlphaInput] = React.useState(value.alpha.toString())\n\n // Sync internal state when value changes externally\n React.useEffect(() => {\n setHexInput(value.hex)\n setAlphaInput(value.alpha.toString())\n }, [value.hex, value.alpha])\n\n const handleHexChange = (newHex: string) => {\n // Remove # if present and convert to uppercase\n const cleaned = newHex.replace('#', '').toUpperCase()\n setHexInput(cleaned)\n\n // Only update if valid 6-character hex\n if (/^[0-9A-F]{6}$/.test(cleaned)) {\n onChange({\n hex: cleaned,\n alpha: value.alpha,\n raw: formatColorValue({ hex: cleaned, alpha: value.alpha, raw: '' }),\n })\n }\n }\n\n const handleAlphaChange = (newAlpha: string) => {\n setAlphaInput(newAlpha)\n\n const numAlpha = parseInt(newAlpha)\n if (!isNaN(numAlpha) && numAlpha >= 0 && numAlpha <= 100) {\n onChange({\n hex: value.hex,\n alpha: numAlpha,\n raw: formatColorValue({ hex: value.hex, alpha: numAlpha, raw: '' }),\n })\n }\n }\n\n return (\n <div>\n <div className=\"flex h-7 items-center rounded-md border-0 bg-muted\">\n {/* Color swatch with popover picker */}\n <div className=\"ml-1.5\">\n <ColorPickerPopover id={id} value={value} onChange={onChange}>\n <div\n className=\"size-5 cursor-pointer rounded-sm shadow-[inset_0_0_0_1px_rgba(0,0,0,0.1)]\"\n style={{ backgroundColor: `#${value.hex}` }}\n />\n </ColorPickerPopover>\n </div>\n\n {/* Hex input */}\n <input\n type=\"text\"\n value={hexInput}\n onChange={(e) => handleHexChange(e.target.value)}\n onBlur={() => setHexInput(value.hex)}\n className=\"h-full w-[68px] bg-transparent px-2 font-mono text-xs uppercase outline-none\"\n maxLength={6}\n placeholder=\"FFFFFF\"\n />\n\n {/* Separator */}\n <span className=\"text-xs text-muted-foreground\">/</span>\n\n {/* Opacity input */}\n <input\n type=\"number\"\n value={alphaInput}\n onChange={(e) => handleAlphaChange(e.target.value)}\n onBlur={() => setAlphaInput(value.alpha.toString())}\n className=\"h-full w-10 bg-transparent px-1 text-center text-xs tabular-nums outline-none [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none [appearance:textfield]\"\n min={0}\n max={100}\n />\n <span className=\"pr-2 text-xs text-muted-foreground\">%</span>\n </div>\n </div>\n )\n}\n\nconst FONT_FAMILIES = [\n { value: 'system-ui, sans-serif', label: 'System Sans-Serif' },\n { value: 'Georgia, serif', label: 'System Serif' },\n { value: 'ui-monospace, monospace', label: 'System Mono' },\n { value: 'Inter, sans-serif', label: 'Inter' },\n { value: 'Roboto, sans-serif', label: 'Roboto' },\n { value: 'Arial, sans-serif', label: 'Arial' },\n]\n\nconst FONT_WEIGHTS = [\n { value: '100', label: 'Thin' },\n { value: '200', label: 'Extra Light' },\n { value: '300', label: 'Light' },\n { value: '400', label: 'Regular' },\n { value: '500', label: 'Medium' },\n { value: '600', label: 'Semibold' },\n { value: '700', label: 'Bold' },\n { value: '800', label: 'Extra Bold' },\n { value: '900', label: 'Black' },\n]\n\ninterface TypographyInputsProps {\n typography: TypographyProperties\n onUpdate: (key: TypographyPropertyKey, value: CSSPropertyValue | string) => void\n}\n\nfunction TypographyInputs({ typography, onUpdate }: TypographyInputsProps) {\n const handleFontSizeChange = (value: number) => {\n onUpdate('fontSize', { numericValue: value, unit: 'px', raw: `${value}px` })\n }\n\n const handleLineHeightChange = (value: number) => {\n onUpdate('lineHeight', { numericValue: value, unit: 'px', raw: `${value}px` })\n }\n\n const handleLetterSpacingChange = (value: number) => {\n onUpdate('letterSpacing', { numericValue: value, unit: 'em', raw: `${value}em` })\n }\n\n const getFontFamilyLabel = (value: string) => {\n const valueLower = value.toLowerCase()\n const family = FONT_FAMILIES.find((f) => {\n const familyName = f.value.split(',')[0].trim().toLowerCase()\n return valueLower.startsWith(familyName) || valueLower.startsWith(`\"${familyName}\"`)\n })\n return family?.label || 'Custom'\n }\n\n const getFontWeightLabel = (value: string) => {\n const weight = FONT_WEIGHTS.find((w) => w.value === value)\n return weight?.label || value\n }\n\n return (\n <div className=\"space-y-3\">\n <Select value={typography.fontFamily} onValueChange={(val) => val && onUpdate('fontFamily', val)}>\n <SelectTrigger className=\"flex h-7 w-full items-center justify-between rounded-md border-0 bg-muted px-2 text-xs hover:bg-muted-foreground/10 focus:outline-none\">\n <span className=\"flex items-center gap-2\">\n <Type className=\"size-3.5 text-muted-foreground\" />\n <span>{getFontFamilyLabel(typography.fontFamily)}</span>\n </span>\n <SelectIcon>\n <ChevronDown className=\"size-3 text-muted-foreground\" />\n </SelectIcon>\n </SelectTrigger>\n <SelectPortal>\n <SelectPositioner sideOffset={4} className=\"z-[99999]\">\n <SelectPopup className=\"min-w-[180px] overflow-hidden rounded-lg border-0 bg-popover p-1 text-popover-foreground shadow-lg animate-in fade-in-0 zoom-in-95\">\n {FONT_FAMILIES.map((option) => (\n <SelectItem\n key={option.value}\n value={option.value}\n className=\"relative flex cursor-default select-none items-center rounded-md py-2 pl-7 pr-2 text-xs outline-none hover:bg-muted hover:text-foreground data-[highlighted]:bg-muted data-[highlighted]:text-foreground\"\n >\n <SelectItemIndicator className=\"absolute left-2 flex items-center justify-center\">\n <Check className=\"size-3\" />\n </SelectItemIndicator>\n <SelectItemText>{option.label}</SelectItemText>\n </SelectItem>\n ))}\n </SelectPopup>\n </SelectPositioner>\n </SelectPortal>\n </Select>\n\n <Select value={typography.fontWeight} onValueChange={(val) => val && onUpdate('fontWeight', val)}>\n <SelectTrigger className=\"flex h-7 w-full items-center justify-between rounded-md border-0 bg-muted px-2 text-xs hover:bg-muted-foreground/10 focus:outline-none\">\n <span className=\"flex items-center gap-2\">\n <ALargeSmall className=\"size-3.5 text-muted-foreground\" />\n <span>{getFontWeightLabel(typography.fontWeight)}</span>\n </span>\n <SelectIcon>\n <ChevronDown className=\"size-3 text-muted-foreground\" />\n </SelectIcon>\n </SelectTrigger>\n <SelectPortal>\n <SelectPositioner sideOffset={4} className=\"z-[99999]\">\n <SelectPopup className=\"min-w-[140px] overflow-hidden rounded-lg border-0 bg-popover p-1 text-popover-foreground shadow-lg animate-in fade-in-0 zoom-in-95\">\n {FONT_WEIGHTS.map((option) => (\n <SelectItem\n key={option.value}\n value={option.value}\n className=\"relative flex cursor-default select-none items-center rounded-md py-2 pl-7 pr-2 text-xs outline-none hover:bg-muted hover:text-foreground data-[highlighted]:bg-muted data-[highlighted]:text-foreground\"\n >\n <SelectItemIndicator className=\"absolute left-2 flex items-center justify-center\">\n <Check className=\"size-3\" />\n </SelectItemIndicator>\n <SelectItemText>{option.label}</SelectItemText>\n </SelectItem>\n ))}\n </SelectPopup>\n </SelectPositioner>\n </SelectPortal>\n </Select>\n\n <div className=\"flex gap-2\">\n <div className=\"relative flex-1\">\n <AArrowUp className=\"absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground\" />\n <NumberInput\n value={Math.round(typography.fontSize.numericValue)}\n onValueChange={handleFontSizeChange}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Font Size\"\n />\n </div>\n <div className=\"relative flex-1\">\n <WrapText className=\"absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground\" />\n <NumberInput\n value={Math.round(typography.lineHeight.numericValue)}\n onValueChange={handleLineHeightChange}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Line Height\"\n />\n </div>\n <div className=\"relative flex-1\">\n <LetterText className=\"absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground\" />\n <NumberInput\n step=\"0.01\"\n value={Math.round(typography.letterSpacing.numericValue * 100) / 100}\n onValueChange={handleLetterSpacingChange}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Letter Spacing (em)\"\n />\n </div>\n </div>\n\n <div className=\"flex items-center gap-3\">\n <div className=\"flex gap-1\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={typography.textAlign === 'left' || typography.textAlign === 'start' ? 'size-7 bg-muted text-foreground' : 'size-7 text-muted-foreground'}\n onClick={() => onUpdate('textAlign', 'left')}\n title=\"Align Left\"\n >\n <AlignLeft className=\"size-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={typography.textAlign === 'center' ? 'size-7 bg-muted text-foreground' : 'size-7 text-muted-foreground'}\n onClick={() => onUpdate('textAlign', 'center')}\n title=\"Align Center\"\n >\n <AlignCenter className=\"size-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={typography.textAlign === 'right' || typography.textAlign === 'end' ? 'size-7 bg-muted text-foreground' : 'size-7 text-muted-foreground'}\n onClick={() => onUpdate('textAlign', 'right')}\n title=\"Align Right\"\n >\n <AlignRight className=\"size-3.5\" />\n </Button>\n </div>\n\n <div className=\"flex gap-1\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={typography.textVerticalAlign === 'flex-start' ? 'size-7 bg-muted text-foreground' : 'size-7 text-muted-foreground'}\n onClick={() => onUpdate('textVerticalAlign', 'flex-start')}\n title=\"Align Top\"\n >\n <AlignVerticalJustifyStart className=\"size-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={typography.textVerticalAlign === 'center' ? 'size-7 bg-muted text-foreground' : 'size-7 text-muted-foreground'}\n onClick={() => onUpdate('textVerticalAlign', 'center')}\n title=\"Align Middle\"\n >\n <AlignVerticalJustifyCenter className=\"size-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={typography.textVerticalAlign === 'flex-end' ? 'size-7 bg-muted text-foreground' : 'size-7 text-muted-foreground'}\n onClick={() => onUpdate('textVerticalAlign', 'flex-end')}\n title=\"Align Bottom\"\n >\n <AlignVerticalJustifyEnd className=\"size-3.5\" />\n </Button>\n </div>\n </div>\n </div>\n )\n}\n\ninterface FillSectionProps {\n backgroundColor: ColorValue\n textColor: ColorValue\n borderColor?: ColorValue\n outlineColor?: ColorValue\n onBackgroundChange: (value: ColorValue) => void\n onTextChange: (value: ColorValue) => void\n onBorderColorChange?: (value: ColorValue) => void\n onOutlineColorChange?: (value: ColorValue) => void\n hasTextContent: boolean\n showBackgroundColor?: boolean\n showBorderColor?: boolean\n showOutlineColor?: boolean\n}\n\nfunction FillSection({\n backgroundColor,\n textColor,\n borderColor,\n outlineColor,\n onBackgroundChange,\n onTextChange,\n onBorderColorChange,\n onOutlineColorChange,\n hasTextContent,\n showBackgroundColor,\n showBorderColor,\n showOutlineColor,\n}: FillSectionProps) {\n return (\n <ColorPickerGroup>\n <div className=\"space-y-3\">\n {showBackgroundColor && (\n <ColorInput\n id=\"fill-bg\"\n label=\"Fill\"\n icon={<Paintbrush className=\"size-3.5\" />}\n value={backgroundColor}\n onChange={onBackgroundChange}\n />\n )}\n\n {hasTextContent && (\n <ColorInput\n id=\"fill-text\"\n label=\"Text\"\n icon={<Type className=\"size-3.5\" />}\n value={textColor}\n onChange={onTextChange}\n />\n )}\n\n {showBorderColor && borderColor && onBorderColorChange && (\n <ColorInput\n id=\"fill-border\"\n label=\"Border\"\n icon={<Square className=\"size-3.5\" />}\n value={borderColor}\n onChange={onBorderColorChange}\n />\n )}\n\n {showOutlineColor && outlineColor && onOutlineColorChange && (\n <ColorInput\n id=\"fill-outline\"\n label=\"Outline\"\n icon={<Focus className=\"size-3.5\" />}\n value={outlineColor}\n onChange={onOutlineColorChange}\n />\n )}\n </div>\n </ColorPickerGroup>\n )\n}\ninterface CollapsibleSectionProps {\n title: string\n actions?: React.ReactNode\n children: React.ReactNode\n}\n\nfunction CollapsibleSection({ title, actions, children }: CollapsibleSectionProps) {\n return (\n <div>\n <div className=\"flex w-full items-center justify-between border-b border-border/50 px-3 py-2.5 text-xs font-medium text-foreground\">\n <span>{title}</span>\n {actions}\n </div>\n {children != null && <div className=\"px-3 py-3.5\">{children}</div>}\n </div>\n )\n}\n\ntype SectionKey = 'layout' | 'radius' | 'border' | 'colors' | 'text'\n\nconst SECTION_LABELS: Record<SectionKey, string> = {\n layout: 'Layout',\n radius: 'Radius',\n border: 'Border',\n colors: 'Colors',\n text: 'Text',\n}\n\nfunction useSectionNav(sectionRefs: Record<SectionKey, React.RefObject<HTMLDivElement | null>>) {\n const scrollRef = React.useRef<HTMLDivElement>(null)\n const [activeSection, setActiveSection] = React.useState<SectionKey>('layout')\n\n React.useEffect(() => {\n const scrollEl = scrollRef.current\n if (!scrollEl) return\n\n const handleScroll = () => {\n const keys = Object.keys(sectionRefs) as SectionKey[]\n let closest: SectionKey = 'layout'\n let closestDist = Infinity\n\n for (const key of keys) {\n const el = sectionRefs[key].current\n if (!el) continue\n const dist = Math.abs(el.getBoundingClientRect().top - scrollEl.getBoundingClientRect().top)\n if (dist < closestDist) {\n closestDist = dist\n closest = key\n }\n }\n\n setActiveSection(closest)\n }\n\n scrollEl.addEventListener('scroll', handleScroll, { passive: true })\n return () => scrollEl.removeEventListener('scroll', handleScroll)\n }, [sectionRefs])\n\n return { scrollRef, activeSection }\n}\n\nfunction SectionNav({\n scrollRef,\n activeSection,\n showColors,\n showText,\n sectionRefs,\n}: {\n scrollRef: React.RefObject<HTMLDivElement | null>\n activeSection: SectionKey\n showColors: boolean\n showText: boolean\n sectionRefs: Record<SectionKey, React.RefObject<HTMLDivElement | null>>\n}) {\n const sections: SectionKey[] = ['layout', 'radius', 'border']\n if (showColors) sections.push('colors')\n if (showText) sections.push('text')\n\n const handleClick = (key: SectionKey) => {\n const el = sectionRefs[key].current\n const scrollEl = scrollRef.current\n if (!el || !scrollEl) return\n const top = el.offsetTop - scrollEl.offsetTop\n scrollEl.scrollTo({ top, behavior: 'smooth' })\n }\n\n return (\n <div className=\"flex shrink-0 gap-0.5 border-b border-border/50 px-2 py-1\">\n {sections.map((key) => (\n <button\n key={key}\n type=\"button\"\n className={cn(\n 'rounded-md px-2 py-1 text-xs font-medium transition-colors',\n activeSection === key\n ? 'bg-muted text-foreground'\n : 'text-muted-foreground hover:text-foreground'\n )}\n onClick={() => handleClick(key)}\n >\n {SECTION_LABELS[key]}\n </button>\n ))}\n </div>\n )\n}\n\nexport interface DirectEditPanelInnerProps {\n elementInfo: {\n tagName: string\n id: string | null\n classList: string[]\n isFlexContainer: boolean\n isFlexItem: boolean\n isTextElement: boolean\n parentElement: HTMLElement | null | boolean\n hasChildren: boolean\n }\n computedSpacing: {\n paddingTop: CSSPropertyValue\n paddingRight: CSSPropertyValue\n paddingBottom: CSSPropertyValue\n paddingLeft: CSSPropertyValue\n marginTop: CSSPropertyValue\n marginRight: CSSPropertyValue\n marginBottom: CSSPropertyValue\n marginLeft: CSSPropertyValue\n gap: CSSPropertyValue\n }\n computedBorderRadius: {\n borderTopLeftRadius: CSSPropertyValue\n borderTopRightRadius: CSSPropertyValue\n borderBottomRightRadius: CSSPropertyValue\n borderBottomLeftRadius: CSSPropertyValue\n }\n computedBorder: BorderProperties\n computedFlex: {\n flexDirection: 'row' | 'row-reverse' | 'column' | 'column-reverse'\n justifyContent: string\n alignItems: string\n }\n computedSizing: {\n width: SizingValue\n height: SizingValue\n } | null\n computedColor: {\n backgroundColor: ColorValue\n color: ColorValue\n borderColor: ColorValue\n outlineColor: ColorValue\n } | null\n computedTypography: TypographyProperties | null\n pendingStyles: Record<string, string>\n onClose?: () => void\n onSelectParent?: () => void\n onSelectChild?: () => void\n onUpdateSpacing: (key: SpacingPropertyKey, value: CSSPropertyValue) => void\n onUpdateBorderRadius: (key: BorderRadiusPropertyKey, value: CSSPropertyValue) => void\n onUpdateBorder: (key: BorderPropertyKey, value: BorderProperties[BorderPropertyKey]) => void\n onBatchUpdateBorder: (changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]>) => void\n onUpdateFlex: (key: 'flexDirection' | 'justifyContent' | 'alignItems', value: string) => void\n onToggleFlex: () => void\n onUpdateSizing: (key: SizingPropertyKey, value: SizingValue) => void\n onUpdateColor: (key: ColorPropertyKey, value: ColorValue) => void\n onUpdateTypography: (key: TypographyPropertyKey, value: CSSPropertyValue | string) => void\n onReset: () => void\n onExportEdits: () => Promise<boolean>\n onSendToAgent: () => Promise<boolean>\n className?: string\n style?: React.CSSProperties\n panelRef?: React.RefObject<HTMLDivElement>\n isDragging?: boolean\n onHeaderPointerDown?: (e: React.PointerEvent) => void\n onHeaderPointerMove?: (e: React.PointerEvent) => void\n onHeaderPointerUp?: (e: React.PointerEvent) => void\n}\n\nexport function DirectEditPanelInner({\n elementInfo,\n computedSpacing,\n computedBorderRadius,\n computedBorder,\n computedFlex,\n computedSizing,\n computedColor,\n computedTypography,\n pendingStyles,\n onClose,\n onSelectParent,\n onSelectChild,\n onUpdateSpacing,\n onUpdateBorderRadius,\n onUpdateBorder,\n onBatchUpdateBorder,\n onUpdateFlex,\n onToggleFlex,\n onUpdateSizing,\n onUpdateColor,\n onUpdateTypography,\n onReset,\n onExportEdits,\n onSendToAgent,\n className,\n style,\n panelRef,\n isDragging,\n onHeaderPointerDown,\n onHeaderPointerMove,\n onHeaderPointerUp,\n}: DirectEditPanelInnerProps) {\n const [copied, setCopied] = React.useState(false)\n const [copyError, setCopyError] = React.useState(false)\n const [sendStatus, setSendStatus] = React.useState<'idle' | 'sending' | 'sent' | 'offline'>('idle')\n const distributeMode: DistributeMode =\n computedFlex?.justifyContent === 'space-between' ||\n computedFlex?.justifyContent === 'space-around' ||\n computedFlex?.justifyContent === 'space-evenly'\n ? computedFlex.justifyContent\n : 'fixed'\n const isDistributeValue = distributeMode !== 'fixed'\n\n const handleCopy = async () => {\n const success = await onExportEdits()\n if (success) {\n setCopyError(false)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n return\n }\n setCopied(false)\n setCopyError(true)\n setTimeout(() => setCopyError(false), 2000)\n }\n\n const handleSendToAgent = async () => {\n if (sendStatus === 'sending') return\n setSendStatus('sending')\n const success = await onSendToAgent()\n if (success) {\n setSendStatus('sent')\n setTimeout(() => setSendStatus('idle'), 2000)\n } else {\n setSendStatus('offline')\n setTimeout(() => setSendStatus('idle'), 2000)\n }\n }\n\n const hasPendingChanges = Object.keys(pendingStyles).length > 0\n const isDraggable = onHeaderPointerDown !== undefined\n\n const sectionRefs = {\n layout: React.useRef<HTMLDivElement>(null),\n radius: React.useRef<HTMLDivElement>(null),\n border: React.useRef<HTMLDivElement>(null),\n colors: React.useRef<HTMLDivElement>(null),\n text: React.useRef<HTMLDivElement>(null),\n }\n const { scrollRef, activeSection } = useSectionNav(sectionRefs)\n\n return (\n <div\n ref={panelRef}\n data-direct-edit=\"panel\"\n className={cn(\n 'flex flex-col overflow-hidden rounded-xl border border-foreground/10 bg-background shadow-2xl',\n isDragging && 'cursor-grabbing select-none',\n className\n )}\n style={{ width: PANEL_WIDTH, ...style }}\n >\n <div\n className={cn(\n 'flex shrink-0 items-center gap-2 border-b border-border/50 bg-background/60 px-3 py-2.5 backdrop-blur-xl',\n isDraggable && 'cursor-grab active:cursor-grabbing'\n )}\n onPointerDown={onHeaderPointerDown}\n onPointerMove={onHeaderPointerMove}\n onPointerUp={onHeaderPointerUp}\n >\n <span className=\"flex-1 text-xs font-medium\">Refine</span>\n {onClose && (\n <Button variant=\"ghost\" size=\"icon\" className=\"size-6\" onClick={onClose}>\n <X className=\"size-4\" />\n </Button>\n )}\n </div>\n\n <div className=\"shrink-0 border-b border-border/50 px-3 py-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <code className=\"text-xs font-medium text-foreground\">\n &lt;{elementInfo.tagName}&gt;\n </code>\n {elementInfo.id && (\n <span className=\"ml-1.5 text-xs text-muted-foreground\">#{elementInfo.id}</span>\n )}\n {elementInfo.classList.length > 0 && (\n <div className=\"mt-0.5 truncate text-xs text-muted-foreground\">\n .{elementInfo.classList.slice(0, 3).join(' .')}\n {elementInfo.classList.length > 3 && ` +${elementInfo.classList.length - 3}`}\n </div>\n )}\n </div>\n <div className=\"flex shrink-0 gap-1\">\n {onSelectParent && (\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={onSelectParent}\n disabled={!elementInfo.parentElement}\n className=\"size-7\"\n title=\"Select Parent\"\n >\n <ChevronUp className=\"size-3.5\" />\n </Button>\n )}\n {onSelectChild && (\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={onSelectChild}\n disabled={!elementInfo.hasChildren}\n className=\"size-7\"\n title=\"Select Child\"\n >\n <ChevronDown className=\"size-3.5\" />\n </Button>\n )}\n </div>\n </div>\n </div>\n\n <SectionNav\n scrollRef={scrollRef}\n activeSection={activeSection}\n showColors={!!computedColor}\n showText={elementInfo.isTextElement && !!computedTypography}\n sectionRefs={sectionRefs}\n />\n\n <div className=\"flex-1 overflow-y-auto\" ref={scrollRef}>\n <CollapsibleSection title=\"Layout\" actions={\n <button\n type=\"button\"\n className=\"flex size-6 items-center justify-center rounded text-muted-foreground hover:bg-muted-foreground/10 hover:text-foreground\"\n onClick={onToggleFlex}\n title={elementInfo.isFlexContainer ? 'Remove flex (Shift+A)' : 'Add flex (Shift+A)'}\n >\n {elementInfo.isFlexContainer ? <Minus className=\"size-3.5\" strokeWidth={1.5} /> : <Plus className=\"size-3.5\" strokeWidth={1.5} />}\n </button>\n }>\n <div className=\"space-y-3\" ref={sectionRefs.layout}>\n {elementInfo.isFlexContainer && (\n <div>\n <div className=\"mb-2 text-xs font-medium text-muted-foreground\">Flex</div>\n <div className=\"grid grid-cols-2 gap-2\">\n <div className=\"space-y-2\">\n <div className=\"flex h-7 gap-0.5 rounded-lg bg-muted p-0.5\">\n <button\n type=\"button\"\n className={cn(\n 'flex flex-1 items-center justify-center rounded-md transition-all',\n computedFlex.flexDirection === 'row'\n ? 'bg-background text-blue-500 shadow-sm'\n : 'text-muted-foreground hover:text-foreground'\n )}\n onClick={() => onUpdateFlex('flexDirection', 'row')}\n title=\"Row\"\n >\n <ArrowRight className=\"size-3.5\" />\n </button>\n <button\n type=\"button\"\n className={cn(\n 'flex flex-1 items-center justify-center rounded-md transition-all',\n computedFlex.flexDirection === 'column'\n ? 'bg-background text-blue-500 shadow-sm'\n : 'text-muted-foreground hover:text-foreground'\n )}\n onClick={() => onUpdateFlex('flexDirection', 'column')}\n title=\"Column\"\n >\n <ArrowDown className=\"size-3.5\" />\n </button>\n </div>\n\n <div className=\"flex h-7 items-center overflow-hidden rounded-md border-0 bg-muted text-xs\">\n <span className=\"flex flex-1 items-center gap-1.5 px-2\">\n <MoveHorizontal className=\"size-3.5 shrink-0 text-muted-foreground\" />\n {isDistributeValue ? (\n <span className=\"flex-1 truncate\">{DISTRIBUTE_LABELS[distributeMode]}</span>\n ) : (\n <SizingFixedInput\n value={computedSpacing.gap.numericValue}\n onValueChange={(numericValue) => {\n const unit = computedSpacing.gap.unit === 'em' || computedSpacing.gap.unit === '' ? 'px' : computedSpacing.gap.unit\n onUpdateSpacing('gap', {\n numericValue,\n unit,\n raw: `${numericValue}${unit}`,\n })\n }}\n />\n )}\n </span>\n <Select value={distributeMode} onValueChange={(val) => {\n if (val) onUpdateFlex('justifyContent', val === 'fixed' ? 'flex-start' : val)\n }}>\n <SelectTrigger className=\"flex h-full items-center justify-center border-l border-border/30 px-1.5 hover:bg-muted-foreground/10\">\n <ChevronsUpDown className=\"size-3 text-muted-foreground\" />\n </SelectTrigger>\n <SelectPortal>\n <SelectPositioner side=\"bottom\" sideOffset={4} alignItemWithTrigger={false} className=\"z-[99999]\">\n <SelectPopup className=\"min-w-[120px] overflow-hidden rounded-lg border-0 bg-popover p-1 text-popover-foreground shadow-lg animate-in fade-in-0 zoom-in-95\">\n {DISTRIBUTE_MODES.map((mode) => (\n <SelectItem key={mode} value={mode} className=\"relative flex cursor-default select-none items-center rounded-md py-1.5 pl-6 pr-2 text-xs outline-none hover:bg-muted data-[highlighted]:bg-muted\">\n <SelectItemIndicator className=\"absolute left-1.5 flex items-center justify-center\">\n <Check className=\"size-3\" />\n </SelectItemIndicator>\n <SelectItemText>{DISTRIBUTE_LABELS[mode]}</SelectItemText>\n </SelectItem>\n ))}\n </SelectPopup>\n </SelectPositioner>\n </SelectPortal>\n </Select>\n </div>\n </div>\n\n <AlignmentGrid\n justifyContent={computedFlex.justifyContent}\n alignItems={computedFlex.alignItems}\n onChange={(justify, align) => {\n onUpdateFlex('justifyContent', justify)\n onUpdateFlex('alignItems', align)\n }}\n />\n </div>\n </div>\n )}\n\n {computedSizing && (\n <div>\n <div className=\"mb-2 text-xs font-medium text-muted-foreground\">Sizing</div>\n <SizingInputs\n width={computedSizing.width}\n height={computedSizing.height}\n onWidthChange={(value) => onUpdateSizing('width', value)}\n onHeightChange={(value) => onUpdateSizing('height', value)}\n />\n </div>\n )}\n\n <div>\n <div className=\"mb-2 text-xs font-medium text-muted-foreground\">Padding</div>\n <PaddingInputs\n values={{\n top: computedSpacing.paddingTop,\n right: computedSpacing.paddingRight,\n bottom: computedSpacing.paddingBottom,\n left: computedSpacing.paddingLeft,\n }}\n onChange={onUpdateSpacing}\n />\n </div>\n\n <div>\n <div className=\"mb-2 text-xs font-medium text-muted-foreground\">Margin</div>\n <MarginInputs\n values={{\n top: computedSpacing.marginTop,\n right: computedSpacing.marginRight,\n bottom: computedSpacing.marginBottom,\n left: computedSpacing.marginLeft,\n }}\n onChange={onUpdateSpacing}\n />\n </div>\n </div>\n </CollapsibleSection>\n\n <div ref={sectionRefs.radius}>\n <CollapsibleSection title=\"Radius\">\n <BorderRadiusInputs\n values={{\n topLeft: computedBorderRadius.borderTopLeftRadius,\n topRight: computedBorderRadius.borderTopRightRadius,\n bottomRight: computedBorderRadius.borderBottomRightRadius,\n bottomLeft: computedBorderRadius.borderBottomLeftRadius,\n }}\n onChange={onUpdateBorderRadius}\n />\n </CollapsibleSection>\n </div>\n\n <div ref={sectionRefs.border}>\n <BorderSection\n border={computedBorder}\n borderColor={computedColor?.borderColor}\n onChange={onUpdateBorder}\n onBatchChange={onBatchUpdateBorder}\n onBorderColorChange={(value) => onUpdateColor('borderColor', value)}\n />\n </div>\n\n {computedColor && (\n <div ref={sectionRefs.colors}>\n <CollapsibleSection title=\"Colors\">\n <FillSection\n backgroundColor={computedColor.backgroundColor}\n textColor={computedColor.color}\n borderColor={computedColor.borderColor}\n outlineColor={computedColor.outlineColor}\n onBackgroundChange={(value) => onUpdateColor('backgroundColor', value)}\n onTextChange={(value) => onUpdateColor('color', value)}\n onBorderColorChange={(value) => onUpdateColor('borderColor', value)}\n onOutlineColorChange={(value) => onUpdateColor('outlineColor', value)}\n hasTextContent={elementInfo.isTextElement}\n showBackgroundColor={computedColor.backgroundColor.alpha > 0}\n showBorderColor={false}\n showOutlineColor={computedColor.outlineColor.alpha > 0}\n />\n </CollapsibleSection>\n </div>\n )}\n\n {elementInfo.isTextElement && computedTypography && (\n <div ref={sectionRefs.text}>\n <CollapsibleSection title=\"Text\">\n <TypographyInputs\n typography={computedTypography}\n onUpdate={onUpdateTypography}\n />\n </CollapsibleSection>\n </div>\n )}\n </div>\n\n <div\n className={cn(\n 'flex shrink-0 items-center gap-1 border-t border-border/50 bg-muted/20 px-3 py-2',\n isDraggable && 'cursor-grab active:cursor-grabbing'\n )}\n onPointerDown={onHeaderPointerDown}\n onPointerMove={onHeaderPointerMove}\n onPointerUp={onHeaderPointerUp}\n >\n <div className=\"flex-1\" />\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleCopy}\n title=\"Copy edits\"\n className=\"size-7\"\n >\n {copyError ? (\n <X className=\"size-3.5 text-red-500\" />\n ) : copied ? (\n <Check className=\"size-3.5 text-green-500\" />\n ) : (\n <Copy className=\"size-3.5\" />\n )}\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={handleSendToAgent}\n disabled={!hasPendingChanges || sendStatus === 'sending'}\n title=\"Apply changes via agent\"\n className=\"size-7\"\n >\n {sendStatus === 'offline' ? (\n <X className=\"size-3.5 text-red-500\" />\n ) : sendStatus === 'sent' ? (\n <Check className=\"size-3.5 text-green-500\" />\n ) : sendStatus === 'sending' ? (\n <Send className=\"size-3.5 animate-pulse\" />\n ) : (\n <Send className=\"size-3.5\" />\n )}\n </Button>\n </div>\n </div>\n )\n}\n\nfunction DirectEditPanelContent() {\n const container = usePortalContainer()\n const {\n isOpen,\n closePanel,\n elementInfo,\n computedSpacing,\n computedBorderRadius,\n computedBorder,\n computedFlex,\n computedSizing,\n computedColor,\n computedTypography,\n updateSpacingProperty,\n updateBorderRadiusProperty,\n updateBorderProperty,\n updateBorderProperties,\n updateFlexProperty,\n toggleFlexLayout,\n updateSizingProperty,\n updateColorProperty,\n updateTypographyProperty,\n resetToOriginal,\n exportEdits,\n sendEditToAgent,\n pendingStyles,\n selectParent,\n selectChild,\n selectElement,\n editModeActive,\n selectedElement,\n handleMoveComplete,\n activeTool,\n setActiveTool,\n comments,\n activeCommentId,\n addComment,\n updateCommentText,\n addCommentReply,\n deleteComment,\n exportComment,\n sendCommentToAgent,\n setActiveCommentId,\n startTextEditing,\n commitTextEditing,\n textEditingElement,\n } = useDirectEdit()\n\n const [position, setPosition] = React.useState<Position>(getInitialPosition)\n const [isDragging, setIsDragging] = React.useState(false)\n const [dragOffset, setDragOffset] = React.useState<Position>({ x: 0, y: 0 })\n const [hoverHighlight, setHoverHighlight] = React.useState<{\n flexContainer: HTMLElement\n children: HTMLElement[]\n } | null>(null)\n const panelRef = React.useRef<HTMLDivElement>(null)\n\n const handlePointerDown = (e: React.PointerEvent) => {\n if (!panelRef.current) return\n\n const rect = panelRef.current.getBoundingClientRect()\n setDragOffset({\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n })\n setIsDragging(true)\n ;(e.target as HTMLElement).setPointerCapture(e.pointerId)\n }\n\n const handlePointerMove = (e: React.PointerEvent) => {\n if (!isDragging) return\n\n const newX = Math.max(0, Math.min(window.innerWidth - PANEL_WIDTH, e.clientX - dragOffset.x))\n const newY = Math.max(0, Math.min(window.innerHeight - PANEL_HEIGHT, e.clientY - dragOffset.y))\n\n setPosition({ x: newX, y: newY })\n }\n\n const handlePointerUp = (e: React.PointerEvent) => {\n if (!isDragging) return\n\n setIsDragging(false)\n ;(e.target as HTMLElement).releasePointerCapture(e.pointerId)\n\n try { localStorage.setItem(STORAGE_KEY, JSON.stringify(position)) } catch {}\n }\n\n React.useEffect(() => {\n function handleResize() {\n setPosition((prev) => ({\n x: Math.min(prev.x, window.innerWidth - PANEL_WIDTH - 20),\n y: Math.min(prev.y, window.innerHeight - PANEL_HEIGHT - 20),\n }))\n }\n\n window.addEventListener('resize', handleResize)\n return () => window.removeEventListener('resize', handleResize)\n }, [])\n\n const { isActive: measurementActive, hoveredElement, measurements, mousePosition } = useMeasurement(\n isOpen ? selectedElement : null\n )\n\n const {\n dragState,\n dropIndicator,\n startDrag,\n } = useMove({\n onMoveComplete: handleMoveComplete,\n })\n\n const overlay = editModeActive && container ? createPortal(\n <>\n <div\n data-direct-edit=\"overlay\"\n className={cn('fixed inset-0 z-[99990]', activeTool === 'comment' ? 'cursor-crosshair' : 'cursor-default')}\n style={{ pointerEvents: textEditingElement ? 'none' : 'auto' }}\n onDoubleClick={(e) => {\n e.preventDefault()\n if (activeTool !== 'select') return\n const elementUnder = elementFromPointWithoutOverlays(e.clientX, e.clientY)\n if (elementUnder && elementUnder !== document.body && elementUnder !== document.documentElement) {\n const resolved = resolveElementTarget(elementUnder, selectedElement)\n if (isTextElement(resolved)) {\n if (selectedElement !== resolved) selectElement(resolved)\n startTextEditing(resolved)\n }\n }\n }}\n onMouseMove={(e) => {\n const elementUnder = elementFromPointWithoutOverlays(e.clientX, e.clientY)\n setHoverHighlight(computeHoverHighlight(elementUnder, selectedElement))\n }}\n onMouseLeave={() => setHoverHighlight(null)}\n onClick={(e) => {\n e.preventDefault()\n setHoverHighlight(null)\n if (activeCommentId) { setActiveCommentId(null); return }\n const elementUnder = elementFromPointWithoutOverlays(e.clientX, e.clientY)\n if (elementUnder && elementUnder !== document.body && elementUnder !== document.documentElement) {\n const resolved = resolveElementTarget(elementUnder, selectedElement)\n if (activeTool === 'comment') addComment(resolved, { x: e.clientX, y: e.clientY })\n else selectElement(resolved)\n }\n }}\n />\n {hoverHighlight && (() => {\n const cr = hoverHighlight.flexContainer.getBoundingClientRect()\n return (\n <svg\n data-direct-edit=\"hover-highlight\"\n className=\"pointer-events-none fixed inset-0 z-[99991]\"\n width=\"100%\"\n height=\"100%\"\n style={{ width: '100vw', height: '100vh' }}\n >\n <rect\n x={cr.left}\n y={cr.top}\n width={cr.width}\n height={cr.height}\n fill=\"transparent\"\n stroke=\"#3b82f6\"\n strokeWidth={1}\n />\n {hoverHighlight.children.map((child, i) => {\n const r = child.getBoundingClientRect()\n return (\n <rect\n key={i}\n x={r.left}\n y={r.top}\n width={r.width}\n height={r.height}\n fill=\"transparent\"\n stroke=\"#3b82f6\"\n strokeWidth={1}\n strokeDasharray=\"4 2\"\n />\n )\n })}\n </svg>\n )\n })()}\n </>,\n container\n ) : null\n\n const commentOverlay = editModeActive && comments.length > 0 && container ? createPortal(\n <CommentOverlay\n comments={comments}\n activeCommentId={activeCommentId}\n onSetActiveComment={setActiveCommentId}\n onUpdateText={updateCommentText}\n onAddReply={addCommentReply}\n onDelete={deleteComment}\n onExport={exportComment}\n onSendToAgent={sendCommentToAgent}\n />,\n container\n ) : null\n\n if (!isOpen || !computedSpacing || !elementInfo || !computedBorderRadius || !computedBorder || !computedFlex || !computedSizing || !computedColor || !computedTypography || !container) return <>{overlay}{commentOverlay}</>\n\n const handleMoveStart = (e: React.PointerEvent) => {\n if (selectedElement) {\n startDrag(e, selectedElement)\n }\n }\n\n return createPortal(\n <>\n {overlay}\n {commentOverlay}\n\n {selectedElement && (\n <SelectionOverlay\n selectedElement={selectedElement}\n isDragging={dragState.isDragging}\n ghostPosition={dragState.ghostPosition}\n onMoveStart={handleMoveStart}\n isTextEditing={Boolean(textEditingElement)}\n onDoubleClick={(clientX, clientY) => {\n if (!selectedElement) return\n if (isTextElement(selectedElement)) {\n startTextEditing(selectedElement)\n return\n }\n const elementUnder = elementFromPointWithoutOverlays(clientX, clientY)\n if (elementUnder && elementUnder !== selectedElement && selectedElement.contains(elementUnder)) {\n const resolved = resolveElementTarget(elementUnder, selectedElement)\n if (isTextElement(resolved)) {\n selectElement(resolved)\n startTextEditing(resolved)\n }\n }\n }}\n onHoverElement={(element) => {\n setHoverHighlight(computeHoverHighlight(element, selectedElement))\n }}\n onClickThrough={(clientX, clientY) => {\n if (!selectedElement) return\n const elementUnder = elementFromPointWithoutOverlays(clientX, clientY)\n if (!elementUnder) return\n if (elementUnder !== selectedElement && selectedElement.contains(elementUnder)) {\n const resolved = resolveElementTarget(elementUnder, selectedElement)\n selectElement(resolved)\n return\n }\n const child = findChildAtPoint(selectedElement, clientX, clientY)\n if (child) {\n selectElement(child)\n }\n }}\n />\n )}\n\n {dragState.isDragging && (\n <MoveOverlay dropIndicator={dropIndicator} />\n )}\n\n {measurementActive && selectedElement && (\n <MeasurementOverlay\n selectedElement={selectedElement}\n hoveredElement={hoveredElement}\n measurements={[\n ...measurements,\n ...calculateGuidelineMeasurements(selectedElement, getStoredGuidelines(), mousePosition),\n ]}\n />\n )}\n\n <DirectEditPanelInner\n elementInfo={elementInfo}\n computedSpacing={computedSpacing}\n computedBorderRadius={computedBorderRadius}\n computedBorder={computedBorder}\n computedFlex={computedFlex}\n computedSizing={computedSizing}\n computedColor={computedColor}\n computedTypography={computedTypography}\n pendingStyles={pendingStyles}\n onClose={closePanel}\n onSelectParent={selectParent}\n onSelectChild={selectChild}\n onUpdateSpacing={updateSpacingProperty}\n onUpdateBorderRadius={updateBorderRadiusProperty}\n onUpdateBorder={updateBorderProperty}\n onBatchUpdateBorder={updateBorderProperties}\n onUpdateFlex={updateFlexProperty}\n onToggleFlex={toggleFlexLayout}\n onUpdateSizing={updateSizingProperty}\n onUpdateColor={updateColorProperty}\n onUpdateTypography={updateTypographyProperty}\n onReset={resetToOriginal}\n onExportEdits={exportEdits}\n onSendToAgent={sendEditToAgent}\n className=\"fixed z-[99999]\"\n style={{\n left: position.x,\n top: position.y,\n maxHeight: PANEL_HEIGHT,\n pointerEvents: 'auto',\n }}\n panelRef={panelRef}\n isDragging={isDragging}\n onHeaderPointerDown={handlePointerDown}\n onHeaderPointerMove={handlePointerMove}\n onHeaderPointerUp={handlePointerUp}\n />\n </>,\n container\n )\n}\n\nexport function DirectEditPanel() {\n const [mounted, setMounted] = React.useState(false)\n\n React.useEffect(() => {\n setMounted(true)\n }, [])\n\n if (!mounted) {\n return null\n }\n\n return <DirectEditPanelContent />\n}\n","import * as React from 'react'\nimport { cn } from '../cn'\n\nconst buttonVariants = {\n base: 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',\n variant: {\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\n destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\n outline: 'border-0 bg-muted text-foreground hover:bg-muted-foreground/10',\n secondary: 'bg-muted text-secondary-foreground hover:bg-muted-foreground/10',\n ghost: 'hover:bg-muted hover:text-foreground',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-10 px-4 py-2',\n sm: 'h-9 rounded-md px-3',\n lg: 'h-11 rounded-md px-8',\n icon: 'h-10 w-10',\n },\n}\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: keyof typeof buttonVariants.variant\n size?: keyof typeof buttonVariants.size\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant = 'default', size = 'default', ...props }, ref) => {\n return (\n <button\n className={cn(\n buttonVariants.base,\n buttonVariants.variant[variant],\n buttonVariants.size[size],\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = 'Button'\n\nexport { Button }\n","import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from 'react'\nimport { cn } from '../cn'\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<'input'>>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n 'flex h-10 w-full rounded-md border-0 bg-muted px-3 py-2 text-base file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none [appearance:textfield]',\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\nInput.displayName = 'Input'\n\nexport { Input }\n","import * as React from 'react'\nimport { Tooltip as TooltipPrimitive } from '@base-ui/react/tooltip'\nimport { usePortalContainer } from '../portal-container'\nimport { cn } from '../cn'\n\nconst TooltipProvider = ({\n children,\n delay,\n delayDuration = 300,\n closeDelay = 0,\n ...props\n}: {\n children: React.ReactNode\n delay?: number\n delayDuration?: number\n closeDelay?: number\n}) => (\n <TooltipPrimitive.Provider delay={delay ?? delayDuration} closeDelay={closeDelay} {...props}>\n {children}\n </TooltipPrimitive.Provider>\n)\n\nconst Tooltip = TooltipPrimitive.Root\n\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Popup>,\n Omit<React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Popup>, 'side' | 'align'> & {\n side?: 'top' | 'right' | 'bottom' | 'left'\n align?: 'start' | 'center' | 'end'\n sideOffset?: number\n }\n>(({ className, side, align, sideOffset = 8, ...props }, ref) => {\n const container = usePortalContainer()\n return (\n <TooltipPrimitive.Portal container={container}>\n <TooltipPrimitive.Positioner side={side} align={align} sideOffset={sideOffset} className=\"fixed z-[99999]\">\n <TooltipPrimitive.Popup\n ref={ref}\n className={cn(\n 'overflow-hidden rounded-md bg-[#171717] px-3 py-1.5 text-xs text-[#fafafa] animate-in fade-in-0 zoom-in-95 data-[closed]:animate-out data-[closed]:fade-out-0 data-[closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n </TooltipPrimitive.Positioner>\n </TooltipPrimitive.Portal>\n )\n})\nTooltipContent.displayName = 'TooltipContent'\n\nconst createTooltipHandle = TooltipPrimitive.createHandle\n\nfunction TooltipPortal(props: React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Portal>) {\n const container = usePortalContainer()\n return <TooltipPrimitive.Portal container={container} {...props} />\n}\n\nconst TooltipPositioner = TooltipPrimitive.Positioner\nconst TooltipPopup = TooltipPrimitive.Popup\n\nexport {\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n TooltipProvider,\n createTooltipHandle,\n TooltipPortal,\n TooltipPositioner,\n TooltipPopup,\n}\n","import { Select as SelectPrimitive } from '@base-ui/react/select'\nimport { usePortalContainer } from '../portal-container'\n\nconst Select = SelectPrimitive.Root\nconst SelectTrigger = SelectPrimitive.Trigger\nconst SelectValue = SelectPrimitive.Value\nconst SelectIcon = SelectPrimitive.Icon\n\nfunction SelectPortal(props: React.ComponentPropsWithoutRef<typeof SelectPrimitive.Portal>) {\n const container = usePortalContainer()\n return <SelectPrimitive.Portal container={container} {...props} />\n}\n\nfunction SelectPositioner(props: React.ComponentPropsWithoutRef<typeof SelectPrimitive.Positioner>) {\n return <SelectPrimitive.Positioner {...props} style={{ pointerEvents: 'auto', ...props.style }} />\n}\nconst SelectPopup = SelectPrimitive.Popup\nconst SelectItem = SelectPrimitive.Item\nconst SelectItemIndicator = SelectPrimitive.ItemIndicator\nconst SelectItemText = SelectPrimitive.ItemText\n\nexport {\n Select,\n SelectTrigger,\n SelectValue,\n SelectIcon,\n SelectPortal,\n SelectPositioner,\n SelectPopup,\n SelectItem,\n SelectItemIndicator,\n SelectItemText,\n}\n","import * as React from 'react'\nimport { Popover } from '@base-ui/react/popover'\nimport { usePortalContainer } from '../portal-container'\nimport type { ColorValue } from '../types'\nimport {\n hexToRgb,\n rgbToHex,\n rgbToHsv,\n hsvToRgb,\n rgbToHsl,\n hslToRgb,\n formatColorValue,\n} from './color-utils'\n\nfunction ColorPickerPortal(props: React.ComponentPropsWithoutRef<typeof Popover.Portal>) {\n const container = usePortalContainer()\n return <Popover.Portal container={container} {...props} />\n}\n\ninterface ColorPickerGroupContextValue {\n activePickerId: string | null\n setActivePickerId: (id: string | null) => void\n}\n\nconst ColorPickerGroupContext = React.createContext<ColorPickerGroupContextValue | null>(null)\n\nexport function ColorPickerGroup({ children }: { children: React.ReactNode }) {\n const [activePickerId, setActivePickerId] = React.useState<string | null>(null)\n return (\n <ColorPickerGroupContext.Provider value={{ activePickerId, setActivePickerId }}>\n {children}\n </ColorPickerGroupContext.Provider>\n )\n}\n\nfunction useDrag(onMove: (x: number, y: number, rect: DOMRect) => void) {\n const ref = React.useRef<HTMLDivElement>(null)\n\n const handlePointerEvent = React.useCallback(\n (e: React.PointerEvent | PointerEvent) => {\n const el = ref.current\n if (!el) return\n const rect = el.getBoundingClientRect()\n const x = Math.max(0, Math.min(e.clientX - rect.left, rect.width))\n const y = Math.max(0, Math.min(e.clientY - rect.top, rect.height))\n onMove(x, y, rect)\n },\n [onMove]\n )\n\n const onPointerDown = React.useCallback(\n (e: React.PointerEvent) => {\n e.preventDefault()\n ref.current?.setPointerCapture(e.pointerId)\n handlePointerEvent(e)\n },\n [handlePointerEvent]\n )\n\n const onPointerMove = React.useCallback(\n (e: React.PointerEvent) => {\n if (e.buttons === 0) return\n handlePointerEvent(e)\n },\n [handlePointerEvent]\n )\n\n return { ref, onPointerDown, onPointerMove }\n}\n\ninterface SaturationValueAreaProps {\n hue: number\n saturation: number\n value: number\n onChange: (s: number, v: number) => void\n}\n\nfunction SaturationValueArea({ hue, saturation, value, onChange }: SaturationValueAreaProps) {\n const drag = useDrag((x, _y, rect) => {\n onChange((x / rect.width) * 100, (1 - _y / rect.height) * 100)\n })\n\n return (\n <div\n ref={drag.ref}\n onPointerDown={drag.onPointerDown}\n onPointerMove={drag.onPointerMove}\n className=\"relative h-[150px] flex-1 cursor-crosshair rounded-sm\"\n style={{ backgroundColor: `hsl(${hue}, 100%, 50%)` }}\n >\n <div className=\"pointer-events-none absolute inset-0 rounded-sm\" style={{ background: 'linear-gradient(to right, #fff, transparent)' }} />\n <div className=\"pointer-events-none absolute inset-0 rounded-sm\" style={{ background: 'linear-gradient(to bottom, transparent, #000)' }} />\n <div\n className=\"pointer-events-none absolute size-3.5 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-white shadow-[0_0_0_1px_rgba(0,0,0,0.3)]\"\n style={{ left: `${saturation}%`, top: `${100 - value}%` }}\n />\n </div>\n )\n}\n\ninterface VerticalSliderProps {\n value: number\n max: number\n background: string\n onChange: (value: number) => void\n checkerboard?: boolean\n}\n\nfunction VerticalSlider({ value, max, background, onChange, checkerboard }: VerticalSliderProps) {\n const drag = useDrag((_x, y, rect) => {\n onChange((y / rect.height) * max)\n })\n\n const pct = (value / max) * 100\n\n return (\n <div\n ref={drag.ref}\n onPointerDown={drag.onPointerDown}\n onPointerMove={drag.onPointerMove}\n className=\"relative w-4 cursor-pointer rounded-sm\"\n style={\n checkerboard\n ? {\n backgroundImage:\n 'conic-gradient(#ccc 25%, #fff 25% 50%, #ccc 50% 75%, #fff 75%)',\n backgroundSize: '8px 8px',\n }\n : undefined\n }\n >\n <div className=\"pointer-events-none absolute inset-0 rounded-sm\" style={{ background }} />\n <div\n className=\"pointer-events-none absolute left-1/2 h-2 w-full -translate-x-1/2 -translate-y-1/2 rounded-sm border-2 border-white shadow-[0_0_0_1px_rgba(0,0,0,0.3)]\"\n style={{ top: `${pct}%` }}\n />\n </div>\n )\n}\n\nfunction NumericInput({\n label,\n value,\n max,\n onChange,\n}: {\n label: string\n value: number\n max: number\n onChange: (v: number) => void\n}) {\n const [local, setLocal] = React.useState(Math.round(value).toString())\n\n React.useEffect(() => {\n setLocal(Math.round(value).toString())\n }, [value])\n\n return (\n <div className=\"flex items-center gap-1\">\n <span className=\"w-3 text-[10px] text-muted-foreground\">{label}</span>\n <input\n type=\"text\"\n value={local}\n onChange={(e) => {\n setLocal(e.target.value)\n const n = parseInt(e.target.value)\n if (!isNaN(n) && n >= 0 && n <= max) onChange(n)\n }}\n onBlur={() => setLocal(Math.round(value).toString())}\n className=\"h-6 w-9 rounded border-0 bg-muted px-1 text-center text-[11px] tabular-nums outline-none\"\n />\n </div>\n )\n}\n\ninterface ColorPickerPopoverProps {\n id?: string\n value: ColorValue\n onChange: (value: ColorValue) => void\n children: React.ReactNode\n}\n\nexport function ColorPickerPopover({ id, value, onChange, children }: ColorPickerPopoverProps) {\n const group = React.useContext(ColorPickerGroupContext)\n const rgb = hexToRgb(value.hex)\n const initialHsv = rgbToHsv(rgb.r, rgb.g, rgb.b)\n\n const [hsv, setHsv] = React.useState({ h: initialHsv.h, s: initialHsv.s, v: initialHsv.v })\n const [alpha, setAlpha] = React.useState(value.alpha)\n\n // Track the last hex we synced from to avoid overwriting HSV on our own updates\n const lastSyncedHex = React.useRef(value.hex)\n\n React.useEffect(() => {\n if (value.hex !== lastSyncedHex.current) {\n const newRgb = hexToRgb(value.hex)\n const newHsv = rgbToHsv(newRgb.r, newRgb.g, newRgb.b)\n // Preserve hue when saturation or value is 0 (would lose hue info)\n setHsv((prev) => ({\n h: newHsv.s === 0 || newHsv.v === 0 ? prev.h : newHsv.h,\n s: newHsv.s,\n v: newHsv.v,\n }))\n lastSyncedHex.current = value.hex\n }\n setAlpha(value.alpha)\n }, [value.hex, value.alpha])\n\n const emitChange = React.useCallback(\n (h: number, s: number, v: number, a: number) => {\n const newRgb = hsvToRgb(h, s, v)\n const hex = rgbToHex(newRgb.r, newRgb.g, newRgb.b)\n lastSyncedHex.current = hex\n onChange({\n hex,\n alpha: a,\n raw: formatColorValue({ hex, alpha: a, raw: '' }),\n })\n },\n [onChange]\n )\n\n const handleSVChange = (s: number, v: number) => {\n setHsv((prev) => ({ ...prev, s, v }))\n emitChange(hsv.h, s, v, alpha)\n }\n\n const handleHueChange = (h: number) => {\n setHsv((prev) => ({ ...prev, h }))\n emitChange(h, hsv.s, hsv.v, alpha)\n }\n\n const handleAlphaChange = (a: number) => {\n const clamped = Math.round(Math.max(0, Math.min(100, (1 - a / 100) * 100)))\n setAlpha(clamped)\n emitChange(hsv.h, hsv.s, hsv.v, clamped)\n }\n\n // Derived values for display\n const currentRgb = hsvToRgb(hsv.h, hsv.s, hsv.v)\n const currentHsl = rgbToHsl(currentRgb.r, currentRgb.g, currentRgb.b)\n const currentHex = rgbToHex(currentRgb.r, currentRgb.g, currentRgb.b)\n\n const handleHslChange = (field: 'h' | 's' | 'l', val: number) => {\n const newHsl = { ...currentHsl, [field]: val }\n const newRgb = hslToRgb(newHsl.h, newHsl.s, newHsl.l)\n const newHsv = rgbToHsv(newRgb.r, newRgb.g, newRgb.b)\n // Preserve hue in HSV when saturation drops to 0\n setHsv((prev) => ({\n h: field === 'h' ? val : newHsv.s === 0 || newHsv.v === 0 ? prev.h : newHsv.h,\n s: newHsv.s,\n v: newHsv.v,\n }))\n const hex = rgbToHex(newRgb.r, newRgb.g, newRgb.b)\n lastSyncedHex.current = hex\n onChange({ hex, alpha, raw: formatColorValue({ hex, alpha, raw: '' }) })\n }\n\n const handleRgbChange = (field: 'r' | 'g' | 'b', val: number) => {\n const newRgb = { ...currentRgb, [field]: val }\n const newHsv = rgbToHsv(newRgb.r, newRgb.g, newRgb.b)\n setHsv((prev) => ({\n h: newHsv.s === 0 || newHsv.v === 0 ? prev.h : newHsv.h,\n s: newHsv.s,\n v: newHsv.v,\n }))\n const hex = rgbToHex(newRgb.r, newRgb.g, newRgb.b)\n lastSyncedHex.current = hex\n onChange({ hex, alpha, raw: formatColorValue({ hex, alpha, raw: '' }) })\n }\n\n const handleHexInput = (input: string) => {\n const cleaned = input.replace('#', '').toUpperCase()\n if (/^[0-9A-F]{6}$/.test(cleaned)) {\n const newRgb = hexToRgb(cleaned)\n const newHsv = rgbToHsv(newRgb.r, newRgb.g, newRgb.b)\n setHsv((prev) => ({\n h: newHsv.s === 0 || newHsv.v === 0 ? prev.h : newHsv.h,\n s: newHsv.s,\n v: newHsv.v,\n }))\n lastSyncedHex.current = cleaned\n onChange({ hex: cleaned, alpha, raw: formatColorValue({ hex: cleaned, alpha, raw: '' }) })\n }\n }\n\n const handleAlphaInput = (input: string) => {\n const n = parseInt(input)\n if (!isNaN(n) && n >= 0 && n <= 100) {\n setAlpha(n)\n emitChange(hsv.h, hsv.s, hsv.v, n)\n }\n }\n\n const alphaGradient = `linear-gradient(to bottom, #${currentHex}, transparent)`\n\n const isControlled = group !== null && id !== undefined\n const isOpen = isControlled ? group.activePickerId === id : undefined\n const handleOpenChange = isControlled\n ? (open: boolean) => { group.setActivePickerId(open ? id : null) }\n : undefined\n\n // Close on outside click — Shadow DOM breaks base-ui's built-in dismiss\n const popupRef = React.useRef<HTMLDivElement>(null)\n const triggerRef = React.useRef<HTMLButtonElement>(null)\n const onCloseRef = React.useRef<() => void>()\n onCloseRef.current = () => group?.setActivePickerId(null)\n\n React.useEffect(() => {\n if (!isOpen) return\n\n function handlePointerDown(e: PointerEvent) {\n const path = e.composedPath()\n if (popupRef.current && path.includes(popupRef.current)) return\n if (triggerRef.current && path.includes(triggerRef.current)) return\n onCloseRef.current?.()\n }\n\n const raf = requestAnimationFrame(() => {\n document.addEventListener('pointerdown', handlePointerDown)\n })\n\n return () => {\n cancelAnimationFrame(raf)\n document.removeEventListener('pointerdown', handlePointerDown)\n }\n }, [isOpen])\n\n return (\n <Popover.Root open={isOpen} onOpenChange={handleOpenChange}>\n <Popover.Trigger ref={triggerRef} render={<button type=\"button\" />} className=\"flex appearance-none items-center border-0 bg-transparent p-0 leading-none\">\n {children}\n </Popover.Trigger>\n <ColorPickerPortal>\n <Popover.Positioner side=\"bottom\" align=\"start\" sideOffset={4} className=\"fixed z-[99999]\" style={{ pointerEvents: 'auto' }}>\n <Popover.Popup ref={popupRef} className=\"w-[260px] rounded-lg border-0 bg-popover p-3 shadow-lg\">\n {/* Gradient area + sliders */}\n <div className=\"flex gap-2\">\n <SaturationValueArea\n hue={hsv.h}\n saturation={hsv.s}\n value={hsv.v}\n onChange={handleSVChange}\n />\n <VerticalSlider\n value={hsv.h}\n max={360}\n background=\"linear-gradient(to bottom, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%)\"\n onChange={handleHueChange}\n />\n <VerticalSlider\n value={(1 - alpha / 100) * 100}\n max={100}\n background={alphaGradient}\n onChange={handleAlphaChange}\n checkerboard\n />\n </div>\n\n {/* HSL row */}\n <div className=\"mt-2.5 flex gap-2\">\n <NumericInput label=\"H\" value={currentHsl.h} max={360} onChange={(v) => handleHslChange('h', v)} />\n <NumericInput label=\"S\" value={currentHsl.s} max={100} onChange={(v) => handleHslChange('s', v)} />\n <NumericInput label=\"L\" value={currentHsl.l} max={100} onChange={(v) => handleHslChange('l', v)} />\n </div>\n\n {/* RGB row */}\n <div className=\"mt-1.5 flex gap-2\">\n <NumericInput label=\"R\" value={currentRgb.r} max={255} onChange={(v) => handleRgbChange('r', v)} />\n <NumericInput label=\"G\" value={currentRgb.g} max={255} onChange={(v) => handleRgbChange('g', v)} />\n <NumericInput label=\"B\" value={currentRgb.b} max={255} onChange={(v) => handleRgbChange('b', v)} />\n </div>\n\n {/* Hex + Alpha row */}\n <div className=\"mt-1.5 flex items-center gap-1.5\">\n <span className=\"text-[10px] text-muted-foreground\">#</span>\n <HexInput value={currentHex} onChange={handleHexInput} />\n <span className=\"text-[10px] text-muted-foreground\">/</span>\n <AlphaInput value={alpha} onChange={handleAlphaInput} />\n <span className=\"text-[10px] text-muted-foreground\">%</span>\n </div>\n </Popover.Popup>\n </Popover.Positioner>\n </ColorPickerPortal>\n </Popover.Root>\n )\n}\n\nfunction HexInput({ value, onChange }: { value: string; onChange: (v: string) => void }) {\n const [local, setLocal] = React.useState(value)\n\n React.useEffect(() => {\n setLocal(value)\n }, [value])\n\n return (\n <input\n type=\"text\"\n value={local}\n onChange={(e) => {\n setLocal(e.target.value.toUpperCase())\n onChange(e.target.value)\n }}\n onBlur={() => setLocal(value)}\n className=\"h-6 w-[60px] rounded border-0 bg-muted px-1 font-mono text-[11px] uppercase outline-none\"\n maxLength={6}\n />\n )\n}\n\nfunction AlphaInput({ value, onChange }: { value: number; onChange: (v: string) => void }) {\n const [local, setLocal] = React.useState(value.toString())\n\n React.useEffect(() => {\n setLocal(value.toString())\n }, [value])\n\n return (\n <input\n type=\"text\"\n value={local}\n onChange={(e) => {\n setLocal(e.target.value)\n onChange(e.target.value)\n }}\n onBlur={() => setLocal(value.toString())}\n className=\"h-6 w-8 rounded border-0 bg-muted px-1 text-center text-[11px] tabular-nums outline-none\"\n maxLength={3}\n />\n )\n}\n","import * as React from 'react'\nimport { Slider as SliderPrimitive } from '@base-ui/react/slider'\nimport { cn } from '../cn'\n\nconst Slider = React.forwardRef<\n React.ElementRef<typeof SliderPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <SliderPrimitive.Root\n ref={ref}\n className={cn('relative w-full', className)}\n {...props}\n >\n <SliderPrimitive.Control className=\"flex w-full touch-none select-none items-center px-1 py-3\">\n <SliderPrimitive.Track className=\"h-2 w-full rounded-full bg-muted\">\n <SliderPrimitive.Indicator className=\"h-full rounded-full bg-foreground\" />\n <SliderPrimitive.Thumb className=\"h-3.5 w-2 rounded-sm border-2 border-white bg-foreground shadow-[0_0_0_1px_rgba(0,0,0,0.3)] transition-colors focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50\" />\n </SliderPrimitive.Track>\n </SliderPrimitive.Control>\n </SliderPrimitive.Root>\n))\nSlider.displayName = 'Slider'\n\nexport { Slider }\n","import * as React from 'react'\nimport type { MeasurementLine } from './types'\nimport { calculateParentMeasurements, calculateElementMeasurements, elementFromPointWithoutOverlays } from './utils'\n\nexport interface UseMeasurementResult {\n isActive: boolean\n hoveredElement: HTMLElement | null\n measurements: MeasurementLine[]\n mousePosition: { x: number; y: number } | null\n}\n\nconst INITIAL_STATE = {\n hoveredElement: null as HTMLElement | null,\n measurements: [] as MeasurementLine[],\n}\n\nexport function useMeasurement(selectedElement: HTMLElement | null): UseMeasurementResult {\n const [altHeld, setAltHeld] = React.useState(false)\n const [state, setState] = React.useState(INITIAL_STATE)\n const [mousePosition, setMousePosition] = React.useState<{ x: number; y: number } | null>(null)\n const rafRef = React.useRef<number | null>(null)\n const mousePositionRef = React.useRef<{ x: number; y: number } | null>(null)\n\n const getElementBelow = React.useCallback((x: number, y: number): HTMLElement | null => {\n const element = elementFromPointWithoutOverlays(x, y)\n if (element?.closest('[data-direct-edit-host]')) return null\n return element\n }, [])\n\n React.useEffect(() => {\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Alt') {\n e.preventDefault()\n setAltHeld(true)\n }\n }\n\n function handleKeyUp(e: KeyboardEvent) {\n if (e.key === 'Alt') {\n setAltHeld(false)\n setState(INITIAL_STATE)\n }\n }\n\n function reset() {\n setAltHeld(false)\n setState(INITIAL_STATE)\n }\n\n function handleVisibilityChange() {\n if (document.hidden) reset()\n }\n\n window.addEventListener('keydown', handleKeyDown)\n window.addEventListener('keyup', handleKeyUp)\n window.addEventListener('blur', reset)\n document.addEventListener('visibilitychange', handleVisibilityChange)\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown)\n window.removeEventListener('keyup', handleKeyUp)\n window.removeEventListener('blur', reset)\n document.removeEventListener('visibilitychange', handleVisibilityChange)\n }\n }, [])\n\n React.useEffect(() => {\n if (!altHeld || !selectedElement) {\n setState(INITIAL_STATE)\n return\n }\n\n const target = selectedElement\n\n function updateMeasurements() {\n const pos = mousePositionRef.current\n\n if (!pos) {\n setState({\n hoveredElement: null,\n measurements: calculateParentMeasurements(target),\n })\n return\n }\n\n const element = getElementBelow(pos.x, pos.y)\n const isValidHover =\n element &&\n element !== target &&\n element !== document.body &&\n element !== document.documentElement\n\n if (isValidHover) {\n const isAncestor = element.contains(target)\n setState({\n hoveredElement: element,\n measurements: isAncestor\n ? calculateParentMeasurements(target, element)\n : calculateElementMeasurements(target, element),\n })\n } else {\n setState({\n hoveredElement: null,\n measurements: calculateParentMeasurements(target),\n })\n }\n }\n\n function handleMouseMove(e: MouseEvent) {\n mousePositionRef.current = { x: e.clientX, y: e.clientY }\n\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current)\n }\n\n rafRef.current = requestAnimationFrame(() => {\n setMousePosition(mousePositionRef.current)\n updateMeasurements()\n rafRef.current = null\n })\n }\n\n updateMeasurements()\n window.addEventListener('mousemove', handleMouseMove)\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove)\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current)\n }\n }\n }, [altHeld, selectedElement, getElementBelow])\n\n return {\n isActive: altHeld && selectedElement !== null,\n hoveredElement: state.hoveredElement,\n measurements: state.measurements,\n mousePosition: altHeld ? mousePosition : null,\n }\n}\n","import * as React from 'react'\nimport type { MeasurementLine } from './types'\n\nconst TOMATO = '#E54D2E'\nconst BLUE = '#0D99FF'\nconst END_CAP_SIZE = 4\n\nexport interface MeasurementOverlayProps {\n selectedElement: HTMLElement\n hoveredElement: HTMLElement | null\n measurements: MeasurementLine[]\n}\n\ninterface EndCapProps {\n x: number\n y: number\n direction: 'horizontal' | 'vertical'\n}\n\nfunction EndCap({ x, y, direction }: EndCapProps) {\n const isHorizontal = direction === 'horizontal'\n return (\n <line\n x1={isHorizontal ? x : x - END_CAP_SIZE}\n y1={isHorizontal ? y - END_CAP_SIZE : y}\n x2={isHorizontal ? x : x + END_CAP_SIZE}\n y2={isHorizontal ? y + END_CAP_SIZE : y}\n stroke={TOMATO}\n strokeWidth={0.5}\n />\n )\n}\n\nfunction MeasurementLineComponent({ line }: { line: MeasurementLine }) {\n const { x1, y1, x2, y2, distance, direction, labelPosition } = line\n\n if (distance <= 0) return null\n\n const labelWidth = Math.max(String(distance).length * 7 + 8, 24)\n\n return (\n <g>\n <line x1={x1} y1={y1} x2={x2} y2={y2} stroke={TOMATO} strokeWidth={0.5} />\n <EndCap x={x1} y={y1} direction={direction} />\n <EndCap x={x2} y={y2} direction={direction} />\n <g transform={`translate(${labelPosition.x}, ${labelPosition.y})`}>\n <rect\n x={-labelWidth / 2}\n y={-8}\n width={labelWidth}\n height={16}\n rx={2}\n fill={TOMATO}\n />\n <text\n x={0}\n y={1}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fill=\"#fff\"\n fontSize={11}\n fontWeight={500}\n fontFamily=\"system-ui, -apple-system, sans-serif\"\n >\n {distance}\n </text>\n </g>\n </g>\n )\n}\n\ninterface ElementHighlightProps {\n element: HTMLElement\n color: string\n isDashed?: boolean\n}\n\nfunction ElementHighlight({ element, color, isDashed = false }: ElementHighlightProps) {\n const rect = element.getBoundingClientRect()\n\n return (\n <rect\n x={rect.left}\n y={rect.top}\n width={rect.width}\n height={rect.height}\n fill=\"transparent\"\n stroke={color}\n strokeWidth={1}\n strokeDasharray={isDashed ? '4 2' : undefined}\n />\n )\n}\n\nexport function MeasurementOverlay({\n selectedElement,\n hoveredElement,\n measurements,\n}: MeasurementOverlayProps) {\n const [, forceUpdate] = React.useReducer((x) => x + 1, 0)\n\n React.useEffect(() => {\n function handleUpdate() {\n requestAnimationFrame(forceUpdate)\n }\n\n window.addEventListener('scroll', handleUpdate, true)\n window.addEventListener('resize', handleUpdate)\n\n return () => {\n window.removeEventListener('scroll', handleUpdate, true)\n window.removeEventListener('resize', handleUpdate)\n }\n }, [selectedElement])\n\n return (\n <svg\n data-direct-edit=\"measurement\"\n style={{\n position: 'fixed',\n inset: 0,\n width: '100vw',\n height: '100vh',\n pointerEvents: 'none',\n zIndex: 99998,\n }}\n >\n <ElementHighlight element={selectedElement} color={BLUE} />\n {hoveredElement && (\n <ElementHighlight element={hoveredElement} color={TOMATO} isDashed />\n )}\n {measurements.map((line, i) => (\n <MeasurementLineComponent key={i} line={line} />\n ))}\n </svg>\n )\n}\n","import * as React from 'react'\nimport type { DragState, DropIndicator } from './types'\nimport {\n findContainerAtPoint,\n calculateDropPosition,\n detectChildrenDirection,\n} from './utils'\n\nexport interface MoveInfo {\n originalParent: HTMLElement\n originalPreviousSibling: HTMLElement | null\n originalNextSibling: HTMLElement | null\n}\n\nexport interface UseMoveOptions {\n onMoveComplete?: (element: HTMLElement, moveInfo: MoveInfo | null) => void\n}\n\nexport interface UseMoveDropTarget {\n container: HTMLElement\n insertBefore: HTMLElement | null\n flexDirection: 'row' | 'row-reverse' | 'column' | 'column-reverse'\n}\n\nexport interface UseMoveResult {\n dragState: DragState\n dropTarget: UseMoveDropTarget | null\n dropIndicator: DropIndicator | null\n startDrag: (e: React.PointerEvent, element: HTMLElement) => void\n}\n\nconst INITIAL_DRAG_STATE: DragState = {\n isDragging: false,\n draggedElement: null,\n originalParent: null,\n originalPreviousSibling: null,\n originalNextSibling: null,\n ghostPosition: { x: 0, y: 0 },\n dragOffset: { x: 0, y: 0 },\n}\n\nexport function useMove({ onMoveComplete }: UseMoveOptions): UseMoveResult {\n const [dragState, setDragState] = React.useState<DragState>(INITIAL_DRAG_STATE)\n const [dropTarget, setDropTarget] = React.useState<UseMoveDropTarget | null>(null)\n const [dropIndicator, setDropIndicator] = React.useState<DropIndicator | null>(null)\n\n const dragStateRef = React.useRef(dragState)\n const dropTargetRef = React.useRef(dropTarget)\n const onMoveCompleteRef = React.useRef(onMoveComplete)\n\n React.useEffect(() => {\n dragStateRef.current = dragState\n dropTargetRef.current = dropTarget\n onMoveCompleteRef.current = onMoveComplete\n })\n\n const cancelDrag = React.useCallback(() => {\n const current = dragStateRef.current\n if (current.draggedElement) {\n current.draggedElement.style.opacity = ''\n }\n setDragState(INITIAL_DRAG_STATE)\n setDropTarget(null)\n setDropIndicator(null)\n }, [])\n\n const completeDrag = React.useCallback(() => {\n const current = dragStateRef.current\n const target = dropTargetRef.current\n const { draggedElement, originalParent, originalPreviousSibling, originalNextSibling } = current\n\n if (!draggedElement) {\n cancelDrag()\n return\n }\n\n draggedElement.style.opacity = ''\n\n let didMove = false\n if (target) {\n const isSamePosition =\n target.container === originalParent &&\n target.insertBefore === originalNextSibling\n const isInvalidTarget =\n target.container === draggedElement ||\n draggedElement.contains(target.container) ||\n (target.insertBefore ? draggedElement.contains(target.insertBefore) : false)\n\n if (!isSamePosition && !isInvalidTarget) {\n try {\n if (target.insertBefore) {\n target.container.insertBefore(draggedElement, target.insertBefore)\n } else {\n target.container.appendChild(draggedElement)\n }\n didMove = true\n } catch {\n // Ignore invalid DOM moves and leave the element in place.\n }\n }\n }\n\n setDragState(INITIAL_DRAG_STATE)\n setDropTarget(null)\n setDropIndicator(null)\n\n if (onMoveCompleteRef.current && draggedElement) {\n const moveInfo: MoveInfo | null = didMove && originalParent\n ? { originalParent, originalPreviousSibling, originalNextSibling }\n : null\n onMoveCompleteRef.current(draggedElement, moveInfo)\n }\n }, [cancelDrag])\n\n const startDrag = React.useCallback(\n (e: React.PointerEvent, element: HTMLElement) => {\n const rect = element.getBoundingClientRect()\n const parent = element.parentElement\n const previousSibling = element.previousElementSibling as HTMLElement | null\n const nextSibling = element.nextElementSibling as HTMLElement | null\n\n setDragState({\n isDragging: true,\n draggedElement: element,\n originalParent: parent,\n originalPreviousSibling: previousSibling,\n originalNextSibling: nextSibling,\n ghostPosition: { x: rect.left, y: rect.top },\n dragOffset: { x: e.clientX - rect.left, y: e.clientY - rect.top },\n })\n\n element.style.opacity = '0.5'\n },\n []\n )\n\n React.useEffect(() => {\n if (!dragState.isDragging) return\n\n function handlePointerMove(e: PointerEvent) {\n const current = dragStateRef.current\n const { draggedElement, dragOffset, originalParent } = current\n\n setDragState((prev) => ({\n ...prev,\n ghostPosition: {\n x: e.clientX - dragOffset.x,\n y: e.clientY - dragOffset.y,\n },\n }))\n\n const container = findContainerAtPoint(\n e.clientX,\n e.clientY,\n draggedElement,\n originalParent\n )\n\n if (container && draggedElement) {\n const dropPos = calculateDropPosition(\n container,\n e.clientX,\n e.clientY,\n draggedElement\n )\n\n if (dropPos) {\n setDropTarget({\n container,\n insertBefore: dropPos.insertBefore,\n flexDirection: (() => {\n const { axis, reversed } = detectChildrenDirection(container, draggedElement)\n if (axis === 'horizontal') return reversed ? 'row-reverse' : 'row'\n return reversed ? 'column-reverse' : 'column'\n })(),\n })\n setDropIndicator(dropPos.indicator)\n }\n } else {\n setDropTarget(null)\n setDropIndicator(null)\n }\n }\n\n function handlePointerUp() {\n completeDrag()\n }\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n cancelDrag()\n }\n }\n\n window.addEventListener('pointermove', handlePointerMove)\n window.addEventListener('pointerup', handlePointerUp)\n window.addEventListener('keydown', handleKeyDown)\n\n return () => {\n window.removeEventListener('pointermove', handlePointerMove)\n window.removeEventListener('pointerup', handlePointerUp)\n window.removeEventListener('keydown', handleKeyDown)\n }\n }, [dragState.isDragging, completeDrag, cancelDrag])\n\n return {\n dragState,\n dropTarget,\n dropIndicator,\n startDrag,\n }\n}\n","import * as React from 'react'\nimport type { Guideline } from './types'\n\nconst STORAGE_KEY = 'direct-edit-guidelines'\n\nexport interface UseGuidelinesResult {\n guidelines: Guideline[]\n activeGuideline: Guideline | null\n dragPosition: number | null\n isCreating: boolean\n scrollOffset: { x: number; y: number }\n startCreate: (orientation: 'horizontal' | 'vertical', viewportPosition: number) => void\n startDrag: (guidelineId: string) => void\n deleteGuideline: (guidelineId: string) => void\n clearAll: () => void\n}\n\nfunction loadGuidelines(): Guideline[] {\n if (typeof window === 'undefined') return []\n try {\n const stored = localStorage.getItem(STORAGE_KEY)\n return stored ? JSON.parse(stored) : []\n } catch {\n return []\n }\n}\n\nexport function getStoredGuidelines(): Guideline[] {\n return loadGuidelines()\n}\n\nfunction saveGuidelines(guidelines: Guideline[]) {\n if (typeof window === 'undefined') return\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(guidelines))\n } catch {\n // ignore\n }\n}\n\nlet idCounter = 0\nfunction generateId(): string {\n return `gl-${Date.now()}-${idCounter++}`\n}\n\nconst RULER_SIZE = 20\n\nfunction viewportToCssCoord(\n hostElement: HTMLElement | null,\n value: number,\n axis: 'x' | 'y',\n): number {\n if (!hostElement) return value\n const rect = hostElement.getBoundingClientRect()\n const origin = axis === 'x' ? rect.left : rect.top\n const size = axis === 'x' ? rect.width : rect.height\n const cssSize = axis === 'x' ? hostElement.offsetWidth : hostElement.offsetHeight\n if (size === 0) return value\n return (value - origin) * (cssSize / size)\n}\n\nexport function useGuidelines(enabled: boolean, hostElement?: HTMLElement | null): UseGuidelinesResult {\n const [guidelines, setGuidelines] = React.useState<Guideline[]>([])\n const [hydrated, setHydrated] = React.useState(false)\n const [activeGuidelineId, setActiveGuidelineId] = React.useState<string | null>(null)\n const [dragPosition, setDragPosition] = React.useState<number | null>(null)\n const [isCreating, setIsCreating] = React.useState(false)\n const [scrollOffset, setScrollOffset] = React.useState({ x: 0, y: 0 })\n\n const hostRef = React.useRef<HTMLElement | null>(hostElement ?? null)\n hostRef.current = hostElement ?? null\n\n const [dragging, setDragging] = React.useState(false)\n\n const guidelinesRef = React.useRef(guidelines)\n guidelinesRef.current = guidelines\n\n const dragInfoRef = React.useRef<{\n guidelineId: string\n orientation: 'horizontal' | 'vertical'\n isCreating: boolean\n } | null>(null)\n\n // Hydrate from localStorage after mount (SSR-safe)\n React.useEffect(() => {\n setGuidelines(loadGuidelines())\n setHydrated(true)\n }, [])\n\n // Persist to localStorage on change\n React.useEffect(() => {\n if (!hydrated) return\n saveGuidelines(guidelines)\n }, [guidelines, hydrated])\n\n // Track scroll and resize\n React.useEffect(() => {\n if (!enabled) return\n\n function update() {\n setScrollOffset({ x: window.scrollX, y: window.scrollY })\n }\n\n update()\n window.addEventListener('scroll', update, true)\n window.addEventListener('resize', update)\n return () => {\n window.removeEventListener('scroll', update, true)\n window.removeEventListener('resize', update)\n }\n }, [enabled])\n\n const endDrag = React.useCallback(() => {\n const wasCreating = dragInfoRef.current?.isCreating ?? false\n dragInfoRef.current = null\n setDragging(false)\n setActiveGuidelineId(null)\n setDragPosition(null)\n if (wasCreating) setIsCreating(false)\n }, [])\n\n // Attach drag listeners via effect so cleanup happens on unmount\n React.useEffect(() => {\n if (!dragging) return\n\n const info = dragInfoRef.current\n if (!info) return\n\n const { guidelineId, orientation } = info\n const axis = orientation === 'horizontal' ? 'y' as const : 'x' as const\n\n function pointerToPos(e: PointerEvent): number {\n const raw = orientation === 'horizontal' ? e.clientY : e.clientX\n return viewportToCssCoord(hostRef.current, raw, axis)\n }\n\n function onPointerMove(e: PointerEvent) {\n const pos = pointerToPos(e)\n setDragPosition(pos)\n const currentScroll = orientation === 'horizontal' ? window.scrollY : window.scrollX\n setGuidelines((prev) =>\n prev.map((g) => (g.id === guidelineId ? { ...g, position: pos + currentScroll } : g)),\n )\n }\n\n function onPointerUp(e: PointerEvent) {\n const pos = pointerToPos(e)\n if (pos <= RULER_SIZE) {\n setGuidelines((prev) => prev.filter((g) => g.id !== guidelineId))\n }\n endDrag()\n }\n\n window.addEventListener('pointermove', onPointerMove)\n window.addEventListener('pointerup', onPointerUp)\n\n return () => {\n window.removeEventListener('pointermove', onPointerMove)\n window.removeEventListener('pointerup', onPointerUp)\n }\n }, [dragging, endDrag])\n\n // Cancel drag when rulers are disabled mid-drag\n React.useEffect(() => {\n if (!enabled && dragging) {\n endDrag()\n }\n }, [enabled, dragging, endDrag])\n\n const activeGuideline = React.useMemo(\n () => guidelines.find((g) => g.id === activeGuidelineId) ?? null,\n [guidelines, activeGuidelineId],\n )\n\n const startCreate = React.useCallback(\n (orientation: 'horizontal' | 'vertical', viewportPosition: number) => {\n const axis = orientation === 'horizontal' ? 'y' as const : 'x' as const\n const pos = viewportToCssCoord(hostRef.current, viewportPosition, axis)\n const scrollPos = orientation === 'horizontal' ? window.scrollY : window.scrollX\n const id = generateId()\n const newGuideline: Guideline = { id, orientation, position: pos + scrollPos }\n\n setGuidelines((prev) => [...prev, newGuideline])\n setActiveGuidelineId(id)\n setDragPosition(pos)\n setIsCreating(true)\n dragInfoRef.current = { guidelineId: id, orientation, isCreating: true }\n setDragging(true)\n },\n [],\n )\n\n const startDrag = React.useCallback((guidelineId: string) => {\n const guideline = guidelinesRef.current.find((g) => g.id === guidelineId)\n if (!guideline) return\n\n const scrollPos = guideline.orientation === 'horizontal' ? window.scrollY : window.scrollX\n setActiveGuidelineId(guidelineId)\n setDragPosition(guideline.position - scrollPos)\n dragInfoRef.current = { guidelineId, orientation: guideline.orientation, isCreating: false }\n setDragging(true)\n }, [])\n\n const deleteGuideline = React.useCallback((guidelineId: string) => {\n setGuidelines((prev) => prev.filter((g) => g.id !== guidelineId))\n }, [])\n\n const clearAll = React.useCallback(() => {\n setGuidelines([])\n }, [])\n\n return {\n guidelines,\n activeGuideline,\n dragPosition,\n isCreating,\n scrollOffset,\n startCreate,\n startDrag,\n deleteGuideline,\n clearAll,\n }\n}\n","import type { DropIndicator } from './types'\n\nconst BLUE = '#0D99FF'\n\nexport interface MoveOverlayProps {\n dropIndicator: DropIndicator | null\n}\n\nexport function MoveOverlay({ dropIndicator }: MoveOverlayProps) {\n if (!dropIndicator) {\n return null\n }\n\n return (\n <svg\n data-direct-edit=\"move-overlay\"\n style={{\n position: 'fixed',\n inset: 0,\n width: '100vw',\n height: '100vh',\n pointerEvents: 'none',\n zIndex: 99997,\n }}\n >\n <rect\n x={dropIndicator.x}\n y={dropIndicator.y}\n width={dropIndicator.width}\n height={dropIndicator.height}\n fill={BLUE}\n />\n </svg>\n )\n}\n","import * as React from 'react'\nimport { elementFromPointWithoutOverlays } from './utils'\n\nconst BLUE = '#0D99FF'\nconst DRAG_THRESHOLD = 4\nconst DBLCLICK_DELAY = 300\n\nexport interface SelectionOverlayProps {\n selectedElement: HTMLElement\n isDragging: boolean\n ghostPosition?: { x: number; y: number }\n onMoveStart: (e: React.PointerEvent) => void\n isTextEditing?: boolean\n onDoubleClick?: (clientX: number, clientY: number) => void\n onHoverElement?: (element: HTMLElement | null) => void\n onClickThrough?: (clientX: number, clientY: number) => void\n}\n\nexport function SelectionOverlay({\n selectedElement,\n isDragging,\n ghostPosition,\n onMoveStart,\n isTextEditing,\n onDoubleClick,\n onHoverElement,\n onClickThrough,\n}: SelectionOverlayProps) {\n const [rect, setRect] = React.useState(() => selectedElement.getBoundingClientRect())\n const cleanupRef = React.useRef<(() => void) | null>(null)\n const clickThroughTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n\n React.useEffect(() => {\n function updateRect() {\n setRect(selectedElement.getBoundingClientRect())\n }\n\n updateRect()\n\n window.addEventListener('scroll', updateRect, true)\n window.addEventListener('resize', updateRect)\n\n const observer = new MutationObserver(updateRect)\n observer.observe(selectedElement, {\n attributes: true,\n childList: true,\n subtree: true,\n })\n\n return () => {\n window.removeEventListener('scroll', updateRect, true)\n window.removeEventListener('resize', updateRect)\n observer.disconnect()\n }\n }, [selectedElement])\n\n React.useEffect(() => {\n return () => {\n cleanupRef.current?.()\n if (clickThroughTimerRef.current) clearTimeout(clickThroughTimerRef.current)\n }\n }, [])\n\n const handlePointerDown = (e: React.PointerEvent) => {\n if (e.button !== 0) return\n e.stopPropagation()\n // No preventDefault — allows browser to generate native dblclick events\n\n cleanupRef.current?.()\n if (clickThroughTimerRef.current) {\n clearTimeout(clickThroughTimerRef.current)\n clickThroughTimerRef.current = null\n }\n\n const origin = { x: e.clientX, y: e.clientY }\n const savedEvent = e\n\n const onMove = (moveEvent: PointerEvent) => {\n const dx = moveEvent.clientX - origin.x\n const dy = moveEvent.clientY - origin.y\n if (dx * dx + dy * dy >= DRAG_THRESHOLD * DRAG_THRESHOLD) {\n cleanup()\n onMoveStart(savedEvent)\n }\n }\n\n const onUp = (upEvent: PointerEvent) => {\n cleanup()\n if (onClickThrough) {\n const { clientX, clientY } = upEvent\n clickThroughTimerRef.current = setTimeout(() => {\n clickThroughTimerRef.current = null\n onClickThrough(clientX, clientY)\n }, DBLCLICK_DELAY)\n }\n }\n\n const cleanup = () => {\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n cleanupRef.current = null\n }\n\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', onUp)\n cleanupRef.current = cleanup\n }\n\n const handleDoubleClick = (e: React.MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n cleanupRef.current?.()\n if (clickThroughTimerRef.current) {\n clearTimeout(clickThroughTimerRef.current)\n clickThroughTimerRef.current = null\n }\n onDoubleClick?.(e.clientX, e.clientY)\n }\n\n const handleMouseMove = (e: React.MouseEvent) => {\n if (!onHoverElement) return\n const elementUnder = elementFromPointWithoutOverlays(e.clientX, e.clientY)\n onHoverElement(elementUnder)\n }\n\n const handleMouseLeave = () => {\n onHoverElement?.(null)\n }\n\n const displayX = isDragging && ghostPosition ? ghostPosition.x : rect.left\n const displayY = isDragging && ghostPosition ? ghostPosition.y : rect.top\n\n return (\n <>\n <svg\n data-direct-edit=\"selection-overlay\"\n style={{\n position: 'fixed',\n inset: 0,\n width: '100vw',\n height: '100vh',\n pointerEvents: 'none',\n zIndex: 99996,\n }}\n >\n {!isTextEditing && (\n <rect\n x={displayX}\n y={displayY}\n width={rect.width}\n height={rect.height}\n fill=\"transparent\"\n stroke={BLUE}\n strokeWidth={1}\n />\n )}\n </svg>\n\n {!isDragging && !isTextEditing && (\n <div\n data-direct-edit=\"selection-handle\"\n style={{\n position: 'fixed',\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n zIndex: 99996,\n cursor: 'default',\n pointerEvents: 'auto',\n }}\n onPointerDown={handlePointerDown}\n onDoubleClick={handleDoubleClick}\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n />\n )}\n </>\n )\n}\n","import * as React from 'react'\nimport type { Comment } from './types'\nimport { cn } from './cn'\nimport { ChevronLeft, Check, Copy, Trash2, ArrowUp, Send, X } from 'lucide-react'\n\nfunction formatRelativeTime(timestamp: number): string {\n const seconds = Math.floor((Date.now() - timestamp) / 1000)\n if (seconds < 60) return 'just now'\n const minutes = Math.floor(seconds / 60)\n if (minutes < 60) return `${minutes}m ago`\n const hours = Math.floor(minutes / 60)\n if (hours < 24) return `${hours}h ago`\n const days = Math.floor(hours / 24)\n return `${days}d ago`\n}\n\nexport interface CommentOverlayProps {\n comments: Comment[]\n activeCommentId: string | null\n onSetActiveComment: (id: string | null) => void\n onUpdateText: (id: string, text: string) => void\n onAddReply: (id: string, text: string) => void\n onDelete: (id: string) => void\n onExport: (id: string) => Promise<boolean>\n onSendToAgent: (id: string) => Promise<boolean>\n}\n\nexport function CommentOverlay({\n comments,\n activeCommentId,\n onSetActiveComment,\n onUpdateText,\n onAddReply,\n onDelete,\n onExport,\n onSendToAgent,\n}: CommentOverlayProps) {\n if (comments.length === 0) return null\n\n return (\n <>\n {comments.map((comment, index) => (\n <CommentPin\n key={comment.id}\n comment={comment}\n index={index + 1}\n isActive={activeCommentId === comment.id}\n onActivate={() => onSetActiveComment(comment.id)}\n onClose={() => onSetActiveComment(null)}\n onUpdateText={(text) => onUpdateText(comment.id, text)}\n onAddReply={(text) => onAddReply(comment.id, text)}\n onDelete={() => onDelete(comment.id)}\n onExport={() => onExport(comment.id)}\n onSendToAgent={() => onSendToAgent(comment.id)}\n />\n ))}\n </>\n )\n}\n\ninterface CommentPinProps {\n comment: Comment\n index: number\n isActive: boolean\n onActivate: () => void\n onClose: () => void\n onUpdateText: (text: string) => void\n onAddReply: (text: string) => void\n onDelete: () => void\n onExport: () => Promise<boolean>\n onSendToAgent: () => Promise<boolean>\n}\n\nfunction CommentPin({\n comment,\n index,\n isActive,\n onActivate,\n onClose,\n onUpdateText,\n onAddReply,\n onDelete,\n onExport,\n onSendToAgent,\n}: CommentPinProps) {\n const [position, setPosition] = React.useState(comment.clickPosition)\n const [flipHorizontal, setFlipHorizontal] = React.useState(false)\n const [flipVertical, setFlipVertical] = React.useState(false)\n\n React.useEffect(() => {\n function updatePosition() {\n if (!comment.element.isConnected) return\n const rect = comment.element.getBoundingClientRect()\n setPosition({\n x: rect.left + comment.relativePosition.x,\n y: rect.top + comment.relativePosition.y,\n })\n }\n\n updatePosition()\n window.addEventListener('scroll', updatePosition, true)\n window.addEventListener('resize', updatePosition)\n return () => {\n window.removeEventListener('scroll', updatePosition, true)\n window.removeEventListener('resize', updatePosition)\n }\n }, [comment.element, comment.relativePosition])\n\n React.useEffect(() => {\n if (isActive) {\n const hasText = comment.text !== ''\n const cardWidth = hasText ? 280 : 220\n const cardHeight = hasText ? 220 : 40\n const pinSize = 12\n setFlipHorizontal(position.x + pinSize + cardWidth > window.innerWidth)\n setFlipVertical(position.y + cardHeight > window.innerHeight)\n }\n }, [isActive, position, comment.text])\n\n return (\n <>\n <div\n data-direct-edit=\"comment-pin\"\n className=\"group/pin fixed z-[99998] flex size-3 cursor-pointer items-center justify-center rounded-full bg-blue-500 shadow-md ring-2 ring-white transition-transform hover:scale-[1.67] hover:shadow-lg\"\n style={{\n left: position.x - 6,\n top: position.y - 6,\n pointerEvents: 'auto',\n }}\n onClick={(e) => {\n e.stopPropagation()\n onActivate()\n }}\n >\n <span className=\"hidden text-[7px] font-medium leading-none text-white group-hover/pin:inline\">\n {index}\n </span>\n </div>\n\n {isActive && (\n comment.text === '' ? (\n <NewCommentInput\n position={position}\n flipHorizontal={flipHorizontal}\n flipVertical={flipVertical}\n onSubmit={(text) => onUpdateText(text)}\n onCancel={onClose}\n />\n ) : (\n <CommentThread\n comment={comment}\n index={index}\n position={position}\n flipHorizontal={flipHorizontal}\n flipVertical={flipVertical}\n onClose={onClose}\n onAddReply={onAddReply}\n onDelete={onDelete}\n onExport={onExport}\n onSendToAgent={onSendToAgent}\n />\n )\n )}\n </>\n )\n}\n\ninterface NewCommentInputProps {\n position: { x: number; y: number }\n flipHorizontal: boolean\n flipVertical: boolean\n onSubmit: (text: string) => void\n onCancel: () => void\n}\n\nfunction NewCommentInput({ position, flipHorizontal, flipVertical, onSubmit, onCancel }: NewCommentInputProps) {\n const [text, setText] = React.useState('')\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n React.useEffect(() => {\n inputRef.current?.focus()\n }, [])\n\n return (\n <div\n data-direct-edit=\"comment-card\"\n className=\"fixed z-[99999] flex items-center gap-1.5 rounded-lg border border-foreground/10 bg-background p-1.5 shadow-2xl\"\n style={{\n width: 220,\n left: flipHorizontal ? position.x - 220 - 8 : position.x + 14,\n top: flipVertical ? position.y - 40 : position.y - 18,\n pointerEvents: 'auto',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <input\n ref={inputRef}\n type=\"text\"\n className=\"min-w-0 flex-1 bg-transparent px-1.5 text-xs text-foreground placeholder:text-muted-foreground focus:outline-none\"\n placeholder=\"Add a comment...\"\n value={text}\n onChange={(e) => setText(e.target.value)}\n onKeyDown={(e) => {\n e.stopPropagation()\n if (e.key === 'Enter' && text.trim()) {\n onSubmit(text.trim())\n } else if (e.key === 'Escape') {\n onCancel()\n }\n }}\n />\n <button\n type=\"button\"\n className={cn(\n 'flex size-6 shrink-0 items-center justify-center rounded-md transition-colors',\n text.trim()\n ? 'bg-blue-500 text-white hover:bg-blue-600'\n : 'bg-muted text-muted-foreground'\n )}\n disabled={!text.trim()}\n onClick={() => {\n if (text.trim()) onSubmit(text.trim())\n }}\n >\n <ArrowUp className=\"size-3.5\" />\n </button>\n </div>\n )\n}\n\ninterface CommentThreadProps {\n comment: Comment\n index: number\n position: { x: number; y: number }\n flipHorizontal: boolean\n flipVertical: boolean\n onClose: () => void\n onAddReply: (text: string) => void\n onDelete: () => void\n onExport: () => Promise<boolean>\n onSendToAgent: () => Promise<boolean>\n}\n\nfunction CommentThread({\n comment,\n index,\n position,\n flipHorizontal,\n flipVertical,\n onClose,\n onAddReply,\n onDelete,\n onExport,\n onSendToAgent,\n}: CommentThreadProps) {\n const [replyText, setReplyText] = React.useState('')\n const [copied, setCopied] = React.useState(false)\n const [sendStatus, setSendStatus] = React.useState<'idle' | 'sending' | 'sent' | 'offline'>('idle')\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n React.useEffect(() => {\n inputRef.current?.focus()\n }, [])\n\n const handleCopy = async () => {\n const success = await onExport()\n if (success) {\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n }\n\n const handleSendToAgent = async () => {\n if (sendStatus === 'sending') return\n setSendStatus('sending')\n const success = await onSendToAgent()\n if (success) {\n setSendStatus('sent')\n setTimeout(() => setSendStatus('idle'), 2000)\n } else {\n setSendStatus('offline')\n setTimeout(() => setSendStatus('idle'), 2000)\n }\n }\n\n const handleSubmitReply = () => {\n if (replyText.trim()) {\n onAddReply(replyText.trim())\n setReplyText('')\n }\n }\n\n return (\n <div\n data-direct-edit=\"comment-card\"\n className=\"fixed z-[99999] w-[280px] overflow-hidden rounded-lg border border-foreground/10 bg-background shadow-2xl\"\n style={{\n left: flipHorizontal ? position.x - 280 - 8 : position.x + 14,\n top: flipVertical ? position.y - 220 : position.y - 14,\n pointerEvents: 'auto',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-border/50 px-2 py-1.5\">\n <button\n type=\"button\"\n className=\"flex size-6 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n onClick={onClose}\n title=\"Back\"\n >\n <ChevronLeft className=\"size-3.5\" />\n </button>\n <div className=\"flex items-center gap-0.5\">\n <button\n type=\"button\"\n className=\"flex size-6 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n onClick={handleCopy}\n title=\"Copy\"\n >\n {copied ? (\n <Check className=\"size-3.5 text-green-500\" />\n ) : (\n <Copy className=\"size-3.5\" />\n )}\n </button>\n <button\n type=\"button\"\n className=\"flex size-6 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n onClick={handleSendToAgent}\n title=\"Send to Agent\"\n >\n {sendStatus === 'sent' ? (\n <Check className=\"size-3.5 text-green-500\" />\n ) : sendStatus === 'offline' ? (\n <X className=\"size-3.5 text-red-500\" />\n ) : (\n <Send className=\"size-3.5\" />\n )}\n </button>\n <button\n type=\"button\"\n className=\"flex size-6 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n onClick={onDelete}\n title=\"Delete\"\n >\n <Trash2 className=\"size-3.5\" />\n </button>\n </div>\n </div>\n\n {/* Thread body */}\n <div className=\"max-h-48 overflow-y-auto\">\n {/* Original comment */}\n <div className=\"px-3 py-2.5\">\n <div className=\"mb-1.5 flex items-center gap-2\">\n <div className=\"flex size-5 shrink-0 items-center justify-center rounded-full bg-blue-500 text-[10px] font-bold text-white\">\n {index}\n </div>\n <span className=\"text-xs font-medium text-foreground\">Comment #{index}</span>\n <span className=\"text-[10px] text-muted-foreground\">{formatRelativeTime(comment.createdAt)}</span>\n </div>\n <p className=\"text-xs leading-relaxed text-foreground\">{comment.text}</p>\n </div>\n\n {/* Replies */}\n {comment.replies.map((reply, i) => (\n <div key={i} className=\"border-t border-border/30 px-3 py-2.5\">\n <div className=\"mb-1 flex items-center gap-2\">\n <div className=\"flex size-5 shrink-0 items-center justify-center rounded-full bg-blue-500 text-[10px] font-bold text-white\">\n {index}\n </div>\n <span className=\"text-[10px] text-muted-foreground\">{formatRelativeTime(reply.createdAt)}</span>\n </div>\n <p className=\"text-xs leading-relaxed text-foreground\">{reply.text}</p>\n </div>\n ))}\n </div>\n\n {/* Footer */}\n <div className=\"flex items-center gap-1.5 border-t border-border/50 px-2 py-1.5\">\n <input\n ref={inputRef}\n type=\"text\"\n className=\"min-w-0 flex-1 bg-transparent px-1.5 text-xs text-foreground placeholder:text-muted-foreground focus:outline-none\"\n placeholder=\"Reply...\"\n value={replyText}\n onChange={(e) => setReplyText(e.target.value)}\n onKeyDown={(e) => {\n e.stopPropagation()\n if (e.key === 'Enter') {\n handleSubmitReply()\n } else if (e.key === 'Escape') {\n onClose()\n }\n }}\n />\n <button\n type=\"button\"\n className={cn(\n 'flex size-6 shrink-0 items-center justify-center rounded-md transition-colors',\n replyText.trim()\n ? 'bg-blue-500 text-white hover:bg-blue-600'\n : 'bg-muted text-muted-foreground'\n )}\n disabled={!replyText.trim()}\n onClick={handleSubmitReply}\n >\n <ArrowUp className=\"size-3.5\" />\n </button>\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { usePortalContainer } from './portal-container'\nimport { useDirectEdit } from './provider'\nimport { useRulersVisible } from './rulers-overlay'\nimport { cn } from './cn'\nimport { useToolbarDock } from './use-toolbar-dock'\nimport { Popover } from '@base-ui/react/popover'\nimport { MousePointer2, Ruler, Command, ArrowBigUp, MessageSquare, EllipsisVertical, Sun, Moon, Monitor, Option, ClipboardList, X, Check, Copy } from 'lucide-react'\nimport type { ActiveTool, Theme, SessionEdit } from './types'\nimport {\n Tooltip,\n TooltipProvider,\n TooltipTrigger,\n TooltipContent,\n} from './ui/tooltip'\n\nexport interface DirectEditToolbarInnerProps {\n editModeActive: boolean\n onToggleEditMode: () => void\n rulersVisible: boolean\n onToggleRulers: () => void\n activeTool?: ActiveTool\n onSetActiveTool?: (tool: ActiveTool) => void\n theme?: Theme\n onSetTheme?: (theme: Theme) => void\n sessionEditCount?: number\n onGetSessionEdits?: () => SessionEdit[]\n onExportAllEdits?: () => Promise<boolean>\n onClearSessionEdits?: () => void\n onRemoveSessionEdit?: (element: HTMLElement) => void\n className?: string\n}\n\nfunction ThemePopoverPortal(props: React.ComponentPropsWithoutRef<typeof Popover.Portal>) {\n const container = usePortalContainer()\n return <Popover.Portal container={container} {...props} />\n}\n\nfunction EditsPopoverPortal(props: React.ComponentPropsWithoutRef<typeof Popover.Portal>) {\n const container = usePortalContainer()\n return <Popover.Portal container={container} {...props} />\n}\n\nexport function DirectEditToolbarInner({\n editModeActive,\n onToggleEditMode,\n rulersVisible,\n onToggleRulers,\n activeTool = 'select',\n onSetActiveTool,\n theme = 'system',\n onSetTheme,\n sessionEditCount = 0,\n onGetSessionEdits,\n onExportAllEdits,\n onClearSessionEdits,\n onRemoveSessionEdit,\n className,\n}: DirectEditToolbarInnerProps) {\n const container = usePortalContainer()\n const toolbarRef = React.useRef<HTMLDivElement>(null)\n const { dockedEdge, isDragging, isSnapping, style: dockStyle, handlePointerDown, handlePointerMove, handlePointerUp, handlePointerCancel } = useToolbarDock(toolbarRef)\n const isVertical = dockedEdge === 'left' || dockedEdge === 'right'\n const tooltipSide = dockedEdge === 'bottom' ? 'top'\n : dockedEdge === 'top' ? 'bottom'\n : dockedEdge === 'left' ? 'right' : 'left'\n const [isMac, setIsMac] = React.useState(false)\n const [settingsOpen, setSettingsOpen] = React.useState(false)\n const [editsOpen, setEditsOpen] = React.useState(false)\n const [copied, setCopied] = React.useState(false)\n const settingsPopupRef = React.useRef<HTMLDivElement>(null)\n const settingsTriggerRef = React.useRef<HTMLButtonElement>(null)\n const editsPopupRef = React.useRef<HTMLDivElement>(null)\n const editsTriggerRef = React.useRef<HTMLButtonElement>(null)\n const [editsSnapshot, setEditsSnapshot] = React.useState<SessionEdit[]>([])\n\n React.useEffect(() => {\n setIsMac(navigator.platform?.includes('Mac') ?? false)\n }, [])\n\n // Close settings popover on outside click (Shadow DOM breaks base-ui's dismiss)\n React.useEffect(() => {\n if (!settingsOpen) return\n\n function handlePointerDown(e: PointerEvent) {\n const path = e.composedPath()\n if (settingsPopupRef.current && path.includes(settingsPopupRef.current)) return\n if (settingsTriggerRef.current && path.includes(settingsTriggerRef.current)) return\n setSettingsOpen(false)\n }\n\n const raf = requestAnimationFrame(() => {\n document.addEventListener('pointerdown', handlePointerDown)\n })\n\n return () => {\n cancelAnimationFrame(raf)\n document.removeEventListener('pointerdown', handlePointerDown)\n }\n }, [settingsOpen])\n\n // Close edits popover on outside click (Shadow DOM breaks base-ui's dismiss)\n React.useEffect(() => {\n if (!editsOpen) return\n\n function handlePointerDown(e: PointerEvent) {\n const path = e.composedPath()\n if (editsPopupRef.current && path.includes(editsPopupRef.current)) return\n if (editsTriggerRef.current && path.includes(editsTriggerRef.current)) return\n setEditsOpen(false)\n }\n\n const raf = requestAnimationFrame(() => {\n document.addEventListener('pointerdown', handlePointerDown)\n })\n\n return () => {\n cancelAnimationFrame(raf)\n document.removeEventListener('pointerdown', handlePointerDown)\n }\n }, [editsOpen])\n\n // Refresh snapshot when popover opens\n React.useEffect(() => {\n if (editsOpen && onGetSessionEdits) {\n setEditsSnapshot(onGetSessionEdits())\n }\n if (!editsOpen) {\n setCopied(false)\n }\n }, [editsOpen, onGetSessionEdits])\n\n // Close popovers on drag start\n React.useEffect(() => {\n if (!isDragging) return\n setSettingsOpen(false)\n setEditsOpen(false)\n }, [isDragging])\n\n const kbdClass = 'inline-flex items-center justify-center rounded bg-white/20 px-1.5 py-0.5 font-mono text-[10px] min-w-[20px] min-h-[18px]'\n const popupKbdClass = 'inline-flex items-center justify-center rounded bg-muted px-1.5 py-0.5 font-mono text-[10px] text-muted-foreground min-w-[20px] min-h-[18px]'\n\n const shortcutContent = isMac ? (\n <>\n <kbd className={kbdClass}><Command className=\"size-2.5\" /></kbd>\n <kbd className={kbdClass}>.</kbd>\n </>\n ) : (\n <>\n <kbd className={kbdClass}>Ctrl</kbd>\n <kbd className={kbdClass}>.</kbd>\n </>\n )\n\n const toolbar = (\n <>\n <div\n ref={toolbarRef}\n data-direct-edit=\"toolbar\"\n style={{ pointerEvents: 'auto', touchAction: 'none', ...dockStyle }}\n className={cn(\n 'group z-[99999] flex rounded-[14px] border border-foreground/10 bg-background p-1.5 shadow-xl transition-shadow duration-200',\n isVertical ? 'flex-col items-center' : 'flex-row items-center',\n isDragging && 'cursor-grabbing select-none shadow-2xl',\n className\n )}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerCancel}\n onLostPointerCapture={handlePointerCancel}\n >\n {/* Handlebar — slides in on hover or while dragging */}\n <div className={cn(\n 'flex shrink-0 cursor-grab items-center justify-center overflow-hidden transition-[max-width,max-height,padding,opacity] duration-200 ease-out',\n isVertical\n ? (isDragging || isSnapping ? 'max-h-3 pt-0 pb-1.5 opacity-100' : 'max-h-0 py-0 opacity-0 group-hover:max-h-3 group-hover:pt-0 group-hover:pb-1.5 group-hover:opacity-100')\n : (isDragging || isSnapping ? 'max-w-3 pl-0 pr-1.5 opacity-100' : 'max-w-0 px-0 opacity-0 group-hover:max-w-3 group-hover:pl-0 group-hover:pr-1.5 group-hover:opacity-100'),\n isVertical ? 'w-full' : 'h-full'\n )}>\n <div className={cn(\n 'shrink-0 rounded-full bg-foreground/25',\n isVertical ? 'h-0.5 w-4' : 'h-4 w-0.5'\n )} />\n </div>\n\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger\n className={cn(\n 'flex cursor-pointer items-center justify-center rounded-[8px] p-2 transition-colors',\n editModeActive && activeTool !== 'comment'\n ? 'bg-foreground text-background hover:bg-foreground/80'\n : editModeActive && activeTool === 'comment'\n ? 'text-muted-foreground hover:bg-muted hover:text-foreground'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n onPointerDown={(e: React.PointerEvent) => e.stopPropagation()}\n onClick={() => {\n if (editModeActive && activeTool === 'comment') {\n onSetActiveTool?.('select')\n } else {\n onToggleEditMode()\n }\n }}\n >\n <MousePointer2 className=\"size-4\" />\n </TooltipTrigger>\n <TooltipContent side={tooltipSide} className=\"inline-flex items-center gap-1.5\">\n <span>{editModeActive ? 'Select' : 'Activate design mode'}</span>\n {shortcutContent}\n </TooltipContent>\n </Tooltip>\n\n <div\n className={cn(\n 'overflow-hidden transition-[max-width,max-height,margin,opacity] duration-300 ease-out',\n isVertical\n ? (editModeActive ? 'mt-1 max-h-[220px] opacity-100' : 'mt-0 max-h-0 opacity-0')\n : (editModeActive ? 'ml-1 max-w-[200px] opacity-100' : 'ml-0 max-w-0 opacity-0')\n )}\n >\n <div className={cn('flex gap-1', isVertical ? 'flex-col items-center' : 'flex-row items-center')}>\n <Tooltip>\n <TooltipTrigger\n className={cn(\n 'flex cursor-pointer items-center justify-center rounded-[8px] p-2 transition-colors',\n activeTool === 'comment'\n ? 'bg-foreground text-background hover:bg-foreground/80'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n onPointerDown={(e) => e.stopPropagation()}\n onClick={() => onSetActiveTool?.(activeTool === 'comment' ? 'select' : 'comment')}\n >\n <MessageSquare className=\"size-4\" />\n </TooltipTrigger>\n <TooltipContent side={tooltipSide} className=\"inline-flex items-center gap-1.5\">\n <span>{activeTool === 'comment' ? 'Exit comment mode' : 'Comment'}</span>\n <kbd className={kbdClass}><ArrowBigUp className=\"size-3\" /></kbd>\n <kbd className={kbdClass}>C</kbd>\n </TooltipContent>\n </Tooltip>\n\n <Tooltip>\n <TooltipTrigger\n className={cn(\n 'flex cursor-pointer items-center justify-center rounded-[8px] p-2 transition-colors',\n rulersVisible\n ? 'bg-muted text-foreground'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n onPointerDown={(e) => e.stopPropagation()}\n onClick={onToggleRulers}\n >\n <Ruler className=\"size-4\" />\n </TooltipTrigger>\n <TooltipContent side={tooltipSide} className=\"inline-flex items-center gap-1.5\">\n <span>{rulersVisible ? 'Hide rulers' : 'Show rulers'}</span>\n <kbd className={kbdClass}><ArrowBigUp className=\"size-2.5\" /></kbd>\n <kbd className={kbdClass}>R</kbd>\n </TooltipContent>\n </Tooltip>\n\n <div className={cn(\n 'border-foreground/10',\n isVertical ? 'my-0.5 w-5 border-t' : 'mx-0.5 h-5 border-l'\n )} />\n\n <Popover.Root open={editsOpen} onOpenChange={setEditsOpen}>\n <Tooltip>\n <Popover.Trigger ref={editsTriggerRef} render={\n <TooltipTrigger\n className={cn(\n 'flex cursor-pointer items-center justify-center rounded-[8px] p-2 transition-colors',\n sessionEditCount > 0 || editsOpen\n ? 'bg-muted text-foreground'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n onPointerDown={(e: React.PointerEvent) => e.stopPropagation()}\n />\n }>\n <ClipboardList className=\"size-4\" />\n </Popover.Trigger>\n <TooltipContent side={tooltipSide}>\n <span>Session edits</span>\n </TooltipContent>\n </Tooltip>\n <EditsPopoverPortal>\n <Popover.Positioner side={tooltipSide} sideOffset={12} className=\"fixed z-[99999]\" style={{ pointerEvents: 'auto' }}>\n <Popover.Popup ref={editsPopupRef} className=\"w-[280px] rounded-lg border border-foreground/10 bg-background shadow-xl\" onPointerDown={(e: React.PointerEvent) => e.stopPropagation()}>\n <div className=\"flex items-center justify-between px-3 pb-1 pt-2.5\">\n <span className=\"text-xs font-medium text-foreground\">Session edits ({editsSnapshot.length})</span>\n {editsSnapshot.length > 0 && (\n <button\n type=\"button\"\n className=\"text-[11px] text-muted-foreground hover:text-foreground\"\n onClick={() => {\n onClearSessionEdits?.()\n setEditsSnapshot([])\n }}\n >\n Clear all\n </button>\n )}\n </div>\n {editsSnapshot.length === 0 ? (\n <div className=\"px-3 pb-3 pt-1 text-xs text-muted-foreground\">\n No edits yet. Select elements and make changes.\n </div>\n ) : (\n <>\n <div className=\"max-h-[240px] overflow-y-auto px-1 py-1\">\n {editsSnapshot.map((edit, i) => {\n const componentName = edit.locator.reactStack[0]?.name ?? edit.locator.tagName\n const styleCount = Object.keys(edit.pendingStyles).length\n const parts: string[] = []\n if (styleCount > 0) parts.push(`${styleCount} style${styleCount !== 1 ? 's' : ''}`)\n if (edit.move) parts.push('moved')\n return (\n <div\n key={i}\n className=\"group flex items-center justify-between rounded-md px-2 py-1.5 text-xs hover:bg-muted/50\"\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-medium text-foreground\">&lt;{componentName}&gt;</div>\n <div className=\"text-[11px] text-muted-foreground\">{parts.join(', ')}</div>\n </div>\n <button\n type=\"button\"\n className=\"ml-2 flex-shrink-0 rounded p-0.5 text-muted-foreground opacity-0 transition-opacity hover:text-foreground group-hover:opacity-100\"\n onClick={() => {\n onRemoveSessionEdit?.(edit.element)\n setEditsSnapshot((prev) => prev.filter((_, j) => j !== i))\n }}\n >\n <X className=\"size-3\" />\n </button>\n </div>\n )\n })}\n </div>\n <div className=\"border-t border-foreground/10 p-2\">\n <button\n type=\"button\"\n className=\"flex w-full items-center justify-center rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background transition-colors hover:bg-foreground/80\"\n onClick={async () => {\n const success = await onExportAllEdits?.()\n if (success) {\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n }}\n >\n {copied ? (\n <Check className=\"mr-1 size-3 text-green-400\" />\n ) : (\n <Copy className=\"mr-1 size-3\" />\n )}\n {copied ? 'Copied! Paste to AI agent' : 'Copy all edits'}\n </button>\n </div>\n </>\n )}\n </Popover.Popup>\n </Popover.Positioner>\n </EditsPopoverPortal>\n </Popover.Root>\n\n <Popover.Root open={settingsOpen} onOpenChange={setSettingsOpen}>\n <Tooltip>\n <Popover.Trigger ref={settingsTriggerRef} render={\n <TooltipTrigger\n className={cn(\n 'flex cursor-pointer items-center justify-center rounded-[8px] p-2 transition-colors',\n settingsOpen\n ? 'bg-muted text-foreground'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n onPointerDown={(e: React.PointerEvent) => e.stopPropagation()}\n />\n }>\n <EllipsisVertical className=\"size-4\" />\n </Popover.Trigger>\n <TooltipContent side={tooltipSide}>\n <span>More</span>\n </TooltipContent>\n </Tooltip>\n <ThemePopoverPortal>\n <Popover.Positioner side={tooltipSide} sideOffset={12} className=\"fixed z-[99999]\" style={{ pointerEvents: 'auto' }}>\n <Popover.Popup ref={settingsPopupRef} className=\"w-[220px] rounded-lg border border-foreground/10 bg-background p-1 shadow-xl\" onPointerDown={(e: React.PointerEvent) => e.stopPropagation()}>\n <div className=\"px-2.5 pb-1 pt-1.5 text-[10px] font-medium text-foreground\">Theme</div>\n {([\n { value: 'light' as const, label: 'Light', Icon: Sun },\n { value: 'dark' as const, label: 'Dark', Icon: Moon },\n { value: 'system' as const, label: 'System', Icon: Monitor },\n ]).map(({ value, label, Icon }) => (\n <button\n key={value}\n type=\"button\"\n className={cn(\n 'flex w-full items-center gap-2 rounded-md px-2.5 py-1.5 text-xs transition-colors',\n theme === value\n ? 'bg-muted text-foreground'\n : 'text-muted-foreground hover:bg-muted/50 hover:text-foreground'\n )}\n onClick={() => {\n onSetTheme?.(value)\n setSettingsOpen(false)\n }}\n >\n <Icon className=\"size-3.5\" />\n {label}\n </button>\n ))}\n <div className=\"mx-1.5 my-1 border-t border-foreground/10\" />\n <div className=\"px-2.5 pb-1 pt-1.5 text-[10px] font-medium text-foreground\">Keyboard Shortcuts</div>\n {([\n { label: 'Toggle design mode', keys: isMac ? [<Command key=\"cmd\" className=\"size-2.5\" />,'.' ] : ['Ctrl', '.'] },\n { label: 'Undo', keys: isMac ? [<Command key=\"cmd\" className=\"size-2.5\" />, 'Z'] : ['Ctrl', 'Z'] },\n { label: 'Toggle comments', keys: [<ArrowBigUp key=\"shift\" className=\"size-3\" />, 'C'] },\n { label: 'Toggle rulers', keys: [<ArrowBigUp key=\"shift\" className=\"size-3\" />, 'R'] },\n { label: 'Hover to measure', keys: isMac ? ['Hold', <Option key=\"opt\" className=\"size-2.5\" />] : ['Hold', 'Alt'] },\n { label: 'Back / Exit', keys: ['Esc'] },\n ]).map(({ label, keys }) => (\n <div key={label} className=\"flex w-full items-center justify-between rounded-md px-2.5 py-1.5 text-xs text-muted-foreground\">\n <span>{label}</span>\n <span className=\"flex items-center gap-0.5\">\n {keys.map((k, i) => (\n <kbd key={i} className={popupKbdClass}>{k}</kbd>\n ))}\n </span>\n </div>\n ))}\n </Popover.Popup>\n </Popover.Positioner>\n </ThemePopoverPortal>\n </Popover.Root>\n </div>\n </div>\n </TooltipProvider>\n </div>\n </>\n )\n\n if (container) {\n return createPortal(toolbar, container)\n }\n\n return toolbar\n}\n\nfunction DirectEditToolbarContent() {\n const {\n editModeActive, toggleEditMode, activeTool, setActiveTool, theme, setTheme,\n sessionEditCount, getSessionEdits, exportAllEdits, clearSessionEdits, removeSessionEdit,\n } = useDirectEdit()\n const [rulersVisible, toggleRulers] = useRulersVisible()\n\n return (\n <DirectEditToolbarInner\n editModeActive={editModeActive}\n onToggleEditMode={toggleEditMode}\n rulersVisible={rulersVisible}\n onToggleRulers={toggleRulers}\n activeTool={activeTool}\n onSetActiveTool={setActiveTool}\n theme={theme}\n onSetTheme={setTheme}\n sessionEditCount={sessionEditCount}\n onGetSessionEdits={getSessionEdits}\n onExportAllEdits={exportAllEdits}\n onClearSessionEdits={clearSessionEdits}\n onRemoveSessionEdit={removeSessionEdit}\n />\n )\n}\n\nexport function DirectEditToolbar() {\n const [mounted, setMounted] = React.useState(false)\n\n React.useEffect(() => {\n setMounted(true)\n }, [])\n\n if (!mounted) {\n return null\n }\n\n return <DirectEditToolbarContent />\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { usePortalContainer } from './portal-container'\nimport { useDirectEdit } from './hooks'\nimport { useGuidelines } from './use-guidelines'\nimport type { Guideline } from './types'\n\nconst RULER_SIZE = 20\nconst GUIDELINE_COLOR = '#FF6B6B'\nconst HIT_ZONE = 9\n\nfunction useRulerColors() {\n const [dark, setDark] = React.useState(false)\n\n React.useEffect(() => {\n const mq = window.matchMedia('(prefers-color-scheme: dark)')\n setDark(mq.matches)\n const handler = (e: MediaQueryListEvent) => setDark(e.matches)\n mq.addEventListener('change', handler)\n return () => mq.removeEventListener('change', handler)\n }, [])\n\n return dark\n ? {\n bg: 'rgba(23, 23, 23, 0.95)',\n border: 'rgba(255, 255, 255, 0.1)',\n tick: 'rgba(255, 255, 255, 0.3)',\n label: 'rgba(255, 255, 255, 0.5)',\n }\n : {\n bg: 'rgba(245, 245, 245, 0.95)',\n border: 'rgba(0, 0, 0, 0.1)',\n tick: 'rgba(0, 0, 0, 0.3)',\n label: 'rgba(0, 0, 0, 0.5)',\n }\n}\n\nconst rulerFont: React.CSSProperties = {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n fontSize: '9px',\n fontVariantNumeric: 'tabular-nums',\n}\n\n// --- HorizontalRuler ---\n\nfunction HorizontalRuler({\n scrollOffset,\n onPointerDown,\n}: {\n scrollOffset: { x: number; y: number }\n onPointerDown: (e: React.PointerEvent) => void\n}) {\n const canvasRef = React.useRef<HTMLCanvasElement>(null)\n const viewportWidth = useViewportWidth()\n const colors = useRulerColors()\n\n React.useEffect(() => {\n const canvas = canvasRef.current\n if (!canvas) return\n const dpr = window.devicePixelRatio || 1\n const width = Math.max(0, viewportWidth - RULER_SIZE)\n const height = RULER_SIZE\n\n canvas.width = width * dpr\n canvas.height = height * dpr\n canvas.style.width = `${width}px`\n canvas.style.height = `${height}px`\n\n if (width === 0) return\n\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n ctx.scale(dpr, dpr)\n ctx.clearRect(0, 0, width, height)\n\n const startPx = Math.floor(scrollOffset.x / 10) * 10\n const endPx = scrollOffset.x + width\n\n for (let px = startPx; px <= endPx; px += 10) {\n const x = px - scrollOffset.x\n const isMajor = px % 100 === 0\n const isMid = px % 50 === 0\n\n ctx.beginPath()\n ctx.moveTo(x, height)\n ctx.lineTo(x, height - (isMajor ? 10 : isMid ? 7 : 4))\n ctx.strokeStyle = colors.tick\n ctx.lineWidth = 1\n ctx.stroke()\n\n if (isMajor && px !== 0) {\n ctx.fillStyle = colors.label\n ctx.font = '9px system-ui, -apple-system, sans-serif'\n ctx.textAlign = 'center'\n ctx.fillText(String(px), x, 9)\n }\n }\n }, [scrollOffset.x, viewportWidth, colors])\n\n return (\n <div\n data-direct-edit=\"ruler-horizontal\"\n style={{\n position: 'fixed',\n top: 0,\n left: RULER_SIZE,\n right: 0,\n height: RULER_SIZE,\n background: colors.bg,\n borderBottom: `1px solid ${colors.border}`,\n zIndex: 99994,\n cursor: 's-resize',\n pointerEvents: 'auto',\n overflow: 'hidden',\n }}\n onPointerDown={onPointerDown}\n >\n <canvas ref={canvasRef} style={{ display: 'block' }} />\n </div>\n )\n}\n\n// --- VerticalRuler ---\n\nfunction VerticalRuler({\n scrollOffset,\n onPointerDown,\n}: {\n scrollOffset: { x: number; y: number }\n onPointerDown: (e: React.PointerEvent) => void\n}) {\n const canvasRef = React.useRef<HTMLCanvasElement>(null)\n const viewportHeight = useViewportHeight()\n const colors = useRulerColors()\n\n React.useEffect(() => {\n const canvas = canvasRef.current\n if (!canvas) return\n const dpr = window.devicePixelRatio || 1\n const width = RULER_SIZE\n const height = Math.max(0, viewportHeight - RULER_SIZE)\n\n canvas.width = width * dpr\n canvas.height = height * dpr\n canvas.style.width = `${width}px`\n canvas.style.height = `${height}px`\n\n if (height === 0) return\n\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n ctx.scale(dpr, dpr)\n ctx.clearRect(0, 0, width, height)\n\n const startPx = Math.floor(scrollOffset.y / 10) * 10\n const endPx = scrollOffset.y + height\n\n for (let px = startPx; px <= endPx; px += 10) {\n const y = px - scrollOffset.y\n const isMajor = px % 100 === 0\n const isMid = px % 50 === 0\n\n ctx.beginPath()\n ctx.moveTo(width, y)\n ctx.lineTo(width - (isMajor ? 10 : isMid ? 7 : 4), y)\n ctx.strokeStyle = colors.tick\n ctx.lineWidth = 1\n ctx.stroke()\n\n if (isMajor && px !== 0) {\n ctx.save()\n ctx.fillStyle = colors.label\n ctx.font = '9px system-ui, -apple-system, sans-serif'\n ctx.textAlign = 'center'\n ctx.translate(9, y)\n ctx.rotate(-Math.PI / 2)\n ctx.fillText(String(px), 0, 0)\n ctx.restore()\n }\n }\n }, [scrollOffset.y, viewportHeight, colors])\n\n return (\n <div\n data-direct-edit=\"ruler-vertical\"\n style={{\n position: 'fixed',\n top: RULER_SIZE,\n left: 0,\n bottom: 0,\n width: RULER_SIZE,\n background: colors.bg,\n borderRight: `1px solid ${colors.border}`,\n zIndex: 99994,\n cursor: 'e-resize',\n pointerEvents: 'auto',\n overflow: 'hidden',\n }}\n onPointerDown={onPointerDown}\n >\n <canvas ref={canvasRef} style={{ display: 'block' }} />\n </div>\n )\n}\n\n// --- CornerSquare ---\n\nfunction CornerSquare() {\n const colors = useRulerColors()\n return (\n <div\n data-direct-edit=\"ruler-corner\"\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n width: RULER_SIZE,\n height: RULER_SIZE,\n background: colors.bg,\n borderRight: `1px solid ${colors.border}`,\n borderBottom: `1px solid ${colors.border}`,\n zIndex: 99994,\n pointerEvents: 'auto',\n }}\n />\n )\n}\n\n// --- GuidelineLine ---\n\nfunction GuidelineLine({\n guideline,\n scrollOffset,\n isActive,\n dragPosition,\n onStartDrag,\n onDelete,\n}: {\n guideline: Guideline\n scrollOffset: { x: number; y: number }\n isActive: boolean\n dragPosition: number | null\n onStartDrag: (id: string) => void\n onDelete: (id: string) => void\n}) {\n const isHorizontal = guideline.orientation === 'horizontal'\n const scrollPos = isHorizontal ? scrollOffset.y : scrollOffset.x\n const viewportPos = guideline.position - scrollPos\n\n const handlePointerDown = (e: React.PointerEvent) => {\n e.preventDefault()\n e.stopPropagation()\n onStartDrag(guideline.id)\n }\n\n const handleDoubleClick = (e: React.MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n onDelete(guideline.id)\n }\n\n const displayPos = isActive && dragPosition !== null ? dragPosition : viewportPos\n\n if (isHorizontal) {\n return (\n <>\n {/* Visible line */}\n <div\n data-direct-edit=\"guideline\"\n style={{\n position: 'fixed',\n top: displayPos,\n left: 0,\n right: 0,\n height: 1,\n background: GUIDELINE_COLOR,\n zIndex: 99993,\n pointerEvents: 'none',\n }}\n />\n {/* Hit zone */}\n <div\n style={{\n position: 'fixed',\n top: displayPos - Math.floor(HIT_ZONE / 2),\n left: RULER_SIZE,\n right: 0,\n height: HIT_ZONE,\n zIndex: 99993,\n cursor: 'ns-resize',\n pointerEvents: 'auto',\n }}\n onPointerDown={handlePointerDown}\n onDoubleClick={handleDoubleClick}\n />\n {/* Position label during drag */}\n {isActive && (\n <div\n style={{\n position: 'fixed',\n top: displayPos + 4,\n left: RULER_SIZE + 4,\n background: GUIDELINE_COLOR,\n color: '#fff',\n padding: '1px 4px',\n borderRadius: 2,\n zIndex: 99995,\n pointerEvents: 'none',\n ...rulerFont,\n }}\n >\n {Math.round(guideline.position)}\n </div>\n )}\n </>\n )\n }\n\n // Vertical guideline\n return (\n <>\n <div\n data-direct-edit=\"guideline\"\n style={{\n position: 'fixed',\n left: displayPos,\n top: 0,\n bottom: 0,\n width: 1,\n background: GUIDELINE_COLOR,\n zIndex: 99993,\n pointerEvents: 'none',\n }}\n />\n <div\n style={{\n position: 'fixed',\n left: displayPos - Math.floor(HIT_ZONE / 2),\n top: RULER_SIZE,\n bottom: 0,\n width: HIT_ZONE,\n zIndex: 99993,\n cursor: 'ew-resize',\n pointerEvents: 'auto',\n }}\n onPointerDown={handlePointerDown}\n onDoubleClick={handleDoubleClick}\n />\n {isActive && (\n <div\n style={{\n position: 'fixed',\n left: displayPos + 4,\n top: RULER_SIZE + 4,\n background: GUIDELINE_COLOR,\n color: '#fff',\n padding: '1px 4px',\n borderRadius: 2,\n zIndex: 99995,\n pointerEvents: 'none',\n ...rulerFont,\n }}\n >\n {Math.round(guideline.position)}\n </div>\n )}\n </>\n )\n}\n\n// --- Viewport size hooks ---\n\nfunction useViewportWidth() {\n const [width, setWidth] = React.useState(0)\n React.useEffect(() => {\n setWidth(window.innerWidth)\n const onResize = () => setWidth(window.innerWidth)\n window.addEventListener('resize', onResize)\n return () => window.removeEventListener('resize', onResize)\n }, [])\n return width\n}\n\nfunction useViewportHeight() {\n const [height, setHeight] = React.useState(0)\n React.useEffect(() => {\n setHeight(window.innerHeight)\n const onResize = () => setHeight(window.innerHeight)\n window.addEventListener('resize', onResize)\n return () => window.removeEventListener('resize', onResize)\n }, [])\n return height\n}\n\n// --- Public Components ---\n\nexport function RulersOverlay({ enabled }: { enabled: boolean }) {\n const container = usePortalContainer()\n\n const hostElement = React.useMemo(() => {\n if (!container) return null\n const root = container.getRootNode()\n if (root instanceof ShadowRoot) return root.host as HTMLElement\n return null\n }, [container])\n\n const {\n guidelines,\n activeGuideline,\n dragPosition,\n scrollOffset,\n startCreate,\n startDrag,\n deleteGuideline,\n } = useGuidelines(enabled, hostElement)\n\n if (!enabled || !container) return null\n\n const handleHorizontalPointerDown = (e: React.PointerEvent) => {\n e.preventDefault()\n startCreate('horizontal', e.clientY)\n }\n\n const handleVerticalPointerDown = (e: React.PointerEvent) => {\n e.preventDefault()\n startCreate('vertical', e.clientX)\n }\n\n return createPortal(\n <>\n <CornerSquare />\n <HorizontalRuler scrollOffset={scrollOffset} onPointerDown={handleHorizontalPointerDown} />\n <VerticalRuler scrollOffset={scrollOffset} onPointerDown={handleVerticalPointerDown} />\n {guidelines.map((g) => (\n <GuidelineLine\n key={g.id}\n guideline={g}\n scrollOffset={scrollOffset}\n isActive={activeGuideline?.id === g.id}\n dragPosition={activeGuideline?.id === g.id ? dragPosition : null}\n onStartDrag={startDrag}\n onDelete={deleteGuideline}\n />\n ))}\n </>,\n container,\n )\n}\n\nconst RULERS_VISIBLE_KEY = 'direct-edit-rulers-visible'\nconst RULERS_TOGGLE_EVENT = 'direct-edit-rulers-toggle'\n\nexport function useRulersVisible(): [boolean, () => void] {\n const [visible, setVisible] = React.useState(true)\n\n React.useEffect(() => {\n try {\n if (localStorage.getItem(RULERS_VISIBLE_KEY) === 'false') setVisible(false)\n } catch { /* ignore */ }\n }, [])\n\n React.useEffect(() => {\n function handler(e: Event) {\n setVisible((e as CustomEvent<boolean>).detail)\n }\n window.addEventListener(RULERS_TOGGLE_EVENT, handler)\n return () => window.removeEventListener(RULERS_TOGGLE_EVENT, handler)\n }, [])\n\n const toggle = React.useCallback(() => {\n setVisible((prev) => {\n const next = !prev\n try { localStorage.setItem(RULERS_VISIBLE_KEY, String(next)) } catch {}\n window.dispatchEvent(new CustomEvent(RULERS_TOGGLE_EVENT, { detail: next }))\n return next\n })\n }, [])\n\n return [visible, toggle]\n}\n\nexport function Rulers() {\n const { editModeActive } = useDirectEdit()\n const [rulersVisible, toggleRulers] = useRulersVisible()\n\n React.useEffect(() => {\n if (!editModeActive) return\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.shiftKey && e.key === 'R' && !e.metaKey && !e.ctrlKey && !e.altKey) {\n const active = document.activeElement\n const isInput = active instanceof HTMLInputElement || active instanceof HTMLTextAreaElement || (active instanceof HTMLElement && active.isContentEditable)\n if (isInput) return\n e.preventDefault()\n toggleRulers()\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [editModeActive, toggleRulers])\n\n return <RulersOverlay enabled={editModeActive && rulersVisible} />\n}\n","import * as React from 'react'\n\nexport type DockedEdge = 'top' | 'bottom' | 'left' | 'right'\n\nconst STORAGE_KEY = 'direct-edit-toolbar-dock'\nconst EDGE_MARGIN = 16\nconst DRAG_THRESHOLD = 3\n\nfunction getInitialEdge(): DockedEdge {\n if (typeof window === 'undefined') return 'bottom'\n try {\n const stored = localStorage.getItem(STORAGE_KEY)\n if (stored === 'top' || stored === 'bottom' || stored === 'left' || stored === 'right') {\n return stored\n }\n } catch {}\n return 'bottom'\n}\n\nfunction getDockedPosition(edge: DockedEdge, width: number, height: number) {\n const vw = window.innerWidth\n const vh = window.innerHeight\n\n switch (edge) {\n case 'bottom':\n return { x: (vw - width) / 2, y: vh - height - EDGE_MARGIN }\n case 'top':\n return { x: (vw - width) / 2, y: EDGE_MARGIN }\n case 'left':\n return { x: EDGE_MARGIN, y: (vh - height) / 2 }\n case 'right':\n return { x: vw - width - EDGE_MARGIN, y: (vh - height) / 2 }\n }\n}\n\nfunction getNearestEdge(centerX: number, centerY: number): DockedEdge {\n const vw = window.innerWidth\n const vh = window.innerHeight\n\n const distances: Record<DockedEdge, number> = {\n top: centerY,\n bottom: vh - centerY,\n left: centerX,\n right: vw - centerX,\n }\n\n let nearest: DockedEdge = 'bottom'\n let min = Infinity\n for (const [edge, dist] of Object.entries(distances) as [DockedEdge, number][]) {\n if (dist < min) {\n min = dist\n nearest = edge\n }\n }\n return nearest\n}\n\ntype Phase = 'docked' | 'dragging' | 'snapping'\n\nexport function useToolbarDock(toolbarRef: React.RefObject<HTMLDivElement | null>) {\n const [dockedEdge, setDockedEdge] = React.useState<DockedEdge>(getInitialEdge)\n const [phase, setPhase] = React.useState<Phase>('docked')\n const [dragPosition, setDragPosition] = React.useState<{ x: number; y: number } | null>(null)\n\n const dragOffsetRef = React.useRef({ x: 0, y: 0 })\n const pointerStartRef = React.useRef({ x: 0, y: 0 })\n const pendingDragRef = React.useRef(false)\n const capturedElementRef = React.useRef<HTMLElement | null>(null)\n const snapTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // Compute docked position based on current edge and toolbar size\n const getDockedPos = React.useCallback(() => {\n const el = toolbarRef.current\n if (!el) return { x: 0, y: 0 }\n const rect = el.getBoundingClientRect()\n return getDockedPosition(dockedEdge, rect.width, rect.height)\n }, [dockedEdge, toolbarRef])\n\n // Docked pixel position (recalculated on edge change / resize)\n const [dockedPos, setDockedPos] = React.useState<{ x: number; y: number }>({ x: 0, y: 0 })\n const [ready, setReady] = React.useState(false)\n\n // Initialize docked position once toolbar mounts\n React.useEffect(() => {\n const el = toolbarRef.current\n if (!el) return\n // Wait one frame so the element has layout\n const raf = requestAnimationFrame(() => {\n setDockedPos(getDockedPos())\n setReady(true)\n })\n return () => cancelAnimationFrame(raf)\n }, [getDockedPos, toolbarRef])\n\n // Resize observer + window resize to recalculate docked position\n React.useEffect(() => {\n const el = toolbarRef.current\n if (!el) return\n\n function recalc() {\n const rect = el!.getBoundingClientRect()\n setDockedPos(getDockedPosition(dockedEdge, rect.width, rect.height))\n }\n\n const ro = new ResizeObserver(recalc)\n ro.observe(el)\n window.addEventListener('resize', recalc)\n\n return () => {\n ro.disconnect()\n window.removeEventListener('resize', recalc)\n }\n }, [dockedEdge, toolbarRef])\n\n const handlePointerDown = React.useCallback((e: React.PointerEvent) => {\n const el = toolbarRef.current\n if (!el) return\n\n const rect = el.getBoundingClientRect()\n dragOffsetRef.current = { x: e.clientX - rect.left, y: e.clientY - rect.top }\n pointerStartRef.current = { x: e.clientX, y: e.clientY }\n pendingDragRef.current = true\n capturedElementRef.current = e.currentTarget as HTMLElement\n capturedElementRef.current.setPointerCapture(e.pointerId)\n }, [toolbarRef])\n\n const handlePointerMove = React.useCallback((e: React.PointerEvent) => {\n if (!pendingDragRef.current && phase !== 'dragging') return\n\n const dx = e.clientX - pointerStartRef.current.x\n const dy = e.clientY - pointerStartRef.current.y\n\n // Threshold check\n if (pendingDragRef.current) {\n if (Math.sqrt(dx * dx + dy * dy) < DRAG_THRESHOLD) return\n if (snapTimerRef.current) {\n clearTimeout(snapTimerRef.current)\n snapTimerRef.current = null\n }\n pendingDragRef.current = false\n setPhase('dragging')\n }\n\n const newX = Math.max(0, e.clientX - dragOffsetRef.current.x)\n const newY = Math.max(0, e.clientY - dragOffsetRef.current.y)\n setDragPosition({ x: newX, y: newY })\n }, [phase])\n\n const handlePointerUp = React.useCallback((e: React.PointerEvent) => {\n if (capturedElementRef.current) {\n capturedElementRef.current.releasePointerCapture(e.pointerId)\n capturedElementRef.current = null\n }\n\n if (pendingDragRef.current) {\n // Never exceeded threshold — treat as click\n pendingDragRef.current = false\n return\n }\n\n if (phase !== 'dragging') return\n\n const el = toolbarRef.current\n if (!el) {\n setPhase('docked')\n setDragPosition(null)\n return\n }\n\n const rect = el.getBoundingClientRect()\n const centerX = rect.left + rect.width / 2\n const centerY = rect.top + rect.height / 2\n const newEdge = getNearestEdge(centerX, centerY)\n\n setDockedEdge(newEdge)\n try {\n localStorage.setItem(STORAGE_KEY, newEdge)\n } catch {}\n\n // Compute new docked position using the new edge\n const newPos = getDockedPosition(newEdge, rect.width, rect.height)\n setDockedPos(newPos)\n setPhase('snapping')\n setDragPosition(null)\n\n // After snap animation, settle to docked phase\n if (snapTimerRef.current) clearTimeout(snapTimerRef.current)\n snapTimerRef.current = setTimeout(() => {\n snapTimerRef.current = null\n setPhase('docked')\n }, 350)\n }, [phase, toolbarRef])\n\n const handlePointerCancel = React.useCallback((e: React.PointerEvent) => {\n if (capturedElementRef.current) {\n try {\n capturedElementRef.current.releasePointerCapture(e.pointerId)\n } catch {}\n capturedElementRef.current = null\n }\n pendingDragRef.current = false\n if (phase === 'dragging') {\n setPhase('docked')\n setDragPosition(null)\n }\n }, [phase])\n\n // Clean up snap timer on unmount\n React.useEffect(() => {\n return () => {\n if (snapTimerRef.current) clearTimeout(snapTimerRef.current)\n }\n }, [])\n\n const isDragging = phase === 'dragging'\n const isSnapping = phase === 'snapping'\n\n const style = React.useMemo((): React.CSSProperties => {\n const base: React.CSSProperties = {\n position: 'fixed',\n ...(!ready && { visibility: 'hidden' as const }),\n }\n\n if (phase === 'dragging' && dragPosition) {\n return {\n ...base,\n left: dragPosition.x,\n top: dragPosition.y,\n transform: 'rotate(1.5deg) scale(1.04)',\n transition: 'transform 150ms ease-out, box-shadow 150ms ease-out',\n willChange: 'left, top, transform',\n }\n }\n\n if (phase === 'snapping') {\n const snap = '300ms cubic-bezier(0.34, 1.56, 0.64, 1)'\n return {\n ...base,\n left: dockedPos.x,\n top: dockedPos.y,\n transition: `left ${snap}, top ${snap}, transform 150ms ease-out, box-shadow 150ms ease-out`,\n }\n }\n\n // docked\n return {\n ...base,\n left: dockedPos.x,\n top: dockedPos.y,\n }\n }, [phase, dragPosition, dockedPos, ready])\n\n return {\n dockedEdge,\n isDragging,\n isSnapping,\n style,\n handlePointerDown,\n handlePointerMove,\n handlePointerUp,\n handlePointerCancel,\n }\n}\n","import { DirectEditProvider } from './provider'\nimport { DirectEditPanel } from './panel'\nimport { DirectEditToolbar } from './toolbar'\nimport { Rulers } from './rulers-overlay'\n\nexport function DirectEdit() {\n return (\n <DirectEditProvider>\n <DirectEditPanel />\n <DirectEditToolbar />\n <Rulers />\n </DirectEditProvider>\n )\n}\n","'use client'\n\nimport * as React from 'react'\nimport { DirectEditPanelInner } from './panel'\nimport { DirectEditToolbarInner } from './toolbar'\nimport { buildEditExport, stylesToTailwind, colorPropertyToCSSMap, borderPropertyToCSSMap } from './utils'\nimport { formatColorValue } from './ui/color-utils'\nimport type { SpacingPropertyKey, BorderRadiusPropertyKey, BorderPropertyKey, BorderProperties, SizingPropertyKey, ColorPropertyKey, ColorValue, TypographyPropertyKey, CSSPropertyValue, SizingValue, TypographyProperties, ElementLocator } from './types'\n\nfunction createValue(num: number, unit: 'px' | 'rem' | '%' | 'em' | '' = 'px'): CSSPropertyValue {\n return { numericValue: num, unit, raw: `${num}${unit}` }\n}\n\nfunction camelToKebab(str: string): string {\n return str.replace(/([A-Z])/g, '-$1').toLowerCase()\n}\n\nconst ELEMENT_INFO = {\n tagName: 'div',\n id: 'demo-element',\n classList: ['flex', 'shrink-0', 'items-center', 'gap-4', 'p-4', 'rounded-lg', 'border', 'bg-background'],\n isFlexContainer: true,\n isFlexItem: true,\n isTextElement: true,\n parentElement: null as HTMLElement | null,\n hasChildren: true,\n}\n\nconst DEMO_LOCATOR: ElementLocator = {\n reactStack: [{ name: 'DirectEditDemo' }],\n domSelector: '#demo-element',\n domContextHtml: '<div id=\"demo-element\" data-direct-edit-target=\"true\"></div>',\n targetHtml: '<div id=\"demo-element\"></div>',\n textPreview: 'Demo element',\n tagName: ELEMENT_INFO.tagName,\n id: ELEMENT_INFO.id,\n classList: ELEMENT_INFO.classList,\n}\n\nexport function DirectEditDemo() {\n const [spacing, setSpacing] = React.useState({\n paddingTop: createValue(16),\n paddingRight: createValue(16),\n paddingBottom: createValue(16),\n paddingLeft: createValue(16),\n marginTop: createValue(0),\n marginRight: createValue(0),\n marginBottom: createValue(0),\n marginLeft: createValue(0),\n gap: createValue(16),\n })\n\n const [borderRadius, setBorderRadius] = React.useState({\n borderTopLeftRadius: createValue(8),\n borderTopRightRadius: createValue(8),\n borderBottomRightRadius: createValue(8),\n borderBottomLeftRadius: createValue(8),\n })\n\n const [border, setBorder] = React.useState<BorderProperties>({\n borderTopStyle: 'solid',\n borderTopWidth: createValue(1),\n borderRightStyle: 'solid',\n borderRightWidth: createValue(1),\n borderBottomStyle: 'solid',\n borderBottomWidth: createValue(1),\n borderLeftStyle: 'solid',\n borderLeftWidth: createValue(1),\n })\n\n const [flex, setFlex] = React.useState({\n display: 'flex',\n flexDirection: 'row' as const,\n justifyContent: 'flex-start',\n alignItems: 'center',\n })\n\n const [sizing, setSizing] = React.useState({\n width: { mode: 'fit' as const, value: createValue(300) },\n height: { mode: 'fit' as const, value: createValue(100) },\n })\n\n const [color, setColor] = React.useState({\n backgroundColor: { hex: 'FFFFFF', alpha: 100, raw: 'rgb(255, 255, 255)' } as ColorValue,\n color: { hex: '000000', alpha: 100, raw: 'rgb(0, 0, 0)' } as ColorValue,\n borderColor: { hex: 'DDDDDD', alpha: 100, raw: 'rgb(221, 221, 221)' } as ColorValue,\n outlineColor: { hex: '000000', alpha: 0, raw: 'transparent' } as ColorValue,\n })\n\n const [typography, setTypography] = React.useState<TypographyProperties>({\n fontFamily: 'system-ui, sans-serif',\n fontWeight: '400',\n fontSize: createValue(16),\n lineHeight: createValue(24),\n letterSpacing: createValue(0, 'em'),\n textAlign: 'left',\n textVerticalAlign: 'flex-start',\n })\n\n const [pendingStyles, setPendingStyles] = React.useState<Record<string, string>>({})\n const [editModeActive, setEditModeActive] = React.useState(false)\n\n const handleUpdateSpacing = (key: SpacingPropertyKey, value: CSSPropertyValue) => {\n setSpacing((prev) => ({ ...prev, [key]: value }))\n setPendingStyles((prev) => ({ ...prev, [camelToKebab(key)]: value.raw }))\n }\n\n const handleUpdateBorderRadius = (key: BorderRadiusPropertyKey, value: CSSPropertyValue) => {\n setBorderRadius((prev) => ({ ...prev, [key]: value }))\n setPendingStyles((prev) => ({ ...prev, [camelToKebab(key)]: value.raw }))\n }\n\n const handleUpdateBorder = (key: BorderPropertyKey, value: BorderProperties[BorderPropertyKey]) => {\n setBorder((prev) => ({ ...prev, [key]: value }))\n const cssProperty = borderPropertyToCSSMap[key]\n const cssValue = typeof value === 'string' ? value : value.raw\n setPendingStyles((prev) => ({ ...prev, [cssProperty]: cssValue }))\n }\n\n const handleBatchUpdateBorder = (changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]>) => {\n for (const [key, value] of changes) {\n handleUpdateBorder(key, value)\n }\n }\n\n const handleUpdateFlex = (key: 'flexDirection' | 'justifyContent' | 'alignItems', value: string) => {\n setFlex((prev) => ({ ...prev, [key]: value }))\n setPendingStyles((prev) => ({ ...prev, [camelToKebab(key)]: value }))\n }\n\n const handleUpdateSizing = (key: SizingPropertyKey, value: SizingValue) => {\n setSizing((prev) => ({ ...prev, [key]: value }))\n const cssValue = value.mode === 'fill' ? '100%' : value.mode === 'fit' ? 'fit-content' : value.value.raw\n setPendingStyles((prev) => ({ ...prev, [key]: cssValue }))\n }\n\n const handleUpdateColor = (key: ColorPropertyKey, value: ColorValue) => {\n setColor((prev) => ({ ...prev, [key]: value }))\n const cssProperty = colorPropertyToCSSMap[key]\n setPendingStyles((prev) => ({ ...prev, [cssProperty]: formatColorValue(value) }))\n }\n\n const handleUpdateTypography = (key: TypographyPropertyKey, value: CSSPropertyValue | string) => {\n setTypography((prev) => ({ ...prev, [key]: value }))\n const cssValue = typeof value === 'string' ? value : value.raw\n setPendingStyles((prev) => ({ ...prev, [camelToKebab(key)]: cssValue }))\n }\n\n const handleReset = () => {\n setSpacing({\n paddingTop: createValue(16),\n paddingRight: createValue(16),\n paddingBottom: createValue(16),\n paddingLeft: createValue(16),\n marginTop: createValue(0),\n marginRight: createValue(0),\n marginBottom: createValue(0),\n marginLeft: createValue(0),\n gap: createValue(16),\n })\n setBorderRadius({\n borderTopLeftRadius: createValue(8),\n borderTopRightRadius: createValue(8),\n borderBottomRightRadius: createValue(8),\n borderBottomLeftRadius: createValue(8),\n })\n setBorder({\n borderTopStyle: 'solid',\n borderTopWidth: createValue(1),\n borderRightStyle: 'solid',\n borderRightWidth: createValue(1),\n borderBottomStyle: 'solid',\n borderBottomWidth: createValue(1),\n borderLeftStyle: 'solid',\n borderLeftWidth: createValue(1),\n })\n setFlex({\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'flex-start',\n alignItems: 'center',\n })\n setSizing({\n width: { mode: 'fit', value: createValue(300) },\n height: { mode: 'fit', value: createValue(100) },\n })\n setColor({\n backgroundColor: { hex: 'FFFFFF', alpha: 100, raw: 'rgb(255, 255, 255)' },\n color: { hex: '000000', alpha: 100, raw: 'rgb(0, 0, 0)' },\n borderColor: { hex: 'DDDDDD', alpha: 100, raw: 'rgb(221, 221, 221)' },\n outlineColor: { hex: '000000', alpha: 0, raw: 'transparent' },\n })\n setTypography({\n fontFamily: 'system-ui, sans-serif',\n fontWeight: '400',\n fontSize: createValue(16),\n lineHeight: createValue(24),\n letterSpacing: createValue(0, 'em'),\n textAlign: 'left',\n textVerticalAlign: 'flex-start',\n })\n setPendingStyles({})\n }\n\n const handleExportEdits = async () => {\n if (Object.keys(pendingStyles).length === 0) return false\n const exportMarkdown = buildEditExport(DEMO_LOCATOR, pendingStyles)\n try {\n await navigator.clipboard.writeText(exportMarkdown)\n return true\n } catch {\n return false\n }\n }\n\n return (\n <div className=\"min-h-screen p-8\">\n <div className=\"mx-auto max-w-4xl\">\n <h1 className=\"mb-2 text-2xl font-bold\">Direct Edit Panel</h1>\n <p className=\"mb-8 text-muted-foreground\">\n Interactive showcase of the visual editing panel UI with mock data.\n </p>\n\n <div className=\"mb-8 flex justify-center\">\n <DirectEditToolbarInner\n editModeActive={editModeActive}\n onToggleEditMode={() => setEditModeActive(!editModeActive)}\n rulersVisible={true}\n onToggleRulers={() => {}}\n />\n </div>\n\n <div className=\"grid gap-8 lg:grid-cols-[300px_1fr]\">\n <DirectEditPanelInner\n elementInfo={ELEMENT_INFO}\n computedSpacing={spacing}\n computedBorderRadius={borderRadius}\n computedBorder={border}\n computedFlex={flex}\n computedSizing={sizing}\n computedColor={color}\n computedTypography={typography}\n pendingStyles={pendingStyles}\n onSelectParent={() => {}}\n onUpdateSpacing={handleUpdateSpacing}\n onUpdateBorderRadius={handleUpdateBorderRadius}\n onUpdateBorder={handleUpdateBorder}\n onBatchUpdateBorder={handleBatchUpdateBorder}\n onUpdateFlex={handleUpdateFlex}\n onToggleFlex={() => {}}\n onUpdateSizing={handleUpdateSizing}\n onUpdateColor={handleUpdateColor}\n onUpdateTypography={handleUpdateTypography}\n onReset={handleReset}\n onExportEdits={handleExportEdits}\n onSendToAgent={async () => false}\n />\n\n <div className=\"space-y-6\">\n <div>\n <h2 className=\"mb-3 text-sm font-medium\">Live Preview</h2>\n <div\n className=\"bg-background border flex\"\n style={{\n padding: `${spacing.paddingTop.raw} ${spacing.paddingRight.raw} ${spacing.paddingBottom.raw} ${spacing.paddingLeft.raw}`,\n borderRadius: `${borderRadius.borderTopLeftRadius.raw} ${borderRadius.borderTopRightRadius.raw} ${borderRadius.borderBottomRightRadius.raw} ${borderRadius.borderBottomLeftRadius.raw}`,\n borderTopStyle: border.borderTopStyle,\n borderTopWidth: border.borderTopWidth.raw,\n borderRightStyle: border.borderRightStyle,\n borderRightWidth: border.borderRightWidth.raw,\n borderBottomStyle: border.borderBottomStyle,\n borderBottomWidth: border.borderBottomWidth.raw,\n borderLeftStyle: border.borderLeftStyle,\n borderLeftWidth: border.borderLeftWidth.raw,\n borderColor: `#${color.borderColor.hex}`,\n gap: spacing.gap.raw,\n flexDirection: flex.flexDirection,\n justifyContent: flex.justifyContent,\n alignItems: flex.alignItems,\n }}\n >\n <div className=\"size-12 rounded bg-blue-500/20 border border-blue-500/30\" />\n <div className=\"size-12 rounded bg-green-500/20 border border-green-500/30\" />\n <div className=\"size-12 rounded bg-purple-500/20 border border-purple-500/30\" />\n </div>\n </div>\n\n <div>\n <h2 className=\"mb-3 text-sm font-medium\">Pending Styles</h2>\n <pre className=\"rounded-lg border bg-background p-4 text-xs min-h-[60px]\">\n {Object.keys(pendingStyles).length > 0\n ? JSON.stringify(pendingStyles, null, 2)\n : '// Make changes to see pending styles'}\n </pre>\n </div>\n\n <div>\n <h2 className=\"mb-3 text-sm font-medium\">Tailwind Classes</h2>\n <code className=\"block rounded-lg border bg-background p-4 text-xs min-h-[40px]\">\n {Object.keys(pendingStyles).length > 0\n ? stylesToTailwind(pendingStyles)\n : '// Tailwind classes will appear here'}\n </code>\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n}\n"],"mappings":"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","names":["React","isFlexContainer","containerRect","token","jsx","sendEditToAgent","sendCommentToAgent","active","React","React","jsx","React","jsx","React","jsx","jsx","React","jsx","jsxs","React","jsx","jsxs","React","React","jsx","jsxs","React","React","jsx","BLUE","React","jsx","jsxs","BLUE","React","Fragment","jsx","jsxs","X","Copy","Check","ArrowUp","Send","Fragment","jsx","jsxs","STORAGE_KEY","sendEditToAgent","sendCommentToAgent","React","createPortal","React","createPortal","Fragment","jsx","jsxs","RULER_SIZE","createPortal","React","STORAGE_KEY","DRAG_THRESHOLD","Popover","X","Check","Copy","Fragment","jsx","jsxs","Popover","handlePointerDown","X","Check","Copy","createPortal","jsx","jsxs","React","jsx","jsxs"]}
1
+ {"version":3,"sources":["../src/provider.tsx","../src/portal-container.tsx","styles.css","../src/utils.ts","../src/ui/color-utils.ts","../src/mcp-client.ts","../src/panel.tsx","../src/ui/button.tsx","../src/cn.ts","../src/ui/input.tsx","../src/ui/tooltip.tsx","../src/ui/select.tsx","../src/ui/color-picker.tsx","../src/ui/slider.tsx","../src/use-measurement.ts","../src/measurement-overlay.tsx","../src/use-move.ts","../src/use-guidelines.ts","../src/move-overlay.tsx","../src/selection-overlay.tsx","../src/comment-overlay.tsx","../src/toolbar.tsx","../src/rulers-overlay.tsx","../src/use-toolbar-dock.ts","../src/direct-edit.tsx","../src/demo.tsx"],"sourcesContent":["import * as React from 'react'\nimport { PortalContainerProvider, usePortalContainer } from './portal-container'\nimport type {\n DirectEditState,\n SpacingPropertyKey,\n BorderRadiusPropertyKey,\n BorderPropertyKey,\n BorderProperties,\n FlexPropertyKey,\n SizingPropertyKey,\n TypographyPropertyKey,\n CSSPropertyValue,\n SizingValue,\n ColorPropertyKey,\n ColorValue,\n UndoEntry,\n ActiveTool,\n Theme,\n Comment,\n SessionEdit,\n} from './types'\nimport type { MoveInfo } from './use-move'\nimport {\n getComputedStyles,\n getComputedBorderStyles,\n getOriginalInlineStyles,\n getElementInfo,\n formatPropertyValue,\n propertyToCSSMap,\n borderRadiusPropertyToCSSMap,\n borderPropertyToCSSMap,\n flexPropertyToCSSMap,\n sizingPropertyToCSSMap,\n typographyPropertyToCSSMap,\n getComputedSizing,\n sizingValueToCSS,\n getComputedColorStyles,\n colorPropertyToCSSMap,\n getComputedTypography,\n buildElementContext,\n buildEditExport,\n buildCommentExport,\n buildSessionExport,\n getElementDisplayName,\n getElementLocator,\n stylesToTailwind,\n isTextElement,\n} from './utils'\nimport { formatColorValue } from './ui/color-utils'\nimport { sendEditToAgent as postEditToAgent, sendCommentToAgent as postCommentToAgent } from './mcp-client'\n\nexport interface DirectEditContextValue extends DirectEditState {\n selectElement: (element: HTMLElement) => void\n selectParent: () => void\n selectChild: () => void\n closePanel: () => void\n updateSpacingProperty: (key: SpacingPropertyKey, value: CSSPropertyValue) => void\n updateBorderRadiusProperty: (key: BorderRadiusPropertyKey, value: CSSPropertyValue) => void\n updateBorderProperty: (key: BorderPropertyKey, value: BorderProperties[BorderPropertyKey]) => void\n updateBorderProperties: (changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]>) => void\n updateFlexProperty: (key: FlexPropertyKey, value: string) => void\n toggleFlexLayout: () => void\n updateSizingProperty: (key: SizingPropertyKey, value: SizingValue) => void\n updateColorProperty: (key: ColorPropertyKey, value: ColorValue) => void\n updateTypographyProperty: (key: TypographyPropertyKey, value: CSSPropertyValue | string) => void\n resetToOriginal: () => void\n exportEdits: () => Promise<boolean>\n toggleEditMode: () => void\n undo: () => void\n handleMoveComplete: (element: HTMLElement, moveInfo: MoveInfo | null) => void\n setActiveTool: (tool: ActiveTool) => void\n setTheme: (theme: Theme) => void\n addComment: (element: HTMLElement, clickPosition: { x: number; y: number }) => void\n updateCommentText: (id: string, text: string) => void\n addCommentReply: (id: string, text: string) => void\n deleteComment: (id: string) => void\n exportComment: (id: string) => Promise<boolean>\n sendEditToAgent: () => Promise<boolean>\n sendCommentToAgent: (id: string) => Promise<boolean>\n setActiveCommentId: (id: string | null) => void\n sessionEditCount: number\n getSessionEdits: () => SessionEdit[]\n exportAllEdits: () => Promise<boolean>\n clearSessionEdits: () => void\n removeSessionEdit: (element: HTMLElement) => void\n startTextEditing: (element: HTMLElement) => void\n commitTextEditing: () => void\n}\n\nconst DirectEditContext = React.createContext<DirectEditContextValue | null>(null)\n\nexport function useDirectEdit(): DirectEditContextValue {\n const context = React.useContext(DirectEditContext)\n if (!context) {\n throw new Error('useDirectEdit must be used within a DirectEditProvider')\n }\n return context\n}\n\ninterface DirectEditProviderProps {\n children: React.ReactNode\n}\n\nexport function DirectEditProvider({ children }: DirectEditProviderProps) {\n\n const [state, setState] = React.useState<DirectEditState>({\n isOpen: false,\n selectedElement: null,\n elementInfo: null,\n computedSpacing: null,\n computedBorderRadius: null,\n computedBorder: null,\n computedFlex: null,\n computedSizing: null,\n computedColor: null,\n computedTypography: null,\n originalStyles: {},\n pendingStyles: {},\n editModeActive: false,\n activeTool: 'select',\n theme: 'system',\n comments: [],\n activeCommentId: null,\n textEditingElement: null,\n })\n\n // Read persisted theme on mount (SSR-safe)\n React.useEffect(() => {\n try {\n const stored = localStorage.getItem('direct-edit-theme')\n if (stored === 'light' || stored === 'dark' || stored === 'system') {\n setState((prev) => ({ ...prev, theme: stored }))\n }\n } catch {}\n }, [])\n\n const undoStackRef = React.useRef<UndoEntry[]>([])\n const sessionEditsRef = React.useRef<Map<HTMLElement, SessionEdit>>(new Map())\n const removedSessionEditsRef = React.useRef<WeakSet<HTMLElement>>(new WeakSet())\n const [sessionEditCount, setSessionEditCount] = React.useState(0)\n const stateRef = React.useRef(state)\n React.useEffect(() => {\n stateRef.current = state\n })\n\n const pushUndo = React.useCallback((entry: UndoEntry) => {\n undoStackRef.current.push(entry)\n if (undoStackRef.current.length > 50) {\n undoStackRef.current = undoStackRef.current.slice(-50)\n }\n if (entry.type === 'edit' || entry.type === 'move' || entry.type === 'textEdit') {\n removedSessionEditsRef.current.delete(entry.element)\n }\n }, [])\n\n const saveCurrentToSession = React.useCallback(() => {\n const current = stateRef.current\n const el = current.selectedElement\n if (!el) return\n if (removedSessionEditsRef.current.has(el)) return\n\n const existing = sessionEditsRef.current.get(el)\n const pendingStyles = { ...current.pendingStyles }\n const hasPendingStyles = Object.keys(pendingStyles).length > 0\n const hasMove = Boolean(existing?.move)\n const hasTextEdit = Boolean(existing?.textEdit)\n\n if (!hasPendingStyles && !hasMove && !hasTextEdit) {\n if (sessionEditsRef.current.delete(el)) {\n setSessionEditCount(sessionEditsRef.current.size)\n }\n return\n }\n\n const locator = getElementLocator(el)\n sessionEditsRef.current.set(el, {\n element: el,\n locator,\n originalStyles: existing?.originalStyles ?? { ...current.originalStyles },\n pendingStyles,\n move: existing?.move ?? null,\n textEdit: existing?.textEdit ?? null,\n })\n setSessionEditCount(sessionEditsRef.current.size)\n }, [])\n\n React.useEffect(() => {\n if (!state.selectedElement) return\n saveCurrentToSession()\n }, [state.selectedElement, state.pendingStyles, saveCurrentToSession])\n\n const selectElement = React.useCallback((element: HTMLElement) => {\n saveCurrentToSession()\n const current = stateRef.current\n if (current.selectedElement || current.isOpen) {\n pushUndo({\n type: 'selection',\n previousElement: current.selectedElement,\n previousOriginalStyles: { ...current.originalStyles },\n previousPendingStyles: { ...current.pendingStyles },\n })\n }\n\n const { spacing, borderRadius, flex } = getComputedStyles(element)\n const border = getComputedBorderStyles(element)\n const sizing = getComputedSizing(element)\n const color = getComputedColorStyles(element)\n const typography = getComputedTypography(element)\n const originalStyles = getOriginalInlineStyles(element)\n const elementInfo = getElementInfo(element)\n\n setState((prev) => ({\n isOpen: true,\n selectedElement: element,\n elementInfo,\n computedSpacing: spacing,\n computedBorderRadius: borderRadius,\n computedBorder: border,\n computedFlex: flex,\n computedSizing: sizing,\n computedColor: color,\n computedTypography: typography,\n originalStyles,\n pendingStyles: {},\n editModeActive: prev.editModeActive,\n activeTool: prev.activeTool,\n theme: prev.theme,\n comments: prev.comments,\n activeCommentId: prev.activeCommentId,\n textEditingElement: null,\n }))\n\n // Auto-copy element context to clipboard on selection\n const locator = getElementLocator(element)\n const context = buildElementContext(locator)\n navigator.clipboard.writeText(`implement the visual edits\\n\\n${context}`).catch(() => {})\n }, [pushUndo, saveCurrentToSession])\n\n const finalizeTextEditing = React.useCallback((editingElement: HTMLElement) => {\n const newText = editingElement.textContent ?? ''\n const existing = sessionEditsRef.current.get(editingElement)\n const originalText = existing?.textEdit?.originalText\n ?? editingElement.getAttribute('data-direct-edit-original-text')\n ?? newText\n const previousText = existing?.textEdit?.newText ?? originalText\n\n editingElement.removeAttribute('contenteditable')\n editingElement.removeAttribute('data-direct-edit-original-text')\n editingElement.style.outline = ''\n editingElement.style.outlineOffset = ''\n editingElement.blur()\n\n if (newText !== previousText) {\n pushUndo({ type: 'textEdit', element: editingElement, originalText, previousText })\n removedSessionEditsRef.current.delete(editingElement)\n\n if (newText === originalText) {\n // Reverted to original - remove textEdit from session\n if (existing) {\n if (Object.keys(existing.pendingStyles).length > 0 || existing.move) {\n sessionEditsRef.current.set(editingElement, { ...existing, textEdit: null })\n } else {\n sessionEditsRef.current.delete(editingElement)\n }\n }\n } else {\n const current = stateRef.current\n const locator = existing?.locator ?? getElementLocator(editingElement)\n const originalStyles = existing?.originalStyles\n ?? (current.selectedElement === editingElement ? { ...current.originalStyles } : {})\n const pendingStyles = existing?.pendingStyles\n ?? (current.selectedElement === editingElement ? { ...current.pendingStyles } : {})\n sessionEditsRef.current.set(editingElement, {\n element: editingElement,\n locator,\n originalStyles,\n pendingStyles,\n move: existing?.move ?? null,\n textEdit: { originalText, newText },\n })\n }\n setSessionEditCount(sessionEditsRef.current.size)\n }\n\n setState((prev) => (prev.textEditingElement ? { ...prev, textEditingElement: null } : prev))\n }, [pushUndo])\n\n const closePanel = React.useCallback(() => {\n setState((prev) => ({\n ...prev,\n isOpen: false,\n }))\n }, [])\n\n const toggleEditMode = React.useCallback(() => {\n const current = stateRef.current\n if (current.editModeActive && current.textEditingElement) {\n finalizeTextEditing(current.textEditingElement)\n }\n\n setState((prev) => ({\n ...prev,\n editModeActive: !prev.editModeActive,\n activeTool: prev.editModeActive ? 'select' : prev.activeTool,\n activeCommentId: prev.editModeActive ? null : prev.activeCommentId,\n }))\n }, [finalizeTextEditing])\n\n const selectParent = React.useCallback(() => {\n if (state.selectedElement?.parentElement) {\n selectElement(state.selectedElement.parentElement)\n }\n }, [state.selectedElement, selectElement])\n\n const selectChild = React.useCallback(() => {\n const firstChild = state.selectedElement?.firstElementChild as HTMLElement | null\n if (firstChild) {\n selectElement(firstChild)\n }\n }, [state.selectedElement, selectElement])\n\n const updateSpacingProperty = React.useCallback(\n (key: SpacingPropertyKey, value: CSSPropertyValue) => {\n if (!state.selectedElement) return\n\n const cssProperty = propertyToCSSMap[key]\n const cssValue = formatPropertyValue(value)\n\n const previousValue = state.selectedElement.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: state.selectedElement, properties: [{ cssProperty, previousValue }] })\n\n state.selectedElement.style.setProperty(cssProperty, cssValue)\n\n setState((prev) => ({\n ...prev,\n computedSpacing: prev.computedSpacing\n ? {\n ...prev.computedSpacing,\n [key]: value,\n }\n : null,\n pendingStyles: {\n ...prev.pendingStyles,\n [cssProperty]: cssValue,\n },\n }))\n },\n [state.selectedElement, pushUndo]\n )\n\n const updateBorderRadiusProperty = React.useCallback(\n (key: BorderRadiusPropertyKey, value: CSSPropertyValue) => {\n if (!state.selectedElement) return\n\n const cssProperty = borderRadiusPropertyToCSSMap[key]\n const cssValue = formatPropertyValue(value)\n\n const previousValue = state.selectedElement.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: state.selectedElement, properties: [{ cssProperty, previousValue }] })\n\n state.selectedElement.style.setProperty(cssProperty, cssValue)\n\n setState((prev) => ({\n ...prev,\n computedBorderRadius: prev.computedBorderRadius\n ? {\n ...prev.computedBorderRadius,\n [key]: value,\n }\n : null,\n pendingStyles: {\n ...prev.pendingStyles,\n [cssProperty]: cssValue,\n },\n }))\n },\n [state.selectedElement, pushUndo]\n )\n\n const updateBorderProperty = React.useCallback(\n (key: BorderPropertyKey, value: BorderProperties[BorderPropertyKey]) => {\n if (!state.selectedElement) return\n\n const cssProperty = borderPropertyToCSSMap[key]\n const cssValue = typeof value === 'string' ? value : formatPropertyValue(value)\n\n const previousValue = state.selectedElement.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: state.selectedElement, properties: [{ cssProperty, previousValue }] })\n\n state.selectedElement.style.setProperty(cssProperty, cssValue)\n\n const border = getComputedBorderStyles(state.selectedElement)\n const color = getComputedColorStyles(state.selectedElement)\n\n setState((prev) => ({\n ...prev,\n computedBorder: border,\n computedColor: color,\n pendingStyles: {\n ...prev.pendingStyles,\n [cssProperty]: cssValue,\n },\n }))\n },\n [state.selectedElement, pushUndo]\n )\n\n const updateBorderProperties = React.useCallback(\n (changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]>) => {\n if (!state.selectedElement || changes.length === 0) return\n\n const properties: Array<{ cssProperty: string; previousValue: string | null }> = []\n const pendingUpdates: Record<string, string> = {}\n\n for (const [key, value] of changes) {\n const cssProperty = borderPropertyToCSSMap[key]\n const cssValue = typeof value === 'string' ? value : formatPropertyValue(value)\n\n const previousValue = state.selectedElement.style.getPropertyValue(cssProperty) || null\n properties.push({ cssProperty, previousValue })\n\n state.selectedElement.style.setProperty(cssProperty, cssValue)\n pendingUpdates[cssProperty] = cssValue\n }\n\n pushUndo({ type: 'edit', element: state.selectedElement, properties })\n\n const border = getComputedBorderStyles(state.selectedElement)\n const color = getComputedColorStyles(state.selectedElement)\n\n setState((prev) => ({\n ...prev,\n computedBorder: border,\n computedColor: color,\n pendingStyles: {\n ...prev.pendingStyles,\n ...pendingUpdates,\n },\n }))\n },\n [state.selectedElement, pushUndo]\n )\n\n const updateFlexProperty = React.useCallback(\n (key: FlexPropertyKey, value: string) => {\n if (!state.selectedElement) return\n\n const cssProperty = flexPropertyToCSSMap[key]\n\n const previousValue = state.selectedElement.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: state.selectedElement, properties: [{ cssProperty, previousValue }] })\n\n state.selectedElement.style.setProperty(cssProperty, value)\n\n setState((prev) => ({\n ...prev,\n computedFlex: prev.computedFlex\n ? {\n ...prev.computedFlex,\n [key]: value,\n }\n : null,\n pendingStyles: {\n ...prev.pendingStyles,\n [cssProperty]: value,\n },\n }))\n },\n [state.selectedElement, pushUndo]\n )\n\n const toggleFlexLayout = React.useCallback(() => {\n if (!state.selectedElement) return\n\n const element = state.selectedElement\n const flexProps = ['display', 'flex-direction', 'justify-content', 'align-items'] as const\n const properties = flexProps.map((cssProperty) => ({\n cssProperty,\n previousValue: element.style.getPropertyValue(cssProperty) || null,\n }))\n\n pushUndo({ type: 'edit', element, properties })\n\n const isCurrentlyFlex = state.elementInfo?.isFlexContainer ?? false\n\n if (isCurrentlyFlex) {\n for (const cssProperty of flexProps) {\n element.style.removeProperty(cssProperty)\n }\n } else {\n element.style.setProperty('display', 'flex')\n }\n\n const { spacing, borderRadius, flex } = getComputedStyles(element)\n const sizing = getComputedSizing(element)\n const elementInfo = getElementInfo(element)\n\n const newPending = { ...stateRef.current.pendingStyles }\n if (isCurrentlyFlex) {\n for (const cssProperty of flexProps) {\n delete newPending[cssProperty]\n }\n } else {\n newPending['display'] = 'flex'\n }\n\n setState((prev) => ({\n ...prev,\n computedFlex: flex,\n computedSpacing: spacing,\n computedBorderRadius: borderRadius,\n computedSizing: sizing,\n elementInfo,\n pendingStyles: newPending,\n }))\n }, [state.selectedElement, state.elementInfo, pushUndo])\n\n const updateSizingProperty = React.useCallback(\n (key: SizingPropertyKey, value: SizingValue) => {\n if (!state.selectedElement) return\n\n const cssProperty = sizingPropertyToCSSMap[key]\n const cssValue = sizingValueToCSS(value)\n\n const previousValue = state.selectedElement.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: state.selectedElement, properties: [{ cssProperty, previousValue }] })\n\n state.selectedElement.style.setProperty(cssProperty, cssValue)\n\n setState((prev) => ({\n ...prev,\n computedSizing: prev.computedSizing\n ? {\n ...prev.computedSizing,\n [key]: value,\n }\n : null,\n pendingStyles: {\n ...prev.pendingStyles,\n [cssProperty]: cssValue,\n },\n }))\n },\n [state.selectedElement, pushUndo]\n )\n\n const updateColorProperty = React.useCallback(\n (key: ColorPropertyKey, value: ColorValue) => {\n if (!state.selectedElement) return\n\n const cssProperty = colorPropertyToCSSMap[key]\n const cssValue = formatColorValue(value)\n\n const previousValue = state.selectedElement.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: state.selectedElement, properties: [{ cssProperty, previousValue }] })\n\n state.selectedElement.style.setProperty(cssProperty, cssValue)\n\n setState((prev) => ({\n ...prev,\n computedColor: prev.computedColor\n ? {\n ...prev.computedColor,\n [key]: value,\n }\n : null,\n pendingStyles: {\n ...prev.pendingStyles,\n [cssProperty]: cssValue,\n },\n }))\n },\n [state.selectedElement, pushUndo]\n )\n\n const updateTypographyProperty = React.useCallback(\n (key: TypographyPropertyKey, value: CSSPropertyValue | string) => {\n if (!state.selectedElement) return\n\n const cssProperty = typographyPropertyToCSSMap[key]\n const cssValue = typeof value === 'string' ? value : formatPropertyValue(value)\n\n if (key === 'textVerticalAlign') {\n const prevDisplay = state.selectedElement.style.getPropertyValue('display') || null\n const prevAlignItems = state.selectedElement.style.getPropertyValue('align-items') || null\n pushUndo({\n type: 'edit',\n element: state.selectedElement,\n properties: [\n { cssProperty: 'display', previousValue: prevDisplay },\n { cssProperty: 'align-items', previousValue: prevAlignItems },\n ],\n })\n\n const computed = window.getComputedStyle(state.selectedElement)\n const isInline = computed.display === 'inline' || computed.display === 'inline-block'\n const displayValue = isInline ? 'inline-flex' : 'flex'\n state.selectedElement.style.setProperty('display', displayValue)\n state.selectedElement.style.setProperty('align-items', cssValue)\n } else {\n const previousValue = state.selectedElement.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: state.selectedElement, properties: [{ cssProperty, previousValue }] })\n\n state.selectedElement.style.setProperty(cssProperty, cssValue)\n }\n\n setState((prev) => {\n let displayValue = 'flex'\n if (key === 'textVerticalAlign' && state.selectedElement) {\n const computed = window.getComputedStyle(state.selectedElement)\n const isInline = computed.display === 'inline-flex' || prev.pendingStyles.display === 'inline-flex'\n displayValue = isInline ? 'inline-flex' : 'flex'\n }\n\n return {\n ...prev,\n computedTypography: prev.computedTypography\n ? {\n ...prev.computedTypography,\n [key]: value,\n }\n : null,\n pendingStyles: {\n ...prev.pendingStyles,\n ...(key === 'textVerticalAlign'\n ? { display: displayValue, 'align-items': cssValue }\n : { [cssProperty]: cssValue }),\n },\n }\n })\n },\n [state.selectedElement, pushUndo]\n )\n\n const resetToOriginal = React.useCallback(() => {\n if (!state.selectedElement) return\n\n const el = state.selectedElement\n const sessionEntry = sessionEditsRef.current.get(el)\n if (sessionEntry?.textEdit) {\n el.textContent = sessionEntry.textEdit.originalText\n }\n if (sessionEntry?.move) {\n sessionEditsRef.current.set(el, { ...sessionEntry, pendingStyles: {}, textEdit: null })\n } else {\n sessionEditsRef.current.delete(el)\n }\n setSessionEditCount(sessionEditsRef.current.size)\n undoStackRef.current = undoStackRef.current.filter(\n (entry) => !((entry.type === 'edit' || entry.type === 'textEdit') && entry.element === el)\n )\n\n const allCSSProps = [\n ...Object.values(propertyToCSSMap),\n ...Object.values(borderRadiusPropertyToCSSMap),\n ...Object.values(borderPropertyToCSSMap),\n ...Object.values(flexPropertyToCSSMap),\n ...Object.values(sizingPropertyToCSSMap),\n ...Object.values(colorPropertyToCSSMap),\n ...Object.values(typographyPropertyToCSSMap),\n ]\n\n for (const prop of allCSSProps) {\n state.selectedElement.style.removeProperty(prop)\n }\n\n for (const [prop, value] of Object.entries(state.originalStyles)) {\n state.selectedElement.style.setProperty(prop, value)\n }\n\n const { spacing, borderRadius, flex } = getComputedStyles(state.selectedElement)\n const border = getComputedBorderStyles(state.selectedElement)\n const sizing = getComputedSizing(state.selectedElement)\n const color = getComputedColorStyles(state.selectedElement)\n const typography = getComputedTypography(state.selectedElement)\n\n setState((prev) => ({\n ...prev,\n computedSpacing: spacing,\n computedBorderRadius: borderRadius,\n computedBorder: border,\n computedFlex: flex,\n computedSizing: sizing,\n computedColor: color,\n computedTypography: typography,\n pendingStyles: {},\n }))\n }, [state.selectedElement, state.originalStyles])\n\n const undo = React.useCallback(() => {\n const entry = undoStackRef.current.pop()\n if (!entry) return\n\n switch (entry.type) {\n case 'edit': {\n if (!entry.element.isConnected) return\n for (const { cssProperty, previousValue } of entry.properties) {\n if (previousValue === null) {\n entry.element.style.removeProperty(cssProperty)\n } else {\n entry.element.style.setProperty(cssProperty, previousValue)\n }\n }\n const current = stateRef.current\n if (current.selectedElement === entry.element) {\n const { spacing, borderRadius, flex } = getComputedStyles(entry.element)\n const border = getComputedBorderStyles(entry.element)\n const sizing = getComputedSizing(entry.element)\n const color = getComputedColorStyles(entry.element)\n const typography = getComputedTypography(entry.element)\n const elementInfo = getElementInfo(entry.element)\n const newPending = { ...current.pendingStyles }\n for (const { cssProperty, previousValue } of entry.properties) {\n if (previousValue === null) {\n delete newPending[cssProperty]\n } else {\n newPending[cssProperty] = previousValue\n }\n }\n setState((prev) => ({\n ...prev,\n computedSpacing: spacing,\n computedBorderRadius: borderRadius,\n computedBorder: border,\n computedFlex: flex,\n computedSizing: sizing,\n computedColor: color,\n computedTypography: typography,\n elementInfo,\n pendingStyles: newPending,\n }))\n }\n break\n }\n case 'selection': {\n const prevEl = entry.previousElement\n if (prevEl && !prevEl.isConnected) return\n if (prevEl) {\n for (const [prop, value] of Object.entries(entry.previousPendingStyles)) {\n prevEl.style.setProperty(prop, value)\n }\n const { spacing, borderRadius, flex } = getComputedStyles(prevEl)\n const border = getComputedBorderStyles(prevEl)\n const sizing = getComputedSizing(prevEl)\n const color = getComputedColorStyles(prevEl)\n const typography = getComputedTypography(prevEl)\n const elementInfo = getElementInfo(prevEl)\n setState((prev) => ({\n isOpen: true,\n selectedElement: prevEl,\n elementInfo,\n computedSpacing: spacing,\n computedBorderRadius: borderRadius,\n computedBorder: border,\n computedFlex: flex,\n computedSizing: sizing,\n computedColor: color,\n computedTypography: typography,\n originalStyles: entry.previousOriginalStyles,\n pendingStyles: entry.previousPendingStyles,\n editModeActive: prev.editModeActive,\n activeTool: prev.activeTool,\n theme: prev.theme,\n comments: prev.comments,\n activeCommentId: prev.activeCommentId,\n textEditingElement: null,\n }))\n } else {\n setState((prev) => ({\n ...prev,\n isOpen: false,\n selectedElement: null,\n elementInfo: null,\n computedSpacing: null,\n computedBorderRadius: null,\n computedBorder: null,\n computedFlex: null,\n computedSizing: null,\n computedColor: null,\n computedTypography: null,\n originalStyles: {},\n pendingStyles: {},\n }))\n }\n break\n }\n case 'move': {\n if (!entry.element.isConnected) return\n try {\n if (entry.originalNextSibling) {\n entry.originalParent.insertBefore(entry.element, entry.originalNextSibling)\n } else {\n entry.originalParent.appendChild(entry.element)\n }\n } catch {\n // Ignore invalid DOM moves\n }\n const sessionEntry = sessionEditsRef.current.get(entry.element)\n if (sessionEntry) {\n const restoredMove = entry.previousSessionMove\n if (Object.keys(sessionEntry.pendingStyles).length > 0 || restoredMove || sessionEntry.textEdit) {\n sessionEditsRef.current.set(entry.element, { ...sessionEntry, move: restoredMove })\n } else {\n sessionEditsRef.current.delete(entry.element)\n }\n setSessionEditCount(sessionEditsRef.current.size)\n }\n const current = stateRef.current\n if (current.selectedElement === entry.element) {\n const elementInfo = getElementInfo(entry.element)\n setState((prev) => ({ ...prev, elementInfo }))\n }\n break\n }\n case 'textEdit': {\n if (!entry.element.isConnected) return\n entry.element.textContent = entry.previousText\n\n const desiredTextEdit = entry.previousText === entry.originalText\n ? null\n : { originalText: entry.originalText, newText: entry.previousText }\n const sessionEntry = sessionEditsRef.current.get(entry.element)\n\n if (sessionEntry) {\n if (desiredTextEdit) {\n sessionEditsRef.current.set(entry.element, {\n ...sessionEntry,\n textEdit: desiredTextEdit,\n })\n } else if (Object.keys(sessionEntry.pendingStyles).length > 0 || sessionEntry.move) {\n sessionEditsRef.current.set(entry.element, { ...sessionEntry, textEdit: null })\n } else {\n sessionEditsRef.current.delete(entry.element)\n }\n } else if (desiredTextEdit) {\n const current = stateRef.current\n sessionEditsRef.current.set(entry.element, {\n element: entry.element,\n locator: getElementLocator(entry.element),\n originalStyles: current.selectedElement === entry.element ? { ...current.originalStyles } : {},\n pendingStyles: current.selectedElement === entry.element ? { ...current.pendingStyles } : {},\n move: null,\n textEdit: desiredTextEdit,\n })\n }\n\n setSessionEditCount(sessionEditsRef.current.size)\n break\n }\n }\n }, [])\n\n const handleMoveComplete = React.useCallback(\n (element: HTMLElement, moveInfo: MoveInfo | null) => {\n if (moveInfo) {\n const existing = sessionEditsRef.current.get(element)\n pushUndo({\n type: 'move',\n element,\n originalParent: moveInfo.originalParent,\n originalNextSibling: moveInfo.originalNextSibling,\n previousSessionMove: existing?.move ?? null,\n })\n const locator = existing?.locator ?? getElementLocator(element)\n const newParent = element.parentElement\n\n // Preserve initial from* from the first move; only update to* on later moves\n const fromFields = existing?.move\n ? {\n fromParentName: existing.move.fromParentName,\n fromSiblingBefore: existing.move.fromSiblingBefore,\n fromSiblingAfter: existing.move.fromSiblingAfter,\n }\n : {\n fromParentName: getElementDisplayName(moveInfo.originalParent),\n fromSiblingBefore: moveInfo.originalPreviousSibling\n ? getElementDisplayName(moveInfo.originalPreviousSibling)\n : null,\n fromSiblingAfter: moveInfo.originalNextSibling\n ? getElementDisplayName(moveInfo.originalNextSibling)\n : null,\n }\n\n sessionEditsRef.current.set(element, {\n element,\n locator,\n originalStyles: existing?.originalStyles ?? { ...stateRef.current.originalStyles },\n pendingStyles: existing?.pendingStyles ?? { ...stateRef.current.pendingStyles },\n textEdit: existing?.textEdit ?? null,\n move: newParent\n ? {\n ...fromFields,\n toParentName: getElementDisplayName(newParent),\n toSiblingBefore: element.previousElementSibling\n ? getElementDisplayName(element.previousElementSibling as HTMLElement)\n : null,\n toSiblingAfter: element.nextElementSibling\n ? getElementDisplayName(element.nextElementSibling as HTMLElement)\n : null,\n }\n : null,\n })\n setSessionEditCount(sessionEditsRef.current.size)\n }\n // Refresh element state without going through selectElement,\n // which would push an extra selection undo entry.\n const { spacing, borderRadius, flex } = getComputedStyles(element)\n const border = getComputedBorderStyles(element)\n const sizing = getComputedSizing(element)\n const color = getComputedColorStyles(element)\n const typography = getComputedTypography(element)\n const elementInfo = getElementInfo(element)\n\n setState((prev) => ({\n isOpen: true,\n selectedElement: element,\n elementInfo,\n computedSpacing: spacing,\n computedBorderRadius: borderRadius,\n computedBorder: border,\n computedFlex: flex,\n computedSizing: sizing,\n computedColor: color,\n computedTypography: typography,\n originalStyles: prev.originalStyles,\n pendingStyles: prev.pendingStyles,\n editModeActive: prev.editModeActive,\n activeTool: prev.activeTool,\n theme: prev.theme,\n comments: prev.comments,\n activeCommentId: prev.activeCommentId,\n textEditingElement: null,\n }))\n },\n [pushUndo]\n )\n\n const setActiveTool = React.useCallback((tool: ActiveTool) => {\n setState((prev) => ({\n ...prev,\n activeTool: tool,\n activeCommentId: null,\n }))\n }, [])\n\n const setTheme = React.useCallback((theme: Theme) => {\n setState((prev) => ({ ...prev, theme }))\n try { localStorage.setItem('direct-edit-theme', theme) } catch {}\n }, [])\n\n const addComment = React.useCallback((element: HTMLElement, clickPosition: { x: number; y: number }) => {\n const locator = getElementLocator(element)\n const rect = element.getBoundingClientRect()\n const relativePosition = {\n x: clickPosition.x - rect.left,\n y: clickPosition.y - rect.top,\n }\n const id = `comment-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`\n const comment: Comment = {\n id,\n element,\n locator,\n clickPosition,\n relativePosition,\n text: '',\n createdAt: Date.now(),\n replies: [],\n }\n setState((prev) => ({\n ...prev,\n comments: [...prev.comments, comment],\n activeCommentId: id,\n }))\n }, [])\n\n const updateCommentText = React.useCallback((id: string, text: string) => {\n setState((prev) => ({\n ...prev,\n comments: prev.comments.map((c) => (c.id === id ? { ...c, text } : c)),\n }))\n }, [])\n\n const addCommentReply = React.useCallback((id: string, text: string) => {\n setState((prev) => ({\n ...prev,\n comments: prev.comments.map((c) =>\n c.id === id\n ? { ...c, replies: [...c.replies, { text, createdAt: Date.now() }] }\n : c\n ),\n }))\n }, [])\n\n const deleteComment = React.useCallback((id: string) => {\n setState((prev) => ({\n ...prev,\n comments: prev.comments.filter((c) => c.id !== id),\n activeCommentId: prev.activeCommentId === id ? null : prev.activeCommentId,\n }))\n }, [])\n\n const exportComment = React.useCallback(async (id: string) => {\n const comment = stateRef.current.comments.find((c) => c.id === id)\n if (!comment) return false\n\n const exportMarkdown = buildCommentExport(comment.locator, comment.text, comment.replies)\n try {\n await navigator.clipboard.writeText(`implement the visual edits\\n\\n${exportMarkdown}`)\n return true\n } catch {\n return false\n }\n }, [])\n\n const setActiveCommentId = React.useCallback((id: string | null) => {\n setState((prev) => {\n let comments = prev.comments\n if (prev.activeCommentId && prev.activeCommentId !== id) {\n const active = comments.find((c) => c.id === prev.activeCommentId)\n if (active && active.text === '') {\n comments = comments.filter((c) => c.id !== prev.activeCommentId)\n }\n }\n return { ...prev, comments, activeCommentId: id }\n })\n }, [])\n\n const startTextEditing = React.useCallback((element: HTMLElement) => {\n if (!isTextElement(element)) return\n if (stateRef.current.textEditingElement) return\n\n // Determine original text: prefer existing session edit's original\n const existing = sessionEditsRef.current.get(element)\n const originalText = existing?.textEdit?.originalText ?? (element.textContent ?? '')\n element.setAttribute('data-direct-edit-original-text', originalText)\n\n element.setAttribute('contenteditable', 'true')\n element.style.outline = '1px solid #0D99FF'\n element.style.outlineOffset = '0px'\n element.focus()\n\n // Select all text for easy replacement\n const selection = window.getSelection()\n if (selection) {\n const range = document.createRange()\n range.selectNodeContents(element)\n selection.removeAllRanges()\n selection.addRange(range)\n }\n\n setState((prev) => ({ ...prev, textEditingElement: element }))\n }, [])\n\n const commitTextEditing = React.useCallback(() => {\n const editingElement = stateRef.current.textEditingElement\n if (!editingElement) return\n\n finalizeTextEditing(editingElement)\n }, [finalizeTextEditing])\n\n // Click-outside listener for text editing\n React.useEffect(() => {\n const editingElement = state.textEditingElement\n if (!editingElement) return\n\n function handleMouseDown(e: MouseEvent) {\n if (!editingElement!.contains(e.target as Node)) {\n commitTextEditing()\n }\n }\n\n // Delay to avoid catching the double-click that started editing\n const rafId = requestAnimationFrame(() => {\n document.addEventListener('mousedown', handleMouseDown, true)\n })\n\n return () => {\n cancelAnimationFrame(rafId)\n document.removeEventListener('mousedown', handleMouseDown, true)\n }\n }, [state.textEditingElement, commitTextEditing])\n\n const getSessionEdits = React.useCallback((): SessionEdit[] => {\n saveCurrentToSession()\n const edits: SessionEdit[] = []\n for (const edit of sessionEditsRef.current.values()) {\n if (!edit.element.isConnected) {\n sessionEditsRef.current.delete(edit.element)\n continue\n }\n edits.push(edit)\n }\n setSessionEditCount(sessionEditsRef.current.size)\n return edits\n }, [saveCurrentToSession])\n\n const exportAllEdits = React.useCallback(async (): Promise<boolean> => {\n const edits = getSessionEdits()\n if (edits.length === 0) return false\n const text = buildSessionExport(edits)\n try {\n await navigator.clipboard.writeText(`implement the visual edits\\n\\n${text}`)\n return true\n } catch {\n return false\n }\n }, [getSessionEdits])\n\n const revertElementStyles = React.useCallback((element: HTMLElement, sessionEdit: SessionEdit) => {\n for (const prop of Object.keys(sessionEdit.pendingStyles)) {\n element.style.removeProperty(prop)\n }\n for (const [prop, value] of Object.entries(sessionEdit.originalStyles)) {\n element.style.setProperty(prop, value)\n }\n }, [])\n\n const refreshSelectedElement = React.useCallback(() => {\n const current = stateRef.current\n if (!current.selectedElement) return\n const el = current.selectedElement\n const { spacing, borderRadius, flex } = getComputedStyles(el)\n const sizing = getComputedSizing(el)\n const color = getComputedColorStyles(el)\n const typography = getComputedTypography(el)\n const border = getComputedBorderStyles(el)\n setState((prev) => ({\n ...prev,\n computedSpacing: spacing,\n computedBorderRadius: borderRadius,\n computedFlex: flex,\n computedSizing: sizing,\n computedColor: color,\n computedTypography: typography,\n computedBorder: border,\n originalStyles: getOriginalInlineStyles(el),\n pendingStyles: {},\n }))\n }, [])\n\n const removeSessionEdit = React.useCallback((element: HTMLElement) => {\n const sessionEdit = sessionEditsRef.current.get(element)\n if (sessionEdit) {\n revertElementStyles(element, sessionEdit)\n if (sessionEdit.textEdit) {\n element.textContent = sessionEdit.textEdit.originalText\n }\n }\n sessionEditsRef.current.delete(element)\n removedSessionEditsRef.current.add(element)\n setSessionEditCount(sessionEditsRef.current.size)\n if (stateRef.current.selectedElement === element) {\n refreshSelectedElement()\n }\n }, [revertElementStyles, refreshSelectedElement])\n\n const clearSessionEdits = React.useCallback(() => {\n for (const [el, sessionEdit] of sessionEditsRef.current.entries()) {\n revertElementStyles(el, sessionEdit)\n if (sessionEdit.textEdit) {\n el.textContent = sessionEdit.textEdit.originalText\n }\n removedSessionEditsRef.current.add(el)\n }\n const current = stateRef.current\n if (current.selectedElement) {\n // Also revert pending styles not yet saved to session\n if (!sessionEditsRef.current.has(current.selectedElement)) {\n for (const prop of Object.keys(current.pendingStyles)) {\n current.selectedElement.style.removeProperty(prop)\n }\n for (const [prop, value] of Object.entries(current.originalStyles)) {\n current.selectedElement.style.setProperty(prop, value)\n }\n }\n removedSessionEditsRef.current.add(current.selectedElement)\n }\n sessionEditsRef.current.clear()\n setSessionEditCount(0)\n refreshSelectedElement()\n }, [revertElementStyles, refreshSelectedElement])\n\n const exportEdits = React.useCallback(async () => {\n if (!state.selectedElement || !state.elementInfo) return false\n const sessionEdit = sessionEditsRef.current.get(state.selectedElement)\n const hasPendingStyles = Object.keys(state.pendingStyles).length > 0\n const hasTextEdit = Boolean(sessionEdit?.textEdit)\n\n const locator = getElementLocator(state.selectedElement)\n const exportMarkdown = hasPendingStyles || hasTextEdit\n ? buildEditExport(locator, state.pendingStyles, sessionEdit?.textEdit)\n : buildElementContext(locator)\n try {\n await navigator.clipboard.writeText(`implement the visual edits\\n\\n${exportMarkdown}`)\n return true\n } catch {\n return false\n }\n }, [\n state.selectedElement,\n state.elementInfo,\n state.pendingStyles,\n sessionEditCount,\n ])\n\n const sendEditToAgent = React.useCallback(async () => {\n if (!state.selectedElement || !state.elementInfo) return false\n const sessionEdit = sessionEditsRef.current.get(state.selectedElement)\n const hasPendingStyles = Object.keys(state.pendingStyles).length > 0\n const hasTextEdit = Boolean(sessionEdit?.textEdit)\n if (!hasPendingStyles && !hasTextEdit) return false\n\n const locator = getElementLocator(state.selectedElement)\n const exportMarkdown = buildEditExport(locator, state.pendingStyles, sessionEdit?.textEdit)\n const changes = Object.entries(state.pendingStyles).map(([cssProperty, cssValue]) => ({\n cssProperty,\n cssValue,\n tailwindClass: stylesToTailwind({ [cssProperty]: cssValue }),\n }))\n\n try {\n const result = await postEditToAgent({\n element: {\n tagName: locator.tagName,\n id: locator.id,\n classList: locator.classList,\n domSelector: locator.domSelector,\n targetHtml: locator.targetHtml,\n textPreview: locator.textPreview,\n },\n source: locator.domSource || null,\n reactStack: locator.reactStack,\n changes,\n textChange: sessionEdit?.textEdit ?? null,\n exportMarkdown,\n })\n return result.ok\n } catch {\n return false\n }\n }, [\n state.selectedElement,\n state.elementInfo,\n state.pendingStyles,\n sessionEditCount,\n ])\n\n const sendCommentToAgent = React.useCallback(async (id: string) => {\n const comment = stateRef.current.comments.find((c) => c.id === id)\n if (!comment) return false\n\n const exportMarkdown = buildCommentExport(comment.locator, comment.text, comment.replies)\n\n try {\n const result = await postCommentToAgent({\n element: {\n tagName: comment.locator.tagName,\n id: comment.locator.id,\n classList: comment.locator.classList,\n domSelector: comment.locator.domSelector,\n targetHtml: comment.locator.targetHtml,\n textPreview: comment.locator.textPreview,\n },\n source: comment.locator.domSource || null,\n reactStack: comment.locator.reactStack,\n commentText: comment.text,\n replies: comment.replies,\n exportMarkdown,\n })\n return result.ok\n } catch {\n return false\n }\n }, [])\n\n // Toggle edit mode: plain Cmd/Ctrl + Period\n // Uses capture phase so it fires before any stopPropagation() in the host app (e.g. Tauri webview)\n // Uses e.code for layout independence (fallback to e.key for virtual keyboards)\n React.useEffect(() => {\n function handleToggle(e: KeyboardEvent) {\n if ((e.metaKey || e.ctrlKey) && !e.shiftKey && !e.altKey && (e.code === 'Period' || e.key === '.')) {\n e.preventDefault()\n toggleEditMode()\n }\n }\n window.addEventListener('keydown', handleToggle, true)\n return () => window.removeEventListener('keydown', handleToggle, true)\n }, [toggleEditMode])\n\n React.useEffect(() => {\n function handleKeyDown(e: KeyboardEvent) {\n if ((e.metaKey || e.ctrlKey) && e.key === 'z' && !e.shiftKey) {\n if (state.textEditingElement) return // let browser handle contenteditable undo\n e.preventDefault()\n undo()\n return\n }\n\n if (e.key === 'C' && e.shiftKey && !e.metaKey && !e.ctrlKey && !e.altKey && state.editModeActive) {\n const active = document.activeElement\n const isInput = active instanceof HTMLInputElement || active instanceof HTMLTextAreaElement || (active instanceof HTMLElement && active.isContentEditable)\n if (!isInput) {\n e.preventDefault()\n setState((prev) => {\n let comments = prev.comments\n if (prev.activeCommentId) {\n const active = comments.find((c) => c.id === prev.activeCommentId)\n if (active && active.text === '') {\n comments = comments.filter((c) => c.id !== prev.activeCommentId)\n }\n }\n return {\n ...prev,\n comments,\n activeTool: prev.activeTool === 'comment' ? 'select' : 'comment',\n activeCommentId: null,\n }\n })\n return\n }\n }\n\n if (e.key === 'A' && e.shiftKey && !e.metaKey && !e.ctrlKey && !e.altKey && state.editModeActive && state.selectedElement) {\n const active = document.activeElement\n const isInput = active instanceof HTMLInputElement || active instanceof HTMLTextAreaElement || (active instanceof HTMLElement && active.isContentEditable)\n if (!isInput) {\n e.preventDefault()\n toggleFlexLayout()\n return\n }\n }\n\n if (e.key === 'Enter' && state.editModeActive && !state.textEditingElement && state.selectedElement) {\n const active = document.activeElement\n const isInput = active instanceof HTMLInputElement || active instanceof HTMLTextAreaElement || (active instanceof HTMLElement && active.isContentEditable)\n if (!isInput && isTextElement(state.selectedElement)) {\n e.preventDefault()\n startTextEditing(state.selectedElement)\n return\n }\n }\n\n if (e.key === 'Escape') {\n if (state.textEditingElement) {\n commitTextEditing()\n return\n }\n if (state.activeCommentId) {\n setState((prev) => {\n let comments = prev.comments\n const active = comments.find((c) => c.id === prev.activeCommentId)\n if (active && active.text === '') {\n comments = comments.filter((c) => c.id !== prev.activeCommentId)\n }\n return { ...prev, comments, activeCommentId: null }\n })\n } else if (state.activeTool === 'comment') {\n setState((prev) => ({ ...prev, activeTool: 'select' }))\n } else if (state.isOpen) {\n closePanel()\n } else if (state.editModeActive) {\n toggleEditMode()\n }\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [state.isOpen, state.editModeActive, state.activeCommentId, state.activeTool, state.textEditingElement, state.selectedElement, closePanel, toggleEditMode, toggleFlexLayout, undo, commitTextEditing, startTextEditing])\n\n const contextValue = React.useMemo<DirectEditContextValue>(() => ({\n ...state,\n selectElement,\n selectParent,\n selectChild,\n closePanel,\n updateSpacingProperty,\n updateBorderRadiusProperty,\n updateBorderProperty,\n updateBorderProperties,\n updateFlexProperty,\n toggleFlexLayout,\n updateSizingProperty,\n updateColorProperty,\n updateTypographyProperty,\n resetToOriginal,\n exportEdits,\n sendEditToAgent,\n sendCommentToAgent,\n toggleEditMode,\n undo,\n handleMoveComplete,\n setActiveTool,\n setTheme,\n addComment,\n updateCommentText,\n addCommentReply,\n deleteComment,\n exportComment,\n setActiveCommentId,\n sessionEditCount,\n getSessionEdits,\n exportAllEdits,\n clearSessionEdits,\n removeSessionEdit,\n startTextEditing,\n commitTextEditing,\n }), [\n state,\n selectElement,\n selectParent,\n selectChild,\n closePanel,\n updateSpacingProperty,\n updateBorderRadiusProperty,\n updateBorderProperty,\n updateBorderProperties,\n updateFlexProperty,\n updateSizingProperty,\n updateColorProperty,\n updateTypographyProperty,\n resetToOriginal,\n exportEdits,\n sendEditToAgent,\n sendCommentToAgent,\n toggleEditMode,\n undo,\n handleMoveComplete,\n setActiveTool,\n setTheme,\n addComment,\n updateCommentText,\n addCommentReply,\n deleteComment,\n exportComment,\n setActiveCommentId,\n sessionEditCount,\n getSessionEdits,\n exportAllEdits,\n clearSessionEdits,\n removeSessionEdit,\n startTextEditing,\n commitTextEditing,\n ])\n\n return (\n <PortalContainerProvider>\n <DirectEditContext.Provider value={contextValue}>\n <ThemeApplier />\n {children}\n </DirectEditContext.Provider>\n </PortalContainerProvider>\n )\n}\n\nfunction ThemeApplier() {\n const { theme } = useDirectEdit()\n const container = usePortalContainer()\n\n React.useEffect(() => {\n if (!container) return\n const host = (container.getRootNode() as ShadowRoot).host as HTMLElement\n if (theme === 'system') {\n host.removeAttribute('data-theme')\n } else {\n host.setAttribute('data-theme', theme)\n }\n }, [container, theme])\n\n return null\n}\n","import * as React from 'react'\n// @ts-expect-error - CSS imported as raw text (Vite: ?raw suffix, tsup: esbuild plugin)\nimport cssText from '../dist/styles.css?raw'\n\nconst PortalContainerContext = React.createContext<HTMLElement | null>(null)\n\nexport function usePortalContainer() {\n return React.useContext(PortalContainerContext)\n}\n\nexport function PortalContainerProvider({ children }: { children: React.ReactNode }) {\n const [container, setContainer] = React.useState<HTMLElement | null>(null)\n\n React.useEffect(() => {\n const disableInlineStyles = document.documentElement.hasAttribute('data-direct-edit-disable-styles')\n const host = document.createElement('div')\n host.setAttribute('data-direct-edit-host', '')\n Object.assign(host.style, {\n position: 'fixed',\n inset: '0',\n zIndex: '2147483646',\n pointerEvents: 'none',\n })\n\n const shadow = host.attachShadow({ mode: 'open' })\n if (!disableInlineStyles) {\n const style = document.createElement('style')\n style.textContent = cssText\n shadow.appendChild(style)\n }\n\n const root = document.createElement('div')\n root.setAttribute('data-direct-edit-root', '')\n shadow.appendChild(root)\n\n document.body.appendChild(host)\n setContainer(root)\n\n return () => { host.remove() }\n }, [])\n\n return (\n <PortalContainerContext.Provider value={container}>\n {children}\n </PortalContainerContext.Provider>\n )\n}\n","/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;--color-red-500:oklch(63.7% .237 25.331);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height:calc(1.5/1);--font-weight-thin:100;--font-weight-extralight:200;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--leading-relaxed:1.625;--radius-sm:calc(.5rem - 4px);--radius-md:calc(.5rem - 2px);--radius-lg:.5rem;--radius-xl:.75rem;--ease-out:cubic-bezier(0,0,.2,1);--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-xl:24px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-border:#e6e6e6;--color-ring:#262626;--color-background:#fff;--color-foreground:#171717;--color-primary:#171717;--color-primary-foreground:#fafafa;--color-secondary-foreground:#171717;--color-destructive:#ef4444;--color-destructive-foreground:#fafafa;--color-muted:#f2f2f2;--color-muted-foreground:#737373;--color-popover:#fff;--color-popover-foreground:#171717}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:root,:host{color-scheme:light;color:var(--color-foreground)}@media (prefers-color-scheme:dark){:root,:host(:not([data-theme])),:host([data-theme=system]){color-scheme:dark;color:var(--color-foreground);--color-border:#2e2e2e;--color-input:#2e2e2e;--color-ring:#d4d4d4;--color-background:#121212;--color-foreground:#fafafa;--color-primary:#fafafa;--color-primary-foreground:#171717;--color-secondary:#262626;--color-secondary-foreground:#fafafa;--color-destructive:#7f1d1d;--color-destructive-foreground:#fafafa;--color-muted:#262626;--color-muted-foreground:#a3a3a3;--color-accent:#262626;--color-accent-foreground:#fafafa;--color-popover:#171717;--color-popover-foreground:#fafafa}}:host([data-theme=dark]){color-scheme:dark;color:var(--color-foreground);--color-border:#2e2e2e;--color-input:#2e2e2e;--color-ring:#d4d4d4;--color-background:#121212;--color-foreground:#fafafa;--color-primary:#fafafa;--color-primary-foreground:#171717;--color-secondary:#262626;--color-secondary-foreground:#fafafa;--color-destructive:#7f1d1d;--color-destructive-foreground:#fafafa;--color-muted:#262626;--color-muted-foreground:#a3a3a3;--color-accent:#262626;--color-accent-foreground:#fafafa;--color-popover:#171717;--color-popover-foreground:#fafafa}*,:before,:after{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:var(--color-background);--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;border-color:var(--color-border)}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing)*0)}.top-1\\/2{top:50%}.left-1\\.5{left:calc(var(--spacing)*1.5)}.left-1\\/2{left:50%}.left-2{left:calc(var(--spacing)*2)}.z-\\[99990\\]{z-index:99990}.z-\\[99991\\]{z-index:99991}.z-\\[99998\\]{z-index:99998}.z-\\[99999\\]{z-index:99999}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-0\\.5{margin-inline:calc(var(--spacing)*.5)}.mx-1\\.5{margin-inline:calc(var(--spacing)*1.5)}.my-0\\.5{margin-block:calc(var(--spacing)*.5)}.my-1{margin-block:calc(var(--spacing)*1)}.mt-0{margin-top:calc(var(--spacing)*0)}.mt-0\\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2\\.5{margin-top:calc(var(--spacing)*2.5)}.mr-1{margin-right:calc(var(--spacing)*1)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.ml-0{margin-left:calc(var(--spacing)*0)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-1\\.5{margin-left:calc(var(--spacing)*1.5)}.ml-2{margin-left:calc(var(--spacing)*2)}.block{display:block}.flex{display:flex}.flow-root{display:flow-root}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.list-item{display:list-item}.size-1{width:calc(var(--spacing)*1);height:calc(var(--spacing)*1)}.size-2\\.5{width:calc(var(--spacing)*2.5);height:calc(var(--spacing)*2.5)}.size-3{width:calc(var(--spacing)*3);height:calc(var(--spacing)*3)}.size-3\\.5{width:calc(var(--spacing)*3.5);height:calc(var(--spacing)*3.5)}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-5{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5)}.size-6{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.size-7{width:calc(var(--spacing)*7);height:calc(var(--spacing)*7)}.size-full{width:100%;height:100%}.h-0\\.5{height:calc(var(--spacing)*.5)}.h-2{height:calc(var(--spacing)*2)}.h-3\\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-11{height:calc(var(--spacing)*11)}.h-\\[150px\\]{height:150px}.h-auto{height:auto}.h-fit{height:fit-content}.h-full{height:100%}.max-h-0{max-height:calc(var(--spacing)*0)}.max-h-3{max-height:calc(var(--spacing)*3)}.max-h-48{max-height:calc(var(--spacing)*48)}.max-h-\\[220px\\]{max-height:220px}.max-h-\\[240px\\]{max-height:240px}.min-h-\\[18px\\]{min-height:18px}.w-0\\.5{width:calc(var(--spacing)*.5)}.w-2{width:calc(var(--spacing)*2)}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-10{width:calc(var(--spacing)*10)}.w-14{width:calc(var(--spacing)*14)}.w-\\[1\\.5px\\]{width:1.5px}.w-\\[60px\\]{width:60px}.w-\\[68px\\]{width:68px}.w-\\[80px\\]{width:80px}.w-\\[200px\\]{width:200px}.w-\\[220px\\]{width:220px}.w-\\[260px\\]{width:260px}.w-\\[280px\\]{width:280px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.max-w-0{max-width:calc(var(--spacing)*0)}.max-w-3{max-width:calc(var(--spacing)*3)}.max-w-\\[200px\\]{max-width:200px}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\\[20px\\]{min-width:20px}.min-w-\\[90px\\]{min-width:90px}.min-w-\\[100px\\]{min-width:100px}.min-w-\\[120px\\]{min-width:120px}.min-w-\\[140px\\]{min-width:140px}.min-w-\\[180px\\]{min-width:180px}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-x-1\\/2{--tw-translate-x:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\\/2{--tw-translate-y:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-crosshair{cursor:crosshair}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.\\[appearance\\:textfield\\]{appearance:textfield}.appearance-none{appearance:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-around{justify-content:space-around}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-evenly{justify-content:space-evenly}.justify-start{justify-content:flex-start}.gap-0\\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-\\[2px\\]{gap:2px}:where(.space-y-1\\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\\[8px\\]{border-radius:8px}.rounded-\\[14px\\]{border-radius:14px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-tl{border-top-left-radius:.25rem}.rounded-tr{border-top-right-radius:.25rem}.rounded-br{border-bottom-right-radius:.25rem}.rounded-bl{border-bottom-left-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-dotted{--tw-border-style:dotted;border-style:dotted}.border-double{--tw-border-style:double;border-style:double}.border-none{--tw-border-style:none;border-style:none}.border-solid{--tw-border-style:solid;border-style:solid}.\\[border-top-style\\:solid\\]{border-top-style:solid}.\\[border-right-style\\:dashed\\]{border-right-style:dashed}.\\[border-bottom-style\\:dashed\\]{border-bottom-style:dashed}.\\[border-bottom-style\\:dotted\\]{border-bottom-style:dotted}.\\[border-bottom-style\\:solid\\]{border-bottom-style:solid}.\\[border-left-style\\:double\\]{border-left-style:double}.\\[border-left-style\\:solid\\]{border-left-style:solid}.border-border\\/30{border-color:#e6e6e64d}@supports (color:color-mix(in lab, red, red)){.border-border\\/30{border-color:color-mix(in oklab,var(--color-border)30%,transparent)}}.border-border\\/50{border-color:#e6e6e680}@supports (color:color-mix(in lab, red, red)){.border-border\\/50{border-color:color-mix(in oklab,var(--color-border)50%,transparent)}}.border-foreground\\/10{border-color:#1717171a}@supports (color:color-mix(in lab, red, red)){.border-foreground\\/10{border-color:color-mix(in oklab,var(--color-foreground)10%,transparent)}}.border-white{border-color:var(--color-white)}.bg-\\[\\#171717\\]{background-color:#171717}.bg-background{background-color:var(--color-background)}.bg-background\\/60{background-color:#fff9}@supports (color:color-mix(in lab, red, red)){.bg-background\\/60{background-color:color-mix(in oklab,var(--color-background)60%,transparent)}}.bg-blue-500{background-color:var(--color-blue-500)}.bg-destructive{background-color:var(--color-destructive)}.bg-foreground{background-color:var(--color-foreground)}.bg-foreground\\/25{background-color:#17171740}@supports (color:color-mix(in lab, red, red)){.bg-foreground\\/25{background-color:color-mix(in oklab,var(--color-foreground)25%,transparent)}}.bg-muted{background-color:var(--color-muted)}.bg-muted-foreground\\/30{background-color:#7373734d}@supports (color:color-mix(in lab, red, red)){.bg-muted-foreground\\/30{background-color:color-mix(in oklab,var(--color-muted-foreground)30%,transparent)}}.bg-muted\\/20{background-color:#f2f2f233}@supports (color:color-mix(in lab, red, red)){.bg-muted\\/20{background-color:color-mix(in oklab,var(--color-muted)20%,transparent)}}.bg-popover{background-color:var(--color-popover)}.bg-primary{background-color:var(--color-primary)}.bg-transparent{background-color:#0000}.bg-white\\/20{background-color:#fff3}@supports (color:color-mix(in lab, red, red)){.bg-white\\/20{background-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.fill-border{fill:var(--color-border)}.p-0{padding:calc(var(--spacing)*0)}.p-0\\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:calc(var(--spacing)*1)}.p-1\\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.px-0{padding-inline:calc(var(--spacing)*0)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-8{padding-inline:calc(var(--spacing)*8)}.py-0{padding-block:calc(var(--spacing)*0)}.py-0\\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-3\\.5{padding-block:calc(var(--spacing)*3.5)}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-1\\.5{padding-top:calc(var(--spacing)*1.5)}.pt-2\\.5{padding-top:calc(var(--spacing)*2.5)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-\\[13px\\]{padding-top:13px}.pr-1{padding-right:calc(var(--spacing)*1)}.pr-1\\.5{padding-right:calc(var(--spacing)*1.5)}.pr-2{padding-right:calc(var(--spacing)*2)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-1\\.5{padding-bottom:calc(var(--spacing)*1.5)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pl-0{padding-left:calc(var(--spacing)*0)}.pl-6{padding-left:calc(var(--spacing)*6)}.pl-7{padding-left:calc(var(--spacing)*7)}.text-center{text-align:center}.text-justify{text-align:justify}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\[7px\\]{font-size:7px}.text-\\[10px\\]{font-size:10px}.text-\\[11px\\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-extralight{--tw-font-weight:var(--font-weight-extralight);font-weight:var(--font-weight-extralight)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.font-thin{--tw-font-weight:var(--font-weight-thin);font-weight:var(--font-weight-thin)}.whitespace-nowrap{white-space:nowrap}.text-\\[\\#fafafa\\]{color:#fafafa}.text-background{color:var(--color-background)}.text-blue-500{color:var(--color-blue-500)}.text-destructive-foreground{color:var(--color-destructive-foreground)}.text-foreground{color:var(--color-foreground)}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-popover-foreground{color:var(--color-popover-foreground)}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-red-500{color:var(--color-red-500)}.text-secondary-foreground{color:var(--color-secondary-foreground)}.text-white{color:var(--color-white)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\\[0_0_0_1px_rgba\\(0\\,0\\,0\\,0\\.3\\)\\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,#0000004d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\\[inset_0_0_0_1px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:inset 0 0 0 1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-white{--tw-ring-color:var(--color-white)}.outline,.outline-1{outline-style:var(--tw-outline-style);outline-width:1px}.outline-foreground\\/10{outline-color:#1717171a}@supports (color:color-mix(in lab, red, red)){.outline-foreground\\/10{outline-color:color-mix(in oklab,var(--color-foreground)10%,transparent)}}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[max-width\\,max-height\\,margin\\,opacity\\]{transition-property:max-width,max-height,margin,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[max-width\\,max-height\\,padding\\,opacity\\]{transition-property:max-width,max-height,padding,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.animate-in{--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial;animation-name:enter;animation-duration:.15s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.duration-200{animation-duration:.2s}.duration-300{animation-duration:.3s}.ease-out{animation-timing-function:cubic-bezier(0,0,.2,1)}.fade-in-0{--tw-enter-opacity:0}.running{animation-play-state:running}.zoom-in-95{--tw-enter-scale:.95}@media (hover:hover){.group-hover\\:max-h-3:is(:where(.group):hover *){max-height:calc(var(--spacing)*3)}.group-hover\\:max-w-3:is(:where(.group):hover *){max-width:calc(var(--spacing)*3)}.group-hover\\:pt-0:is(:where(.group):hover *){padding-top:calc(var(--spacing)*0)}.group-hover\\:pr-1\\.5:is(:where(.group):hover *){padding-right:calc(var(--spacing)*1.5)}.group-hover\\:pb-1\\.5:is(:where(.group):hover *){padding-bottom:calc(var(--spacing)*1.5)}.group-hover\\:pl-0:is(:where(.group):hover *){padding-left:calc(var(--spacing)*0)}.group-hover\\:opacity-100:is(:where(.group):hover *){opacity:1}.group-hover\\/pin\\:inline:is(:where(.group\\/pin):hover *){display:inline}}.file\\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\\:bg-transparent::file-selector-button{background-color:#0000}.file\\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\\:text-foreground::file-selector-button{color:var(--color-foreground)}.placeholder\\:text-muted-foreground::placeholder{color:var(--color-muted-foreground)}@media (hover:hover){.hover\\:scale-\\[1\\.67\\]:hover{scale:1.67}.hover\\:bg-blue-600:hover{background-color:var(--color-blue-600)}.hover\\:bg-destructive\\/90:hover{background-color:#ef4444e6}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-destructive\\/90:hover{background-color:color-mix(in oklab,var(--color-destructive)90%,transparent)}}.hover\\:bg-foreground\\/80:hover{background-color:#171717cc}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-foreground\\/80:hover{background-color:color-mix(in oklab,var(--color-foreground)80%,transparent)}}.hover\\:bg-muted:hover{background-color:var(--color-muted)}.hover\\:bg-muted-foreground\\/10:hover{background-color:#7373731a}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted-foreground\\/10:hover{background-color:color-mix(in oklab,var(--color-muted-foreground)10%,transparent)}}.hover\\:bg-muted\\/50:hover{background-color:#f2f2f280}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted\\/50:hover{background-color:color-mix(in oklab,var(--color-muted)50%,transparent)}}.hover\\:bg-primary\\/90:hover{background-color:#171717e6}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab,var(--color-primary)90%,transparent)}}.hover\\:text-foreground:hover{color:var(--color-foreground)}.hover\\:underline:hover{text-decoration-line:underline}.hover\\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\\:ring-ring:focus-visible{--tw-ring-color:var(--color-ring)}.focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\\:cursor-grabbing:active{cursor:grabbing}.disabled\\:pointer-events-none:disabled{pointer-events:none}.disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:opacity-50:disabled{opacity:.5}.data-\\[closed\\]\\:animate-out[data-closed]{--tw-exit-opacity:initial;--tw-exit-scale:initial;--tw-exit-rotate:initial;--tw-exit-translate-x:initial;--tw-exit-translate-y:initial;animation-name:exit;animation-duration:.15s}.data-\\[closed\\]\\:fade-out-0[data-closed]{--tw-exit-opacity:0}.data-\\[closed\\]\\:zoom-out-95[data-closed]{--tw-exit-scale:.95}.data-\\[highlighted\\]\\:bg-muted[data-highlighted]{background-color:var(--color-muted)}.data-\\[highlighted\\]\\:text-foreground[data-highlighted]{color:var(--color-foreground)}.data-\\[side\\=bottom\\]\\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:-.5rem}.data-\\[side\\=left\\]\\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:.5rem}.data-\\[side\\=right\\]\\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:-.5rem}.data-\\[side\\=top\\]\\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:.5rem}@media (min-width:48rem){.md\\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.\\[\\&_svg\\]\\:size-4 svg{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.\\[\\&\\:\\:-webkit-inner-spin-button\\]\\:appearance-none::-webkit-inner-spin-button{appearance:none}.\\[\\&\\:\\:-webkit-outer-spin-button\\]\\:appearance-none::-webkit-outer-spin-button{appearance:none}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0))}}@property --tw-translate-x{syntax:\"*\";inherits:false;initial-value:0}@property --tw-translate-y{syntax:\"*\";inherits:false;initial-value:0}@property --tw-translate-z{syntax:\"*\";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:\"*\";inherits:false}@property --tw-rotate-y{syntax:\"*\";inherits:false}@property --tw-rotate-z{syntax:\"*\";inherits:false}@property --tw-skew-x{syntax:\"*\";inherits:false}@property --tw-skew-y{syntax:\"*\";inherits:false}@property --tw-space-y-reverse{syntax:\"*\";inherits:false;initial-value:0}@property --tw-border-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-leading{syntax:\"*\";inherits:false}@property --tw-font-weight{syntax:\"*\";inherits:false}@property --tw-ordinal{syntax:\"*\";inherits:false}@property --tw-slashed-zero{syntax:\"*\";inherits:false}@property --tw-numeric-figure{syntax:\"*\";inherits:false}@property --tw-numeric-spacing{syntax:\"*\";inherits:false}@property --tw-numeric-fraction{syntax:\"*\";inherits:false}@property --tw-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:\"*\";inherits:false}@property --tw-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:\"*\";inherits:false}@property --tw-inset-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:\"*\";inherits:false}@property --tw-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:\"*\";inherits:false}@property --tw-inset-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:\"*\";inherits:false}@property --tw-ring-offset-width{syntax:\"<length>\";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:\"*\";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-blur{syntax:\"*\";inherits:false}@property --tw-brightness{syntax:\"*\";inherits:false}@property --tw-contrast{syntax:\"*\";inherits:false}@property --tw-grayscale{syntax:\"*\";inherits:false}@property --tw-hue-rotate{syntax:\"*\";inherits:false}@property --tw-invert{syntax:\"*\";inherits:false}@property --tw-opacity{syntax:\"*\";inherits:false}@property --tw-saturate{syntax:\"*\";inherits:false}@property --tw-sepia{syntax:\"*\";inherits:false}@property --tw-drop-shadow{syntax:\"*\";inherits:false}@property --tw-drop-shadow-color{syntax:\"*\";inherits:false}@property --tw-drop-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:\"*\";inherits:false}@property --tw-backdrop-blur{syntax:\"*\";inherits:false}@property --tw-backdrop-brightness{syntax:\"*\";inherits:false}@property --tw-backdrop-contrast{syntax:\"*\";inherits:false}@property --tw-backdrop-grayscale{syntax:\"*\";inherits:false}@property --tw-backdrop-hue-rotate{syntax:\"*\";inherits:false}@property --tw-backdrop-invert{syntax:\"*\";inherits:false}@property --tw-backdrop-opacity{syntax:\"*\";inherits:false}@property --tw-backdrop-saturate{syntax:\"*\";inherits:false}@property --tw-backdrop-sepia{syntax:\"*\";inherits:false}@property --tw-duration{syntax:\"*\";inherits:false}@property --tw-ease{syntax:\"*\";inherits:false}@keyframes pulse{50%{opacity:.5}}","import type {\n CSSPropertyValue,\n SpacingProperties,\n BorderRadiusProperties,\n BorderStyle,\n BorderProperties,\n FlexProperties,\n SizingProperties,\n SizingValue,\n SizingMode,\n SpacingPropertyKey,\n BorderRadiusPropertyKey,\n BorderPropertyKey,\n FlexPropertyKey,\n SizingPropertyKey,\n TypographyPropertyKey,\n TypographyProperties,\n ElementInfo,\n ReactComponentFrame,\n ElementLocator,\n DomSourceLocation,\n ColorValue,\n ColorProperties,\n ColorPropertyKey,\n MeasurementLine,\n Guideline,\n DropIndicator,\n SessionEdit,\n} from './types'\n\ndeclare global {\n interface Window {\n __DIRECT_EDIT_DEVTOOLS__?: {\n getFiberForElement: (element: HTMLElement) => unknown | null\n hasHook?: boolean\n }\n }\n}\n\nexport function parsePropertyValue(value: string): CSSPropertyValue {\n const raw = value.trim()\n const match = raw.match(/^(-?\\d*\\.?\\d+)(px|rem|em|%)?$/)\n\n if (match) {\n return {\n numericValue: parseFloat(match[1]),\n unit: (match[2] as CSSPropertyValue['unit']) || 'px',\n raw,\n }\n }\n\n return {\n numericValue: 0,\n unit: 'px',\n raw,\n }\n}\n\nexport function formatPropertyValue(value: CSSPropertyValue): string {\n if (value.raw === 'auto' || value.raw === 'inherit' || value.raw === 'initial') {\n return value.raw\n }\n return `${value.numericValue}${value.unit}`\n}\n\nexport function getComputedStyles(element: HTMLElement): {\n spacing: SpacingProperties\n borderRadius: BorderRadiusProperties\n flex: FlexProperties\n} {\n const computed = window.getComputedStyle(element)\n\n return {\n spacing: {\n paddingTop: parsePropertyValue(computed.paddingTop),\n paddingRight: parsePropertyValue(computed.paddingRight),\n paddingBottom: parsePropertyValue(computed.paddingBottom),\n paddingLeft: parsePropertyValue(computed.paddingLeft),\n marginTop: parsePropertyValue(computed.marginTop),\n marginRight: parsePropertyValue(computed.marginRight),\n marginBottom: parsePropertyValue(computed.marginBottom),\n marginLeft: parsePropertyValue(computed.marginLeft),\n gap: parsePropertyValue(computed.gap || '0px'),\n },\n borderRadius: {\n borderTopLeftRadius: parsePropertyValue(computed.borderTopLeftRadius),\n borderTopRightRadius: parsePropertyValue(computed.borderTopRightRadius),\n borderBottomRightRadius: parsePropertyValue(computed.borderBottomRightRadius),\n borderBottomLeftRadius: parsePropertyValue(computed.borderBottomLeftRadius),\n },\n flex: {\n display: computed.display,\n flexDirection: computed.flexDirection as FlexProperties['flexDirection'],\n justifyContent: computed.justifyContent,\n alignItems: computed.alignItems,\n },\n }\n}\n\nexport function getComputedBorderStyles(element: HTMLElement): BorderProperties {\n const computed = window.getComputedStyle(element)\n\n const topStyle = computed.borderTopStyle as BorderStyle\n const rightStyle = computed.borderRightStyle as BorderStyle\n const bottomStyle = computed.borderBottomStyle as BorderStyle\n const leftStyle = computed.borderLeftStyle as BorderStyle\n\n const topWidth = parsePropertyValue(computed.borderTopWidth)\n const rightWidth = parsePropertyValue(computed.borderRightWidth)\n const bottomWidth = parsePropertyValue(computed.borderBottomWidth)\n const leftWidth = parsePropertyValue(computed.borderLeftWidth)\n\n return {\n borderTopStyle: topStyle,\n borderTopWidth: topWidth,\n borderRightStyle: rightStyle,\n borderRightWidth: rightWidth,\n borderBottomStyle: bottomStyle,\n borderBottomWidth: bottomWidth,\n borderLeftStyle: leftStyle,\n borderLeftWidth: leftWidth,\n }\n}\n\nexport function getOriginalInlineStyles(element: HTMLElement): Record<string, string> {\n const styles: Record<string, string> = {}\n const relevantProps = [\n 'padding-top',\n 'padding-right',\n 'padding-bottom',\n 'padding-left',\n 'padding',\n 'margin-top',\n 'margin-right',\n 'margin-bottom',\n 'margin-left',\n 'margin',\n 'gap',\n 'border-radius',\n 'border-top-left-radius',\n 'border-top-right-radius',\n 'border-bottom-right-radius',\n 'border-bottom-left-radius',\n 'border',\n 'border-style',\n 'border-width',\n 'border-top-style',\n 'border-top-width',\n 'border-right-style',\n 'border-right-width',\n 'border-bottom-style',\n 'border-bottom-width',\n 'border-left-style',\n 'border-left-width',\n 'display',\n 'flex-direction',\n 'justify-content',\n 'align-items',\n 'width',\n 'height',\n 'background-color',\n 'color',\n 'border-color',\n 'outline-color',\n 'font-family',\n 'font-weight',\n 'font-size',\n 'line-height',\n 'letter-spacing',\n 'text-align',\n ]\n\n for (const prop of relevantProps) {\n const value = element.style.getPropertyValue(prop)\n if (value) {\n styles[prop] = value\n }\n }\n\n return styles\n}\n\nconst tailwindClassMap: Record<string, { prefix: string; scale: Record<number, string> }> = {\n 'padding-top': {\n prefix: 'pt',\n scale: { 0: '0', 1: 'px', 2: '0.5', 4: '1', 8: '2', 12: '3', 16: '4', 20: '5', 24: '6', 32: '8' },\n },\n 'padding-right': {\n prefix: 'pr',\n scale: { 0: '0', 1: 'px', 2: '0.5', 4: '1', 8: '2', 12: '3', 16: '4', 20: '5', 24: '6', 32: '8' },\n },\n 'padding-bottom': {\n prefix: 'pb',\n scale: { 0: '0', 1: 'px', 2: '0.5', 4: '1', 8: '2', 12: '3', 16: '4', 20: '5', 24: '6', 32: '8' },\n },\n 'padding-left': {\n prefix: 'pl',\n scale: { 0: '0', 1: 'px', 2: '0.5', 4: '1', 8: '2', 12: '3', 16: '4', 20: '5', 24: '6', 32: '8' },\n },\n 'margin-top': {\n prefix: 'mt',\n scale: { 0: '0', 1: 'px', 2: '0.5', 4: '1', 8: '2', 12: '3', 16: '4', 20: '5', 24: '6', 32: '8' },\n },\n 'margin-right': {\n prefix: 'mr',\n scale: { 0: '0', 1: 'px', 2: '0.5', 4: '1', 8: '2', 12: '3', 16: '4', 20: '5', 24: '6', 32: '8' },\n },\n 'margin-bottom': {\n prefix: 'mb',\n scale: { 0: '0', 1: 'px', 2: '0.5', 4: '1', 8: '2', 12: '3', 16: '4', 20: '5', 24: '6', 32: '8' },\n },\n 'margin-left': {\n prefix: 'ml',\n scale: { 0: '0', 1: 'px', 2: '0.5', 4: '1', 8: '2', 12: '3', 16: '4', 20: '5', 24: '6', 32: '8' },\n },\n gap: {\n prefix: 'gap',\n scale: { 0: '0', 1: 'px', 2: '0.5', 4: '1', 8: '2', 12: '3', 16: '4', 20: '5', 24: '6', 32: '8' },\n },\n 'border-width': {\n prefix: 'border',\n scale: { 0: '0', 1: '', 2: '2', 4: '4', 8: '8' },\n },\n 'border-top-width': {\n prefix: 'border-t',\n scale: { 0: '0', 1: '', 2: '2', 4: '4', 8: '8' },\n },\n 'border-right-width': {\n prefix: 'border-r',\n scale: { 0: '0', 1: '', 2: '2', 4: '4', 8: '8' },\n },\n 'border-bottom-width': {\n prefix: 'border-b',\n scale: { 0: '0', 1: '', 2: '2', 4: '4', 8: '8' },\n },\n 'border-left-width': {\n prefix: 'border-l',\n scale: { 0: '0', 1: '', 2: '2', 4: '4', 8: '8' },\n },\n 'border-radius': {\n prefix: 'rounded',\n scale: { 0: 'none', 2: 'sm', 4: '', 6: 'md', 8: 'lg', 12: 'xl', 16: '2xl', 24: '3xl', 9999: 'full' },\n },\n 'border-top-left-radius': {\n prefix: 'rounded-tl',\n scale: { 0: 'none', 2: 'sm', 4: '', 6: 'md', 8: 'lg', 12: 'xl', 16: '2xl', 24: '3xl', 9999: 'full' },\n },\n 'border-top-right-radius': {\n prefix: 'rounded-tr',\n scale: { 0: 'none', 2: 'sm', 4: '', 6: 'md', 8: 'lg', 12: 'xl', 16: '2xl', 24: '3xl', 9999: 'full' },\n },\n 'border-bottom-right-radius': {\n prefix: 'rounded-br',\n scale: { 0: 'none', 2: 'sm', 4: '', 6: 'md', 8: 'lg', 12: 'xl', 16: '2xl', 24: '3xl', 9999: 'full' },\n },\n 'border-bottom-left-radius': {\n prefix: 'rounded-bl',\n scale: { 0: 'none', 2: 'sm', 4: '', 6: 'md', 8: 'lg', 12: 'xl', 16: '2xl', 24: '3xl', 9999: 'full' },\n },\n}\n\nconst flexDirectionMap: Record<string, string> = {\n row: 'flex-row',\n 'row-reverse': 'flex-row-reverse',\n column: 'flex-col',\n 'column-reverse': 'flex-col-reverse',\n}\n\nconst justifyContentMap: Record<string, string> = {\n 'flex-start': 'justify-start',\n 'flex-end': 'justify-end',\n center: 'justify-center',\n 'space-between': 'justify-between',\n 'space-around': 'justify-around',\n 'space-evenly': 'justify-evenly',\n start: 'justify-start',\n end: 'justify-end',\n}\n\nconst alignItemsMap: Record<string, string> = {\n 'flex-start': 'items-start',\n 'flex-end': 'items-end',\n center: 'items-center',\n baseline: 'items-baseline',\n stretch: 'items-stretch',\n start: 'items-start',\n end: 'items-end',\n}\n\nfunction getExactScaleValue(value: number, scale: Record<number, string>): string | null {\n if (Object.prototype.hasOwnProperty.call(scale, value)) {\n return scale[value]\n }\n return null\n}\n\nexport function stylesToTailwind(styles: Record<string, string>): string {\n const classes: string[] = []\n\n for (const [prop, value] of Object.entries(styles)) {\n if (tailwindClassMap[prop]) {\n const parsed = parsePropertyValue(value)\n const mapping = tailwindClassMap[prop]\n if (value === 'auto') {\n classes.push(`${mapping.prefix}-auto`)\n continue\n }\n if (parsed.unit === 'px') {\n const exactScale = getExactScaleValue(parsed.numericValue, mapping.scale)\n if (exactScale !== null) {\n if (exactScale === '') {\n classes.push(mapping.prefix)\n } else {\n classes.push(`${mapping.prefix}-${exactScale}`)\n }\n continue\n }\n }\n classes.push(`${mapping.prefix}-[${value}]`)\n continue\n }\n\n if (prop === 'flex-direction' && flexDirectionMap[value]) {\n classes.push(flexDirectionMap[value])\n continue\n }\n\n if (prop === 'justify-content' && justifyContentMap[value]) {\n classes.push(justifyContentMap[value])\n continue\n }\n\n if (prop === 'align-items' && alignItemsMap[value]) {\n classes.push(alignItemsMap[value])\n continue\n }\n\n if (prop === 'display') {\n if (value === 'flex') classes.push('flex')\n else if (value === 'inline-flex') classes.push('inline-flex')\n else if (value === 'grid') classes.push('grid')\n else if (value === 'block') classes.push('block')\n else if (value === 'inline-block') classes.push('inline-block')\n else if (value === 'none') classes.push('hidden')\n continue\n }\n\n if (prop === 'width') {\n if (value === '100%') classes.push('w-full')\n else if (value === 'fit-content') classes.push('w-fit')\n else if (value === 'auto') classes.push('w-auto')\n else classes.push(`w-[${value}]`)\n continue\n }\n\n if (prop === 'height') {\n if (value === '100%') classes.push('h-full')\n else if (value === 'fit-content') classes.push('h-fit')\n else if (value === 'auto') classes.push('h-auto')\n else classes.push(`h-[${value}]`)\n continue\n }\n\n if (prop === 'background-color') {\n const colorValue = parseColorValue(value)\n classes.push(colorToTailwind('backgroundColor', colorValue))\n continue\n }\n\n if (prop === 'color') {\n const colorValue = parseColorValue(value)\n classes.push(colorToTailwind('color', colorValue))\n continue\n }\n\n if (prop === 'border-color') {\n const colorValue = parseColorValue(value)\n classes.push(colorToTailwind('borderColor', colorValue))\n continue\n }\n\n if (prop === 'border-style') {\n const styleMap: Record<string, string> = {\n none: 'border-none',\n solid: 'border-solid',\n dashed: 'border-dashed',\n dotted: 'border-dotted',\n double: 'border-double',\n }\n classes.push(styleMap[value] || `[border-style:${value}]`)\n continue\n }\n\n // Tailwind has no per-side border-style utilities — consolidate when all sides match\n if (prop === 'border-top-style' || prop === 'border-right-style' || prop === 'border-bottom-style' || prop === 'border-left-style') {\n const allPresent =\n 'border-top-style' in styles &&\n 'border-right-style' in styles &&\n 'border-bottom-style' in styles &&\n 'border-left-style' in styles\n if (allPresent) {\n // Only emit once (from border-top-style) when all four sides are present\n if (prop === 'border-top-style') {\n const allSame =\n styles['border-top-style'] === styles['border-right-style'] &&\n styles['border-top-style'] === styles['border-bottom-style'] &&\n styles['border-top-style'] === styles['border-left-style']\n if (allSame) {\n const styleMap: Record<string, string> = {\n none: 'border-none',\n solid: 'border-solid',\n dashed: 'border-dashed',\n dotted: 'border-dotted',\n double: 'border-double',\n }\n classes.push(styleMap[value] || `[border-style:${value}]`)\n } else {\n // Sides differ — emit each side individually\n classes.push(`[border-top-style:${styles['border-top-style']}]`)\n classes.push(`[border-right-style:${styles['border-right-style']}]`)\n classes.push(`[border-bottom-style:${styles['border-bottom-style']}]`)\n classes.push(`[border-left-style:${styles['border-left-style']}]`)\n }\n }\n } else {\n // Emit arbitrary-property syntax for individual side styles\n classes.push(`[${prop}:${value}]`)\n }\n continue\n }\n\n if (prop === 'outline-color') {\n const colorValue = parseColorValue(value)\n classes.push(colorToTailwind('outlineColor', colorValue))\n continue\n }\n\n if (prop === 'font-size') {\n classes.push(`text-[${value}]`)\n continue\n }\n\n if (prop === 'font-weight') {\n const weightMap: Record<string, string> = {\n '100': 'font-thin',\n '200': 'font-extralight',\n '300': 'font-light',\n '400': 'font-normal',\n '500': 'font-medium',\n '600': 'font-semibold',\n '700': 'font-bold',\n '800': 'font-extrabold',\n '900': 'font-black',\n }\n classes.push(weightMap[value] || `font-[${value}]`)\n continue\n }\n\n if (prop === 'line-height') {\n classes.push(`leading-[${value}]`)\n continue\n }\n\n if (prop === 'letter-spacing') {\n classes.push(`tracking-[${value}]`)\n continue\n }\n\n if (prop === 'text-align') {\n const alignMap: Record<string, string> = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n justify: 'text-justify',\n }\n if (alignMap[value]) classes.push(alignMap[value])\n continue\n }\n\n if (prop === 'font-family') {\n classes.push(`font-[${value.replace(/\\s+/g, '_')}]`)\n continue\n }\n }\n\n return classes.join(' ')\n}\n\nexport const propertyToCSSMap: Record<SpacingPropertyKey, string> = {\n paddingTop: 'padding-top',\n paddingRight: 'padding-right',\n paddingBottom: 'padding-bottom',\n paddingLeft: 'padding-left',\n marginTop: 'margin-top',\n marginRight: 'margin-right',\n marginBottom: 'margin-bottom',\n marginLeft: 'margin-left',\n gap: 'gap',\n}\n\nexport const borderRadiusPropertyToCSSMap: Record<BorderRadiusPropertyKey, string> = {\n borderTopLeftRadius: 'border-top-left-radius',\n borderTopRightRadius: 'border-top-right-radius',\n borderBottomRightRadius: 'border-bottom-right-radius',\n borderBottomLeftRadius: 'border-bottom-left-radius',\n}\n\nexport const borderPropertyToCSSMap: Record<BorderPropertyKey, string> = {\n borderTopStyle: 'border-top-style',\n borderTopWidth: 'border-top-width',\n borderRightStyle: 'border-right-style',\n borderRightWidth: 'border-right-width',\n borderBottomStyle: 'border-bottom-style',\n borderBottomWidth: 'border-bottom-width',\n borderLeftStyle: 'border-left-style',\n borderLeftWidth: 'border-left-width',\n}\n\nexport const flexPropertyToCSSMap: Record<FlexPropertyKey, string> = {\n display: 'display',\n flexDirection: 'flex-direction',\n justifyContent: 'justify-content',\n alignItems: 'align-items',\n}\n\nexport const sizingPropertyToCSSMap: Record<SizingPropertyKey, string> = {\n width: 'width',\n height: 'height',\n}\n\nexport const typographyPropertyToCSSMap: Record<TypographyPropertyKey, string> = {\n fontFamily: 'font-family',\n fontWeight: 'font-weight',\n fontSize: 'font-size',\n lineHeight: 'line-height',\n letterSpacing: 'letter-spacing',\n textAlign: 'text-align',\n textVerticalAlign: 'align-items',\n}\n\nconst TEXT_ELEMENT_TAGS = new Set([\n 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\n 'span', 'label', 'a', 'strong', 'em', 'small',\n 'blockquote', 'li', 'td', 'th', 'caption', 'figcaption',\n 'legend', 'dt', 'dd', 'abbr', 'cite', 'code', 'pre',\n])\n\nfunction hasDirectNonWhitespaceText(element: HTMLElement): boolean {\n return Array.from(element.childNodes).some(\n (node) => node.nodeType === Node.TEXT_NODE && Boolean(node.textContent?.trim())\n )\n}\n\nexport function isTextElement(element: HTMLElement): boolean {\n const tagName = element.tagName.toLowerCase()\n if (TEXT_ELEMENT_TAGS.has(tagName)) {\n return true\n }\n if (hasDirectNonWhitespaceText(element)) {\n return true\n }\n if (element.children.length === 0 && element.textContent?.trim()) {\n return true\n }\n return false\n}\n\nexport function getComputedTypography(element: HTMLElement): TypographyProperties {\n const computed = window.getComputedStyle(element)\n\n let textVerticalAlign: TypographyProperties['textVerticalAlign'] = 'flex-start'\n if (computed.display === 'flex' || computed.display === 'inline-flex') {\n const alignItems = computed.alignItems\n if (alignItems === 'center') textVerticalAlign = 'center'\n else if (alignItems === 'flex-end' || alignItems === 'end') textVerticalAlign = 'flex-end'\n }\n\n // Handle \"normal\" keyword for line-height (use font-size as approximation)\n const lineHeight = computed.lineHeight === 'normal'\n ? { numericValue: parseFloat(computed.fontSize) * 1.2, unit: 'px' as const, raw: `${Math.round(parseFloat(computed.fontSize) * 1.2)}px` }\n : parsePropertyValue(computed.lineHeight)\n\n // Handle letter-spacing: convert px to em for consistent editing\n const fontSize = parseFloat(computed.fontSize)\n let letterSpacing: CSSPropertyValue\n if (computed.letterSpacing === 'normal') {\n letterSpacing = { numericValue: 0, unit: 'em' as const, raw: '0em' }\n } else {\n const parsed = parsePropertyValue(computed.letterSpacing)\n if (parsed.unit === 'px' && fontSize > 0) {\n const emValue = Math.round((parsed.numericValue / fontSize) * 100) / 100\n letterSpacing = { numericValue: emValue, unit: 'em' as const, raw: `${emValue}em` }\n } else {\n letterSpacing = parsed\n }\n }\n\n return {\n fontFamily: computed.fontFamily,\n fontWeight: computed.fontWeight,\n fontSize: parsePropertyValue(computed.fontSize),\n lineHeight,\n letterSpacing,\n textAlign: computed.textAlign as TypographyProperties['textAlign'],\n textVerticalAlign,\n }\n}\n\nexport function detectSizingMode(\n element: HTMLElement,\n dimension: 'width' | 'height'\n): SizingMode {\n const computed = window.getComputedStyle(element)\n const inlineValue = element.style[dimension]\n\n if (inlineValue === '100%') return 'fill'\n if (inlineValue === 'auto' || inlineValue === 'fit-content') return 'fit'\n\n const computedValue = computed[dimension]\n\n if (computedValue === '100%') return 'fill'\n if (\n computedValue === 'auto' ||\n computedValue === 'fit-content' ||\n computedValue === 'max-content'\n ) {\n return 'fit'\n }\n\n const parent = element.parentElement\n if (parent) {\n const parentComputed = window.getComputedStyle(parent)\n if (parentComputed.display === 'flex' || parentComputed.display === 'inline-flex') {\n const flexGrow = computed.flexGrow\n if (flexGrow !== '0') {\n return 'fill'\n }\n }\n }\n\n if (dimension === 'width') {\n if (computed.display === 'block' && !inlineValue) {\n return 'fill'\n }\n if (\n computed.display === 'inline-block' ||\n computed.display === 'inline-flex' ||\n computed.display === 'inline'\n ) {\n return 'fit'\n }\n }\n\n if (dimension === 'height') {\n if (!inlineValue) {\n return 'fit'\n }\n }\n\n return 'fixed'\n}\n\nexport function getSizingValue(element: HTMLElement, dimension: 'width' | 'height'): SizingValue {\n const mode = detectSizingMode(element, dimension)\n const rect = element.getBoundingClientRect()\n const numericValue = Math.round(dimension === 'width' ? rect.width : rect.height)\n\n return {\n mode,\n value: {\n numericValue,\n unit: 'px',\n raw: `${numericValue}px`,\n },\n }\n}\n\nexport function getComputedSizing(element: HTMLElement): SizingProperties {\n return {\n width: getSizingValue(element, 'width'),\n height: getSizingValue(element, 'height'),\n }\n}\n\nexport function sizingValueToCSS(sizing: SizingValue): string {\n switch (sizing.mode) {\n case 'fill':\n return '100%'\n case 'fit':\n return 'fit-content'\n case 'fixed':\n return `${sizing.value.numericValue}${sizing.value.unit}`\n }\n}\n\nexport function sizingToTailwind(dimension: 'width' | 'height', sizing: SizingValue): string {\n const prefix = dimension === 'width' ? 'w' : 'h'\n\n switch (sizing.mode) {\n case 'fill':\n return `${prefix}-full`\n case 'fit':\n return `${prefix}-fit`\n case 'fixed':\n return `${prefix}-[${sizing.value.numericValue}${sizing.value.unit}]`\n }\n}\n\nfunction parseHexColor(hex: string): ColorValue {\n const raw = hex\n let h = hex.replace('#', '')\n\n // Expand shorthand (#RGB -> #RRGGBB)\n if (h.length === 3) {\n h = h\n .split('')\n .map((c) => c + c)\n .join('')\n }\n\n // Handle 8-digit hex with alpha\n if (h.length === 8) {\n const alpha = Math.round((parseInt(h.slice(6, 8), 16) / 255) * 100)\n return { hex: h.slice(0, 6).toUpperCase(), alpha, raw }\n }\n\n return { hex: h.toUpperCase(), alpha: 100, raw }\n}\n\nfunction parseRgbaColor(rgba: string): ColorValue {\n const match = rgba.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([\\d.]+))?\\)/)\n if (!match) {\n return { hex: '000000', alpha: 100, raw: rgba }\n }\n\n const r = parseInt(match[1])\n const g = parseInt(match[2])\n const b = parseInt(match[3])\n const a = match[4] ? parseFloat(match[4]) : 1\n\n const hex = [r, g, b]\n .map((v) => v.toString(16).padStart(2, '0'))\n .join('')\n .toUpperCase()\n const alpha = Math.round(a * 100)\n\n return { hex, alpha, raw: rgba }\n}\n\nfunction parseNamedColor(name: string): ColorValue {\n // Use a temporary canvas to convert named colors\n const ctx = document.createElement('canvas').getContext('2d')\n if (!ctx) {\n return { hex: '000000', alpha: 100, raw: name }\n }\n\n ctx.fillStyle = name\n const computed = ctx.fillStyle\n\n if (computed.startsWith('#')) {\n return parseHexColor(computed)\n }\n return parseRgbaColor(computed)\n}\n\nexport function parseColorValue(cssValue: string): ColorValue {\n const raw = cssValue.trim()\n\n // Handle transparent\n if (raw === 'transparent') {\n return { hex: '000000', alpha: 0, raw }\n }\n\n // Handle hex colors\n if (raw.startsWith('#')) {\n return parseHexColor(raw)\n }\n\n // Handle rgb/rgba\n if (raw.startsWith('rgb')) {\n return parseRgbaColor(raw)\n }\n\n // Fallback: use canvas to convert named colors\n return parseNamedColor(raw)\n}\n\nconst TRANSPARENT_COLOR: ColorValue = { hex: '000000', alpha: 0, raw: 'transparent' }\n\nexport function getComputedColorStyles(element: HTMLElement): ColorProperties {\n const computed = window.getComputedStyle(element)\n\n const borderSides = [\n { style: computed.borderTopStyle, width: computed.borderTopWidth, color: computed.borderTopColor },\n { style: computed.borderRightStyle, width: computed.borderRightWidth, color: computed.borderRightColor },\n { style: computed.borderBottomStyle, width: computed.borderBottomWidth, color: computed.borderBottomColor },\n { style: computed.borderLeftStyle, width: computed.borderLeftWidth, color: computed.borderLeftColor },\n ]\n const visibleBorderSide = borderSides.find(\n (side) => side.style !== 'none' && side.style !== 'hidden' && parseFloat(side.width) > 0\n )\n const hasBorder = Boolean(visibleBorderSide)\n const hasOutline =\n computed.outlineStyle !== 'none' && parseFloat(computed.outlineWidth) > 0\n\n return {\n backgroundColor: parseColorValue(computed.backgroundColor),\n color: parseColorValue(computed.color),\n borderColor: hasBorder && visibleBorderSide ? parseColorValue(visibleBorderSide.color) : TRANSPARENT_COLOR,\n outlineColor: hasOutline ? parseColorValue(computed.outlineColor) : TRANSPARENT_COLOR,\n }\n}\n\nexport const colorPropertyToCSSMap: Record<ColorPropertyKey, string> = {\n backgroundColor: 'background-color',\n color: 'color',\n borderColor: 'border-color',\n outlineColor: 'outline-color',\n}\n\nconst colorTailwindPrefixMap: Record<ColorPropertyKey, string> = {\n backgroundColor: 'bg',\n color: 'text',\n borderColor: 'border',\n outlineColor: 'outline',\n}\n\nexport function colorToTailwind(\n property: ColorPropertyKey,\n colorValue: ColorValue\n): string {\n const prefix = colorTailwindPrefixMap[property]\n\n // Use arbitrary hex value\n if (colorValue.alpha === 100) {\n return `${prefix}-[#${colorValue.hex}]`\n }\n return `${prefix}-[#${colorValue.hex}]/${colorValue.alpha}`\n}\n\nexport function getElementInfo(element: HTMLElement): ElementInfo {\n const computed = window.getComputedStyle(element)\n const parentElement = element.parentElement\n\n const isFlexContainer = computed.display === 'flex' || computed.display === 'inline-flex'\n\n let isFlexItem = false\n if (parentElement) {\n const parentComputed = window.getComputedStyle(parentElement)\n isFlexItem = parentComputed.display === 'flex' || parentComputed.display === 'inline-flex'\n }\n\n return {\n tagName: element.tagName.toLowerCase(),\n id: element.id || null,\n classList: Array.from(element.classList),\n isFlexContainer,\n isFlexItem,\n isTextElement: isTextElement(element),\n parentElement,\n hasChildren: element.children.length > 0,\n }\n}\n\ninterface DimensionDisplay {\n width: string\n height: string\n}\n\nfunction isFitSizing(element: HTMLElement, dimension: 'width' | 'height'): boolean {\n const computed = window.getComputedStyle(element)\n const inlineValue = element.style[dimension]\n\n if (inlineValue === 'auto') return true\n\n const computedValue = computed[dimension]\n\n if (!inlineValue) {\n const parent = element.parentElement\n if (parent) {\n const parentComputed = window.getComputedStyle(parent)\n if (parentComputed.display === 'flex' || parentComputed.display === 'inline-flex') {\n const flexBasis = computed.flexBasis\n const flexGrow = computed.flexGrow\n if (flexBasis === 'auto' && flexGrow === '0') {\n return true\n }\n }\n }\n\n if (dimension === 'width') {\n if (computed.display === 'block' && !inlineValue) {\n return false\n }\n if (\n computed.display === 'inline-block' ||\n computed.display === 'inline-flex' ||\n computed.display === 'inline'\n ) {\n return true\n }\n }\n\n if (dimension === 'height') {\n return !inlineValue\n }\n }\n\n if (computedValue.includes('fit-content') || computedValue.includes('max-content')) {\n return true\n }\n\n return false\n}\n\nexport function getDimensionDisplay(element: HTMLElement): DimensionDisplay {\n const rect = element.getBoundingClientRect()\n const width = Math.round(rect.width)\n const height = Math.round(rect.height)\n\n const widthIsFit = isFitSizing(element, 'width')\n const heightIsFit = isFitSizing(element, 'height')\n\n return {\n width: widthIsFit ? `Fit ${width}` : `${width}`,\n height: heightIsFit ? `Fit ${height}` : `${height}`,\n }\n}\n\n\nexport function calculateParentMeasurements(element: HTMLElement, container?: HTMLElement): MeasurementLine[] {\n const parent = container ?? element.parentElement\n if (!parent) return []\n\n const elementRect = element.getBoundingClientRect()\n const parentRect = parent.getBoundingClientRect()\n\n // Use clientLeft/clientTop for reliable border widths, clientWidth/clientHeight\n // for inner dimensions (handles scrollbars correctly)\n const paddingBoxLeft = parentRect.left + parent.clientLeft\n const paddingBoxTop = parentRect.top + parent.clientTop\n const paddingBoxRight = parentRect.left + parent.clientLeft + parent.clientWidth\n const paddingBoxBottom = parentRect.top + parent.clientTop + parent.clientHeight\n\n let parentInnerLeft: number\n let parentInnerTop: number\n let parentInnerRight: number\n let parentInnerBottom: number\n\n if (container) {\n // Ancestor case: measure from padding-box (inside border, outside padding).\n // The ancestor's padding doesn't directly position the child — intermediate\n // elements do — so the visually correct edge is inside the border only.\n parentInnerLeft = paddingBoxLeft\n parentInnerTop = paddingBoxTop\n parentInnerRight = paddingBoxRight\n parentInnerBottom = paddingBoxBottom\n } else {\n // Direct parent case: measure from content-box (inside border and padding).\n // The parent's padding IS the gap between its edge and the child's layout area.\n const parentStyles = window.getComputedStyle(parent)\n parentInnerLeft = paddingBoxLeft + (parseFloat(parentStyles.paddingLeft) || 0)\n parentInnerTop = paddingBoxTop + (parseFloat(parentStyles.paddingTop) || 0)\n parentInnerRight = paddingBoxRight - (parseFloat(parentStyles.paddingRight) || 0)\n parentInnerBottom = paddingBoxBottom - (parseFloat(parentStyles.paddingBottom) || 0)\n }\n\n const measurements: MeasurementLine[] = []\n\n const topDistance = Math.round(elementRect.top - parentInnerTop)\n if (topDistance > 0) {\n const midX = elementRect.left + elementRect.width / 2\n measurements.push({\n direction: 'vertical',\n x1: midX,\n y1: parentInnerTop,\n x2: midX,\n y2: elementRect.top,\n distance: topDistance,\n labelPosition: { x: midX, y: (parentInnerTop + elementRect.top) / 2 },\n })\n }\n\n const bottomDistance = Math.round(parentInnerBottom - elementRect.bottom)\n if (bottomDistance > 0) {\n const midX = elementRect.left + elementRect.width / 2\n measurements.push({\n direction: 'vertical',\n x1: midX,\n y1: elementRect.bottom,\n x2: midX,\n y2: parentInnerBottom,\n distance: bottomDistance,\n labelPosition: { x: midX, y: (elementRect.bottom + parentInnerBottom) / 2 },\n })\n }\n\n const leftDistance = Math.round(elementRect.left - parentInnerLeft)\n if (leftDistance > 0) {\n const midY = elementRect.top + elementRect.height / 2\n measurements.push({\n direction: 'horizontal',\n x1: parentInnerLeft,\n y1: midY,\n x2: elementRect.left,\n y2: midY,\n distance: leftDistance,\n labelPosition: { x: (parentInnerLeft + elementRect.left) / 2, y: midY },\n })\n }\n\n const rightDistance = Math.round(parentInnerRight - elementRect.right)\n if (rightDistance > 0) {\n const midY = elementRect.top + elementRect.height / 2\n measurements.push({\n direction: 'horizontal',\n x1: elementRect.right,\n y1: midY,\n x2: parentInnerRight,\n y2: midY,\n distance: rightDistance,\n labelPosition: { x: (elementRect.right + parentInnerRight) / 2, y: midY },\n })\n }\n\n return measurements\n}\n\nexport function calculateElementMeasurements(\n from: HTMLElement,\n to: HTMLElement\n): MeasurementLine[] {\n const fromRect = from.getBoundingClientRect()\n const toRect = to.getBoundingClientRect()\n const measurements: MeasurementLine[] = []\n\n const horizontalOverlap =\n fromRect.left < toRect.right && fromRect.right > toRect.left\n const verticalOverlap =\n fromRect.top < toRect.bottom && fromRect.bottom > toRect.top\n\n if (verticalOverlap) {\n const overlapTop = Math.max(fromRect.top, toRect.top)\n const overlapBottom = Math.min(fromRect.bottom, toRect.bottom)\n const midY = (overlapTop + overlapBottom) / 2\n\n if (fromRect.right <= toRect.left) {\n const distance = Math.round(toRect.left - fromRect.right)\n measurements.push({\n direction: 'horizontal',\n x1: fromRect.right,\n y1: midY,\n x2: toRect.left,\n y2: midY,\n distance,\n labelPosition: { x: (fromRect.right + toRect.left) / 2, y: midY },\n })\n } else if (fromRect.left >= toRect.right) {\n const distance = Math.round(fromRect.left - toRect.right)\n measurements.push({\n direction: 'horizontal',\n x1: toRect.right,\n y1: midY,\n x2: fromRect.left,\n y2: midY,\n distance,\n labelPosition: { x: (toRect.right + fromRect.left) / 2, y: midY },\n })\n }\n }\n\n if (horizontalOverlap) {\n const overlapLeft = Math.max(fromRect.left, toRect.left)\n const overlapRight = Math.min(fromRect.right, toRect.right)\n const midX = (overlapLeft + overlapRight) / 2\n\n if (fromRect.bottom <= toRect.top) {\n const distance = Math.round(toRect.top - fromRect.bottom)\n measurements.push({\n direction: 'vertical',\n x1: midX,\n y1: fromRect.bottom,\n x2: midX,\n y2: toRect.top,\n distance,\n labelPosition: { x: midX, y: (fromRect.bottom + toRect.top) / 2 },\n })\n } else if (fromRect.top >= toRect.bottom) {\n const distance = Math.round(fromRect.top - toRect.bottom)\n measurements.push({\n direction: 'vertical',\n x1: midX,\n y1: toRect.bottom,\n x2: midX,\n y2: fromRect.top,\n distance,\n labelPosition: { x: midX, y: (toRect.bottom + fromRect.top) / 2 },\n })\n }\n }\n\n if (!horizontalOverlap && !verticalOverlap) {\n const fromCenterX = fromRect.left + fromRect.width / 2\n const fromCenterY = fromRect.top + fromRect.height / 2\n const toCenterX = toRect.left + toRect.width / 2\n const toCenterY = toRect.top + toRect.height / 2\n\n const hDistance = toCenterX > fromCenterX\n ? Math.round(toRect.left - fromRect.right)\n : Math.round(fromRect.left - toRect.right)\n\n if (hDistance > 0) {\n const startX = toCenterX > fromCenterX ? fromRect.right : fromRect.left\n const endX = toCenterX > fromCenterX ? toRect.left : toRect.right\n const y = (fromCenterY + toCenterY) / 2\n measurements.push({\n direction: 'horizontal',\n x1: startX,\n y1: y,\n x2: endX,\n y2: y,\n distance: hDistance,\n labelPosition: { x: (startX + endX) / 2, y },\n })\n }\n\n const vDistance = toCenterY > fromCenterY\n ? Math.round(toRect.top - fromRect.bottom)\n : Math.round(fromRect.top - toRect.bottom)\n\n if (vDistance > 0) {\n const x = (fromCenterX + toCenterX) / 2\n const startY = toCenterY > fromCenterY ? fromRect.bottom : fromRect.top\n const endY = toCenterY > fromCenterY ? toRect.top : toRect.bottom\n measurements.push({\n direction: 'vertical',\n x1: x,\n y1: startY,\n x2: x,\n y2: endY,\n distance: vDistance,\n labelPosition: { x, y: (startY + endY) / 2 },\n })\n }\n }\n\n return measurements\n}\n\nconst GUIDELINE_PROXIMITY = 80\n\nexport function calculateGuidelineMeasurements(\n element: HTMLElement,\n guidelines: Guideline[],\n mousePosition?: { x: number; y: number } | null,\n): MeasurementLine[] {\n if (guidelines.length === 0) return []\n\n const rect = element.getBoundingClientRect()\n const scrollX = window.scrollX\n const scrollY = window.scrollY\n const measurements: MeasurementLine[] = []\n\n for (const g of guidelines) {\n if (g.orientation === 'horizontal') {\n const gy = g.position - scrollY\n const midX = rect.left + rect.width / 2\n\n // Only show when mouse is near this guideline's Y position\n if (mousePosition && Math.abs(mousePosition.y - gy) > GUIDELINE_PROXIMITY) continue\n\n if (gy < rect.top) {\n const distance = Math.round(rect.top - gy)\n if (distance > 0) {\n measurements.push({\n direction: 'vertical',\n x1: midX,\n y1: gy,\n x2: midX,\n y2: rect.top,\n distance,\n labelPosition: { x: midX, y: (gy + rect.top) / 2 },\n })\n }\n } else if (gy > rect.bottom) {\n const distance = Math.round(gy - rect.bottom)\n if (distance > 0) {\n measurements.push({\n direction: 'vertical',\n x1: midX,\n y1: rect.bottom,\n x2: midX,\n y2: gy,\n distance,\n labelPosition: { x: midX, y: (rect.bottom + gy) / 2 },\n })\n }\n }\n } else {\n const gx = g.position - scrollX\n const midY = rect.top + rect.height / 2\n\n // Only show when mouse is near this guideline's X position\n if (mousePosition && Math.abs(mousePosition.x - gx) > GUIDELINE_PROXIMITY) continue\n\n if (gx < rect.left) {\n const distance = Math.round(rect.left - gx)\n if (distance > 0) {\n measurements.push({\n direction: 'horizontal',\n x1: gx,\n y1: midY,\n x2: rect.left,\n y2: midY,\n distance,\n labelPosition: { x: (gx + rect.left) / 2, y: midY },\n })\n }\n } else if (gx > rect.right) {\n const distance = Math.round(gx - rect.right)\n if (distance > 0) {\n measurements.push({\n direction: 'horizontal',\n x1: rect.right,\n y1: midY,\n x2: gx,\n y2: midY,\n distance,\n labelPosition: { x: (rect.right + gx) / 2, y: midY },\n })\n }\n }\n }\n }\n\n return measurements\n}\n\nexport function isFlexContainer(element: HTMLElement): boolean {\n const computed = window.getComputedStyle(element)\n return computed.display === 'flex' || computed.display === 'inline-flex'\n}\n\nexport function getFlexDirection(\n element: HTMLElement\n): 'row' | 'row-reverse' | 'column' | 'column-reverse' {\n const computed = window.getComputedStyle(element)\n return computed.flexDirection as 'row' | 'row-reverse' | 'column' | 'column-reverse'\n}\n\nexport function detectChildrenDirection(\n container: HTMLElement,\n exclude: HTMLElement | null\n): { axis: 'horizontal' | 'vertical'; reversed: boolean } {\n const computed = window.getComputedStyle(container)\n\n // Flex: trust CSS for accuracy (especially reverse)\n if (computed.display === 'flex' || computed.display === 'inline-flex') {\n const dir = computed.flexDirection\n return {\n axis: (dir === 'row' || dir === 'row-reverse') ? 'horizontal' : 'vertical',\n reversed: dir === 'row-reverse' || dir === 'column-reverse',\n }\n }\n\n // Non-flex: examine first two visible, in-flow children\n const visible: HTMLElement[] = []\n for (const c of container.children) {\n if (!(c instanceof HTMLElement) || c === exclude) continue\n const cs = window.getComputedStyle(c)\n if (cs.display === 'none' || cs.position === 'absolute' || cs.position === 'fixed') continue\n visible.push(c)\n if (visible.length === 2) break\n }\n\n if (visible.length < 2) return { axis: 'vertical', reversed: false }\n\n const first = visible[0].getBoundingClientRect()\n const second = visible[1].getBoundingClientRect()\n const yOverlap = first.bottom - 2 > second.top && second.bottom - 2 > first.top\n\n if (yOverlap) {\n return { axis: 'horizontal', reversed: second.right < first.left }\n }\n return { axis: 'vertical', reversed: second.bottom < first.top }\n}\n\nfunction htmlChildren(el: HTMLElement): HTMLElement[] {\n return Array.from(el.children).filter(\n (child): child is HTMLElement => child instanceof HTMLElement\n )\n}\n\n/** Walk up from `element` to find the nearest flex/inline-flex ancestor, stopping at `boundary`. */\nfunction findFlexAncestor(\n element: HTMLElement,\n boundary: HTMLElement | null,\n): { flexParent: HTMLElement; child: HTMLElement } | null {\n let current: HTMLElement | null = element\n while (current && current !== document.body) {\n const parent: HTMLElement | null = current.parentElement\n if (!parent) break\n const display = getComputedStyle(parent).display\n if (display === 'flex' || display === 'inline-flex') {\n return { flexParent: parent, child: current }\n }\n if (boundary && parent === boundary) break\n current = parent\n }\n return null\n}\n\nexport function computeHoverHighlight(\n elementUnder: HTMLElement | null,\n selectedElement: HTMLElement | null,\n): { flexContainer: HTMLElement; children: HTMLElement[] } | null {\n if (\n !elementUnder ||\n elementUnder === document.body ||\n elementUnder === document.documentElement ||\n elementUnder.closest('[data-direct-edit]') ||\n elementUnder.closest('[data-direct-edit-host]') ||\n elementUnder === selectedElement\n ) {\n return null\n }\n\n // When hovering descendants of the selected element, stop walk-up at the boundary\n const boundary = selectedElement?.contains(elementUnder) ? selectedElement : null\n\n const ownDisplay = getComputedStyle(elementUnder).display\n if (ownDisplay === 'flex' || ownDisplay === 'inline-flex') {\n return { flexContainer: elementUnder, children: htmlChildren(elementUnder) }\n }\n\n const found = findFlexAncestor(elementUnder, boundary)\n if (found) {\n return { flexContainer: found.flexParent, children: htmlChildren(found.flexParent) }\n }\n\n return { flexContainer: elementUnder, children: [] }\n}\n\nexport function resolveElementTarget(\n elementUnder: HTMLElement,\n selectedElement: HTMLElement | null,\n): HTMLElement {\n const boundary = selectedElement?.contains(elementUnder) ? selectedElement : null\n const found = findFlexAncestor(elementUnder, boundary)\n if (found && found.flexParent === boundary) return elementUnder\n return found?.child ?? elementUnder\n}\n\n/** Finds the text-owning element at a point within `boundary` using browser caret hit-testing. */\nexport function findTextOwnerAtPoint(\n boundary: HTMLElement,\n clientX: number,\n clientY: number,\n): HTMLElement | null {\n const doc = document as Document & {\n caretPositionFromPoint?: (x: number, y: number) => { offsetNode: Node } | null\n caretRangeFromPoint?: (x: number, y: number) => Range | null\n }\n\n const caretNode =\n doc.caretPositionFromPoint?.(clientX, clientY)?.offsetNode\n ?? doc.caretRangeFromPoint?.(clientX, clientY)?.startContainer\n ?? null\n if (!caretNode || caretNode.nodeType !== Node.TEXT_NODE) return null\n\n const textNode = caretNode as Text\n if (!(textNode.nodeValue ?? '').trim()) return null\n\n const owner = textNode.parentElement\n if (!owner || !boundary.contains(owner)) return null\n if (owner.closest('[data-direct-edit]') || owner.closest('[data-direct-edit-host]')) return null\n\n // Guard against caret APIs returning nearby text nodes.\n const range = document.createRange()\n range.selectNodeContents(textNode)\n const hitsText = Array.from(range.getClientRects()).some(\n (r) => clientX >= r.left && clientX <= r.right && clientY >= r.top && clientY <= r.bottom\n )\n range.detach?.()\n return hitsText ? owner : null\n}\n\n/** Fallback text hit-testing by scanning text nodes and rendered rects within `boundary`. */\nexport function findTextOwnerByRangeScan(\n boundary: HTMLElement,\n clientX: number,\n clientY: number,\n): HTMLElement | null {\n const walker = document.createTreeWalker(boundary, NodeFilter.SHOW_TEXT)\n let current: Node | null = walker.nextNode()\n\n while (current) {\n const textNode = current as Text\n if ((textNode.nodeValue ?? '').trim()) {\n const owner = textNode.parentElement\n if (\n owner &&\n boundary.contains(owner) &&\n !owner.closest('[data-direct-edit]') &&\n !owner.closest('[data-direct-edit-host]')\n ) {\n const range = document.createRange()\n range.selectNodeContents(textNode)\n const hitsText = Array.from(range.getClientRects()).some(\n (r) => clientX >= r.left && clientX <= r.right && clientY >= r.top && clientY <= r.bottom\n )\n range.detach?.()\n if (hitsText) return owner\n }\n }\n current = walker.nextNode()\n }\n\n return null\n}\n\n/** Wrap the direct text node under the point into a span so it becomes independently selectable. */\nexport function ensureDirectTextSpanAtPoint(\n parent: HTMLElement,\n clientX: number,\n clientY: number,\n): HTMLElement | null {\n const directTextNodes = Array.from(parent.childNodes).filter(\n (node): node is Text => node.nodeType === Node.TEXT_NODE && Boolean(node.textContent?.trim())\n )\n\n for (const textNode of directTextNodes) {\n const range = document.createRange()\n range.selectNodeContents(textNode)\n const hitsText = Array.from(range.getClientRects()).some(\n (r) => clientX >= r.left && clientX <= r.right && clientY >= r.top && clientY <= r.bottom\n )\n range.detach?.()\n\n if (!hitsText) continue\n\n const span = document.createElement('span')\n span.setAttribute('data-direct-edit-generated', 'text-span')\n span.textContent = textNode.textContent ?? ''\n parent.replaceChild(span, textNode)\n return span\n }\n\n return null\n}\n\n/** When elementFromPoint returns the selected element (bare text, padding, gap),\n * find the best child element to drill into at the given coordinates. */\nexport function findChildAtPoint(\n parent: HTMLElement,\n clientX: number,\n clientY: number,\n): HTMLElement | null {\n const children = htmlChildren(parent)\n if (children.length === 0) return null\n\n // Direct hit: child whose bbox contains the click\n const hit = children.find((child) => {\n const r = child.getBoundingClientRect()\n return clientX >= r.left && clientX <= r.right && clientY >= r.top && clientY <= r.bottom\n })\n if (hit) return hit\n\n // Single-child fallback should not steal clicks from parent's direct text.\n if (children.length === 1 && !hasDirectNonWhitespaceText(parent)) return children[0]\n\n return null\n}\n\nexport function elementFromPointWithoutOverlays(x: number, y: number): HTMLElement | null {\n const host = document.querySelector<HTMLElement>('[data-direct-edit-host]')\n if (host) host.style.display = 'none'\n const el = document.elementFromPoint(x, y) as HTMLElement | null\n if (host) host.style.display = ''\n return el\n}\n\nfunction isLayoutContainer(element: HTMLElement): boolean {\n const display = window.getComputedStyle(element).display\n return (\n display === 'flex' ||\n display === 'inline-flex' ||\n display === 'grid' ||\n display === 'inline-grid'\n )\n}\n\nfunction isBlockContainer(element: HTMLElement): boolean {\n const display = window.getComputedStyle(element).display\n return display === 'block' || display === 'flow-root'\n || display === 'inline-block' || display === 'list-item'\n}\n\nfunction skipElement(el: HTMLElement, exclude: HTMLElement | null): boolean {\n if (exclude && exclude.contains(el)) return true\n if (el === document.body || el === document.documentElement) return true\n if (el.closest('[data-direct-edit]') || el.closest('[data-direct-edit-host]')) return true\n return false\n}\n\nfunction findContainerViaTraversal(x: number, y: number, exclude: HTMLElement | null): HTMLElement | null {\n const el = elementFromPointWithoutOverlays(x, y)\n if (!el) return null\n let current: HTMLElement | null = el\n while (current) {\n if (!skipElement(current, exclude)) {\n if (isLayoutContainer(current) || isBlockContainer(current)) return current\n }\n current = current.parentElement\n }\n return null\n}\n\nexport function findContainerAtPoint(\n x: number,\n y: number,\n exclude: HTMLElement | null,\n preferredParent?: HTMLElement | null\n): HTMLElement | null {\n const host = document.querySelector<HTMLElement>('[data-direct-edit-host]')\n if (host) host.style.display = 'none'\n\n const elements = document.elementsFromPoint(x, y) as HTMLElement[]\n\n if (host) host.style.display = ''\n\n // Find most specific container (front-to-back = most nested first)\n for (const el of elements) {\n if (skipElement(el, exclude)) continue\n if (isLayoutContainer(el) || isBlockContainer(el)) return el\n }\n\n // Fallback: preferredParent for gap/padding areas\n if (preferredParent && (isLayoutContainer(preferredParent) || isBlockContainer(preferredParent))) {\n for (const el of elements) {\n if (el === preferredParent) return preferredParent\n }\n }\n\n // Last resort: walk up DOM\n return findContainerViaTraversal(x, y, exclude)\n}\n\nexport function calculateDropPosition(\n container: HTMLElement,\n pointerX: number,\n pointerY: number,\n draggedElement: HTMLElement\n): { insertBefore: HTMLElement | null; indicator: DropIndicator } | null {\n const { axis, reversed: isReversed } = detectChildrenDirection(container, draggedElement)\n const isHorizontal = axis === 'horizontal'\n\n const children = Array.from(container.children).filter(\n (child) => child !== draggedElement && child instanceof HTMLElement\n ) as HTMLElement[]\n\n if (children.length === 0) {\n const containerRect = container.getBoundingClientRect()\n return {\n insertBefore: null,\n indicator: {\n x: containerRect.left + 4,\n y: containerRect.top + 4,\n width: isHorizontal ? 1 : containerRect.width - 8,\n height: isHorizontal ? containerRect.height - 8 : 1,\n },\n }\n }\n\n const containerRect = container.getBoundingClientRect()\n let insertBefore: HTMLElement | null = null\n let indicatorPosition = 0\n\n for (let i = 0; i < children.length; i++) {\n const child = children[i]\n const rect = child.getBoundingClientRect()\n const midpoint = isHorizontal\n ? rect.left + rect.width / 2\n : rect.top + rect.height / 2\n\n const pointer = isHorizontal ? pointerX : pointerY\n\n const beforeMidpoint = isReversed ? pointer > midpoint : pointer < midpoint\n\n if (beforeMidpoint) {\n insertBefore = child\n indicatorPosition = isHorizontal ? rect.left : rect.top\n break\n }\n }\n\n if (!insertBefore) {\n const lastChild = children[children.length - 1]\n const lastRect = lastChild.getBoundingClientRect()\n indicatorPosition = isHorizontal ? lastRect.right : lastRect.bottom\n }\n\n const indicator: DropIndicator = isHorizontal\n ? {\n x: indicatorPosition,\n y: containerRect.top + 4,\n width: 2,\n height: containerRect.height - 8,\n }\n : {\n x: containerRect.left + 4,\n y: indicatorPosition,\n width: containerRect.width - 8,\n height: 2,\n }\n\n return { insertBefore, indicator }\n}\n\n// Accesses React fiber internals to find the component stack. This is an undocumented\n// API that could change between React versions, but is a common pattern for dev tools.\n// Returns an empty array gracefully if React internals are unavailable.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getFiberForElement(element: HTMLElement): any | null {\n if (typeof window !== 'undefined') {\n const devtools = window.__DIRECT_EDIT_DEVTOOLS__\n if (devtools?.getFiberForElement) {\n const fiber = devtools.getFiberForElement(element)\n if (fiber) return fiber as any\n }\n }\n\n const fiberKey = Object.keys(element).find(\n (key) => key.startsWith('__reactFiber$') || key.startsWith('__reactInternalInstance$')\n )\n\n if (!fiberKey) return null\n return (element as any)[fiberKey] || null\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getSourceFromFiber(fiber: any):\n | {\n fileName?: string\n lineNumber?: number\n columnNumber?: number\n }\n | null {\n const debugSource = fiber?._debugSource\n if (debugSource?.fileName) return debugSource\n\n const owner = fiber?._debugOwner\n const ownerPending = owner?.pendingProps?.__source\n if (ownerPending?.fileName) return ownerPending\n\n const ownerMemo = owner?.memoizedProps?.__source\n if (ownerMemo?.fileName) return ownerMemo\n\n const pending = fiber?.pendingProps?.__source\n if (pending?.fileName) return pending\n\n const memo = fiber?.memoizedProps?.__source\n if (memo?.fileName) return memo\n\n return null\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction buildFrame(fiber: any): ReactComponentFrame | null {\n const type = fiber?.type\n if (typeof type !== 'function' && typeof type !== 'object') return null\n\n const name = type?.displayName || type?.name || null\n if (!name || name === 'Fragment') return null\n\n const frame: ReactComponentFrame = { name }\n const source = getSourceFromFiber(fiber)\n if (source?.fileName) {\n frame.file = source.fileName\n if (typeof source.lineNumber === 'number') {\n frame.line = source.lineNumber\n }\n if (typeof source.columnNumber === 'number') {\n frame.column = source.columnNumber\n }\n }\n\n return frame\n}\n\nfunction shouldIncludeFrame(\n frame: ReactComponentFrame,\n lastFrame: ReactComponentFrame | null\n): boolean {\n if (!lastFrame) return true\n if (frame.name !== lastFrame.name) return true\n if (!lastFrame.file && frame.file) return true\n if (lastFrame.file && frame.file && lastFrame.line == null && frame.line != null) return true\n if (\n lastFrame.file &&\n frame.file &&\n lastFrame.line != null &&\n frame.line != null &&\n lastFrame.column == null &&\n frame.column != null\n ) {\n return true\n }\n return false\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getOwnerStack(fiber: any): ReactComponentFrame[] {\n const frames: ReactComponentFrame[] = []\n let current = fiber\n let lastFrame: ReactComponentFrame | null = null\n\n while (current) {\n const frame = buildFrame(current)\n if (frame && shouldIncludeFrame(frame, lastFrame)) {\n frames.push(frame)\n lastFrame = frame\n }\n current = current._debugOwner\n }\n\n return frames\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getRenderStack(fiber: any): ReactComponentFrame[] {\n const frames: ReactComponentFrame[] = []\n let current = fiber\n let lastFrame: ReactComponentFrame | null = null\n\n while (current) {\n const frame = buildFrame(current)\n if (frame && shouldIncludeFrame(frame, lastFrame)) {\n frames.push(frame)\n lastFrame = frame\n }\n current = current.return\n }\n\n return frames\n}\n\nfunction getReactComponentStack(element: HTMLElement): ReactComponentFrame[] {\n const fiber = getFiberForElement(element)\n if (!fiber) return []\n\n const ownerStack = getOwnerStack(fiber)\n if (ownerStack.length > 0) {\n return ownerStack\n }\n\n return getRenderStack(fiber)\n}\n\nexport function getElementDisplayName(element: HTMLElement): string {\n return element.tagName.toLowerCase()\n}\n\nconst STABLE_ATTRIBUTES = ['data-testid', 'data-qa', 'data-cy', 'aria-label', 'role'] as const\nconst MAX_SELECTOR_DEPTH = 4\n\nfunction escapeCssIdentifier(value: string): string {\n if (typeof CSS !== 'undefined' && typeof CSS.escape === 'function') {\n return CSS.escape(value)\n }\n return value.replace(/[^a-zA-Z0-9_-]/g, (char) => `\\\\${char}`)\n}\n\nfunction escapeAttributeValue(value: string): string {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')\n}\n\nfunction isUniqueSelector(selector: string): boolean {\n if (typeof document === 'undefined') return false\n try {\n return document.querySelectorAll(selector).length === 1\n } catch {\n return false\n }\n}\n\nfunction getUniqueIdSelector(element: HTMLElement): string | null {\n if (!element.id) return null\n const selector = `#${escapeCssIdentifier(element.id)}`\n return isUniqueSelector(selector) ? selector : null\n}\n\nfunction getStableAttributeSelector(element: HTMLElement): string | null {\n const tagName = element.tagName.toLowerCase()\n for (const attr of STABLE_ATTRIBUTES) {\n const value = element.getAttribute(attr)\n if (!value) continue\n const selector = `${tagName}[${attr}=\"${escapeAttributeValue(value)}\"]`\n if (isUniqueSelector(selector)) {\n return selector\n }\n }\n return null\n}\n\nfunction getNthOfTypeSelector(element: HTMLElement): string {\n const tagName = element.tagName.toLowerCase()\n const classes = Array.from(element.classList)\n .filter((className) => className && !className.startsWith('direct-edit'))\n .slice(0, 2)\n const classSelector = classes.map((className) => `.${escapeCssIdentifier(className)}`).join('')\n\n let nthOfType = ''\n const parent = element.parentElement\n if (parent) {\n const siblings = Array.from(parent.children).filter(\n (child) => (child as HTMLElement).tagName.toLowerCase() === tagName\n )\n if (siblings.length > 1) {\n const index = siblings.indexOf(element) + 1\n nthOfType = `:nth-of-type(${index})`\n }\n }\n\n return `${tagName}${classSelector}${nthOfType}`\n}\n\nfunction buildDomSelector(element: HTMLElement): string {\n if (typeof document === 'undefined') {\n return element.tagName.toLowerCase()\n }\n if (element.closest('[data-direct-edit]')) return ''\n\n const uniqueId = getUniqueIdSelector(element)\n if (uniqueId) return uniqueId\n\n const stableAttribute = getStableAttributeSelector(element)\n if (stableAttribute) return stableAttribute\n\n const segments: string[] = []\n let current: HTMLElement | null = element\n let depth = 0\n\n while (current && current !== document.body && depth < MAX_SELECTOR_DEPTH) {\n if (current.hasAttribute('data-direct-edit')) {\n current = current.parentElement\n continue\n }\n\n if (depth > 0) {\n const parentId = getUniqueIdSelector(current)\n if (parentId) {\n segments.unshift(parentId)\n break\n }\n const parentStableAttr = getStableAttributeSelector(current)\n if (parentStableAttr) {\n segments.unshift(parentStableAttr)\n break\n }\n }\n\n segments.unshift(getNthOfTypeSelector(current))\n current = current.parentElement\n depth += 1\n }\n\n return segments.join(' > ')\n}\n\nfunction stripDirectEditNodes(root: Element) {\n const nodes = root.querySelectorAll('[data-direct-edit]')\n nodes.forEach((node) => node.remove())\n}\n\nfunction buildTargetHtml(element: HTMLElement): string {\n const tagName = element.tagName.toLowerCase()\n const attrs: string[] = []\n const allowList = [\n 'id',\n 'class',\n 'href',\n 'src',\n 'alt',\n 'aria-label',\n 'role',\n 'data-testid',\n ]\n const maxAttrLength = 48\n\n for (const attr of allowList) {\n const value = element.getAttribute(attr)\n if (!value) continue\n const trimmed = value.length > maxAttrLength ? `${value.slice(0, maxAttrLength - 3)}...` : value\n attrs.push(`${attr}=\"${escapeAttributeValue(trimmed)}\"`)\n }\n\n const text = getTextPreview(element)\n const attrString = attrs.length > 0 ? ` ${attrs.join(' ')}` : ''\n\n if (text) {\n return `<${tagName}${attrString}>\\n ${escapeHtml(text)}\\n</${tagName}>`\n }\n\n return `<${tagName}${attrString}></${tagName}>`\n}\n\nfunction formatSourcePath(file: string): string {\n const normalized = file\n .replace(/\\\\/g, '/')\n .replace(/^webpack:\\/\\/\\//, '')\n .replace(/^webpack:\\/\\//, '')\n .replace(/^file:\\/\\//, '')\n .replace(/^_N_E\\//, '')\n .replace(/^\\.\\/+/, '')\n const packagesIndex = normalized.indexOf('/packages/')\n if (packagesIndex !== -1) {\n return `/[project]${normalized.slice(packagesIndex)}`\n }\n const appIndex = normalized.indexOf('/app/')\n if (appIndex !== -1) {\n return `/[project]${normalized.slice(appIndex)}`\n }\n const srcIndex = normalized.indexOf('/src/')\n if (srcIndex !== -1) {\n return `/[project]${normalized.slice(srcIndex)}`\n }\n return normalized\n}\n\nfunction formatSourceLocation(file: string, line?: number, column?: number): string {\n const formatted = formatSourcePath(file)\n if (typeof line === 'number') {\n const columnSuffix = typeof column === 'number' ? `:${column}` : ''\n return `${formatted}:${line}${columnSuffix}`\n }\n return formatted\n}\n\nfunction isUserlandSource(file: string): boolean {\n const normalized = file.replace(/\\\\/g, '/')\n if (\n normalized.includes('node_modules') ||\n normalized.includes('next/dist') ||\n normalized.includes('react') ||\n normalized.includes('react-dom') ||\n normalized.includes('direct-edit')\n ) {\n return false\n }\n return (\n normalized.includes('/app/') ||\n normalized.includes('/src/') ||\n normalized.includes('/packages/') ||\n normalized.startsWith('./')\n )\n}\n\nfunction getPrimaryFrame(locator: ElementLocator): ReactComponentFrame | null {\n for (const frame of locator.reactStack) {\n if (frame.file && isUserlandSource(frame.file)) {\n return frame\n }\n }\n for (const frame of locator.reactStack) {\n if (frame.file) {\n return frame\n }\n }\n return locator.reactStack[0] ?? null\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;')\n}\n\nfunction buildDomContextHtml(\n element: HTMLElement,\n options?: { siblingCount?: number }\n): string {\n const parent = element.parentElement\n if (!parent) {\n return element.outerHTML\n }\n\n const parentClone = parent.cloneNode(false) as HTMLElement\n const siblings = Array.from(parent.children) as HTMLElement[]\n const selectedIndex = siblings.indexOf(element)\n let slice = siblings\n\n if (options?.siblingCount && options.siblingCount > 0 && selectedIndex >= 0) {\n const start = Math.max(0, selectedIndex - options.siblingCount)\n const end = Math.min(siblings.length, selectedIndex + options.siblingCount + 1)\n slice = siblings.slice(start, end)\n }\n\n for (const sibling of slice) {\n if (sibling.closest('[data-direct-edit]')) continue\n const clone = sibling.cloneNode(true) as HTMLElement\n if (sibling === element) {\n clone.setAttribute('data-direct-edit-target', 'true')\n }\n stripDirectEditNodes(clone)\n parentClone.appendChild(clone)\n }\n\n return parentClone.outerHTML\n}\n\nfunction getTextPreview(element: HTMLElement): string {\n const text = element.textContent ?? ''\n const cleaned = text.replace(/\\s+/g, ' ').trim()\n if (cleaned.length <= 120) {\n return cleaned\n }\n return `${cleaned.slice(0, 117)}...`\n}\n\nfunction parseDomSource(element: HTMLElement): DomSourceLocation | null {\n const value = element.getAttribute('data-direct-edit-source')\n if (!value) return null\n\n let file = value\n let line: number | undefined\n let column: number | undefined\n\n const lastColon = value.lastIndexOf(':')\n if (lastColon !== -1) {\n const maybeColumn = Number(value.slice(lastColon + 1))\n if (!Number.isNaN(maybeColumn)) {\n column = maybeColumn\n file = value.slice(0, lastColon)\n\n const prevColon = file.lastIndexOf(':')\n if (prevColon !== -1) {\n const maybeLine = Number(file.slice(prevColon + 1))\n if (!Number.isNaN(maybeLine)) {\n line = maybeLine\n file = file.slice(0, prevColon)\n }\n }\n }\n }\n\n return { file, line, column }\n}\n\nexport function getElementLocator(element: HTMLElement): ElementLocator {\n const elementInfo = getElementInfo(element)\n let domSource = parseDomSource(element)\n\n // Fallback: get source from the element's own React fiber when\n // the Vite plugin attribute is not present\n if (!domSource) {\n const fiber = getFiberForElement(element)\n if (fiber) {\n const fiberSource = getSourceFromFiber(fiber)\n if (fiberSource?.fileName) {\n domSource = {\n file: fiberSource.fileName,\n line: fiberSource.lineNumber,\n column: fiberSource.columnNumber,\n }\n }\n }\n }\n\n return {\n reactStack: getReactComponentStack(element),\n domSelector: buildDomSelector(element),\n domContextHtml: buildDomContextHtml(element),\n targetHtml: buildTargetHtml(element),\n textPreview: getTextPreview(element),\n tagName: elementInfo.tagName,\n id: elementInfo.id,\n classList: elementInfo.classList,\n domSource: domSource ?? undefined,\n }\n}\n\ninterface ExportChange {\n property: string\n value: string\n tailwind: string\n}\n\nexport function buildElementContext(locator: ElementLocator): string {\n const lines: string[] = []\n\n const primaryFrame = getPrimaryFrame(locator)\n const componentLabel = primaryFrame?.name ? primaryFrame.name : locator.tagName\n const formattedSource = locator.domSource?.file\n ? formatSourceLocation(locator.domSource.file, locator.domSource.line, locator.domSource.column)\n : primaryFrame?.file\n ? formatSourceLocation(primaryFrame.file, primaryFrame.line, primaryFrame.column)\n : null\n\n lines.push(`@<${componentLabel}>`)\n lines.push('')\n lines.push(locator.targetHtml || locator.domContextHtml || '')\n lines.push(`in ${formattedSource ?? '(file not available)'}`)\n\n if (!formattedSource) {\n const selector = locator.domSelector?.trim()\n const text = locator.textPreview?.trim()\n if (selector) {\n lines.push(`selector: ${selector}`)\n }\n if (text) {\n lines.push(`text: ${text}`)\n }\n }\n\n return lines.join('\\n')\n}\n\nexport function buildEditExport(\n locator: ElementLocator,\n pendingStyles: Record<string, string>,\n textEdit?: { originalText: string; newText: string } | null\n): string\nexport function buildEditExport(\n element: HTMLElement | null,\n elementInfo: ElementInfo,\n computedSpacing: SpacingProperties | null,\n computedBorderRadius: BorderRadiusProperties | null,\n computedFlex: FlexProperties | null,\n computedSizing: SizingProperties | null,\n pendingStyles: Record<string, string>\n): string\nexport function buildEditExport(\n arg1: ElementLocator | HTMLElement | null,\n arg2: ElementInfo | Record<string, string>,\n arg3?: SpacingProperties | null | { originalText: string; newText: string },\n arg4?: BorderRadiusProperties | null,\n arg5?: FlexProperties | null,\n arg6?: SizingProperties | null,\n arg7?: Record<string, string>\n): string {\n const isLocator = Boolean(arg1 && typeof arg1 === 'object' && 'domSelector' in arg1)\n if (!isLocator) {\n void arg4\n void arg5\n void arg6\n }\n const pendingStyles = (isLocator ? (arg2 as Record<string, string>) : arg7) || {}\n const textEdit = isLocator && arg3 && typeof arg3 === 'object' && 'originalText' in arg3\n ? (arg3 as { originalText: string; newText: string })\n : null\n let locator: ElementLocator\n\n if (isLocator) {\n locator = arg1 as ElementLocator\n } else {\n const element = arg1 as HTMLElement | null\n const elementInfo = arg2 as ElementInfo\n locator = element\n ? getElementLocator(element)\n : {\n reactStack: [],\n domSelector: elementInfo.id ? `#${elementInfo.id}` : elementInfo.tagName,\n domContextHtml: `<${elementInfo.tagName}${elementInfo.id ? ` id=\"${elementInfo.id}\"` : ''} data-direct-edit-target=\"true\"></${elementInfo.tagName}>`,\n targetHtml: `<${elementInfo.tagName}${elementInfo.id ? ` id=\"${elementInfo.id}\"` : ''}></${elementInfo.tagName}>`,\n textPreview: '',\n tagName: elementInfo.tagName,\n id: elementInfo.id,\n classList: elementInfo.classList,\n }\n }\n\n const changes: ExportChange[] = []\n\n for (const [property, value] of Object.entries(pendingStyles)) {\n const tailwindClass = stylesToTailwind({ [property]: value })\n changes.push({\n property,\n value,\n tailwind: tailwindClass,\n })\n }\n\n const lines: string[] = []\n\n const primaryFrame = getPrimaryFrame(locator)\n const componentLabel = primaryFrame?.name ? primaryFrame.name : locator.tagName\n const formattedSource = locator.domSource?.file\n ? formatSourceLocation(locator.domSource.file, locator.domSource.line, locator.domSource.column)\n : primaryFrame?.file\n ? formatSourceLocation(primaryFrame.file, primaryFrame.line, primaryFrame.column)\n : null\n\n lines.push(`@<${componentLabel}>`)\n lines.push('')\n lines.push(locator.targetHtml || locator.domContextHtml || '')\n lines.push(`in ${formattedSource ?? '(file not available)'}`)\n\n if (!formattedSource) {\n const selector = locator.domSelector?.trim()\n const text = locator.textPreview?.trim()\n if (selector) {\n lines.push(`selector: ${selector}`)\n }\n if (text) {\n lines.push(`text: ${text}`)\n }\n }\n\n lines.push('')\n if (changes.length > 0) {\n lines.push('edits:')\n for (const change of changes) {\n const tailwind = change.tailwind ? ` (${change.tailwind})` : ''\n lines.push(`${change.property}: ${change.value}${tailwind}`)\n }\n }\n\n if (textEdit) {\n lines.push('text content changed:')\n lines.push(`from: \"${textEdit.originalText}\"`)\n lines.push(`to: \"${textEdit.newText}\"`)\n }\n\n return lines.join('\\n')\n}\n\nexport function buildCommentExport(\n locator: ElementLocator,\n commentText: string,\n replies?: Array<{ text: string; createdAt: number }>\n): string {\n const lines: string[] = []\n\n const primaryFrame = getPrimaryFrame(locator)\n const componentLabel = primaryFrame?.name ? primaryFrame.name : locator.tagName\n const formattedSource = locator.domSource?.file\n ? formatSourceLocation(locator.domSource.file, locator.domSource.line, locator.domSource.column)\n : primaryFrame?.file\n ? formatSourceLocation(primaryFrame.file, primaryFrame.line, primaryFrame.column)\n : null\n\n lines.push(`@<${componentLabel}>`)\n lines.push('')\n lines.push(locator.targetHtml || locator.domContextHtml || '')\n lines.push(`in ${formattedSource ?? '(file not available)'}`)\n\n if (!formattedSource) {\n const selector = locator.domSelector?.trim()\n const text = locator.textPreview?.trim()\n if (selector) {\n lines.push(`selector: ${selector}`)\n }\n if (text) {\n lines.push(`text: ${text}`)\n }\n }\n\n lines.push('')\n lines.push(`comment: ${commentText}`)\n if (replies && replies.length > 0) {\n for (const reply of replies) {\n lines.push(`reply: ${reply.text}`)\n }\n }\n\n return lines.join('\\n')\n}\n\nfunction formatPosition(\n siblingBefore: string | null,\n siblingAfter: string | null\n): string {\n if (siblingBefore && siblingAfter) return `after <${siblingBefore}>`\n if (siblingBefore && !siblingAfter) return `after <${siblingBefore}> (last)`\n if (!siblingBefore && siblingAfter) return `before <${siblingAfter}> (first)`\n return '(only child)'\n}\n\nexport function buildSessionExport(edits: SessionEdit[]): string {\n const blocks: string[] = []\n\n for (const edit of edits) {\n let block = buildEditExport(edit.locator, edit.pendingStyles, edit.textEdit)\n if (edit.move) {\n const fromPosition = formatPosition(edit.move.fromSiblingBefore, edit.move.fromSiblingAfter)\n const toPosition = formatPosition(edit.move.toSiblingBefore, edit.move.toSiblingAfter)\n if (edit.move.fromParentName === edit.move.toParentName) {\n block += `\\nmoved: in <${edit.move.toParentName}>, from ${fromPosition} to ${toPosition}`\n } else {\n block += `\\nmoved: from <${edit.move.fromParentName}> ${fromPosition} to <${edit.move.toParentName}> ${toPosition}`\n }\n }\n blocks.push(block)\n }\n\n return blocks.join('\\n\\n---\\n\\n')\n}\n\nexport type {\n ElementInfo,\n CSSPropertyValue,\n SpacingProperties,\n BorderRadiusProperties,\n BorderStyle,\n BorderProperties,\n FlexProperties,\n DirectEditState,\n SpacingPropertyKey,\n BorderRadiusPropertyKey,\n BorderPropertyKey,\n FlexPropertyKey,\n MeasurementLine,\n MeasurementState,\n ColorValue,\n ColorProperties,\n ColorPropertyKey,\n SizingProperties,\n SizingPropertyKey,\n SizingMode,\n SizingValue,\n TypographyProperties,\n TypographyPropertyKey,\n ReactComponentFrame,\n ElementLocator,\n DragState,\n DropTarget,\n DropIndicator,\n} from './types'\n","import type { ColorValue } from '../types'\n\nexport function formatColorValue(color: ColorValue): string {\n const r = parseInt(color.hex.slice(0, 2), 16)\n const g = parseInt(color.hex.slice(2, 4), 16)\n const b = parseInt(color.hex.slice(4, 6), 16)\n const a = color.alpha / 100\n\n if (a === 1) {\n return `#${color.hex}`\n }\n return `rgba(${r}, ${g}, ${b}, ${a})`\n}\n\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } {\n const h = hex.replace('#', '')\n return {\n r: parseInt(h.slice(0, 2), 16),\n g: parseInt(h.slice(2, 4), 16),\n b: parseInt(h.slice(4, 6), 16),\n }\n}\n\nexport function rgbToHex(r: number, g: number, b: number): string {\n return [r, g, b].map((v) => Math.round(v).toString(16).padStart(2, '0')).join('').toUpperCase()\n}\n\nexport function rgbToHsv(r: number, g: number, b: number): { h: number; s: number; v: number } {\n r /= 255\n g /= 255\n b /= 255\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n const d = max - min\n let h = 0\n const s = max === 0 ? 0 : (d / max) * 100\n const v = max * 100\n if (d !== 0) {\n switch (max) {\n case r: h = ((g - b) / d + (g < b ? 6 : 0)) * 60; break\n case g: h = ((b - r) / d + 2) * 60; break\n case b: h = ((r - g) / d + 4) * 60; break\n }\n }\n return { h, s, v }\n}\n\nexport function hsvToRgb(h: number, s: number, v: number): { r: number; g: number; b: number } {\n s /= 100\n v /= 100\n const c = v * s\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1))\n const m = v - c\n let r = 0, g = 0, b = 0\n if (h < 60) { r = c; g = x }\n else if (h < 120) { r = x; g = c }\n else if (h < 180) { g = c; b = x }\n else if (h < 240) { g = x; b = c }\n else if (h < 300) { r = x; b = c }\n else { r = c; b = x }\n return {\n r: Math.round((r + m) * 255),\n g: Math.round((g + m) * 255),\n b: Math.round((b + m) * 255),\n }\n}\n\nexport function rgbToHsl(r: number, g: number, b: number): { h: number; s: number; l: number } {\n r /= 255\n g /= 255\n b /= 255\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n const l = (max + min) / 2\n let h = 0\n let s = 0\n if (max !== min) {\n const d = max - min\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\n switch (max) {\n case r: h = ((g - b) / d + (g < b ? 6 : 0)) * 60; break\n case g: h = ((b - r) / d + 2) * 60; break\n case b: h = ((r - g) / d + 4) * 60; break\n }\n }\n return { h, s: s * 100, l: l * 100 }\n}\n\nexport function hslToRgb(h: number, s: number, l: number): { r: number; g: number; b: number } {\n s /= 100\n l /= 100\n const c = (1 - Math.abs(2 * l - 1)) * s\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1))\n const m = l - c / 2\n let r = 0, g = 0, b = 0\n if (h < 60) { r = c; g = x }\n else if (h < 120) { r = x; g = c }\n else if (h < 180) { g = c; b = x }\n else if (h < 240) { g = x; b = c }\n else if (h < 300) { r = x; b = c }\n else { r = c; b = x }\n return {\n r: Math.round((r + m) * 255),\n g: Math.round((g + m) * 255),\n b: Math.round((b + m) * 255),\n }\n}\n","const MCP_BASE = 'http://127.0.0.1:4747'\n\nlet cachedToken: string | null = null\n\nasync function getSessionToken(forceRefresh = false): Promise<string | null> {\n if (!forceRefresh && cachedToken) return cachedToken\n try {\n const res = await fetch(`${MCP_BASE}/api/health`, { signal: AbortSignal.timeout(2000) })\n if (!res.ok) return null\n const data = await res.json()\n cachedToken = typeof data.sessionToken === 'string' ? data.sessionToken : null\n return cachedToken\n } catch {\n return null\n }\n}\n\nasync function postWithSessionToken(\n path: '/api/edit' | '/api/comment',\n payload: Record<string, unknown>\n): Promise<{ ok: boolean; id: string }> {\n const send = async (token: string | null) => {\n const headers: Record<string, string> = { 'Content-Type': 'application/json' }\n if (token) headers['X-Session-Token'] = token\n return fetch(`${MCP_BASE}${path}`, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n })\n }\n\n let token = await getSessionToken()\n let res = await send(token)\n\n if (res.status === 403) {\n cachedToken = null\n token = await getSessionToken(true)\n res = await send(token)\n }\n\n return res.json()\n}\n\nexport async function sendEditToAgent(\n edit: Record<string, unknown>\n): Promise<{ ok: boolean; id: string }> {\n return postWithSessionToken('/api/edit', edit)\n}\n\nexport async function sendCommentToAgent(\n comment: Record<string, unknown>\n): Promise<{ ok: boolean; id: string }> {\n return postWithSessionToken('/api/comment', comment)\n}\n\nexport async function checkAgentConnection(): Promise<boolean> {\n try {\n const res = await fetch(`${MCP_BASE}/api/health`, { signal: AbortSignal.timeout(2000) })\n if (!res.ok) return false\n const data = await res.json()\n cachedToken = typeof data.sessionToken === 'string' ? data.sessionToken : null\n return data.ok === true\n } catch {\n return false\n }\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { usePortalContainer } from './portal-container'\nimport { useDirectEdit } from './provider'\nimport { Button } from './ui/button'\nimport { Input } from './ui/input'\nimport {\n Tooltip,\n TooltipProvider,\n TooltipTrigger,\n TooltipPortal,\n TooltipPositioner,\n TooltipPopup,\n createTooltipHandle,\n} from './ui/tooltip'\nimport {\n Select,\n SelectTrigger,\n SelectIcon,\n SelectPortal,\n SelectPositioner,\n SelectPopup,\n SelectItem,\n SelectItemIndicator,\n SelectItemText,\n} from './ui/select'\nimport { cn } from './cn'\nimport type { SpacingPropertyKey, BorderRadiusPropertyKey, BorderPropertyKey, BorderProperties, BorderStyle, CSSPropertyValue, SizingValue, SizingMode, SizingPropertyKey, ColorValue, ColorPropertyKey, TypographyPropertyKey, TypographyProperties } from './types'\nimport { formatColorValue } from './ui/color-utils'\nimport { ColorPickerPopover, ColorPickerGroup } from './ui/color-picker'\nimport { Slider } from './ui/slider'\nimport { useMeasurement } from './use-measurement'\nimport { MeasurementOverlay } from './measurement-overlay'\nimport { useMove } from './use-move'\nimport { getStoredGuidelines } from './use-guidelines'\nimport {\n calculateGuidelineMeasurements, isTextElement,\n resolveElementTarget, computeHoverHighlight,\n elementFromPointWithoutOverlays, findChildAtPoint,\n} from './utils'\nimport { MoveOverlay } from './move-overlay'\nimport { SelectionOverlay } from './selection-overlay'\nimport { CommentOverlay } from './comment-overlay'\nimport {\n X,\n Copy,\n Check,\n ChevronUp,\n ChevronDown,\n ArrowRight,\n ArrowDown,\n ArrowUp,\n ArrowLeft,\n MoveHorizontal,\n MoveVertical,\n ChevronsLeftRightEllipsis,\n Grid2x2,\n Columns2,\n ChevronsUpDown,\n Paintbrush,\n Square,\n Focus,\n Type,\n AlignLeft,\n AlignCenter,\n AlignRight,\n AlignVerticalJustifyStart,\n AlignVerticalJustifyCenter,\n AlignVerticalJustifyEnd,\n ALargeSmall,\n WrapText,\n AArrowUp,\n LetterText,\n Plus,\n Minus,\n Send,\n Link,\n Unlink,\n} from 'lucide-react'\n\nconst STORAGE_KEY = 'direct-edit-panel-position'\nconst PANEL_WIDTH = 300\nconst PANEL_HEIGHT = 420\n\nconst selectOnFocus = (e: React.FocusEvent<HTMLInputElement>) => e.target.select()\n\ninterface NumberInputProps extends Omit<React.ComponentProps<typeof Input>, 'value' | 'onChange' | 'type'> {\n value: number\n onValueChange: (value: number) => void\n}\n\nfunction NumberInput({ value: propValue, onValueChange, ...props }: NumberInputProps) {\n const [localValue, setLocalValue] = React.useState(String(propValue))\n\n React.useEffect(() => {\n setLocalValue(String(propValue))\n }, [propValue])\n\n return (\n <Input\n {...props}\n type=\"number\"\n value={localValue}\n onChange={(e) => {\n setLocalValue(e.target.value)\n const parsed = parseFloat(e.target.value)\n if (!isNaN(parsed)) onValueChange(parsed)\n }}\n onBlur={() => {\n if (localValue === '' || isNaN(parseFloat(localValue))) {\n setLocalValue(String(propValue))\n }\n }}\n onFocus={selectOnFocus}\n />\n )\n}\n\ninterface Position {\n x: number\n y: number\n}\n\nfunction getInitialPosition(): Position {\n if (typeof window === 'undefined') {\n return { x: 0, y: 0 }\n }\n\n try {\n const stored = localStorage.getItem(STORAGE_KEY)\n if (stored) {\n return JSON.parse(stored)\n }\n } catch {\n // Fall through to default\n }\n\n return {\n x: window.innerWidth - PANEL_WIDTH - 20,\n y: window.innerHeight - PANEL_HEIGHT - 20,\n }\n}\n\nconst DISTRIBUTE_MODES = ['fixed', 'space-between', 'space-around', 'space-evenly'] as const\ntype DistributeMode = typeof DISTRIBUTE_MODES[number]\nconst DISTRIBUTE_LABELS: Record<DistributeMode, string> = {\n fixed: 'Fixed',\n 'space-between': 'Between',\n 'space-around': 'Around',\n 'space-evenly': 'Evenly',\n}\n\n\ninterface PaddingInputsProps {\n values: {\n top: CSSPropertyValue\n right: CSSPropertyValue\n bottom: CSSPropertyValue\n left: CSSPropertyValue\n }\n onChange: (key: SpacingPropertyKey, value: CSSPropertyValue) => void\n}\n\nfunction PaddingInputs({ values, onChange }: PaddingInputsProps) {\n const [individual, setIndividual] = React.useState(false)\n\n const handleChange = (sides: ('top' | 'right' | 'bottom' | 'left')[], numericValue: number) => {\n const newValue: CSSPropertyValue = {\n numericValue,\n unit: 'px',\n raw: `${numericValue}px`,\n }\n\n for (const side of sides) {\n const key = `padding${side.charAt(0).toUpperCase() + side.slice(1)}` as SpacingPropertyKey\n onChange(key, newValue)\n }\n }\n\n const horizontalValue =\n values.left.numericValue === values.right.numericValue\n ? values.left.numericValue\n : values.left.numericValue\n const verticalValue =\n values.top.numericValue === values.bottom.numericValue\n ? values.top.numericValue\n : values.top.numericValue\n\n if (individual) {\n return (\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center gap-1.5\">\n <div className=\"relative flex-1\">\n <ArrowLeft className=\"absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground\" />\n <NumberInput\n value={values.left?.numericValue ?? 0}\n onValueChange={(val) => handleChange(['left'], val)}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Left\"\n />\n </div>\n <div className=\"relative flex-1\">\n <ArrowUp className=\"absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground\" />\n <NumberInput\n value={values.top?.numericValue ?? 0}\n onValueChange={(val) => handleChange(['top'], val)}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Top\"\n />\n </div>\n <Button\n variant=\"secondary\"\n size=\"icon\"\n className=\"size-7 shrink-0\"\n onClick={() => setIndividual(false)}\n title=\"Combined mode\"\n >\n <Columns2 className=\"size-3\" />\n </Button>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <div className=\"relative flex-1\">\n <ArrowRight className=\"absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground\" />\n <NumberInput\n value={values.right?.numericValue ?? 0}\n onValueChange={(val) => handleChange(['right'], val)}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Right\"\n />\n </div>\n <div className=\"relative flex-1\">\n <ArrowDown className=\"absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground\" />\n <NumberInput\n value={values.bottom?.numericValue ?? 0}\n onValueChange={(val) => handleChange(['bottom'], val)}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Bottom\"\n />\n </div>\n <div className=\"size-7 shrink-0\" />\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"flex items-center gap-1.5\">\n <div className=\"relative flex-1\">\n <MoveHorizontal className=\"absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground\" />\n <NumberInput\n value={horizontalValue}\n onValueChange={(val) => handleChange(['left', 'right'], val)}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Horizontal (left & right)\"\n />\n </div>\n <div className=\"relative flex-1\">\n <MoveVertical className=\"absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground\" />\n <NumberInput\n value={verticalValue}\n onValueChange={(val) => handleChange(['top', 'bottom'], val)}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Vertical (top & bottom)\"\n />\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 shrink-0\"\n onClick={() => setIndividual(true)}\n title=\"Individual mode\"\n >\n <Grid2x2 className=\"size-3\" />\n </Button>\n </div>\n )\n}\n\ninterface MarginInputsProps {\n values: {\n top: CSSPropertyValue\n right: CSSPropertyValue\n bottom: CSSPropertyValue\n left: CSSPropertyValue\n }\n onChange: (key: SpacingPropertyKey, value: CSSPropertyValue) => void\n}\n\nfunction MarginInputs({ values, onChange }: MarginInputsProps) {\n const [individual, setIndividual] = React.useState(false)\n\n const handleChange = (sides: ('top' | 'right' | 'bottom' | 'left')[], numericValue: number) => {\n const newValue: CSSPropertyValue = {\n numericValue,\n unit: 'px',\n raw: `${numericValue}px`,\n }\n\n for (const side of sides) {\n const key = `margin${side.charAt(0).toUpperCase() + side.slice(1)}` as SpacingPropertyKey\n onChange(key, newValue)\n }\n }\n\n const horizontalValue =\n values.left.numericValue === values.right.numericValue\n ? values.left.numericValue\n : values.left.numericValue\n const verticalValue =\n values.top.numericValue === values.bottom.numericValue\n ? values.top.numericValue\n : values.top.numericValue\n\n if (individual) {\n return (\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center gap-1.5\">\n <div className=\"relative flex-1\">\n <ArrowLeft className=\"absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground\" />\n <NumberInput\n value={values.left?.numericValue ?? 0}\n onValueChange={(val) => handleChange(['left'], val)}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Left\"\n />\n </div>\n <div className=\"relative flex-1\">\n <ArrowUp className=\"absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground\" />\n <NumberInput\n value={values.top?.numericValue ?? 0}\n onValueChange={(val) => handleChange(['top'], val)}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Top\"\n />\n </div>\n <Button\n variant=\"secondary\"\n size=\"icon\"\n className=\"size-7 shrink-0\"\n onClick={() => setIndividual(false)}\n title=\"Combined mode\"\n >\n <Columns2 className=\"size-3\" />\n </Button>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <div className=\"relative flex-1\">\n <ArrowRight className=\"absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground\" />\n <NumberInput\n value={values.right?.numericValue ?? 0}\n onValueChange={(val) => handleChange(['right'], val)}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Right\"\n />\n </div>\n <div className=\"relative flex-1\">\n <ArrowDown className=\"absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground\" />\n <NumberInput\n value={values.bottom?.numericValue ?? 0}\n onValueChange={(val) => handleChange(['bottom'], val)}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Bottom\"\n />\n </div>\n <div className=\"size-7 shrink-0\" />\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"flex items-center gap-1.5\">\n <div className=\"relative flex-1\">\n <MoveHorizontal className=\"absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground\" />\n <NumberInput\n value={horizontalValue}\n onValueChange={(val) => handleChange(['left', 'right'], val)}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Horizontal (left & right)\"\n />\n </div>\n <div className=\"relative flex-1\">\n <MoveVertical className=\"absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground\" />\n <NumberInput\n value={verticalValue}\n onValueChange={(val) => handleChange(['top', 'bottom'], val)}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Vertical (top & bottom)\"\n />\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 shrink-0\"\n onClick={() => setIndividual(true)}\n title=\"Individual mode\"\n >\n <Grid2x2 className=\"size-3\" />\n </Button>\n </div>\n )\n}\n\ninterface BorderRadiusInputsProps {\n values: {\n topLeft: CSSPropertyValue\n topRight: CSSPropertyValue\n bottomRight: CSSPropertyValue\n bottomLeft: CSSPropertyValue\n }\n onChange: (key: BorderRadiusPropertyKey, value: CSSPropertyValue) => void\n}\n\nconst BORDER_RADIUS_FULL = 9999\nconst BORDER_RADIUS_SLIDER_MAX = 49\n\n// Slider position 0-48 maps to 0-48px, position 49 maps to 9999 (Full)\nfunction sliderToValue(sliderPos: number): number {\n return sliderPos >= BORDER_RADIUS_SLIDER_MAX ? BORDER_RADIUS_FULL : sliderPos\n}\n\nfunction valueToSlider(value: number): number {\n return value >= BORDER_RADIUS_FULL ? BORDER_RADIUS_SLIDER_MAX : Math.min(value, BORDER_RADIUS_SLIDER_MAX - 1)\n}\n\nfunction RadiusCornerIcon({ corner, className }: { corner: 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight'; className?: string }) {\n const paths: Record<string, string> = {\n topLeft: 'M5 19V8a3 3 0 0 1 3-3h11',\n topRight: 'M19 19V8a3 3 0 0 0-3-3H5',\n bottomLeft: 'M5 5v11a3 3 0 0 0 3 3h11',\n bottomRight: 'M19 5v11a3 3 0 0 1-3 3H5',\n }\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" className={cn('size-3', className)}>\n <path d={paths[corner]} />\n </svg>\n )\n}\n\nfunction BorderRadiusInputs({ values, onChange }: BorderRadiusInputsProps) {\n const [individual, setIndividual] = React.useState(false)\n\n const handleChange = (\n corners: ('topLeft' | 'topRight' | 'bottomRight' | 'bottomLeft')[],\n numericValue: number\n ) => {\n const newValue: CSSPropertyValue = {\n numericValue,\n unit: 'px',\n raw: `${numericValue}px`,\n }\n\n for (const corner of corners) {\n const key = `border${corner.charAt(0).toUpperCase() + corner.slice(1)}Radius` as BorderRadiusPropertyKey\n onChange(key, newValue)\n }\n }\n\n const handleTextInputChange = (\n corners: ('topLeft' | 'topRight' | 'bottomRight' | 'bottomLeft')[],\n inputValue: string\n ) => {\n if (inputValue.toLowerCase() === 'full') {\n handleChange(corners, BORDER_RADIUS_FULL)\n } else {\n const numericValue = parseFloat(inputValue) || 0\n handleChange(corners, numericValue)\n }\n }\n\n const allSame =\n values.topLeft.numericValue === values.topRight.numericValue &&\n values.topRight.numericValue === values.bottomRight.numericValue &&\n values.bottomRight.numericValue === values.bottomLeft.numericValue\n const uniformValue = allSame ? values.topLeft.numericValue : values.topLeft.numericValue\n\n if (individual) {\n return (\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center gap-1.5\">\n <div className=\"relative flex-1\">\n <RadiusCornerIcon corner=\"topLeft\" className=\"absolute left-1.5 top-1/2 -translate-y-1/2 text-muted-foreground\" />\n <NumberInput\n value={values.topLeft?.numericValue ?? 0}\n onValueChange={(val) => handleChange(['topLeft'], val)}\n className=\"h-7 pl-6 pr-1 text-center text-xs tabular-nums\"\n title=\"Top Left\"\n />\n </div>\n <div className=\"relative flex-1\">\n <RadiusCornerIcon corner=\"topRight\" className=\"absolute left-1.5 top-1/2 -translate-y-1/2 text-muted-foreground\" />\n <NumberInput\n value={values.topRight?.numericValue ?? 0}\n onValueChange={(val) => handleChange(['topRight'], val)}\n className=\"h-7 pl-6 pr-1 text-center text-xs tabular-nums\"\n title=\"Top Right\"\n />\n </div>\n <Button\n variant=\"secondary\"\n size=\"icon\"\n className=\"size-7 shrink-0\"\n onClick={() => setIndividual(false)}\n title=\"Combined mode\"\n >\n <Columns2 className=\"size-3\" />\n </Button>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <div className=\"relative flex-1\">\n <RadiusCornerIcon corner=\"bottomLeft\" className=\"absolute left-1.5 top-1/2 -translate-y-1/2 text-muted-foreground\" />\n <NumberInput\n value={values.bottomLeft?.numericValue ?? 0}\n onValueChange={(val) => handleChange(['bottomLeft'], val)}\n className=\"h-7 pl-6 pr-1 text-center text-xs tabular-nums\"\n title=\"Bottom Left\"\n />\n </div>\n <div className=\"relative flex-1\">\n <RadiusCornerIcon corner=\"bottomRight\" className=\"absolute left-1.5 top-1/2 -translate-y-1/2 text-muted-foreground\" />\n <NumberInput\n value={values.bottomRight?.numericValue ?? 0}\n onValueChange={(val) => handleChange(['bottomRight'], val)}\n className=\"h-7 pl-6 pr-1 text-center text-xs tabular-nums\"\n title=\"Bottom Right\"\n />\n </div>\n <div className=\"size-7 shrink-0\" />\n </div>\n </div>\n )\n }\n\n const isFull = uniformValue >= BORDER_RADIUS_FULL\n const displayValue = isFull ? 'Full' : String(uniformValue)\n const sliderValue = valueToSlider(uniformValue)\n\n return (\n <div className=\"flex items-center gap-1.5\">\n <Slider\n value={sliderValue}\n onValueChange={(val) => {\n const sliderPos = typeof val === 'number' ? val : val[0]\n handleChange(\n ['topLeft', 'topRight', 'bottomRight', 'bottomLeft'],\n sliderToValue(sliderPos)\n )\n }}\n max={BORDER_RADIUS_SLIDER_MAX}\n step={1}\n className=\"flex-1\"\n />\n <Input\n type=\"text\"\n value={displayValue}\n onChange={(e) =>\n handleTextInputChange(\n ['topLeft', 'topRight', 'bottomRight', 'bottomLeft'],\n e.target.value\n )\n }\n onFocus={selectOnFocus}\n className=\"h-7 w-14 px-2 text-center text-xs tabular-nums\"\n />\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 shrink-0\"\n onClick={() => setIndividual(true)}\n title=\"Individual mode\"\n >\n <Grid2x2 className=\"size-3\" />\n </Button>\n </div>\n )\n}\n\nfunction BorderSideIcon({ side, className }: { side: 'Top' | 'Right' | 'Bottom' | 'Left'; className?: string }) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" className={cn('size-3', className)}>\n {/* Top */}\n <line x1=\"3\" y1=\"3\" x2=\"21\" y2=\"3\"\n stroke=\"currentColor\"\n strokeWidth={side === 'Top' ? 2.5 : 1.5}\n strokeDasharray={side === 'Top' ? 'none' : '3 2'}\n strokeOpacity={side === 'Top' ? 1 : 0.35}\n />\n {/* Right */}\n <line x1=\"21\" y1=\"3\" x2=\"21\" y2=\"21\"\n stroke=\"currentColor\"\n strokeWidth={side === 'Right' ? 2.5 : 1.5}\n strokeDasharray={side === 'Right' ? 'none' : '3 2'}\n strokeOpacity={side === 'Right' ? 1 : 0.35}\n />\n {/* Bottom */}\n <line x1=\"3\" y1=\"21\" x2=\"21\" y2=\"21\"\n stroke=\"currentColor\"\n strokeWidth={side === 'Bottom' ? 2.5 : 1.5}\n strokeDasharray={side === 'Bottom' ? 'none' : '3 2'}\n strokeOpacity={side === 'Bottom' ? 1 : 0.35}\n />\n {/* Left */}\n <line x1=\"3\" y1=\"3\" x2=\"3\" y2=\"21\"\n stroke=\"currentColor\"\n strokeWidth={side === 'Left' ? 2.5 : 1.5}\n strokeDasharray={side === 'Left' ? 'none' : '3 2'}\n strokeOpacity={side === 'Left' ? 1 : 0.35}\n />\n </svg>\n )\n}\n\nconst BORDER_STYLE_OPTIONS: Array<{ value: BorderStyle; label: string }> = [\n { value: 'solid', label: 'Solid' },\n { value: 'dashed', label: 'Dashed' },\n { value: 'dotted', label: 'Dotted' },\n]\n\nconst BORDER_SIDES = ['Top', 'Right', 'Bottom', 'Left'] as const\n\ninterface BorderInputsProps {\n border: BorderProperties\n borderColor?: ColorValue\n onChange: (key: BorderPropertyKey, value: BorderProperties[BorderPropertyKey]) => void\n onBatchChange: (changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]>) => void\n onBorderColorChange?: (value: ColorValue) => void\n}\n\nconst BORDER_SIDE_OPTIONS = ['All', 'Top', 'Right', 'Bottom', 'Left', 'Custom'] as const\ntype BorderSideOption = typeof BORDER_SIDE_OPTIONS[number]\n\nfunction BorderInputs({ border, borderColor, onChange, onBatchChange, onBorderColorChange }: BorderInputsProps) {\n const [selectedSide, setSelectedSide] = React.useState<BorderSideOption>('All')\n\n const activeSides = selectedSide === 'All' || selectedSide === 'Custom'\n ? BORDER_SIDES\n : [selectedSide] as const\n\n const stylesMatch = activeSides.every(\n (s) => (border[`border${s}Style` as keyof BorderProperties] as BorderStyle) === (border[`border${activeSides[0]}Style` as keyof BorderProperties] as BorderStyle),\n )\n const widthsMatch = activeSides.every((s) => {\n const w = border[`border${s}Width` as keyof BorderProperties] as CSSPropertyValue\n const first = border[`border${activeSides[0]}Width` as keyof BorderProperties] as CSSPropertyValue\n return w.numericValue === first.numericValue\n })\n\n const currentStyle = stylesMatch ? (border[`border${activeSides[0]}Style` as keyof BorderProperties] as BorderStyle) || 'solid' : 'solid'\n const currentWidth = widthsMatch ? (border[`border${activeSides[0]}Width` as keyof BorderProperties] as CSSPropertyValue) : null\n\n const handleStyleChange = (style: BorderStyle) => {\n const changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]> = []\n for (const s of activeSides) {\n const w = border[`border${s}Width` as keyof BorderProperties] as CSSPropertyValue\n if (w.numericValue <= 0) {\n changes.push([`border${s}Width` as BorderPropertyKey, { numericValue: 1, unit: 'px', raw: '1px' }])\n }\n changes.push([`border${s}Style` as BorderPropertyKey, style])\n }\n onBatchChange(changes)\n }\n\n const handleAllWidthChange = (numericValue: number) => {\n const clamped = Math.max(0, numericValue)\n const value: CSSPropertyValue = { numericValue: clamped, unit: 'px', raw: `${clamped}px` }\n const changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]> = []\n for (const s of activeSides) {\n changes.push([`border${s}Width` as BorderPropertyKey, value])\n }\n onBatchChange(changes)\n }\n\n const handleSideWidthChange = (side: string, numericValue: number) => {\n const clamped = Math.max(0, numericValue)\n onChange(`border${side}Width` as BorderPropertyKey, {\n numericValue: clamped,\n unit: 'px',\n raw: `${clamped}px`,\n })\n }\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-1.5\">\n <Select value={currentStyle} onValueChange={(val) => val && handleStyleChange(val as BorderStyle)}>\n <SelectTrigger className=\"flex h-7 w-[80px] items-center justify-between rounded-md border-0 bg-muted px-2 text-xs hover:bg-muted-foreground/10 focus:outline-none\">\n <span className=\"flex items-center gap-1.5\">\n <Square className=\"size-3.5 text-muted-foreground\" />\n <span>{BORDER_STYLE_OPTIONS.find((o) => o.value === currentStyle)?.label ?? currentStyle}</span>\n </span>\n <SelectIcon>\n <ChevronDown className=\"size-3 text-muted-foreground\" />\n </SelectIcon>\n </SelectTrigger>\n <SelectPortal>\n <SelectPositioner sideOffset={4} className=\"z-[99999]\">\n <SelectPopup className=\"min-w-[100px] overflow-hidden rounded-lg border-0 bg-popover p-1 text-popover-foreground shadow-lg animate-in fade-in-0 zoom-in-95\">\n {BORDER_STYLE_OPTIONS.map((option) => (\n <SelectItem\n key={option.value}\n value={option.value}\n className=\"relative flex cursor-default select-none items-center rounded-md py-1.5 pl-6 pr-2 text-xs outline-none hover:bg-muted data-[highlighted]:bg-muted\"\n >\n <SelectItemIndicator className=\"absolute left-1.5 flex items-center justify-center\">\n <Check className=\"size-3\" />\n </SelectItemIndicator>\n <SelectItemText>{option.label}</SelectItemText>\n </SelectItem>\n ))}\n </SelectPopup>\n </SelectPositioner>\n </SelectPortal>\n </Select>\n\n <NumberInput\n min={0}\n step={0.5}\n value={currentWidth ? Math.round(currentWidth.numericValue * 100) / 100 : 0}\n placeholder={currentWidth ? undefined : '–'}\n onValueChange={handleAllWidthChange}\n className=\"h-7 w-14 px-2 text-center text-xs tabular-nums\"\n title=\"Border width\"\n />\n\n <Select value={selectedSide} onValueChange={(val) => val && setSelectedSide(val as BorderSideOption)}>\n <SelectTrigger className=\"flex h-7 flex-1 items-center justify-between rounded-md border-0 bg-muted px-2 text-xs hover:bg-muted-foreground/10 focus:outline-none\">\n <span className=\"flex items-center gap-1.5\">\n <Square className=\"size-3 text-muted-foreground\" />\n <span>{selectedSide}</span>\n </span>\n <SelectIcon>\n <ChevronDown className=\"size-3 text-muted-foreground\" />\n </SelectIcon>\n </SelectTrigger>\n <SelectPortal>\n <SelectPositioner sideOffset={4} className=\"z-[99999]\">\n <SelectPopup className=\"min-w-[90px] overflow-hidden rounded-lg border-0 bg-popover p-1 text-popover-foreground shadow-lg animate-in fade-in-0 zoom-in-95\">\n {BORDER_SIDE_OPTIONS.map((side) => (\n <SelectItem\n key={side}\n value={side}\n className=\"relative flex cursor-default select-none items-center rounded-md py-1.5 pl-6 pr-2 text-xs outline-none hover:bg-muted data-[highlighted]:bg-muted\"\n >\n <SelectItemIndicator className=\"absolute left-1.5 flex items-center justify-center\">\n <Check className=\"size-3\" />\n </SelectItemIndicator>\n <SelectItemText>{side}</SelectItemText>\n </SelectItem>\n ))}\n </SelectPopup>\n </SelectPositioner>\n </SelectPortal>\n </Select>\n </div>\n\n {selectedSide === 'Custom' && (\n <div className=\"grid grid-cols-2 gap-1.5\">\n {BORDER_SIDES.map((side) => {\n const w = border[`border${side}Width` as keyof BorderProperties] as CSSPropertyValue\n return (\n <div key={side} className=\"relative\">\n <BorderSideIcon side={side} className=\"absolute left-2 top-1/2 -translate-y-1/2 text-muted-foreground\" />\n <NumberInput\n min={0}\n step={0.5}\n value={Math.round(w.numericValue * 100) / 100}\n onValueChange={(val) => handleSideWidthChange(side, val)}\n className=\"h-7 pl-7 pr-2 text-xs tabular-nums\"\n title={`Border ${side.toLowerCase()} width`}\n />\n </div>\n )\n })}\n </div>\n )}\n\n {borderColor && onBorderColorChange && (\n <ColorInput\n id=\"border-color\"\n label=\"Border\"\n icon={<Square className=\"size-3.5\" />}\n value={borderColor}\n onChange={onBorderColorChange}\n />\n )}\n </div>\n )\n}\n\ninterface BorderSectionProps {\n border: BorderProperties\n borderColor?: ColorValue\n onChange: (key: BorderPropertyKey, value: BorderProperties[BorderPropertyKey]) => void\n onBatchChange: (changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]>) => void\n onBorderColorChange?: (value: ColorValue) => void\n}\n\nfunction BorderSection({ border, borderColor, onChange, onBatchChange, onBorderColorChange }: BorderSectionProps) {\n const hasBorder = BORDER_SIDES.some((s) => {\n const style = border[`border${s}Style` as keyof BorderProperties] as BorderStyle\n const width = border[`border${s}Width` as keyof BorderProperties] as CSSPropertyValue\n return style !== 'none' && width.numericValue > 0\n })\n\n const handleAddBorder = () => {\n const changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]> = []\n for (const s of BORDER_SIDES) {\n changes.push([`border${s}Style` as BorderPropertyKey, 'solid'])\n const w = border[`border${s}Width` as keyof BorderProperties] as CSSPropertyValue\n if (w.numericValue <= 0) {\n changes.push([`border${s}Width` as BorderPropertyKey, { numericValue: 1, unit: 'px', raw: '1px' }])\n }\n }\n onBatchChange(changes)\n }\n\n const handleRemoveBorder = () => {\n const changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]> = []\n for (const s of BORDER_SIDES) {\n changes.push([`border${s}Style` as BorderPropertyKey, 'none'])\n changes.push([`border${s}Width` as BorderPropertyKey, { numericValue: 0, unit: 'px', raw: '0px' }])\n }\n onBatchChange(changes)\n }\n\n const headerActions = (\n <button\n type=\"button\"\n className=\"flex size-6 items-center justify-center rounded text-muted-foreground hover:bg-muted-foreground/10 hover:text-foreground\"\n onClick={hasBorder ? handleRemoveBorder : handleAddBorder}\n title={hasBorder ? 'Remove border' : 'Add border'}\n >\n {hasBorder ? <Minus className=\"size-3.5\" strokeWidth={1.5} /> : <Plus className=\"size-3.5\" strokeWidth={1.5} />}\n </button>\n )\n\n return (\n <CollapsibleSection title=\"Border\" actions={headerActions}>\n {hasBorder ? (\n <ColorPickerGroup>\n <BorderInputs\n border={border}\n borderColor={borderColor}\n onChange={onChange}\n onBatchChange={onBatchChange}\n onBorderColorChange={onBorderColorChange}\n />\n </ColorPickerGroup>\n ) : null}\n </CollapsibleSection>\n )\n}\n\ninterface AlignmentGridProps {\n justifyContent: string\n alignItems: string\n onChange: (justify: string, align: string) => void\n}\n\nfunction AlignmentGrid({ justifyContent, alignItems, onChange }: AlignmentGridProps) {\n const justifyValues = ['flex-start', 'center', 'flex-end']\n const alignValues = ['flex-start', 'center', 'flex-end']\n\n const normalizeJustify = (val: string) => {\n if (val === 'start') return 'flex-start'\n if (val === 'end') return 'flex-end'\n return val\n }\n\n const normalizeAlign = (val: string) => {\n if (val === 'start') return 'flex-start'\n if (val === 'end') return 'flex-end'\n return val\n }\n\n const currentJustify = normalizeJustify(justifyContent)\n const currentAlign = normalizeAlign(alignItems)\n\n const tooltipHandle = createTooltipHandle<{ justify: string; align: string }>()\n\n return (\n <TooltipProvider delayDuration={300} closeDelay={150}>\n <div className=\"grid grid-cols-3 gap-0.5 rounded-md bg-muted p-0.5\">\n {alignValues.map((align) =>\n justifyValues.map((justify) => {\n const isActive = currentJustify === justify && currentAlign === align\n return (\n <TooltipTrigger\n key={`${justify}-${align}`}\n handle={tooltipHandle}\n payload={{ justify, align }}\n render={\n <button\n type=\"button\"\n className={cn(\n 'flex size-7 items-center justify-center rounded transition-all',\n isActive\n ? 'bg-background shadow-sm'\n : 'hover:bg-muted-foreground/10'\n )}\n onClick={() => onChange(justify, align)}\n >\n {isActive ? (\n <div\n className=\"flex size-full gap-[2px] p-1\"\n style={{ justifyContent: justify, alignItems: align }}\n >\n <span className=\"h-2 w-[1.5px] rounded-full bg-blue-500\" />\n <span className=\"h-2 w-[1.5px] rounded-full bg-blue-500\" />\n <span className=\"h-2 w-[1.5px] rounded-full bg-blue-500\" />\n </div>\n ) : (\n <span className=\"size-1 rounded-full bg-muted-foreground/30\" />\n )}\n </button>\n }\n />\n )\n })\n )}\n </div>\n <Tooltip handle={tooltipHandle}>\n {({ payload }) => (\n <TooltipPortal>\n <TooltipPositioner side=\"bottom\" sideOffset={8} className=\"fixed z-[99999]\">\n <TooltipPopup className=\"overflow-hidden rounded-md bg-[#171717] px-3 py-1.5 text-xs text-[#fafafa] animate-in fade-in-0 zoom-in-95 data-[closed]:animate-out data-[closed]:fade-out-0 data-[closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2\">\n justify: {payload?.justify}, align: {payload?.align}\n </TooltipPopup>\n </TooltipPositioner>\n </TooltipPortal>\n )}\n </Tooltip>\n </TooltipProvider>\n )\n}\n\nconst SIZING_OPTIONS: { value: SizingMode; label: string }[] = [\n { value: 'fixed', label: 'Fixed' },\n { value: 'fill', label: 'Fill container' },\n { value: 'fit', label: 'Fit content' },\n]\n\nfunction SizingFixedInput({ value, onValueChange }: { value: number; onValueChange: (v: number) => void }) {\n const [localValue, setLocalValue] = React.useState(String(value))\n\n React.useEffect(() => {\n setLocalValue(String(value))\n }, [value])\n\n return (\n <input\n type=\"number\"\n value={localValue}\n onChange={(e) => {\n setLocalValue(e.target.value)\n const parsed = parseFloat(e.target.value)\n if (!isNaN(parsed)) onValueChange(parsed)\n }}\n onBlur={() => {\n if (localValue === '' || isNaN(parseFloat(localValue))) {\n setLocalValue(String(value))\n }\n }}\n onFocus={selectOnFocus}\n className=\"w-full min-w-0 flex-1 bg-transparent tabular-nums outline-none [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none [appearance:textfield]\"\n />\n )\n}\n\ninterface SizingDropdownProps {\n label: string\n value: SizingValue\n onChange: (value: SizingValue) => void\n}\n\nfunction SizingDropdown({ label, value, onChange }: SizingDropdownProps) {\n const handleFixedValueChange = (numericValue: number) => {\n onChange({\n mode: 'fixed',\n value: {\n numericValue,\n unit: 'px',\n raw: `${numericValue}px`,\n },\n })\n }\n\n return (\n <div className=\"flex h-7 flex-1 items-center overflow-hidden rounded-md border-0 bg-muted text-xs\">\n <span className=\"flex flex-1 items-center gap-1.5 px-2\">\n <span className=\"text-muted-foreground\">{label}</span>\n {value.mode === 'fixed' ? (\n <SizingFixedInput\n value={Math.round(value.value.numericValue)}\n onValueChange={handleFixedValueChange}\n />\n ) : (\n <span className=\"flex flex-1 items-center gap-1\">\n <span className=\"tabular-nums text-muted-foreground\">{Math.round(value.value.numericValue)}</span>\n <span>{value.mode === 'fill' ? 'Fill' : 'Fit'}</span>\n </span>\n )}\n </span>\n <Select value={value.mode} onValueChange={(val) => {\n if (val) onChange({ mode: val as SizingMode, value: value.value })\n }}>\n <SelectTrigger className=\"flex h-full items-center justify-center border-l border-border/30 px-1.5 hover:bg-muted-foreground/10\">\n <ChevronsUpDown className=\"size-3 text-muted-foreground\" />\n </SelectTrigger>\n <SelectPortal>\n <SelectPositioner side=\"bottom\" sideOffset={4} alignItemWithTrigger={false} className=\"z-[99999]\">\n <SelectPopup className=\"min-w-[100px] overflow-hidden rounded-lg border-0 bg-popover p-1 text-popover-foreground shadow-lg animate-in fade-in-0 zoom-in-95\">\n {SIZING_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value} className=\"relative flex cursor-default select-none items-center rounded-md py-1.5 pl-6 pr-2 text-xs outline-none hover:bg-muted data-[highlighted]:bg-muted\">\n <SelectItemIndicator className=\"absolute left-1.5 flex items-center justify-center\">\n <Check className=\"size-3\" />\n </SelectItemIndicator>\n <SelectItemText>{option.label}</SelectItemText>\n </SelectItem>\n ))}\n </SelectPopup>\n </SelectPositioner>\n </SelectPortal>\n </Select>\n </div>\n )\n}\n\ninterface SizingInputsProps {\n width: SizingValue\n height: SizingValue\n onWidthChange: (value: SizingValue) => void\n onHeightChange: (value: SizingValue) => void\n}\n\nfunction SizingInputs({ width, height, onWidthChange, onHeightChange }: SizingInputsProps) {\n const { selectedElement } = useDirectEdit()\n const [locked, setLocked] = React.useState(false)\n const ratioRef = React.useRef<number>(1)\n\n React.useEffect(() => {\n setLocked(false)\n }, [selectedElement])\n\n const canLock = width.mode === 'fixed' && height.mode === 'fixed' && height.value.numericValue > 0 && width.value.numericValue > 0\n\n const handleLockToggle = () => {\n if (!locked && canLock) {\n ratioRef.current = width.value.numericValue / height.value.numericValue\n }\n setLocked(!locked)\n }\n\n const handleWidthChange = (value: SizingValue) => {\n onWidthChange(value)\n if (locked && value.mode === 'fixed' && height.mode === 'fixed' && ratioRef.current > 0) {\n const newHeight = Math.round(value.value.numericValue / ratioRef.current)\n onHeightChange({\n mode: 'fixed',\n value: { numericValue: newHeight, unit: height.value.unit, raw: `${newHeight}${height.value.unit}` },\n })\n }\n }\n\n const handleHeightChange = (value: SizingValue) => {\n onHeightChange(value)\n if (locked && value.mode === 'fixed' && width.mode === 'fixed' && ratioRef.current > 0) {\n const newWidth = Math.round(value.value.numericValue * ratioRef.current)\n onWidthChange({\n mode: 'fixed',\n value: { numericValue: newWidth, unit: width.value.unit, raw: `${newWidth}${width.value.unit}` },\n })\n }\n }\n\n return (\n <div className=\"flex items-center gap-2\">\n <SizingDropdown label=\"W\" value={width} onChange={handleWidthChange} />\n <SizingDropdown label=\"H\" value={height} onChange={handleHeightChange} />\n <Button\n variant={locked ? 'secondary' : 'ghost'}\n size=\"icon\"\n className=\"size-7 shrink-0\"\n onClick={handleLockToggle}\n disabled={!canLock}\n title={locked ? 'Unlock aspect ratio' : 'Lock aspect ratio'}\n >\n {locked ? <Link className=\"size-3\" /> : <Unlink className=\"size-3\" />}\n </Button>\n </div>\n )\n}\n\ninterface ColorInputProps {\n id?: string\n label: string\n icon: React.ReactNode\n value: ColorValue\n onChange: (value: ColorValue) => void\n}\n\nfunction ColorInput({ id, label, icon, value, onChange }: ColorInputProps) {\n const [hexInput, setHexInput] = React.useState(value.hex)\n const [alphaInput, setAlphaInput] = React.useState(value.alpha.toString())\n\n // Sync internal state when value changes externally\n React.useEffect(() => {\n setHexInput(value.hex)\n setAlphaInput(value.alpha.toString())\n }, [value.hex, value.alpha])\n\n const handleHexChange = (newHex: string) => {\n // Remove # if present and convert to uppercase\n const cleaned = newHex.replace('#', '').toUpperCase()\n setHexInput(cleaned)\n\n // Only update if valid 6-character hex\n if (/^[0-9A-F]{6}$/.test(cleaned)) {\n onChange({\n hex: cleaned,\n alpha: value.alpha,\n raw: formatColorValue({ hex: cleaned, alpha: value.alpha, raw: '' }),\n })\n }\n }\n\n const handleAlphaChange = (newAlpha: string) => {\n setAlphaInput(newAlpha)\n\n const numAlpha = parseInt(newAlpha)\n if (!isNaN(numAlpha) && numAlpha >= 0 && numAlpha <= 100) {\n onChange({\n hex: value.hex,\n alpha: numAlpha,\n raw: formatColorValue({ hex: value.hex, alpha: numAlpha, raw: '' }),\n })\n }\n }\n\n return (\n <div>\n <div className=\"flex h-7 items-center rounded-md border-0 bg-muted\">\n {/* Color swatch with popover picker */}\n <div className=\"ml-1\">\n <ColorPickerPopover id={id} value={value} onChange={onChange}>\n <div\n className=\"size-5 cursor-pointer rounded-sm shadow-[inset_0_0_0_1px_rgba(0,0,0,0.1)]\"\n style={{ backgroundColor: `#${value.hex}` }}\n />\n </ColorPickerPopover>\n </div>\n\n {/* Hex input */}\n <input\n type=\"text\"\n value={hexInput}\n onChange={(e) => handleHexChange(e.target.value)}\n onBlur={() => setHexInput(value.hex)}\n className=\"h-full w-[68px] bg-transparent px-2 font-mono text-xs uppercase outline-none\"\n maxLength={6}\n placeholder=\"FFFFFF\"\n />\n\n {/* Separator */}\n <span className=\"text-xs text-muted-foreground\">/</span>\n\n {/* Opacity input */}\n <input\n type=\"number\"\n value={alphaInput}\n onChange={(e) => handleAlphaChange(e.target.value)}\n onBlur={() => setAlphaInput(value.alpha.toString())}\n className=\"h-full w-10 bg-transparent px-1 text-center text-xs tabular-nums outline-none [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none [appearance:textfield]\"\n min={0}\n max={100}\n />\n <span className=\"pr-2 text-xs text-muted-foreground\">%</span>\n </div>\n </div>\n )\n}\n\nconst FONT_FAMILIES = [\n { value: 'system-ui, sans-serif', label: 'System Sans-Serif' },\n { value: 'Georgia, serif', label: 'System Serif' },\n { value: 'ui-monospace, monospace', label: 'System Mono' },\n { value: 'Inter, sans-serif', label: 'Inter' },\n { value: 'Roboto, sans-serif', label: 'Roboto' },\n { value: 'Arial, sans-serif', label: 'Arial' },\n]\n\nconst FONT_WEIGHTS = [\n { value: '100', label: 'Thin' },\n { value: '200', label: 'Extra Light' },\n { value: '300', label: 'Light' },\n { value: '400', label: 'Regular' },\n { value: '500', label: 'Medium' },\n { value: '600', label: 'Semibold' },\n { value: '700', label: 'Bold' },\n { value: '800', label: 'Extra Bold' },\n { value: '900', label: 'Black' },\n]\n\ninterface TypographyInputsProps {\n typography: TypographyProperties\n onUpdate: (key: TypographyPropertyKey, value: CSSPropertyValue | string) => void\n}\n\nfunction TypographyInputs({ typography, onUpdate }: TypographyInputsProps) {\n const handleFontSizeChange = (value: number) => {\n onUpdate('fontSize', { numericValue: value, unit: 'px', raw: `${value}px` })\n }\n\n const handleLineHeightChange = (value: number) => {\n onUpdate('lineHeight', { numericValue: value, unit: 'px', raw: `${value}px` })\n }\n\n const handleLetterSpacingChange = (value: number) => {\n onUpdate('letterSpacing', { numericValue: value, unit: 'em', raw: `${value}em` })\n }\n\n const getFontFamilyLabel = (value: string) => {\n const valueLower = value.toLowerCase()\n const family = FONT_FAMILIES.find((f) => {\n const familyName = f.value.split(',')[0].trim().toLowerCase()\n return valueLower.startsWith(familyName) || valueLower.startsWith(`\"${familyName}\"`)\n })\n return family?.label || 'Custom'\n }\n\n const getFontWeightLabel = (value: string) => {\n const weight = FONT_WEIGHTS.find((w) => w.value === value)\n return weight?.label || value\n }\n\n return (\n <div className=\"space-y-3\">\n <Select value={typography.fontFamily} onValueChange={(val) => val && onUpdate('fontFamily', val)}>\n <SelectTrigger className=\"flex h-7 w-full items-center justify-between rounded-md border-0 bg-muted px-2 text-xs hover:bg-muted-foreground/10 focus:outline-none\">\n <span className=\"flex items-center gap-2\">\n <Type className=\"size-3.5 text-muted-foreground\" />\n <span>{getFontFamilyLabel(typography.fontFamily)}</span>\n </span>\n <SelectIcon>\n <ChevronDown className=\"size-3 text-muted-foreground\" />\n </SelectIcon>\n </SelectTrigger>\n <SelectPortal>\n <SelectPositioner sideOffset={4} className=\"z-[99999]\">\n <SelectPopup className=\"min-w-[180px] overflow-hidden rounded-lg border-0 bg-popover p-1 text-popover-foreground shadow-lg animate-in fade-in-0 zoom-in-95\">\n {FONT_FAMILIES.map((option) => (\n <SelectItem\n key={option.value}\n value={option.value}\n className=\"relative flex cursor-default select-none items-center rounded-md py-2 pl-7 pr-2 text-xs outline-none hover:bg-muted hover:text-foreground data-[highlighted]:bg-muted data-[highlighted]:text-foreground\"\n >\n <SelectItemIndicator className=\"absolute left-2 flex items-center justify-center\">\n <Check className=\"size-3\" />\n </SelectItemIndicator>\n <SelectItemText>{option.label}</SelectItemText>\n </SelectItem>\n ))}\n </SelectPopup>\n </SelectPositioner>\n </SelectPortal>\n </Select>\n\n <Select value={typography.fontWeight} onValueChange={(val) => val && onUpdate('fontWeight', val)}>\n <SelectTrigger className=\"flex h-7 w-full items-center justify-between rounded-md border-0 bg-muted px-2 text-xs hover:bg-muted-foreground/10 focus:outline-none\">\n <span className=\"flex items-center gap-2\">\n <ALargeSmall className=\"size-3.5 text-muted-foreground\" />\n <span>{getFontWeightLabel(typography.fontWeight)}</span>\n </span>\n <SelectIcon>\n <ChevronDown className=\"size-3 text-muted-foreground\" />\n </SelectIcon>\n </SelectTrigger>\n <SelectPortal>\n <SelectPositioner sideOffset={4} className=\"z-[99999]\">\n <SelectPopup className=\"min-w-[140px] overflow-hidden rounded-lg border-0 bg-popover p-1 text-popover-foreground shadow-lg animate-in fade-in-0 zoom-in-95\">\n {FONT_WEIGHTS.map((option) => (\n <SelectItem\n key={option.value}\n value={option.value}\n className=\"relative flex cursor-default select-none items-center rounded-md py-2 pl-7 pr-2 text-xs outline-none hover:bg-muted hover:text-foreground data-[highlighted]:bg-muted data-[highlighted]:text-foreground\"\n >\n <SelectItemIndicator className=\"absolute left-2 flex items-center justify-center\">\n <Check className=\"size-3\" />\n </SelectItemIndicator>\n <SelectItemText>{option.label}</SelectItemText>\n </SelectItem>\n ))}\n </SelectPopup>\n </SelectPositioner>\n </SelectPortal>\n </Select>\n\n <div className=\"flex gap-2\">\n <div className=\"relative flex-1\">\n <AArrowUp className=\"absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground\" />\n <NumberInput\n value={Math.round(typography.fontSize.numericValue)}\n onValueChange={handleFontSizeChange}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Font Size\"\n />\n </div>\n <div className=\"relative flex-1\">\n <WrapText className=\"absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground\" />\n <NumberInput\n value={Math.round(typography.lineHeight.numericValue)}\n onValueChange={handleLineHeightChange}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Line Height\"\n />\n </div>\n <div className=\"relative flex-1\">\n <LetterText className=\"absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground\" />\n <NumberInput\n step=\"0.01\"\n value={Math.round(typography.letterSpacing.numericValue * 100) / 100}\n onValueChange={handleLetterSpacingChange}\n className=\"h-7 pl-7 pr-2 text-center text-xs tabular-nums\"\n title=\"Letter Spacing (em)\"\n />\n </div>\n </div>\n\n <div className=\"flex items-center gap-3\">\n <div className=\"flex gap-1\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={typography.textAlign === 'left' || typography.textAlign === 'start' ? 'size-7 bg-muted text-foreground' : 'size-7 text-muted-foreground'}\n onClick={() => onUpdate('textAlign', 'left')}\n title=\"Align Left\"\n >\n <AlignLeft className=\"size-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={typography.textAlign === 'center' ? 'size-7 bg-muted text-foreground' : 'size-7 text-muted-foreground'}\n onClick={() => onUpdate('textAlign', 'center')}\n title=\"Align Center\"\n >\n <AlignCenter className=\"size-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={typography.textAlign === 'right' || typography.textAlign === 'end' ? 'size-7 bg-muted text-foreground' : 'size-7 text-muted-foreground'}\n onClick={() => onUpdate('textAlign', 'right')}\n title=\"Align Right\"\n >\n <AlignRight className=\"size-3.5\" />\n </Button>\n </div>\n\n <div className=\"flex gap-1\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={typography.textVerticalAlign === 'flex-start' ? 'size-7 bg-muted text-foreground' : 'size-7 text-muted-foreground'}\n onClick={() => onUpdate('textVerticalAlign', 'flex-start')}\n title=\"Align Top\"\n >\n <AlignVerticalJustifyStart className=\"size-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={typography.textVerticalAlign === 'center' ? 'size-7 bg-muted text-foreground' : 'size-7 text-muted-foreground'}\n onClick={() => onUpdate('textVerticalAlign', 'center')}\n title=\"Align Middle\"\n >\n <AlignVerticalJustifyCenter className=\"size-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={typography.textVerticalAlign === 'flex-end' ? 'size-7 bg-muted text-foreground' : 'size-7 text-muted-foreground'}\n onClick={() => onUpdate('textVerticalAlign', 'flex-end')}\n title=\"Align Bottom\"\n >\n <AlignVerticalJustifyEnd className=\"size-3.5\" />\n </Button>\n </div>\n </div>\n </div>\n )\n}\n\ninterface FillSectionProps {\n backgroundColor: ColorValue\n textColor: ColorValue\n borderColor?: ColorValue\n outlineColor?: ColorValue\n onBackgroundChange: (value: ColorValue) => void\n onTextChange: (value: ColorValue) => void\n onBorderColorChange?: (value: ColorValue) => void\n onOutlineColorChange?: (value: ColorValue) => void\n hasTextContent: boolean\n showBackgroundColor?: boolean\n showBorderColor?: boolean\n showOutlineColor?: boolean\n}\n\nfunction FillSection({\n backgroundColor,\n textColor,\n borderColor,\n outlineColor,\n onBackgroundChange,\n onTextChange,\n onBorderColorChange,\n onOutlineColorChange,\n hasTextContent,\n showBackgroundColor,\n showBorderColor,\n showOutlineColor,\n}: FillSectionProps) {\n return (\n <ColorPickerGroup>\n <div className=\"space-y-3\">\n {showBackgroundColor && (\n <ColorInput\n id=\"fill-bg\"\n label=\"Fill\"\n icon={<Paintbrush className=\"size-3.5\" />}\n value={backgroundColor}\n onChange={onBackgroundChange}\n />\n )}\n\n {hasTextContent && (\n <ColorInput\n id=\"fill-text\"\n label=\"Text\"\n icon={<Type className=\"size-3.5\" />}\n value={textColor}\n onChange={onTextChange}\n />\n )}\n\n {showBorderColor && borderColor && onBorderColorChange && (\n <ColorInput\n id=\"fill-border\"\n label=\"Border\"\n icon={<Square className=\"size-3.5\" />}\n value={borderColor}\n onChange={onBorderColorChange}\n />\n )}\n\n {showOutlineColor && outlineColor && onOutlineColorChange && (\n <ColorInput\n id=\"fill-outline\"\n label=\"Outline\"\n icon={<Focus className=\"size-3.5\" />}\n value={outlineColor}\n onChange={onOutlineColorChange}\n />\n )}\n </div>\n </ColorPickerGroup>\n )\n}\ninterface CollapsibleSectionProps {\n title: string\n actions?: React.ReactNode\n children: React.ReactNode\n}\n\nfunction CollapsibleSection({ title, actions, children }: CollapsibleSectionProps) {\n return (\n <div>\n <div className=\"flex w-full items-center justify-between border-b border-border/50 px-3 py-2.5 text-xs font-medium text-foreground\">\n <span>{title}</span>\n {actions}\n </div>\n {children != null && <div className=\"px-3 py-3.5\">{children}</div>}\n </div>\n )\n}\n\ntype SectionKey = 'layout' | 'radius' | 'border' | 'colors' | 'text'\n\nconst SECTION_LABELS: Record<SectionKey, string> = {\n layout: 'Layout',\n radius: 'Radius',\n border: 'Border',\n colors: 'Colors',\n text: 'Text',\n}\n\nfunction useSectionNav(sectionRefs: Record<SectionKey, React.RefObject<HTMLDivElement | null>>) {\n const scrollRef = React.useRef<HTMLDivElement>(null)\n const [activeSection, setActiveSection] = React.useState<SectionKey>('layout')\n\n React.useEffect(() => {\n const scrollEl = scrollRef.current\n if (!scrollEl) return\n\n const handleScroll = () => {\n const keys = Object.keys(sectionRefs) as SectionKey[]\n let closest: SectionKey = 'layout'\n let closestDist = Infinity\n\n for (const key of keys) {\n const el = sectionRefs[key].current\n if (!el) continue\n const dist = Math.abs(el.getBoundingClientRect().top - scrollEl.getBoundingClientRect().top)\n if (dist < closestDist) {\n closestDist = dist\n closest = key\n }\n }\n\n setActiveSection(closest)\n }\n\n scrollEl.addEventListener('scroll', handleScroll, { passive: true })\n return () => scrollEl.removeEventListener('scroll', handleScroll)\n }, [sectionRefs])\n\n return { scrollRef, activeSection }\n}\n\nfunction SectionNav({\n scrollRef,\n activeSection,\n showColors,\n showText,\n sectionRefs,\n}: {\n scrollRef: React.RefObject<HTMLDivElement | null>\n activeSection: SectionKey\n showColors: boolean\n showText: boolean\n sectionRefs: Record<SectionKey, React.RefObject<HTMLDivElement | null>>\n}) {\n const sections: SectionKey[] = ['layout', 'radius', 'border']\n if (showColors) sections.push('colors')\n if (showText) sections.push('text')\n\n const handleClick = (key: SectionKey) => {\n const el = sectionRefs[key].current\n const scrollEl = scrollRef.current\n if (!el || !scrollEl) return\n const top = el.offsetTop - scrollEl.offsetTop\n scrollEl.scrollTo({ top, behavior: 'smooth' })\n }\n\n return (\n <div className=\"flex shrink-0 gap-0.5 border-b border-border/50 px-2 py-1\">\n {sections.map((key) => (\n <button\n key={key}\n type=\"button\"\n className={cn(\n 'rounded-md px-2 py-1 text-xs font-medium transition-colors',\n activeSection === key\n ? 'bg-muted text-foreground'\n : 'text-muted-foreground hover:text-foreground'\n )}\n onClick={() => handleClick(key)}\n >\n {SECTION_LABELS[key]}\n </button>\n ))}\n </div>\n )\n}\n\nexport interface DirectEditPanelInnerProps {\n elementInfo: {\n tagName: string\n id: string | null\n classList: string[]\n isFlexContainer: boolean\n isFlexItem: boolean\n isTextElement: boolean\n parentElement: HTMLElement | null | boolean\n hasChildren: boolean\n }\n computedSpacing: {\n paddingTop: CSSPropertyValue\n paddingRight: CSSPropertyValue\n paddingBottom: CSSPropertyValue\n paddingLeft: CSSPropertyValue\n marginTop: CSSPropertyValue\n marginRight: CSSPropertyValue\n marginBottom: CSSPropertyValue\n marginLeft: CSSPropertyValue\n gap: CSSPropertyValue\n }\n computedBorderRadius: {\n borderTopLeftRadius: CSSPropertyValue\n borderTopRightRadius: CSSPropertyValue\n borderBottomRightRadius: CSSPropertyValue\n borderBottomLeftRadius: CSSPropertyValue\n }\n computedBorder: BorderProperties\n computedFlex: {\n flexDirection: 'row' | 'row-reverse' | 'column' | 'column-reverse'\n justifyContent: string\n alignItems: string\n }\n computedSizing: {\n width: SizingValue\n height: SizingValue\n } | null\n computedColor: {\n backgroundColor: ColorValue\n color: ColorValue\n borderColor: ColorValue\n outlineColor: ColorValue\n } | null\n computedTypography: TypographyProperties | null\n pendingStyles: Record<string, string>\n onClose?: () => void\n onSelectParent?: () => void\n onSelectChild?: () => void\n onUpdateSpacing: (key: SpacingPropertyKey, value: CSSPropertyValue) => void\n onUpdateBorderRadius: (key: BorderRadiusPropertyKey, value: CSSPropertyValue) => void\n onUpdateBorder: (key: BorderPropertyKey, value: BorderProperties[BorderPropertyKey]) => void\n onBatchUpdateBorder: (changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]>) => void\n onUpdateFlex: (key: 'flexDirection' | 'justifyContent' | 'alignItems', value: string) => void\n onToggleFlex: () => void\n onUpdateSizing: (key: SizingPropertyKey, value: SizingValue) => void\n onUpdateColor: (key: ColorPropertyKey, value: ColorValue) => void\n onUpdateTypography: (key: TypographyPropertyKey, value: CSSPropertyValue | string) => void\n onReset: () => void\n onExportEdits: () => Promise<boolean>\n onSendToAgent: () => Promise<boolean>\n className?: string\n style?: React.CSSProperties\n panelRef?: React.RefObject<HTMLDivElement>\n isDragging?: boolean\n onHeaderPointerDown?: (e: React.PointerEvent) => void\n onHeaderPointerMove?: (e: React.PointerEvent) => void\n onHeaderPointerUp?: (e: React.PointerEvent) => void\n}\n\nexport function DirectEditPanelInner({\n elementInfo,\n computedSpacing,\n computedBorderRadius,\n computedBorder,\n computedFlex,\n computedSizing,\n computedColor,\n computedTypography,\n pendingStyles,\n onClose,\n onSelectParent,\n onSelectChild,\n onUpdateSpacing,\n onUpdateBorderRadius,\n onUpdateBorder,\n onBatchUpdateBorder,\n onUpdateFlex,\n onToggleFlex,\n onUpdateSizing,\n onUpdateColor,\n onUpdateTypography,\n onReset,\n onExportEdits,\n onSendToAgent,\n className,\n style,\n panelRef,\n isDragging,\n onHeaderPointerDown,\n onHeaderPointerMove,\n onHeaderPointerUp,\n}: DirectEditPanelInnerProps) {\n const [copied, setCopied] = React.useState(false)\n const [copyError, setCopyError] = React.useState(false)\n const [sendStatus, setSendStatus] = React.useState<'idle' | 'sending' | 'sent' | 'offline'>('idle')\n const distributeMode: DistributeMode =\n computedFlex?.justifyContent === 'space-between' ||\n computedFlex?.justifyContent === 'space-around' ||\n computedFlex?.justifyContent === 'space-evenly'\n ? computedFlex.justifyContent\n : 'fixed'\n const isDistributeValue = distributeMode !== 'fixed'\n\n const handleCopy = async () => {\n const success = await onExportEdits()\n if (success) {\n setCopyError(false)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n return\n }\n setCopied(false)\n setCopyError(true)\n setTimeout(() => setCopyError(false), 2000)\n }\n\n const handleSendToAgent = async () => {\n if (sendStatus === 'sending') return\n setSendStatus('sending')\n const success = await onSendToAgent()\n if (success) {\n setSendStatus('sent')\n setTimeout(() => setSendStatus('idle'), 2000)\n } else {\n setSendStatus('offline')\n setTimeout(() => setSendStatus('idle'), 2000)\n }\n }\n\n const hasPendingChanges = Object.keys(pendingStyles).length > 0\n const isDraggable = onHeaderPointerDown !== undefined\n\n const sectionRefs = {\n layout: React.useRef<HTMLDivElement>(null),\n radius: React.useRef<HTMLDivElement>(null),\n border: React.useRef<HTMLDivElement>(null),\n colors: React.useRef<HTMLDivElement>(null),\n text: React.useRef<HTMLDivElement>(null),\n }\n const { scrollRef, activeSection } = useSectionNav(sectionRefs)\n\n return (\n <div\n ref={panelRef}\n data-direct-edit=\"panel\"\n className={cn(\n 'flex flex-col overflow-hidden rounded-xl outline outline-1 outline-foreground/10 bg-background shadow-lg',\n isDragging && 'cursor-grabbing select-none',\n className\n )}\n style={{ width: PANEL_WIDTH, ...style }}\n >\n <div\n className={cn(\n 'flex shrink-0 items-center gap-2 border-b border-border/50 bg-background/60 px-3 py-2.5 backdrop-blur-xl',\n isDraggable && 'cursor-grab active:cursor-grabbing'\n )}\n onPointerDown={onHeaderPointerDown}\n onPointerMove={onHeaderPointerMove}\n onPointerUp={onHeaderPointerUp}\n >\n <span className=\"flex-1 text-xs font-medium\">Refine</span>\n {onClose && (\n <Button variant=\"ghost\" size=\"icon\" className=\"size-6\" onClick={onClose}>\n <X className=\"size-4\" />\n </Button>\n )}\n </div>\n\n <div className=\"shrink-0 border-b border-border/50 px-3 py-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <code className=\"text-xs font-medium text-foreground\">\n &lt;{elementInfo.tagName}&gt;\n </code>\n {elementInfo.id && (\n <span className=\"ml-1.5 text-xs text-muted-foreground\">#{elementInfo.id}</span>\n )}\n {elementInfo.classList.length > 0 && (\n <div className=\"mt-0.5 truncate text-xs text-muted-foreground\">\n .{elementInfo.classList.slice(0, 3).join(' .')}\n {elementInfo.classList.length > 3 && ` +${elementInfo.classList.length - 3}`}\n </div>\n )}\n </div>\n <div className=\"flex shrink-0 gap-1\">\n {onSelectParent && (\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={onSelectParent}\n disabled={!elementInfo.parentElement}\n className=\"size-7\"\n title=\"Select Parent\"\n >\n <ChevronUp className=\"size-3.5\" />\n </Button>\n )}\n {onSelectChild && (\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={onSelectChild}\n disabled={!elementInfo.hasChildren}\n className=\"size-7\"\n title=\"Select Child\"\n >\n <ChevronDown className=\"size-3.5\" />\n </Button>\n )}\n </div>\n </div>\n </div>\n\n <SectionNav\n scrollRef={scrollRef}\n activeSection={activeSection}\n showColors={!!computedColor}\n showText={elementInfo.isTextElement && !!computedTypography}\n sectionRefs={sectionRefs}\n />\n\n <div className=\"flex-1 overflow-y-auto\" ref={scrollRef}>\n <CollapsibleSection title=\"Layout\" actions={\n <button\n type=\"button\"\n className=\"flex size-6 items-center justify-center rounded text-muted-foreground hover:bg-muted-foreground/10 hover:text-foreground\"\n onClick={onToggleFlex}\n title={elementInfo.isFlexContainer ? 'Remove flex (Shift+A)' : 'Add flex (Shift+A)'}\n >\n {elementInfo.isFlexContainer ? <Minus className=\"size-3.5\" strokeWidth={1.5} /> : <Plus className=\"size-3.5\" strokeWidth={1.5} />}\n </button>\n }>\n <div className=\"space-y-3\" ref={sectionRefs.layout}>\n {elementInfo.isFlexContainer && (\n <div>\n <div className=\"mb-2 text-xs font-medium text-muted-foreground\">Flex</div>\n <div className=\"grid grid-cols-2 gap-2\">\n <div className=\"space-y-2\">\n <div className=\"flex h-7 gap-0.5 rounded-lg bg-muted p-0.5\">\n <button\n type=\"button\"\n className={cn(\n 'flex flex-1 items-center justify-center rounded-md transition-all',\n computedFlex.flexDirection === 'row'\n ? 'bg-background text-blue-500 shadow-sm'\n : 'text-muted-foreground hover:text-foreground'\n )}\n onClick={() => onUpdateFlex('flexDirection', 'row')}\n title=\"Row\"\n >\n <ArrowRight className=\"size-3.5\" />\n </button>\n <button\n type=\"button\"\n className={cn(\n 'flex flex-1 items-center justify-center rounded-md transition-all',\n computedFlex.flexDirection === 'column'\n ? 'bg-background text-blue-500 shadow-sm'\n : 'text-muted-foreground hover:text-foreground'\n )}\n onClick={() => onUpdateFlex('flexDirection', 'column')}\n title=\"Column\"\n >\n <ArrowDown className=\"size-3.5\" />\n </button>\n </div>\n\n <div className=\"flex h-7 items-center overflow-hidden rounded-md border-0 bg-muted text-xs\">\n <span className=\"flex flex-1 items-center gap-1.5 px-2\">\n <MoveHorizontal className=\"size-3.5 shrink-0 text-muted-foreground\" />\n {isDistributeValue ? (\n <span className=\"flex-1 truncate\">{DISTRIBUTE_LABELS[distributeMode]}</span>\n ) : (\n <SizingFixedInput\n value={computedSpacing.gap.numericValue}\n onValueChange={(numericValue) => {\n const unit = computedSpacing.gap.unit === 'em' || computedSpacing.gap.unit === '' ? 'px' : computedSpacing.gap.unit\n onUpdateSpacing('gap', {\n numericValue,\n unit,\n raw: `${numericValue}${unit}`,\n })\n }}\n />\n )}\n </span>\n <Select value={distributeMode} onValueChange={(val) => {\n if (val) onUpdateFlex('justifyContent', val === 'fixed' ? 'flex-start' : val)\n }}>\n <SelectTrigger className=\"flex h-full items-center justify-center border-l border-border/30 px-1.5 hover:bg-muted-foreground/10\">\n <ChevronsUpDown className=\"size-3 text-muted-foreground\" />\n </SelectTrigger>\n <SelectPortal>\n <SelectPositioner side=\"bottom\" sideOffset={4} alignItemWithTrigger={false} className=\"z-[99999]\">\n <SelectPopup className=\"min-w-[120px] overflow-hidden rounded-lg border-0 bg-popover p-1 text-popover-foreground shadow-lg animate-in fade-in-0 zoom-in-95\">\n {DISTRIBUTE_MODES.map((mode) => (\n <SelectItem key={mode} value={mode} className=\"relative flex cursor-default select-none items-center rounded-md py-1.5 pl-6 pr-2 text-xs outline-none hover:bg-muted data-[highlighted]:bg-muted\">\n <SelectItemIndicator className=\"absolute left-1.5 flex items-center justify-center\">\n <Check className=\"size-3\" />\n </SelectItemIndicator>\n <SelectItemText>{DISTRIBUTE_LABELS[mode]}</SelectItemText>\n </SelectItem>\n ))}\n </SelectPopup>\n </SelectPositioner>\n </SelectPortal>\n </Select>\n </div>\n </div>\n\n <AlignmentGrid\n justifyContent={computedFlex.justifyContent}\n alignItems={computedFlex.alignItems}\n onChange={(justify, align) => {\n onUpdateFlex('justifyContent', justify)\n onUpdateFlex('alignItems', align)\n }}\n />\n </div>\n </div>\n )}\n\n {computedSizing && (\n <div>\n <div className=\"mb-2 text-xs font-medium text-muted-foreground\">Sizing</div>\n <SizingInputs\n width={computedSizing.width}\n height={computedSizing.height}\n onWidthChange={(value) => onUpdateSizing('width', value)}\n onHeightChange={(value) => onUpdateSizing('height', value)}\n />\n </div>\n )}\n\n <div>\n <div className=\"mb-2 text-xs font-medium text-muted-foreground\">Padding</div>\n <PaddingInputs\n values={{\n top: computedSpacing.paddingTop,\n right: computedSpacing.paddingRight,\n bottom: computedSpacing.paddingBottom,\n left: computedSpacing.paddingLeft,\n }}\n onChange={onUpdateSpacing}\n />\n </div>\n\n <div>\n <div className=\"mb-2 text-xs font-medium text-muted-foreground\">Margin</div>\n <MarginInputs\n values={{\n top: computedSpacing.marginTop,\n right: computedSpacing.marginRight,\n bottom: computedSpacing.marginBottom,\n left: computedSpacing.marginLeft,\n }}\n onChange={onUpdateSpacing}\n />\n </div>\n </div>\n </CollapsibleSection>\n\n <div ref={sectionRefs.radius}>\n <CollapsibleSection title=\"Radius\">\n <BorderRadiusInputs\n values={{\n topLeft: computedBorderRadius.borderTopLeftRadius,\n topRight: computedBorderRadius.borderTopRightRadius,\n bottomRight: computedBorderRadius.borderBottomRightRadius,\n bottomLeft: computedBorderRadius.borderBottomLeftRadius,\n }}\n onChange={onUpdateBorderRadius}\n />\n </CollapsibleSection>\n </div>\n\n <div ref={sectionRefs.border}>\n <BorderSection\n border={computedBorder}\n borderColor={computedColor?.borderColor}\n onChange={onUpdateBorder}\n onBatchChange={onBatchUpdateBorder}\n onBorderColorChange={(value) => onUpdateColor('borderColor', value)}\n />\n </div>\n\n {computedColor && (\n <div ref={sectionRefs.colors}>\n <CollapsibleSection title=\"Colors\">\n <FillSection\n backgroundColor={computedColor.backgroundColor}\n textColor={computedColor.color}\n borderColor={computedColor.borderColor}\n outlineColor={computedColor.outlineColor}\n onBackgroundChange={(value) => onUpdateColor('backgroundColor', value)}\n onTextChange={(value) => onUpdateColor('color', value)}\n onBorderColorChange={(value) => onUpdateColor('borderColor', value)}\n onOutlineColorChange={(value) => onUpdateColor('outlineColor', value)}\n hasTextContent={elementInfo.isTextElement}\n showBackgroundColor={computedColor.backgroundColor.alpha > 0}\n showBorderColor={false}\n showOutlineColor={computedColor.outlineColor.alpha > 0}\n />\n </CollapsibleSection>\n </div>\n )}\n\n {elementInfo.isTextElement && computedTypography && (\n <div ref={sectionRefs.text}>\n <CollapsibleSection title=\"Text\">\n <TypographyInputs\n typography={computedTypography}\n onUpdate={onUpdateTypography}\n />\n </CollapsibleSection>\n </div>\n )}\n </div>\n\n <div\n className={cn(\n 'flex shrink-0 items-center gap-1 border-t border-border/50 bg-muted/20 px-3 py-2',\n isDraggable && 'cursor-grab active:cursor-grabbing'\n )}\n onPointerDown={onHeaderPointerDown}\n onPointerMove={onHeaderPointerMove}\n onPointerUp={onHeaderPointerUp}\n >\n <div className=\"flex-1\" />\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleCopy}\n title=\"Copy edits\"\n className=\"size-7\"\n >\n {copyError ? (\n <X className=\"size-3.5 text-red-500\" />\n ) : copied ? (\n <Check className=\"size-3.5 text-green-500\" />\n ) : (\n <Copy className=\"size-3.5\" />\n )}\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={handleSendToAgent}\n disabled={!hasPendingChanges || sendStatus === 'sending'}\n title=\"Apply changes via agent\"\n className=\"size-7\"\n >\n {sendStatus === 'offline' ? (\n <X className=\"size-3.5 text-red-500\" />\n ) : sendStatus === 'sent' ? (\n <Check className=\"size-3.5 text-green-500\" />\n ) : sendStatus === 'sending' ? (\n <Send className=\"size-3.5 animate-pulse\" />\n ) : (\n <Send className=\"size-3.5\" />\n )}\n </Button>\n </div>\n </div>\n )\n}\n\nfunction DirectEditPanelContent() {\n const container = usePortalContainer()\n const {\n isOpen,\n closePanel,\n elementInfo,\n computedSpacing,\n computedBorderRadius,\n computedBorder,\n computedFlex,\n computedSizing,\n computedColor,\n computedTypography,\n updateSpacingProperty,\n updateBorderRadiusProperty,\n updateBorderProperty,\n updateBorderProperties,\n updateFlexProperty,\n toggleFlexLayout,\n updateSizingProperty,\n updateColorProperty,\n updateTypographyProperty,\n resetToOriginal,\n exportEdits,\n sendEditToAgent,\n pendingStyles,\n selectParent,\n selectChild,\n selectElement,\n editModeActive,\n selectedElement,\n handleMoveComplete,\n activeTool,\n setActiveTool,\n comments,\n activeCommentId,\n addComment,\n updateCommentText,\n addCommentReply,\n deleteComment,\n exportComment,\n sendCommentToAgent,\n setActiveCommentId,\n startTextEditing,\n commitTextEditing,\n textEditingElement,\n } = useDirectEdit()\n\n const [position, setPosition] = React.useState<Position>(getInitialPosition)\n const [isDragging, setIsDragging] = React.useState(false)\n const [dragOffset, setDragOffset] = React.useState<Position>({ x: 0, y: 0 })\n const [hoverHighlight, setHoverHighlight] = React.useState<{\n flexContainer: HTMLElement\n children: HTMLElement[]\n } | null>(null)\n const panelRef = React.useRef<HTMLDivElement>(null)\n\n const handlePointerDown = (e: React.PointerEvent) => {\n if (!panelRef.current) return\n\n const rect = panelRef.current.getBoundingClientRect()\n setDragOffset({\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n })\n setIsDragging(true)\n ;(e.target as HTMLElement).setPointerCapture(e.pointerId)\n }\n\n const handlePointerMove = (e: React.PointerEvent) => {\n if (!isDragging) return\n\n const newX = Math.max(0, Math.min(window.innerWidth - PANEL_WIDTH, e.clientX - dragOffset.x))\n const newY = Math.max(0, Math.min(window.innerHeight - PANEL_HEIGHT, e.clientY - dragOffset.y))\n\n setPosition({ x: newX, y: newY })\n }\n\n const handlePointerUp = (e: React.PointerEvent) => {\n if (!isDragging) return\n\n setIsDragging(false)\n ;(e.target as HTMLElement).releasePointerCapture(e.pointerId)\n\n try { localStorage.setItem(STORAGE_KEY, JSON.stringify(position)) } catch {}\n }\n\n React.useEffect(() => {\n function handleResize() {\n setPosition((prev) => ({\n x: Math.min(prev.x, window.innerWidth - PANEL_WIDTH - 20),\n y: Math.min(prev.y, window.innerHeight - PANEL_HEIGHT - 20),\n }))\n }\n\n window.addEventListener('resize', handleResize)\n return () => window.removeEventListener('resize', handleResize)\n }, [])\n\n const { isActive: measurementActive, hoveredElement, measurements, mousePosition } = useMeasurement(\n isOpen ? selectedElement : null\n )\n\n const {\n dragState,\n dropIndicator,\n startDrag,\n } = useMove({\n onMoveComplete: handleMoveComplete,\n })\n\n const overlay = editModeActive && container ? createPortal(\n <>\n <div\n data-direct-edit=\"overlay\"\n className={cn('fixed inset-0 z-[99990]', activeTool === 'comment' ? 'cursor-crosshair' : 'cursor-default')}\n style={{ pointerEvents: textEditingElement ? 'none' : 'auto' }}\n onDoubleClick={(e) => {\n e.preventDefault()\n if (activeTool !== 'select') return\n const elementUnder = elementFromPointWithoutOverlays(e.clientX, e.clientY)\n if (elementUnder && elementUnder !== document.body && elementUnder !== document.documentElement) {\n const resolved = resolveElementTarget(elementUnder, selectedElement)\n if (isTextElement(resolved)) {\n if (selectedElement !== resolved) selectElement(resolved)\n startTextEditing(resolved)\n }\n }\n }}\n onMouseMove={(e) => {\n const elementUnder = elementFromPointWithoutOverlays(e.clientX, e.clientY)\n setHoverHighlight(computeHoverHighlight(elementUnder, selectedElement))\n }}\n onMouseLeave={() => setHoverHighlight(null)}\n onClick={(e) => {\n e.preventDefault()\n setHoverHighlight(null)\n if (activeCommentId) { setActiveCommentId(null); return }\n const elementUnder = elementFromPointWithoutOverlays(e.clientX, e.clientY)\n if (elementUnder && elementUnder !== document.body && elementUnder !== document.documentElement) {\n const resolved = resolveElementTarget(elementUnder, selectedElement)\n if (activeTool === 'comment') addComment(resolved, { x: e.clientX, y: e.clientY })\n else selectElement(resolved)\n }\n }}\n />\n {hoverHighlight && (() => {\n const cr = hoverHighlight.flexContainer.getBoundingClientRect()\n return (\n <svg\n data-direct-edit=\"hover-highlight\"\n className=\"pointer-events-none fixed inset-0 z-[99991]\"\n width=\"100%\"\n height=\"100%\"\n style={{ width: '100vw', height: '100vh' }}\n >\n <rect\n x={cr.left}\n y={cr.top}\n width={cr.width}\n height={cr.height}\n fill=\"transparent\"\n stroke=\"#3b82f6\"\n strokeWidth={1}\n />\n {hoverHighlight.children.map((child, i) => {\n const r = child.getBoundingClientRect()\n return (\n <rect\n key={i}\n x={r.left}\n y={r.top}\n width={r.width}\n height={r.height}\n fill=\"transparent\"\n stroke=\"#3b82f6\"\n strokeWidth={1}\n strokeDasharray=\"4 2\"\n />\n )\n })}\n </svg>\n )\n })()}\n </>,\n container\n ) : null\n\n const commentOverlay = editModeActive && comments.length > 0 && container ? createPortal(\n <CommentOverlay\n comments={comments}\n activeCommentId={activeCommentId}\n onSetActiveComment={setActiveCommentId}\n onUpdateText={updateCommentText}\n onAddReply={addCommentReply}\n onDelete={deleteComment}\n onExport={exportComment}\n onSendToAgent={sendCommentToAgent}\n />,\n container\n ) : null\n\n if (!isOpen || !computedSpacing || !elementInfo || !computedBorderRadius || !computedBorder || !computedFlex || !computedSizing || !computedColor || !computedTypography || !container) return <>{overlay}{commentOverlay}</>\n\n const handleMoveStart = (e: React.PointerEvent) => {\n if (selectedElement) {\n startDrag(e, selectedElement)\n }\n }\n\n return createPortal(\n <>\n {overlay}\n {commentOverlay}\n\n {selectedElement && (\n <SelectionOverlay\n selectedElement={selectedElement}\n isDragging={dragState.isDragging}\n ghostPosition={dragState.ghostPosition}\n onMoveStart={handleMoveStart}\n isTextEditing={Boolean(textEditingElement)}\n onDoubleClick={(clientX, clientY) => {\n if (!selectedElement) return\n if (isTextElement(selectedElement)) {\n startTextEditing(selectedElement)\n return\n }\n const elementUnder = elementFromPointWithoutOverlays(clientX, clientY)\n if (elementUnder && elementUnder !== selectedElement && selectedElement.contains(elementUnder)) {\n const resolved = resolveElementTarget(elementUnder, selectedElement)\n if (isTextElement(resolved)) {\n selectElement(resolved)\n startTextEditing(resolved)\n }\n }\n }}\n onHoverElement={(element) => {\n setHoverHighlight(computeHoverHighlight(element, selectedElement))\n }}\n onClickThrough={(clientX, clientY) => {\n if (!selectedElement) return\n const elementUnder = elementFromPointWithoutOverlays(clientX, clientY)\n if (!elementUnder) return\n if (elementUnder !== selectedElement && selectedElement.contains(elementUnder)) {\n const resolved = resolveElementTarget(elementUnder, selectedElement)\n selectElement(resolved)\n return\n }\n const child = findChildAtPoint(selectedElement, clientX, clientY)\n if (child) {\n selectElement(child)\n }\n }}\n />\n )}\n\n {dragState.isDragging && (\n <MoveOverlay dropIndicator={dropIndicator} />\n )}\n\n {measurementActive && selectedElement && (\n <MeasurementOverlay\n selectedElement={selectedElement}\n hoveredElement={hoveredElement}\n measurements={[\n ...measurements,\n ...calculateGuidelineMeasurements(selectedElement, getStoredGuidelines(), mousePosition),\n ]}\n />\n )}\n\n <DirectEditPanelInner\n elementInfo={elementInfo}\n computedSpacing={computedSpacing}\n computedBorderRadius={computedBorderRadius}\n computedBorder={computedBorder}\n computedFlex={computedFlex}\n computedSizing={computedSizing}\n computedColor={computedColor}\n computedTypography={computedTypography}\n pendingStyles={pendingStyles}\n onClose={closePanel}\n onSelectParent={selectParent}\n onSelectChild={selectChild}\n onUpdateSpacing={updateSpacingProperty}\n onUpdateBorderRadius={updateBorderRadiusProperty}\n onUpdateBorder={updateBorderProperty}\n onBatchUpdateBorder={updateBorderProperties}\n onUpdateFlex={updateFlexProperty}\n onToggleFlex={toggleFlexLayout}\n onUpdateSizing={updateSizingProperty}\n onUpdateColor={updateColorProperty}\n onUpdateTypography={updateTypographyProperty}\n onReset={resetToOriginal}\n onExportEdits={exportEdits}\n onSendToAgent={sendEditToAgent}\n className=\"fixed z-[99999]\"\n style={{\n left: position.x,\n top: position.y,\n maxHeight: PANEL_HEIGHT,\n pointerEvents: 'auto',\n }}\n panelRef={panelRef}\n isDragging={isDragging}\n onHeaderPointerDown={handlePointerDown}\n onHeaderPointerMove={handlePointerMove}\n onHeaderPointerUp={handlePointerUp}\n />\n </>,\n container\n )\n}\n\nexport function DirectEditPanel() {\n const [mounted, setMounted] = React.useState(false)\n\n React.useEffect(() => {\n setMounted(true)\n }, [])\n\n if (!mounted) {\n return null\n }\n\n return <DirectEditPanelContent />\n}\n","import * as React from 'react'\nimport { cn } from '../cn'\n\nconst buttonVariants = {\n base: 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',\n variant: {\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\n destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\n outline: 'border-0 bg-muted text-foreground hover:bg-muted-foreground/10',\n secondary: 'bg-muted text-secondary-foreground hover:bg-muted-foreground/10',\n ghost: 'hover:bg-muted hover:text-foreground',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-10 px-4 py-2',\n sm: 'h-9 rounded-md px-3',\n lg: 'h-11 rounded-md px-8',\n icon: 'h-10 w-10',\n },\n}\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: keyof typeof buttonVariants.variant\n size?: keyof typeof buttonVariants.size\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant = 'default', size = 'default', ...props }, ref) => {\n return (\n <button\n className={cn(\n buttonVariants.base,\n buttonVariants.variant[variant],\n buttonVariants.size[size],\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = 'Button'\n\nexport { Button }\n","import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from 'react'\nimport { cn } from '../cn'\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<'input'>>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n 'flex h-10 w-full rounded-md border-0 bg-muted px-3 py-2 text-base file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none [appearance:textfield]',\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\nInput.displayName = 'Input'\n\nexport { Input }\n","import * as React from 'react'\nimport { Tooltip as TooltipPrimitive } from '@base-ui/react/tooltip'\nimport { usePortalContainer } from '../portal-container'\nimport { cn } from '../cn'\n\nconst TooltipProvider = ({\n children,\n delay,\n delayDuration = 300,\n closeDelay = 0,\n ...props\n}: {\n children: React.ReactNode\n delay?: number\n delayDuration?: number\n closeDelay?: number\n}) => (\n <TooltipPrimitive.Provider delay={delay ?? delayDuration} closeDelay={closeDelay} {...props}>\n {children}\n </TooltipPrimitive.Provider>\n)\n\nconst Tooltip = TooltipPrimitive.Root\n\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Popup>,\n Omit<React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Popup>, 'side' | 'align'> & {\n side?: 'top' | 'right' | 'bottom' | 'left'\n align?: 'start' | 'center' | 'end'\n sideOffset?: number\n }\n>(({ className, side, align, sideOffset = 8, ...props }, ref) => {\n const container = usePortalContainer()\n return (\n <TooltipPrimitive.Portal container={container}>\n <TooltipPrimitive.Positioner side={side} align={align} sideOffset={sideOffset} className=\"fixed z-[99999]\">\n <TooltipPrimitive.Popup\n ref={ref}\n className={cn(\n 'overflow-hidden rounded-md bg-[#171717] px-3 py-1.5 text-xs text-[#fafafa] animate-in fade-in-0 zoom-in-95 data-[closed]:animate-out data-[closed]:fade-out-0 data-[closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n </TooltipPrimitive.Positioner>\n </TooltipPrimitive.Portal>\n )\n})\nTooltipContent.displayName = 'TooltipContent'\n\nconst createTooltipHandle = TooltipPrimitive.createHandle\n\nfunction TooltipPortal(props: React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Portal>) {\n const container = usePortalContainer()\n return <TooltipPrimitive.Portal container={container} {...props} />\n}\n\nconst TooltipPositioner = TooltipPrimitive.Positioner\nconst TooltipPopup = TooltipPrimitive.Popup\n\nexport {\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n TooltipProvider,\n createTooltipHandle,\n TooltipPortal,\n TooltipPositioner,\n TooltipPopup,\n}\n","import { Select as SelectPrimitive } from '@base-ui/react/select'\nimport { usePortalContainer } from '../portal-container'\n\nconst Select = SelectPrimitive.Root\nconst SelectTrigger = SelectPrimitive.Trigger\nconst SelectValue = SelectPrimitive.Value\nconst SelectIcon = SelectPrimitive.Icon\n\nfunction SelectPortal(props: React.ComponentPropsWithoutRef<typeof SelectPrimitive.Portal>) {\n const container = usePortalContainer()\n return <SelectPrimitive.Portal container={container} {...props} />\n}\n\nfunction SelectPositioner(props: React.ComponentPropsWithoutRef<typeof SelectPrimitive.Positioner>) {\n return <SelectPrimitive.Positioner {...props} style={{ pointerEvents: 'auto', ...props.style }} />\n}\nconst SelectPopup = SelectPrimitive.Popup\nconst SelectItem = SelectPrimitive.Item\nconst SelectItemIndicator = SelectPrimitive.ItemIndicator\nconst SelectItemText = SelectPrimitive.ItemText\n\nexport {\n Select,\n SelectTrigger,\n SelectValue,\n SelectIcon,\n SelectPortal,\n SelectPositioner,\n SelectPopup,\n SelectItem,\n SelectItemIndicator,\n SelectItemText,\n}\n","import * as React from 'react'\nimport { Popover } from '@base-ui/react/popover'\nimport { usePortalContainer } from '../portal-container'\nimport type { ColorValue } from '../types'\nimport {\n hexToRgb,\n rgbToHex,\n rgbToHsv,\n hsvToRgb,\n rgbToHsl,\n hslToRgb,\n formatColorValue,\n} from './color-utils'\n\nfunction ColorPickerPortal(props: React.ComponentPropsWithoutRef<typeof Popover.Portal>) {\n const container = usePortalContainer()\n return <Popover.Portal container={container} {...props} />\n}\n\ninterface ColorPickerGroupContextValue {\n activePickerId: string | null\n setActivePickerId: (id: string | null) => void\n}\n\nconst ColorPickerGroupContext = React.createContext<ColorPickerGroupContextValue | null>(null)\n\nexport function ColorPickerGroup({ children }: { children: React.ReactNode }) {\n const [activePickerId, setActivePickerId] = React.useState<string | null>(null)\n return (\n <ColorPickerGroupContext.Provider value={{ activePickerId, setActivePickerId }}>\n {children}\n </ColorPickerGroupContext.Provider>\n )\n}\n\nfunction useDrag(onMove: (x: number, y: number, rect: DOMRect) => void) {\n const ref = React.useRef<HTMLDivElement>(null)\n\n const handlePointerEvent = React.useCallback(\n (e: React.PointerEvent | PointerEvent) => {\n const el = ref.current\n if (!el) return\n const rect = el.getBoundingClientRect()\n const x = Math.max(0, Math.min(e.clientX - rect.left, rect.width))\n const y = Math.max(0, Math.min(e.clientY - rect.top, rect.height))\n onMove(x, y, rect)\n },\n [onMove]\n )\n\n const onPointerDown = React.useCallback(\n (e: React.PointerEvent) => {\n e.preventDefault()\n ref.current?.setPointerCapture(e.pointerId)\n handlePointerEvent(e)\n },\n [handlePointerEvent]\n )\n\n const onPointerMove = React.useCallback(\n (e: React.PointerEvent) => {\n if (e.buttons === 0) return\n handlePointerEvent(e)\n },\n [handlePointerEvent]\n )\n\n return { ref, onPointerDown, onPointerMove }\n}\n\ninterface SaturationValueAreaProps {\n hue: number\n saturation: number\n value: number\n onChange: (s: number, v: number) => void\n}\n\nfunction SaturationValueArea({ hue, saturation, value, onChange }: SaturationValueAreaProps) {\n const drag = useDrag((x, _y, rect) => {\n onChange((x / rect.width) * 100, (1 - _y / rect.height) * 100)\n })\n\n return (\n <div\n ref={drag.ref}\n onPointerDown={drag.onPointerDown}\n onPointerMove={drag.onPointerMove}\n className=\"relative h-[150px] flex-1 cursor-crosshair rounded-sm\"\n style={{ backgroundColor: `hsl(${hue}, 100%, 50%)` }}\n >\n <div className=\"pointer-events-none absolute inset-0 rounded-sm\" style={{ background: 'linear-gradient(to right, #fff, transparent)' }} />\n <div className=\"pointer-events-none absolute inset-0 rounded-sm\" style={{ background: 'linear-gradient(to bottom, transparent, #000)' }} />\n <div\n className=\"pointer-events-none absolute size-3.5 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-white shadow-[0_0_0_1px_rgba(0,0,0,0.3)]\"\n style={{ left: `${saturation}%`, top: `${100 - value}%` }}\n />\n </div>\n )\n}\n\ninterface VerticalSliderProps {\n value: number\n max: number\n background: string\n onChange: (value: number) => void\n checkerboard?: boolean\n}\n\nfunction VerticalSlider({ value, max, background, onChange, checkerboard }: VerticalSliderProps) {\n const drag = useDrag((_x, y, rect) => {\n onChange((y / rect.height) * max)\n })\n\n const pct = (value / max) * 100\n\n return (\n <div\n ref={drag.ref}\n onPointerDown={drag.onPointerDown}\n onPointerMove={drag.onPointerMove}\n className=\"relative w-4 cursor-pointer rounded-sm\"\n style={\n checkerboard\n ? {\n backgroundImage:\n 'conic-gradient(#ccc 25%, #fff 25% 50%, #ccc 50% 75%, #fff 75%)',\n backgroundSize: '8px 8px',\n }\n : undefined\n }\n >\n <div className=\"pointer-events-none absolute inset-0 rounded-sm\" style={{ background }} />\n <div\n className=\"pointer-events-none absolute left-1/2 h-2 w-full -translate-x-1/2 -translate-y-1/2 rounded-sm border-2 border-white shadow-[0_0_0_1px_rgba(0,0,0,0.3)]\"\n style={{ top: `${pct}%` }}\n />\n </div>\n )\n}\n\nfunction NumericInput({\n label,\n value,\n max,\n onChange,\n}: {\n label: string\n value: number\n max: number\n onChange: (v: number) => void\n}) {\n const [local, setLocal] = React.useState(Math.round(value).toString())\n\n React.useEffect(() => {\n setLocal(Math.round(value).toString())\n }, [value])\n\n return (\n <div className=\"flex items-center gap-1\">\n <span className=\"w-3 text-[10px] text-muted-foreground\">{label}</span>\n <input\n type=\"text\"\n value={local}\n onChange={(e) => {\n setLocal(e.target.value)\n const n = parseInt(e.target.value)\n if (!isNaN(n) && n >= 0 && n <= max) onChange(n)\n }}\n onBlur={() => setLocal(Math.round(value).toString())}\n className=\"h-6 w-9 rounded border-0 bg-muted px-1 text-center text-[11px] tabular-nums outline-none\"\n />\n </div>\n )\n}\n\ninterface ColorPickerPopoverProps {\n id?: string\n value: ColorValue\n onChange: (value: ColorValue) => void\n children: React.ReactNode\n}\n\nexport function ColorPickerPopover({ id, value, onChange, children }: ColorPickerPopoverProps) {\n const group = React.useContext(ColorPickerGroupContext)\n const rgb = hexToRgb(value.hex)\n const initialHsv = rgbToHsv(rgb.r, rgb.g, rgb.b)\n\n const [hsv, setHsv] = React.useState({ h: initialHsv.h, s: initialHsv.s, v: initialHsv.v })\n const [alpha, setAlpha] = React.useState(value.alpha)\n\n // Track the last hex we synced from to avoid overwriting HSV on our own updates\n const lastSyncedHex = React.useRef(value.hex)\n\n React.useEffect(() => {\n if (value.hex !== lastSyncedHex.current) {\n const newRgb = hexToRgb(value.hex)\n const newHsv = rgbToHsv(newRgb.r, newRgb.g, newRgb.b)\n // Preserve hue when saturation or value is 0 (would lose hue info)\n setHsv((prev) => ({\n h: newHsv.s === 0 || newHsv.v === 0 ? prev.h : newHsv.h,\n s: newHsv.s,\n v: newHsv.v,\n }))\n lastSyncedHex.current = value.hex\n }\n setAlpha(value.alpha)\n }, [value.hex, value.alpha])\n\n const emitChange = React.useCallback(\n (h: number, s: number, v: number, a: number) => {\n const newRgb = hsvToRgb(h, s, v)\n const hex = rgbToHex(newRgb.r, newRgb.g, newRgb.b)\n lastSyncedHex.current = hex\n onChange({\n hex,\n alpha: a,\n raw: formatColorValue({ hex, alpha: a, raw: '' }),\n })\n },\n [onChange]\n )\n\n const handleSVChange = (s: number, v: number) => {\n setHsv((prev) => ({ ...prev, s, v }))\n emitChange(hsv.h, s, v, alpha)\n }\n\n const handleHueChange = (h: number) => {\n setHsv((prev) => ({ ...prev, h }))\n emitChange(h, hsv.s, hsv.v, alpha)\n }\n\n const handleAlphaChange = (a: number) => {\n const clamped = Math.round(Math.max(0, Math.min(100, (1 - a / 100) * 100)))\n setAlpha(clamped)\n emitChange(hsv.h, hsv.s, hsv.v, clamped)\n }\n\n // Derived values for display\n const currentRgb = hsvToRgb(hsv.h, hsv.s, hsv.v)\n const currentHsl = rgbToHsl(currentRgb.r, currentRgb.g, currentRgb.b)\n const currentHex = rgbToHex(currentRgb.r, currentRgb.g, currentRgb.b)\n\n const handleHslChange = (field: 'h' | 's' | 'l', val: number) => {\n const newHsl = { ...currentHsl, [field]: val }\n const newRgb = hslToRgb(newHsl.h, newHsl.s, newHsl.l)\n const newHsv = rgbToHsv(newRgb.r, newRgb.g, newRgb.b)\n // Preserve hue in HSV when saturation drops to 0\n setHsv((prev) => ({\n h: field === 'h' ? val : newHsv.s === 0 || newHsv.v === 0 ? prev.h : newHsv.h,\n s: newHsv.s,\n v: newHsv.v,\n }))\n const hex = rgbToHex(newRgb.r, newRgb.g, newRgb.b)\n lastSyncedHex.current = hex\n onChange({ hex, alpha, raw: formatColorValue({ hex, alpha, raw: '' }) })\n }\n\n const handleRgbChange = (field: 'r' | 'g' | 'b', val: number) => {\n const newRgb = { ...currentRgb, [field]: val }\n const newHsv = rgbToHsv(newRgb.r, newRgb.g, newRgb.b)\n setHsv((prev) => ({\n h: newHsv.s === 0 || newHsv.v === 0 ? prev.h : newHsv.h,\n s: newHsv.s,\n v: newHsv.v,\n }))\n const hex = rgbToHex(newRgb.r, newRgb.g, newRgb.b)\n lastSyncedHex.current = hex\n onChange({ hex, alpha, raw: formatColorValue({ hex, alpha, raw: '' }) })\n }\n\n const handleHexInput = (input: string) => {\n const cleaned = input.replace('#', '').toUpperCase()\n if (/^[0-9A-F]{6}$/.test(cleaned)) {\n const newRgb = hexToRgb(cleaned)\n const newHsv = rgbToHsv(newRgb.r, newRgb.g, newRgb.b)\n setHsv((prev) => ({\n h: newHsv.s === 0 || newHsv.v === 0 ? prev.h : newHsv.h,\n s: newHsv.s,\n v: newHsv.v,\n }))\n lastSyncedHex.current = cleaned\n onChange({ hex: cleaned, alpha, raw: formatColorValue({ hex: cleaned, alpha, raw: '' }) })\n }\n }\n\n const handleAlphaInput = (input: string) => {\n const n = parseInt(input)\n if (!isNaN(n) && n >= 0 && n <= 100) {\n setAlpha(n)\n emitChange(hsv.h, hsv.s, hsv.v, n)\n }\n }\n\n const alphaGradient = `linear-gradient(to bottom, #${currentHex}, transparent)`\n\n const isControlled = group !== null && id !== undefined\n const isOpen = isControlled ? group.activePickerId === id : undefined\n const handleOpenChange = isControlled\n ? (open: boolean) => { group.setActivePickerId(open ? id : null) }\n : undefined\n\n // Close on outside click — Shadow DOM breaks base-ui's built-in dismiss\n const popupRef = React.useRef<HTMLDivElement>(null)\n const triggerRef = React.useRef<HTMLButtonElement>(null)\n const onCloseRef = React.useRef<() => void>()\n onCloseRef.current = () => group?.setActivePickerId(null)\n\n React.useEffect(() => {\n if (!isOpen) return\n\n function handlePointerDown(e: PointerEvent) {\n const path = e.composedPath()\n if (popupRef.current && path.includes(popupRef.current)) return\n if (triggerRef.current && path.includes(triggerRef.current)) return\n onCloseRef.current?.()\n }\n\n const raf = requestAnimationFrame(() => {\n document.addEventListener('pointerdown', handlePointerDown)\n })\n\n return () => {\n cancelAnimationFrame(raf)\n document.removeEventListener('pointerdown', handlePointerDown)\n }\n }, [isOpen])\n\n return (\n <Popover.Root open={isOpen} onOpenChange={handleOpenChange}>\n <Popover.Trigger ref={triggerRef} render={<button type=\"button\" />} className=\"flex appearance-none items-center border-0 bg-transparent p-0 leading-none\">\n {children}\n </Popover.Trigger>\n <ColorPickerPortal>\n <Popover.Positioner side=\"bottom\" align=\"start\" sideOffset={4} className=\"fixed z-[99999]\" style={{ pointerEvents: 'auto' }}>\n <Popover.Popup ref={popupRef} className=\"w-[260px] rounded-lg border-0 bg-popover p-3 shadow-lg\">\n {/* Gradient area + sliders */}\n <div className=\"flex gap-2\">\n <SaturationValueArea\n hue={hsv.h}\n saturation={hsv.s}\n value={hsv.v}\n onChange={handleSVChange}\n />\n <VerticalSlider\n value={hsv.h}\n max={360}\n background=\"linear-gradient(to bottom, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%)\"\n onChange={handleHueChange}\n />\n <VerticalSlider\n value={(1 - alpha / 100) * 100}\n max={100}\n background={alphaGradient}\n onChange={handleAlphaChange}\n checkerboard\n />\n </div>\n\n {/* HSL row */}\n <div className=\"mt-2.5 flex gap-2\">\n <NumericInput label=\"H\" value={currentHsl.h} max={360} onChange={(v) => handleHslChange('h', v)} />\n <NumericInput label=\"S\" value={currentHsl.s} max={100} onChange={(v) => handleHslChange('s', v)} />\n <NumericInput label=\"L\" value={currentHsl.l} max={100} onChange={(v) => handleHslChange('l', v)} />\n </div>\n\n {/* RGB row */}\n <div className=\"mt-1.5 flex gap-2\">\n <NumericInput label=\"R\" value={currentRgb.r} max={255} onChange={(v) => handleRgbChange('r', v)} />\n <NumericInput label=\"G\" value={currentRgb.g} max={255} onChange={(v) => handleRgbChange('g', v)} />\n <NumericInput label=\"B\" value={currentRgb.b} max={255} onChange={(v) => handleRgbChange('b', v)} />\n </div>\n\n {/* Hex + Alpha row */}\n <div className=\"mt-1.5 flex items-center gap-1.5\">\n <span className=\"text-[10px] text-muted-foreground\">#</span>\n <HexInput value={currentHex} onChange={handleHexInput} />\n <span className=\"text-[10px] text-muted-foreground\">/</span>\n <AlphaInput value={alpha} onChange={handleAlphaInput} />\n <span className=\"text-[10px] text-muted-foreground\">%</span>\n </div>\n </Popover.Popup>\n </Popover.Positioner>\n </ColorPickerPortal>\n </Popover.Root>\n )\n}\n\nfunction HexInput({ value, onChange }: { value: string; onChange: (v: string) => void }) {\n const [local, setLocal] = React.useState(value)\n\n React.useEffect(() => {\n setLocal(value)\n }, [value])\n\n return (\n <input\n type=\"text\"\n value={local}\n onChange={(e) => {\n setLocal(e.target.value.toUpperCase())\n onChange(e.target.value)\n }}\n onBlur={() => setLocal(value)}\n className=\"h-6 w-[60px] rounded border-0 bg-muted px-1 font-mono text-[11px] uppercase outline-none\"\n maxLength={6}\n />\n )\n}\n\nfunction AlphaInput({ value, onChange }: { value: number; onChange: (v: string) => void }) {\n const [local, setLocal] = React.useState(value.toString())\n\n React.useEffect(() => {\n setLocal(value.toString())\n }, [value])\n\n return (\n <input\n type=\"text\"\n value={local}\n onChange={(e) => {\n setLocal(e.target.value)\n onChange(e.target.value)\n }}\n onBlur={() => setLocal(value.toString())}\n className=\"h-6 w-8 rounded border-0 bg-muted px-1 text-center text-[11px] tabular-nums outline-none\"\n maxLength={3}\n />\n )\n}\n","import * as React from 'react'\nimport { Slider as SliderPrimitive } from '@base-ui/react/slider'\nimport { cn } from '../cn'\n\nconst Slider = React.forwardRef<\n React.ElementRef<typeof SliderPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <SliderPrimitive.Root\n ref={ref}\n className={cn('relative w-full', className)}\n {...props}\n >\n <SliderPrimitive.Control className=\"flex w-full touch-none select-none items-center px-1 py-3\">\n <SliderPrimitive.Track className=\"h-2 w-full rounded-full bg-muted\">\n <SliderPrimitive.Indicator className=\"h-full rounded-full bg-foreground\" />\n <SliderPrimitive.Thumb className=\"h-3.5 w-2 rounded-sm border-2 border-white bg-foreground shadow-[0_0_0_1px_rgba(0,0,0,0.3)] transition-colors focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50\" />\n </SliderPrimitive.Track>\n </SliderPrimitive.Control>\n </SliderPrimitive.Root>\n))\nSlider.displayName = 'Slider'\n\nexport { Slider }\n","import * as React from 'react'\nimport type { MeasurementLine } from './types'\nimport { calculateParentMeasurements, calculateElementMeasurements, elementFromPointWithoutOverlays } from './utils'\n\nexport interface UseMeasurementResult {\n isActive: boolean\n hoveredElement: HTMLElement | null\n measurements: MeasurementLine[]\n mousePosition: { x: number; y: number } | null\n}\n\nconst INITIAL_STATE = {\n hoveredElement: null as HTMLElement | null,\n measurements: [] as MeasurementLine[],\n}\n\nexport function useMeasurement(selectedElement: HTMLElement | null): UseMeasurementResult {\n const [altHeld, setAltHeld] = React.useState(false)\n const [state, setState] = React.useState(INITIAL_STATE)\n const [mousePosition, setMousePosition] = React.useState<{ x: number; y: number } | null>(null)\n const rafRef = React.useRef<number | null>(null)\n const mousePositionRef = React.useRef<{ x: number; y: number } | null>(null)\n\n const getElementBelow = React.useCallback((x: number, y: number): HTMLElement | null => {\n const element = elementFromPointWithoutOverlays(x, y)\n if (element?.closest('[data-direct-edit-host]')) return null\n return element\n }, [])\n\n React.useEffect(() => {\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Alt') {\n e.preventDefault()\n setAltHeld(true)\n }\n }\n\n function handleKeyUp(e: KeyboardEvent) {\n if (e.key === 'Alt') {\n setAltHeld(false)\n setState(INITIAL_STATE)\n }\n }\n\n function reset() {\n setAltHeld(false)\n setState(INITIAL_STATE)\n }\n\n function handleVisibilityChange() {\n if (document.hidden) reset()\n }\n\n window.addEventListener('keydown', handleKeyDown)\n window.addEventListener('keyup', handleKeyUp)\n window.addEventListener('blur', reset)\n document.addEventListener('visibilitychange', handleVisibilityChange)\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown)\n window.removeEventListener('keyup', handleKeyUp)\n window.removeEventListener('blur', reset)\n document.removeEventListener('visibilitychange', handleVisibilityChange)\n }\n }, [])\n\n React.useEffect(() => {\n if (!altHeld || !selectedElement) {\n setState(INITIAL_STATE)\n return\n }\n\n const target = selectedElement\n\n function updateMeasurements() {\n const pos = mousePositionRef.current\n\n if (!pos) {\n setState({\n hoveredElement: null,\n measurements: calculateParentMeasurements(target),\n })\n return\n }\n\n const element = getElementBelow(pos.x, pos.y)\n const isValidHover =\n element &&\n element !== target &&\n element !== document.body &&\n element !== document.documentElement\n\n if (isValidHover) {\n const isAncestor = element.contains(target)\n setState({\n hoveredElement: element,\n measurements: isAncestor\n ? calculateParentMeasurements(target, element)\n : calculateElementMeasurements(target, element),\n })\n } else {\n setState({\n hoveredElement: null,\n measurements: calculateParentMeasurements(target),\n })\n }\n }\n\n function handleMouseMove(e: MouseEvent) {\n mousePositionRef.current = { x: e.clientX, y: e.clientY }\n\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current)\n }\n\n rafRef.current = requestAnimationFrame(() => {\n setMousePosition(mousePositionRef.current)\n updateMeasurements()\n rafRef.current = null\n })\n }\n\n updateMeasurements()\n window.addEventListener('mousemove', handleMouseMove)\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove)\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current)\n }\n }\n }, [altHeld, selectedElement, getElementBelow])\n\n return {\n isActive: altHeld && selectedElement !== null,\n hoveredElement: state.hoveredElement,\n measurements: state.measurements,\n mousePosition: altHeld ? mousePosition : null,\n }\n}\n","import * as React from 'react'\nimport type { MeasurementLine } from './types'\n\nconst TOMATO = '#E54D2E'\nconst BLUE = '#0D99FF'\nconst END_CAP_SIZE = 4\n\nexport interface MeasurementOverlayProps {\n selectedElement: HTMLElement\n hoveredElement: HTMLElement | null\n measurements: MeasurementLine[]\n}\n\ninterface EndCapProps {\n x: number\n y: number\n direction: 'horizontal' | 'vertical'\n}\n\nfunction EndCap({ x, y, direction }: EndCapProps) {\n const isHorizontal = direction === 'horizontal'\n return (\n <line\n x1={isHorizontal ? x : x - END_CAP_SIZE}\n y1={isHorizontal ? y - END_CAP_SIZE : y}\n x2={isHorizontal ? x : x + END_CAP_SIZE}\n y2={isHorizontal ? y + END_CAP_SIZE : y}\n stroke={TOMATO}\n strokeWidth={0.5}\n />\n )\n}\n\nfunction MeasurementLineComponent({ line }: { line: MeasurementLine }) {\n const { x1, y1, x2, y2, distance, direction, labelPosition } = line\n\n if (distance <= 0) return null\n\n const labelWidth = Math.max(String(distance).length * 7 + 8, 24)\n\n return (\n <g>\n <line x1={x1} y1={y1} x2={x2} y2={y2} stroke={TOMATO} strokeWidth={0.5} />\n <EndCap x={x1} y={y1} direction={direction} />\n <EndCap x={x2} y={y2} direction={direction} />\n <g transform={`translate(${labelPosition.x}, ${labelPosition.y})`}>\n <rect\n x={-labelWidth / 2}\n y={-8}\n width={labelWidth}\n height={16}\n rx={2}\n fill={TOMATO}\n />\n <text\n x={0}\n y={1}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fill=\"#fff\"\n fontSize={11}\n fontWeight={500}\n fontFamily=\"system-ui, -apple-system, sans-serif\"\n >\n {distance}\n </text>\n </g>\n </g>\n )\n}\n\ninterface ElementHighlightProps {\n element: HTMLElement\n color: string\n isDashed?: boolean\n}\n\nfunction ElementHighlight({ element, color, isDashed = false }: ElementHighlightProps) {\n const rect = element.getBoundingClientRect()\n\n return (\n <rect\n x={rect.left}\n y={rect.top}\n width={rect.width}\n height={rect.height}\n fill=\"transparent\"\n stroke={color}\n strokeWidth={1}\n strokeDasharray={isDashed ? '4 2' : undefined}\n />\n )\n}\n\nexport function MeasurementOverlay({\n selectedElement,\n hoveredElement,\n measurements,\n}: MeasurementOverlayProps) {\n const [, forceUpdate] = React.useReducer((x) => x + 1, 0)\n\n React.useEffect(() => {\n function handleUpdate() {\n requestAnimationFrame(forceUpdate)\n }\n\n window.addEventListener('scroll', handleUpdate, true)\n window.addEventListener('resize', handleUpdate)\n\n return () => {\n window.removeEventListener('scroll', handleUpdate, true)\n window.removeEventListener('resize', handleUpdate)\n }\n }, [selectedElement])\n\n return (\n <svg\n data-direct-edit=\"measurement\"\n style={{\n position: 'fixed',\n inset: 0,\n width: '100vw',\n height: '100vh',\n pointerEvents: 'none',\n zIndex: 99998,\n }}\n >\n <ElementHighlight element={selectedElement} color={BLUE} />\n {hoveredElement && (\n <ElementHighlight element={hoveredElement} color={TOMATO} isDashed />\n )}\n {measurements.map((line, i) => (\n <MeasurementLineComponent key={i} line={line} />\n ))}\n </svg>\n )\n}\n","import * as React from 'react'\nimport type { DragState, DropIndicator } from './types'\nimport {\n findContainerAtPoint,\n calculateDropPosition,\n detectChildrenDirection,\n} from './utils'\n\nexport interface MoveInfo {\n originalParent: HTMLElement\n originalPreviousSibling: HTMLElement | null\n originalNextSibling: HTMLElement | null\n}\n\nexport interface UseMoveOptions {\n onMoveComplete?: (element: HTMLElement, moveInfo: MoveInfo | null) => void\n}\n\nexport interface UseMoveDropTarget {\n container: HTMLElement\n insertBefore: HTMLElement | null\n flexDirection: 'row' | 'row-reverse' | 'column' | 'column-reverse'\n}\n\nexport interface UseMoveResult {\n dragState: DragState\n dropTarget: UseMoveDropTarget | null\n dropIndicator: DropIndicator | null\n startDrag: (e: React.PointerEvent, element: HTMLElement) => void\n}\n\nconst INITIAL_DRAG_STATE: DragState = {\n isDragging: false,\n draggedElement: null,\n originalParent: null,\n originalPreviousSibling: null,\n originalNextSibling: null,\n ghostPosition: { x: 0, y: 0 },\n dragOffset: { x: 0, y: 0 },\n}\n\nexport function useMove({ onMoveComplete }: UseMoveOptions): UseMoveResult {\n const [dragState, setDragState] = React.useState<DragState>(INITIAL_DRAG_STATE)\n const [dropTarget, setDropTarget] = React.useState<UseMoveDropTarget | null>(null)\n const [dropIndicator, setDropIndicator] = React.useState<DropIndicator | null>(null)\n\n const dragStateRef = React.useRef(dragState)\n const dropTargetRef = React.useRef(dropTarget)\n const onMoveCompleteRef = React.useRef(onMoveComplete)\n\n React.useEffect(() => {\n dragStateRef.current = dragState\n dropTargetRef.current = dropTarget\n onMoveCompleteRef.current = onMoveComplete\n })\n\n const cancelDrag = React.useCallback(() => {\n const current = dragStateRef.current\n if (current.draggedElement) {\n current.draggedElement.style.opacity = ''\n }\n setDragState(INITIAL_DRAG_STATE)\n setDropTarget(null)\n setDropIndicator(null)\n }, [])\n\n const completeDrag = React.useCallback(() => {\n const current = dragStateRef.current\n const target = dropTargetRef.current\n const { draggedElement, originalParent, originalPreviousSibling, originalNextSibling } = current\n\n if (!draggedElement) {\n cancelDrag()\n return\n }\n\n draggedElement.style.opacity = ''\n\n let didMove = false\n if (target) {\n const isSamePosition =\n target.container === originalParent &&\n target.insertBefore === originalNextSibling\n const isInvalidTarget =\n target.container === draggedElement ||\n draggedElement.contains(target.container) ||\n (target.insertBefore ? draggedElement.contains(target.insertBefore) : false)\n\n if (!isSamePosition && !isInvalidTarget) {\n try {\n if (target.insertBefore) {\n target.container.insertBefore(draggedElement, target.insertBefore)\n } else {\n target.container.appendChild(draggedElement)\n }\n didMove = true\n } catch {\n // Ignore invalid DOM moves and leave the element in place.\n }\n }\n }\n\n setDragState(INITIAL_DRAG_STATE)\n setDropTarget(null)\n setDropIndicator(null)\n\n if (onMoveCompleteRef.current && draggedElement) {\n const moveInfo: MoveInfo | null = didMove && originalParent\n ? { originalParent, originalPreviousSibling, originalNextSibling }\n : null\n onMoveCompleteRef.current(draggedElement, moveInfo)\n }\n }, [cancelDrag])\n\n const startDrag = React.useCallback(\n (e: React.PointerEvent, element: HTMLElement) => {\n const rect = element.getBoundingClientRect()\n const parent = element.parentElement\n const previousSibling = element.previousElementSibling as HTMLElement | null\n const nextSibling = element.nextElementSibling as HTMLElement | null\n\n setDragState({\n isDragging: true,\n draggedElement: element,\n originalParent: parent,\n originalPreviousSibling: previousSibling,\n originalNextSibling: nextSibling,\n ghostPosition: { x: rect.left, y: rect.top },\n dragOffset: { x: e.clientX - rect.left, y: e.clientY - rect.top },\n })\n\n element.style.opacity = '0.5'\n },\n []\n )\n\n React.useEffect(() => {\n if (!dragState.isDragging) return\n\n function handlePointerMove(e: PointerEvent) {\n const current = dragStateRef.current\n const { draggedElement, dragOffset, originalParent } = current\n\n setDragState((prev) => ({\n ...prev,\n ghostPosition: {\n x: e.clientX - dragOffset.x,\n y: e.clientY - dragOffset.y,\n },\n }))\n\n const container = findContainerAtPoint(\n e.clientX,\n e.clientY,\n draggedElement,\n originalParent\n )\n\n if (container && draggedElement) {\n const dropPos = calculateDropPosition(\n container,\n e.clientX,\n e.clientY,\n draggedElement\n )\n\n if (dropPos) {\n setDropTarget({\n container,\n insertBefore: dropPos.insertBefore,\n flexDirection: (() => {\n const { axis, reversed } = detectChildrenDirection(container, draggedElement)\n if (axis === 'horizontal') return reversed ? 'row-reverse' : 'row'\n return reversed ? 'column-reverse' : 'column'\n })(),\n })\n setDropIndicator(dropPos.indicator)\n }\n } else {\n setDropTarget(null)\n setDropIndicator(null)\n }\n }\n\n function handlePointerUp() {\n completeDrag()\n }\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n cancelDrag()\n }\n }\n\n window.addEventListener('pointermove', handlePointerMove)\n window.addEventListener('pointerup', handlePointerUp)\n window.addEventListener('keydown', handleKeyDown)\n\n return () => {\n window.removeEventListener('pointermove', handlePointerMove)\n window.removeEventListener('pointerup', handlePointerUp)\n window.removeEventListener('keydown', handleKeyDown)\n }\n }, [dragState.isDragging, completeDrag, cancelDrag])\n\n return {\n dragState,\n dropTarget,\n dropIndicator,\n startDrag,\n }\n}\n","import * as React from 'react'\nimport type { Guideline } from './types'\n\nconst STORAGE_KEY = 'direct-edit-guidelines'\n\nexport interface UseGuidelinesResult {\n guidelines: Guideline[]\n activeGuideline: Guideline | null\n dragPosition: number | null\n isCreating: boolean\n scrollOffset: { x: number; y: number }\n startCreate: (orientation: 'horizontal' | 'vertical', viewportPosition: number) => void\n startDrag: (guidelineId: string) => void\n deleteGuideline: (guidelineId: string) => void\n clearAll: () => void\n}\n\nfunction loadGuidelines(): Guideline[] {\n if (typeof window === 'undefined') return []\n try {\n const stored = localStorage.getItem(STORAGE_KEY)\n return stored ? JSON.parse(stored) : []\n } catch {\n return []\n }\n}\n\nexport function getStoredGuidelines(): Guideline[] {\n return loadGuidelines()\n}\n\nfunction saveGuidelines(guidelines: Guideline[]) {\n if (typeof window === 'undefined') return\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(guidelines))\n } catch {\n // ignore\n }\n}\n\nlet idCounter = 0\nfunction generateId(): string {\n return `gl-${Date.now()}-${idCounter++}`\n}\n\nconst RULER_SIZE = 20\n\nfunction viewportToCssCoord(\n hostElement: HTMLElement | null,\n value: number,\n axis: 'x' | 'y',\n): number {\n if (!hostElement) return value\n const rect = hostElement.getBoundingClientRect()\n const origin = axis === 'x' ? rect.left : rect.top\n const size = axis === 'x' ? rect.width : rect.height\n const cssSize = axis === 'x' ? hostElement.offsetWidth : hostElement.offsetHeight\n if (size === 0) return value\n return (value - origin) * (cssSize / size)\n}\n\nexport function useGuidelines(enabled: boolean, hostElement?: HTMLElement | null): UseGuidelinesResult {\n const [guidelines, setGuidelines] = React.useState<Guideline[]>([])\n const [hydrated, setHydrated] = React.useState(false)\n const [activeGuidelineId, setActiveGuidelineId] = React.useState<string | null>(null)\n const [dragPosition, setDragPosition] = React.useState<number | null>(null)\n const [isCreating, setIsCreating] = React.useState(false)\n const [scrollOffset, setScrollOffset] = React.useState({ x: 0, y: 0 })\n\n const hostRef = React.useRef<HTMLElement | null>(hostElement ?? null)\n hostRef.current = hostElement ?? null\n\n const [dragging, setDragging] = React.useState(false)\n\n const guidelinesRef = React.useRef(guidelines)\n guidelinesRef.current = guidelines\n\n const dragInfoRef = React.useRef<{\n guidelineId: string\n orientation: 'horizontal' | 'vertical'\n isCreating: boolean\n } | null>(null)\n\n // Hydrate from localStorage after mount (SSR-safe)\n React.useEffect(() => {\n setGuidelines(loadGuidelines())\n setHydrated(true)\n }, [])\n\n // Persist to localStorage on change\n React.useEffect(() => {\n if (!hydrated) return\n saveGuidelines(guidelines)\n }, [guidelines, hydrated])\n\n // Track scroll and resize\n React.useEffect(() => {\n if (!enabled) return\n\n function update() {\n setScrollOffset({ x: window.scrollX, y: window.scrollY })\n }\n\n update()\n window.addEventListener('scroll', update, true)\n window.addEventListener('resize', update)\n return () => {\n window.removeEventListener('scroll', update, true)\n window.removeEventListener('resize', update)\n }\n }, [enabled])\n\n const endDrag = React.useCallback(() => {\n const wasCreating = dragInfoRef.current?.isCreating ?? false\n dragInfoRef.current = null\n setDragging(false)\n setActiveGuidelineId(null)\n setDragPosition(null)\n if (wasCreating) setIsCreating(false)\n }, [])\n\n // Attach drag listeners via effect so cleanup happens on unmount\n React.useEffect(() => {\n if (!dragging) return\n\n const info = dragInfoRef.current\n if (!info) return\n\n const { guidelineId, orientation } = info\n const axis = orientation === 'horizontal' ? 'y' as const : 'x' as const\n\n function pointerToPos(e: PointerEvent): number {\n const raw = orientation === 'horizontal' ? e.clientY : e.clientX\n return viewportToCssCoord(hostRef.current, raw, axis)\n }\n\n function onPointerMove(e: PointerEvent) {\n const pos = pointerToPos(e)\n setDragPosition(pos)\n const currentScroll = orientation === 'horizontal' ? window.scrollY : window.scrollX\n setGuidelines((prev) =>\n prev.map((g) => (g.id === guidelineId ? { ...g, position: pos + currentScroll } : g)),\n )\n }\n\n function onPointerUp(e: PointerEvent) {\n const pos = pointerToPos(e)\n if (pos <= RULER_SIZE) {\n setGuidelines((prev) => prev.filter((g) => g.id !== guidelineId))\n }\n endDrag()\n }\n\n window.addEventListener('pointermove', onPointerMove)\n window.addEventListener('pointerup', onPointerUp)\n\n return () => {\n window.removeEventListener('pointermove', onPointerMove)\n window.removeEventListener('pointerup', onPointerUp)\n }\n }, [dragging, endDrag])\n\n // Cancel drag when rulers are disabled mid-drag\n React.useEffect(() => {\n if (!enabled && dragging) {\n endDrag()\n }\n }, [enabled, dragging, endDrag])\n\n const activeGuideline = React.useMemo(\n () => guidelines.find((g) => g.id === activeGuidelineId) ?? null,\n [guidelines, activeGuidelineId],\n )\n\n const startCreate = React.useCallback(\n (orientation: 'horizontal' | 'vertical', viewportPosition: number) => {\n const axis = orientation === 'horizontal' ? 'y' as const : 'x' as const\n const pos = viewportToCssCoord(hostRef.current, viewportPosition, axis)\n const scrollPos = orientation === 'horizontal' ? window.scrollY : window.scrollX\n const id = generateId()\n const newGuideline: Guideline = { id, orientation, position: pos + scrollPos }\n\n setGuidelines((prev) => [...prev, newGuideline])\n setActiveGuidelineId(id)\n setDragPosition(pos)\n setIsCreating(true)\n dragInfoRef.current = { guidelineId: id, orientation, isCreating: true }\n setDragging(true)\n },\n [],\n )\n\n const startDrag = React.useCallback((guidelineId: string) => {\n const guideline = guidelinesRef.current.find((g) => g.id === guidelineId)\n if (!guideline) return\n\n const scrollPos = guideline.orientation === 'horizontal' ? window.scrollY : window.scrollX\n setActiveGuidelineId(guidelineId)\n setDragPosition(guideline.position - scrollPos)\n dragInfoRef.current = { guidelineId, orientation: guideline.orientation, isCreating: false }\n setDragging(true)\n }, [])\n\n const deleteGuideline = React.useCallback((guidelineId: string) => {\n setGuidelines((prev) => prev.filter((g) => g.id !== guidelineId))\n }, [])\n\n const clearAll = React.useCallback(() => {\n setGuidelines([])\n }, [])\n\n return {\n guidelines,\n activeGuideline,\n dragPosition,\n isCreating,\n scrollOffset,\n startCreate,\n startDrag,\n deleteGuideline,\n clearAll,\n }\n}\n","import type { DropIndicator } from './types'\n\nconst BLUE = '#0D99FF'\n\nexport interface MoveOverlayProps {\n dropIndicator: DropIndicator | null\n}\n\nexport function MoveOverlay({ dropIndicator }: MoveOverlayProps) {\n if (!dropIndicator) {\n return null\n }\n\n return (\n <svg\n data-direct-edit=\"move-overlay\"\n style={{\n position: 'fixed',\n inset: 0,\n width: '100vw',\n height: '100vh',\n pointerEvents: 'none',\n zIndex: 99997,\n }}\n >\n <rect\n x={dropIndicator.x}\n y={dropIndicator.y}\n width={dropIndicator.width}\n height={dropIndicator.height}\n fill={BLUE}\n />\n </svg>\n )\n}\n","import * as React from 'react'\nimport { elementFromPointWithoutOverlays } from './utils'\n\nconst BLUE = '#0D99FF'\nconst DRAG_THRESHOLD = 4\nconst DBLCLICK_DELAY = 300\n\nexport interface SelectionOverlayProps {\n selectedElement: HTMLElement\n isDragging: boolean\n ghostPosition?: { x: number; y: number }\n onMoveStart: (e: React.PointerEvent) => void\n isTextEditing?: boolean\n onDoubleClick?: (clientX: number, clientY: number) => void\n onHoverElement?: (element: HTMLElement | null) => void\n onClickThrough?: (clientX: number, clientY: number) => void\n}\n\nexport function SelectionOverlay({\n selectedElement,\n isDragging,\n ghostPosition,\n onMoveStart,\n isTextEditing,\n onDoubleClick,\n onHoverElement,\n onClickThrough,\n}: SelectionOverlayProps) {\n const [rect, setRect] = React.useState(() => selectedElement.getBoundingClientRect())\n const cleanupRef = React.useRef<(() => void) | null>(null)\n const clickThroughTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n\n React.useEffect(() => {\n function updateRect() {\n setRect(selectedElement.getBoundingClientRect())\n }\n\n updateRect()\n\n window.addEventListener('scroll', updateRect, true)\n window.addEventListener('resize', updateRect)\n\n const observer = new MutationObserver(updateRect)\n observer.observe(selectedElement, {\n attributes: true,\n childList: true,\n subtree: true,\n })\n\n return () => {\n window.removeEventListener('scroll', updateRect, true)\n window.removeEventListener('resize', updateRect)\n observer.disconnect()\n }\n }, [selectedElement])\n\n React.useEffect(() => {\n return () => {\n cleanupRef.current?.()\n if (clickThroughTimerRef.current) clearTimeout(clickThroughTimerRef.current)\n }\n }, [])\n\n const handlePointerDown = (e: React.PointerEvent) => {\n if (e.button !== 0) return\n e.stopPropagation()\n // No preventDefault — allows browser to generate native dblclick events\n\n cleanupRef.current?.()\n if (clickThroughTimerRef.current) {\n clearTimeout(clickThroughTimerRef.current)\n clickThroughTimerRef.current = null\n }\n\n const origin = { x: e.clientX, y: e.clientY }\n const savedEvent = e\n\n const onMove = (moveEvent: PointerEvent) => {\n const dx = moveEvent.clientX - origin.x\n const dy = moveEvent.clientY - origin.y\n if (dx * dx + dy * dy >= DRAG_THRESHOLD * DRAG_THRESHOLD) {\n cleanup()\n onMoveStart(savedEvent)\n }\n }\n\n const onUp = (upEvent: PointerEvent) => {\n cleanup()\n if (onClickThrough) {\n const { clientX, clientY } = upEvent\n clickThroughTimerRef.current = setTimeout(() => {\n clickThroughTimerRef.current = null\n onClickThrough(clientX, clientY)\n }, DBLCLICK_DELAY)\n }\n }\n\n const cleanup = () => {\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n cleanupRef.current = null\n }\n\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', onUp)\n cleanupRef.current = cleanup\n }\n\n const handleDoubleClick = (e: React.MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n cleanupRef.current?.()\n if (clickThroughTimerRef.current) {\n clearTimeout(clickThroughTimerRef.current)\n clickThroughTimerRef.current = null\n }\n onDoubleClick?.(e.clientX, e.clientY)\n }\n\n const handleMouseMove = (e: React.MouseEvent) => {\n if (!onHoverElement) return\n const elementUnder = elementFromPointWithoutOverlays(e.clientX, e.clientY)\n onHoverElement(elementUnder)\n }\n\n const handleMouseLeave = () => {\n onHoverElement?.(null)\n }\n\n const displayX = isDragging && ghostPosition ? ghostPosition.x : rect.left\n const displayY = isDragging && ghostPosition ? ghostPosition.y : rect.top\n\n return (\n <>\n <svg\n data-direct-edit=\"selection-overlay\"\n style={{\n position: 'fixed',\n inset: 0,\n width: '100vw',\n height: '100vh',\n pointerEvents: 'none',\n zIndex: 99996,\n }}\n >\n {!isTextEditing && (\n <rect\n x={displayX}\n y={displayY}\n width={rect.width}\n height={rect.height}\n fill=\"transparent\"\n stroke={BLUE}\n strokeWidth={1}\n />\n )}\n </svg>\n\n {!isDragging && !isTextEditing && (\n <div\n data-direct-edit=\"selection-handle\"\n style={{\n position: 'fixed',\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n zIndex: 99996,\n cursor: 'default',\n pointerEvents: 'auto',\n }}\n onPointerDown={handlePointerDown}\n onDoubleClick={handleDoubleClick}\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n />\n )}\n </>\n )\n}\n","import * as React from 'react'\nimport type { Comment } from './types'\nimport { cn } from './cn'\nimport { ChevronLeft, Check, Copy, Trash2, ArrowUp, Send, X } from 'lucide-react'\n\nfunction formatRelativeTime(timestamp: number): string {\n const seconds = Math.floor((Date.now() - timestamp) / 1000)\n if (seconds < 60) return 'just now'\n const minutes = Math.floor(seconds / 60)\n if (minutes < 60) return `${minutes}m ago`\n const hours = Math.floor(minutes / 60)\n if (hours < 24) return `${hours}h ago`\n const days = Math.floor(hours / 24)\n return `${days}d ago`\n}\n\nexport interface CommentOverlayProps {\n comments: Comment[]\n activeCommentId: string | null\n onSetActiveComment: (id: string | null) => void\n onUpdateText: (id: string, text: string) => void\n onAddReply: (id: string, text: string) => void\n onDelete: (id: string) => void\n onExport: (id: string) => Promise<boolean>\n onSendToAgent: (id: string) => Promise<boolean>\n}\n\nexport function CommentOverlay({\n comments,\n activeCommentId,\n onSetActiveComment,\n onUpdateText,\n onAddReply,\n onDelete,\n onExport,\n onSendToAgent,\n}: CommentOverlayProps) {\n if (comments.length === 0) return null\n\n return (\n <>\n {comments.map((comment, index) => (\n <CommentPin\n key={comment.id}\n comment={comment}\n index={index + 1}\n isActive={activeCommentId === comment.id}\n onActivate={() => onSetActiveComment(comment.id)}\n onClose={() => onSetActiveComment(null)}\n onUpdateText={(text) => onUpdateText(comment.id, text)}\n onAddReply={(text) => onAddReply(comment.id, text)}\n onDelete={() => onDelete(comment.id)}\n onExport={() => onExport(comment.id)}\n onSendToAgent={() => onSendToAgent(comment.id)}\n />\n ))}\n </>\n )\n}\n\ninterface CommentPinProps {\n comment: Comment\n index: number\n isActive: boolean\n onActivate: () => void\n onClose: () => void\n onUpdateText: (text: string) => void\n onAddReply: (text: string) => void\n onDelete: () => void\n onExport: () => Promise<boolean>\n onSendToAgent: () => Promise<boolean>\n}\n\nfunction CommentPin({\n comment,\n index,\n isActive,\n onActivate,\n onClose,\n onUpdateText,\n onAddReply,\n onDelete,\n onExport,\n onSendToAgent,\n}: CommentPinProps) {\n const [position, setPosition] = React.useState(comment.clickPosition)\n const [flipHorizontal, setFlipHorizontal] = React.useState(false)\n const [flipVertical, setFlipVertical] = React.useState(false)\n\n React.useEffect(() => {\n function updatePosition() {\n if (!comment.element.isConnected) return\n const rect = comment.element.getBoundingClientRect()\n setPosition({\n x: rect.left + comment.relativePosition.x,\n y: rect.top + comment.relativePosition.y,\n })\n }\n\n updatePosition()\n window.addEventListener('scroll', updatePosition, true)\n window.addEventListener('resize', updatePosition)\n return () => {\n window.removeEventListener('scroll', updatePosition, true)\n window.removeEventListener('resize', updatePosition)\n }\n }, [comment.element, comment.relativePosition])\n\n React.useEffect(() => {\n if (isActive) {\n const hasText = comment.text !== ''\n const cardWidth = hasText ? 280 : 220\n const cardHeight = hasText ? 220 : 40\n const pinSize = 12\n setFlipHorizontal(position.x + pinSize + cardWidth > window.innerWidth)\n setFlipVertical(position.y + cardHeight > window.innerHeight)\n }\n }, [isActive, position, comment.text])\n\n return (\n <>\n <div\n data-direct-edit=\"comment-pin\"\n className=\"group/pin fixed z-[99998] flex size-3 cursor-pointer items-center justify-center rounded-full bg-blue-500 shadow-md ring-2 ring-white transition-transform hover:scale-[1.67] hover:shadow-lg\"\n style={{\n left: position.x - 6,\n top: position.y - 6,\n pointerEvents: 'auto',\n }}\n onClick={(e) => {\n e.stopPropagation()\n onActivate()\n }}\n >\n <span className=\"hidden text-[7px] font-medium leading-none text-white group-hover/pin:inline\">\n {index}\n </span>\n </div>\n\n {isActive && (\n comment.text === '' ? (\n <NewCommentInput\n position={position}\n flipHorizontal={flipHorizontal}\n flipVertical={flipVertical}\n onSubmit={(text) => onUpdateText(text)}\n onCancel={onClose}\n />\n ) : (\n <CommentThread\n comment={comment}\n index={index}\n position={position}\n flipHorizontal={flipHorizontal}\n flipVertical={flipVertical}\n onClose={onClose}\n onAddReply={onAddReply}\n onDelete={onDelete}\n onExport={onExport}\n onSendToAgent={onSendToAgent}\n />\n )\n )}\n </>\n )\n}\n\ninterface NewCommentInputProps {\n position: { x: number; y: number }\n flipHorizontal: boolean\n flipVertical: boolean\n onSubmit: (text: string) => void\n onCancel: () => void\n}\n\nfunction NewCommentInput({ position, flipHorizontal, flipVertical, onSubmit, onCancel }: NewCommentInputProps) {\n const [text, setText] = React.useState('')\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n React.useEffect(() => {\n inputRef.current?.focus()\n }, [])\n\n return (\n <div\n data-direct-edit=\"comment-card\"\n className=\"fixed z-[99999] flex items-center gap-1.5 rounded-lg outline outline-1 outline-foreground/10 bg-background p-1.5 shadow-lg\"\n style={{\n width: 220,\n left: flipHorizontal ? position.x - 220 - 8 : position.x + 14,\n top: flipVertical ? position.y - 40 : position.y - 18,\n pointerEvents: 'auto',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <input\n ref={inputRef}\n type=\"text\"\n className=\"min-w-0 flex-1 bg-transparent px-1.5 text-xs text-foreground placeholder:text-muted-foreground focus:outline-none\"\n placeholder=\"Add a comment...\"\n value={text}\n onChange={(e) => setText(e.target.value)}\n onKeyDown={(e) => {\n e.stopPropagation()\n if (e.key === 'Enter' && text.trim()) {\n onSubmit(text.trim())\n } else if (e.key === 'Escape') {\n onCancel()\n }\n }}\n />\n <button\n type=\"button\"\n className={cn(\n 'flex size-6 shrink-0 items-center justify-center rounded-md transition-colors',\n text.trim()\n ? 'bg-blue-500 text-white hover:bg-blue-600'\n : 'bg-muted text-muted-foreground'\n )}\n disabled={!text.trim()}\n onClick={() => {\n if (text.trim()) onSubmit(text.trim())\n }}\n >\n <ArrowUp className=\"size-3.5\" />\n </button>\n </div>\n )\n}\n\ninterface CommentThreadProps {\n comment: Comment\n index: number\n position: { x: number; y: number }\n flipHorizontal: boolean\n flipVertical: boolean\n onClose: () => void\n onAddReply: (text: string) => void\n onDelete: () => void\n onExport: () => Promise<boolean>\n onSendToAgent: () => Promise<boolean>\n}\n\nfunction CommentThread({\n comment,\n index,\n position,\n flipHorizontal,\n flipVertical,\n onClose,\n onAddReply,\n onDelete,\n onExport,\n onSendToAgent,\n}: CommentThreadProps) {\n const [replyText, setReplyText] = React.useState('')\n const [copied, setCopied] = React.useState(false)\n const [sendStatus, setSendStatus] = React.useState<'idle' | 'sending' | 'sent' | 'offline'>('idle')\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n React.useEffect(() => {\n inputRef.current?.focus()\n }, [])\n\n const handleCopy = async () => {\n const success = await onExport()\n if (success) {\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n }\n\n const handleSendToAgent = async () => {\n if (sendStatus === 'sending') return\n setSendStatus('sending')\n const success = await onSendToAgent()\n if (success) {\n setSendStatus('sent')\n setTimeout(() => setSendStatus('idle'), 2000)\n } else {\n setSendStatus('offline')\n setTimeout(() => setSendStatus('idle'), 2000)\n }\n }\n\n const handleSubmitReply = () => {\n if (replyText.trim()) {\n onAddReply(replyText.trim())\n setReplyText('')\n }\n }\n\n return (\n <div\n data-direct-edit=\"comment-card\"\n className=\"fixed z-[99999] w-[280px] overflow-hidden rounded-lg outline outline-1 outline-foreground/10 bg-background shadow-lg\"\n style={{\n left: flipHorizontal ? position.x - 280 - 8 : position.x + 14,\n top: flipVertical ? position.y - 220 : position.y - 14,\n pointerEvents: 'auto',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-border/50 px-2 py-1.5\">\n <button\n type=\"button\"\n className=\"flex size-6 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n onClick={onClose}\n title=\"Back\"\n >\n <ChevronLeft className=\"size-3.5\" />\n </button>\n <div className=\"flex items-center gap-0.5\">\n <button\n type=\"button\"\n className=\"flex size-6 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n onClick={handleCopy}\n title=\"Copy\"\n >\n {copied ? (\n <Check className=\"size-3.5 text-green-500\" />\n ) : (\n <Copy className=\"size-3.5\" />\n )}\n </button>\n <button\n type=\"button\"\n className=\"flex size-6 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n onClick={handleSendToAgent}\n title=\"Send to Agent\"\n >\n {sendStatus === 'sent' ? (\n <Check className=\"size-3.5 text-green-500\" />\n ) : sendStatus === 'offline' ? (\n <X className=\"size-3.5 text-red-500\" />\n ) : (\n <Send className=\"size-3.5\" />\n )}\n </button>\n <button\n type=\"button\"\n className=\"flex size-6 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n onClick={onDelete}\n title=\"Delete\"\n >\n <Trash2 className=\"size-3.5\" />\n </button>\n </div>\n </div>\n\n {/* Thread body */}\n <div className=\"max-h-48 overflow-y-auto\">\n {/* Original comment */}\n <div className=\"px-3 py-2.5\">\n <div className=\"mb-1.5 flex items-center gap-2\">\n <div className=\"flex size-5 shrink-0 items-center justify-center rounded-full bg-blue-500 text-[10px] font-bold text-white\">\n {index}\n </div>\n <span className=\"text-xs font-medium text-foreground\">Comment #{index}</span>\n <span className=\"text-[10px] text-muted-foreground\">{formatRelativeTime(comment.createdAt)}</span>\n </div>\n <p className=\"text-xs leading-relaxed text-foreground\">{comment.text}</p>\n </div>\n\n {/* Replies */}\n {comment.replies.map((reply, i) => (\n <div key={i} className=\"border-t border-border/30 px-3 py-2.5\">\n <div className=\"mb-1 flex items-center gap-2\">\n <div className=\"flex size-5 shrink-0 items-center justify-center rounded-full bg-blue-500 text-[10px] font-bold text-white\">\n {index}\n </div>\n <span className=\"text-[10px] text-muted-foreground\">{formatRelativeTime(reply.createdAt)}</span>\n </div>\n <p className=\"text-xs leading-relaxed text-foreground\">{reply.text}</p>\n </div>\n ))}\n </div>\n\n {/* Footer */}\n <div className=\"flex items-center gap-1.5 border-t border-border/50 px-2 py-1.5\">\n <input\n ref={inputRef}\n type=\"text\"\n className=\"min-w-0 flex-1 bg-transparent px-1.5 text-xs text-foreground placeholder:text-muted-foreground focus:outline-none\"\n placeholder=\"Reply...\"\n value={replyText}\n onChange={(e) => setReplyText(e.target.value)}\n onKeyDown={(e) => {\n e.stopPropagation()\n if (e.key === 'Enter') {\n handleSubmitReply()\n } else if (e.key === 'Escape') {\n onClose()\n }\n }}\n />\n <button\n type=\"button\"\n className={cn(\n 'flex size-6 shrink-0 items-center justify-center rounded-md transition-colors',\n replyText.trim()\n ? 'bg-blue-500 text-white hover:bg-blue-600'\n : 'bg-muted text-muted-foreground'\n )}\n disabled={!replyText.trim()}\n onClick={handleSubmitReply}\n >\n <ArrowUp className=\"size-3.5\" />\n </button>\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { usePortalContainer } from './portal-container'\nimport { useDirectEdit } from './provider'\nimport { useRulersVisible } from './rulers-overlay'\nimport { cn } from './cn'\nimport { useToolbarDock } from './use-toolbar-dock'\nimport { Popover } from '@base-ui/react/popover'\nimport { MousePointer2, Ruler, Command, ArrowBigUp, MessageSquare, EllipsisVertical, Sun, Moon, Monitor, Option, ClipboardList, X, Check, Copy } from 'lucide-react'\nimport type { ActiveTool, Theme, SessionEdit } from './types'\nimport {\n Tooltip,\n TooltipProvider,\n TooltipTrigger,\n TooltipContent,\n} from './ui/tooltip'\n\nexport interface DirectEditToolbarInnerProps {\n editModeActive: boolean\n onToggleEditMode: () => void\n rulersVisible: boolean\n onToggleRulers: () => void\n activeTool?: ActiveTool\n onSetActiveTool?: (tool: ActiveTool) => void\n theme?: Theme\n onSetTheme?: (theme: Theme) => void\n sessionEditCount?: number\n onGetSessionEdits?: () => SessionEdit[]\n onExportAllEdits?: () => Promise<boolean>\n onClearSessionEdits?: () => void\n onRemoveSessionEdit?: (element: HTMLElement) => void\n className?: string\n}\n\nfunction ThemePopoverPortal(props: React.ComponentPropsWithoutRef<typeof Popover.Portal>) {\n const container = usePortalContainer()\n return <Popover.Portal container={container} {...props} />\n}\n\nfunction EditsPopoverPortal(props: React.ComponentPropsWithoutRef<typeof Popover.Portal>) {\n const container = usePortalContainer()\n return <Popover.Portal container={container} {...props} />\n}\n\nexport function DirectEditToolbarInner({\n editModeActive,\n onToggleEditMode,\n rulersVisible,\n onToggleRulers,\n activeTool = 'select',\n onSetActiveTool,\n theme = 'system',\n onSetTheme,\n sessionEditCount = 0,\n onGetSessionEdits,\n onExportAllEdits,\n onClearSessionEdits,\n onRemoveSessionEdit,\n className,\n}: DirectEditToolbarInnerProps) {\n const container = usePortalContainer()\n const toolbarRef = React.useRef<HTMLDivElement>(null)\n const { dockedEdge, isDragging, isSnapping, style: dockStyle, handlePointerDown, handlePointerMove, handlePointerUp, handlePointerCancel } = useToolbarDock(toolbarRef)\n const isVertical = dockedEdge === 'left' || dockedEdge === 'right'\n const tooltipSide = dockedEdge === 'bottom' ? 'top'\n : dockedEdge === 'top' ? 'bottom'\n : dockedEdge === 'left' ? 'right' : 'left'\n const [isMac, setIsMac] = React.useState(false)\n const [settingsOpen, setSettingsOpen] = React.useState(false)\n const [editsOpen, setEditsOpen] = React.useState(false)\n const [copied, setCopied] = React.useState(false)\n const settingsPopupRef = React.useRef<HTMLDivElement>(null)\n const settingsTriggerRef = React.useRef<HTMLButtonElement>(null)\n const editsPopupRef = React.useRef<HTMLDivElement>(null)\n const editsTriggerRef = React.useRef<HTMLButtonElement>(null)\n const [editsSnapshot, setEditsSnapshot] = React.useState<SessionEdit[]>([])\n\n React.useEffect(() => {\n setIsMac(navigator.platform?.includes('Mac') ?? false)\n }, [])\n\n // Close settings popover on outside click (Shadow DOM breaks base-ui's dismiss)\n React.useEffect(() => {\n if (!settingsOpen) return\n\n function handlePointerDown(e: PointerEvent) {\n const path = e.composedPath()\n if (settingsPopupRef.current && path.includes(settingsPopupRef.current)) return\n if (settingsTriggerRef.current && path.includes(settingsTriggerRef.current)) return\n setSettingsOpen(false)\n }\n\n const raf = requestAnimationFrame(() => {\n document.addEventListener('pointerdown', handlePointerDown)\n })\n\n return () => {\n cancelAnimationFrame(raf)\n document.removeEventListener('pointerdown', handlePointerDown)\n }\n }, [settingsOpen])\n\n // Close edits popover on outside click (Shadow DOM breaks base-ui's dismiss)\n React.useEffect(() => {\n if (!editsOpen) return\n\n function handlePointerDown(e: PointerEvent) {\n const path = e.composedPath()\n if (editsPopupRef.current && path.includes(editsPopupRef.current)) return\n if (editsTriggerRef.current && path.includes(editsTriggerRef.current)) return\n setEditsOpen(false)\n }\n\n const raf = requestAnimationFrame(() => {\n document.addEventListener('pointerdown', handlePointerDown)\n })\n\n return () => {\n cancelAnimationFrame(raf)\n document.removeEventListener('pointerdown', handlePointerDown)\n }\n }, [editsOpen])\n\n // Refresh snapshot when popover opens\n React.useEffect(() => {\n if (editsOpen && onGetSessionEdits) {\n setEditsSnapshot(onGetSessionEdits())\n }\n if (!editsOpen) {\n setCopied(false)\n }\n }, [editsOpen, onGetSessionEdits])\n\n // Close popovers on drag start\n React.useEffect(() => {\n if (!isDragging) return\n setSettingsOpen(false)\n setEditsOpen(false)\n }, [isDragging])\n\n const kbdClass = 'inline-flex items-center justify-center rounded bg-white/20 px-1.5 py-0.5 font-mono text-[10px] min-w-[20px] min-h-[18px]'\n const popupKbdClass = 'inline-flex items-center justify-center rounded bg-muted px-1.5 py-0.5 font-mono text-[10px] text-muted-foreground min-w-[20px] min-h-[18px]'\n\n const shortcutContent = isMac ? (\n <>\n <kbd className={kbdClass}><Command className=\"size-2.5\" /></kbd>\n <kbd className={kbdClass}>.</kbd>\n </>\n ) : (\n <>\n <kbd className={kbdClass}>Ctrl</kbd>\n <kbd className={kbdClass}>.</kbd>\n </>\n )\n\n const toolbar = (\n <>\n <div\n ref={toolbarRef}\n data-direct-edit=\"toolbar\"\n style={{ pointerEvents: 'auto', touchAction: 'none', ...dockStyle }}\n className={cn(\n 'group z-[99999] flex rounded-[14px] outline outline-1 outline-foreground/10 bg-background p-1.5 shadow-lg transition-shadow duration-200',\n isVertical ? 'flex-col items-center' : 'flex-row items-center',\n isDragging && 'cursor-grabbing select-none shadow-2xl',\n className\n )}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerCancel}\n onLostPointerCapture={handlePointerCancel}\n >\n {/* Handlebar — slides in on hover or while dragging */}\n <div className={cn(\n 'flex shrink-0 cursor-grab items-center justify-center overflow-hidden transition-[max-width,max-height,padding,opacity] duration-200 ease-out',\n isVertical\n ? (isDragging || isSnapping ? 'max-h-3 pt-0 pb-1.5 opacity-100' : 'max-h-0 py-0 opacity-0 group-hover:max-h-3 group-hover:pt-0 group-hover:pb-1.5 group-hover:opacity-100')\n : (isDragging || isSnapping ? 'max-w-3 pl-0 pr-1.5 opacity-100' : 'max-w-0 px-0 opacity-0 group-hover:max-w-3 group-hover:pl-0 group-hover:pr-1.5 group-hover:opacity-100'),\n isVertical ? 'w-full' : 'h-full'\n )}>\n <div className={cn(\n 'shrink-0 rounded-full bg-foreground/25',\n isVertical ? 'h-0.5 w-4' : 'h-4 w-0.5'\n )} />\n </div>\n\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger\n className={cn(\n 'flex cursor-pointer items-center justify-center rounded-[8px] p-2 transition-colors',\n editModeActive && activeTool !== 'comment'\n ? 'bg-foreground text-background hover:bg-foreground/80'\n : editModeActive && activeTool === 'comment'\n ? 'text-muted-foreground hover:bg-muted hover:text-foreground'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n onPointerDown={(e: React.PointerEvent) => e.stopPropagation()}\n onClick={() => {\n if (editModeActive && activeTool === 'comment') {\n onSetActiveTool?.('select')\n } else {\n onToggleEditMode()\n }\n }}\n >\n <MousePointer2 className=\"size-4\" />\n </TooltipTrigger>\n <TooltipContent side={tooltipSide} className=\"inline-flex items-center gap-1.5\">\n <span>{editModeActive ? 'Select' : 'Activate design mode'}</span>\n {shortcutContent}\n </TooltipContent>\n </Tooltip>\n\n <div\n className={cn(\n 'overflow-hidden transition-[max-width,max-height,margin,opacity] duration-300 ease-out',\n isVertical\n ? (editModeActive ? 'mt-1 max-h-[220px] opacity-100' : 'mt-0 max-h-0 opacity-0')\n : (editModeActive ? 'ml-1 max-w-[200px] opacity-100' : 'ml-0 max-w-0 opacity-0')\n )}\n >\n <div className={cn('flex gap-1', isVertical ? 'flex-col items-center' : 'flex-row items-center')}>\n <Tooltip>\n <TooltipTrigger\n className={cn(\n 'flex cursor-pointer items-center justify-center rounded-[8px] p-2 transition-colors',\n activeTool === 'comment'\n ? 'bg-foreground text-background hover:bg-foreground/80'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n onPointerDown={(e) => e.stopPropagation()}\n onClick={() => onSetActiveTool?.(activeTool === 'comment' ? 'select' : 'comment')}\n >\n <MessageSquare className=\"size-4\" />\n </TooltipTrigger>\n <TooltipContent side={tooltipSide} className=\"inline-flex items-center gap-1.5\">\n <span>{activeTool === 'comment' ? 'Exit comment mode' : 'Comment'}</span>\n <kbd className={kbdClass}><ArrowBigUp className=\"size-3\" /></kbd>\n <kbd className={kbdClass}>C</kbd>\n </TooltipContent>\n </Tooltip>\n\n <Tooltip>\n <TooltipTrigger\n className={cn(\n 'flex cursor-pointer items-center justify-center rounded-[8px] p-2 transition-colors',\n rulersVisible\n ? 'bg-muted text-foreground'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n onPointerDown={(e) => e.stopPropagation()}\n onClick={onToggleRulers}\n >\n <Ruler className=\"size-4\" />\n </TooltipTrigger>\n <TooltipContent side={tooltipSide} className=\"inline-flex items-center gap-1.5\">\n <span>{rulersVisible ? 'Hide rulers' : 'Show rulers'}</span>\n <kbd className={kbdClass}><ArrowBigUp className=\"size-2.5\" /></kbd>\n <kbd className={kbdClass}>R</kbd>\n </TooltipContent>\n </Tooltip>\n\n <div className={cn(\n 'border-foreground/10',\n isVertical ? 'my-0.5 w-5 border-t' : 'mx-0.5 h-5 border-l'\n )} />\n\n <Popover.Root open={editsOpen} onOpenChange={setEditsOpen}>\n <Tooltip>\n <Popover.Trigger ref={editsTriggerRef} render={\n <TooltipTrigger\n className={cn(\n 'flex cursor-pointer items-center justify-center rounded-[8px] p-2 transition-colors',\n sessionEditCount > 0 || editsOpen\n ? 'bg-muted text-foreground'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n onPointerDown={(e: React.PointerEvent) => e.stopPropagation()}\n />\n }>\n <ClipboardList className=\"size-4\" />\n </Popover.Trigger>\n <TooltipContent side={tooltipSide}>\n <span>Session edits</span>\n </TooltipContent>\n </Tooltip>\n <EditsPopoverPortal>\n <Popover.Positioner side={tooltipSide} sideOffset={12} className=\"fixed z-[99999]\" style={{ pointerEvents: 'auto' }}>\n <Popover.Popup ref={editsPopupRef} className=\"w-[280px] rounded-lg outline outline-1 outline-foreground/10 bg-background shadow-lg\" onPointerDown={(e: React.PointerEvent) => e.stopPropagation()}>\n <div className=\"flex items-center justify-between px-3 pb-1 pt-2.5\">\n <span className=\"text-xs font-medium text-foreground\">Session edits ({editsSnapshot.length})</span>\n {editsSnapshot.length > 0 && (\n <button\n type=\"button\"\n className=\"text-[11px] text-muted-foreground hover:text-foreground\"\n onClick={() => {\n onClearSessionEdits?.()\n setEditsSnapshot([])\n }}\n >\n Clear all\n </button>\n )}\n </div>\n {editsSnapshot.length === 0 ? (\n <div className=\"px-3 pb-3 pt-1 text-xs text-muted-foreground\">\n No edits yet. Select elements and make changes.\n </div>\n ) : (\n <>\n <div className=\"max-h-[240px] overflow-y-auto px-1 py-1\">\n {editsSnapshot.map((edit, i) => {\n const componentName = edit.locator.reactStack[0]?.name ?? edit.locator.tagName\n const styleCount = Object.keys(edit.pendingStyles).length\n const parts: string[] = []\n if (styleCount > 0) parts.push(`${styleCount} style${styleCount !== 1 ? 's' : ''}`)\n if (edit.move) parts.push('moved')\n return (\n <div\n key={i}\n className=\"group flex items-center justify-between rounded-md px-2 py-1.5 text-xs hover:bg-muted/50\"\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-medium text-foreground\">&lt;{componentName}&gt;</div>\n <div className=\"text-[11px] text-muted-foreground\">{parts.join(', ')}</div>\n </div>\n <button\n type=\"button\"\n className=\"ml-2 flex-shrink-0 rounded p-0.5 text-muted-foreground opacity-0 transition-opacity hover:text-foreground group-hover:opacity-100\"\n onClick={() => {\n onRemoveSessionEdit?.(edit.element)\n setEditsSnapshot((prev) => prev.filter((_, j) => j !== i))\n }}\n >\n <X className=\"size-3\" />\n </button>\n </div>\n )\n })}\n </div>\n <div className=\"border-t border-foreground/10 p-2\">\n <button\n type=\"button\"\n className=\"flex w-full items-center justify-center rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background transition-colors hover:bg-foreground/80\"\n onClick={async () => {\n const success = await onExportAllEdits?.()\n if (success) {\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n }}\n >\n {copied ? (\n <Check className=\"mr-1 size-3 text-green-400\" />\n ) : (\n <Copy className=\"mr-1 size-3\" />\n )}\n {copied ? 'Copied! Paste to AI agent' : 'Copy all edits'}\n </button>\n </div>\n </>\n )}\n </Popover.Popup>\n </Popover.Positioner>\n </EditsPopoverPortal>\n </Popover.Root>\n\n <Popover.Root open={settingsOpen} onOpenChange={setSettingsOpen}>\n <Tooltip>\n <Popover.Trigger ref={settingsTriggerRef} render={\n <TooltipTrigger\n className={cn(\n 'flex cursor-pointer items-center justify-center rounded-[8px] p-2 transition-colors',\n settingsOpen\n ? 'bg-muted text-foreground'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n onPointerDown={(e: React.PointerEvent) => e.stopPropagation()}\n />\n }>\n <EllipsisVertical className=\"size-4\" />\n </Popover.Trigger>\n <TooltipContent side={tooltipSide}>\n <span>More</span>\n </TooltipContent>\n </Tooltip>\n <ThemePopoverPortal>\n <Popover.Positioner side={tooltipSide} sideOffset={12} className=\"fixed z-[99999]\" style={{ pointerEvents: 'auto' }}>\n <Popover.Popup ref={settingsPopupRef} className=\"w-[220px] rounded-lg outline outline-1 outline-foreground/10 bg-background p-1 shadow-lg\" onPointerDown={(e: React.PointerEvent) => e.stopPropagation()}>\n <div className=\"px-2.5 pb-1 pt-1.5 text-[10px] font-medium text-foreground\">Theme</div>\n {([\n { value: 'light' as const, label: 'Light', Icon: Sun },\n { value: 'dark' as const, label: 'Dark', Icon: Moon },\n { value: 'system' as const, label: 'System', Icon: Monitor },\n ]).map(({ value, label, Icon }) => (\n <button\n key={value}\n type=\"button\"\n className={cn(\n 'flex w-full items-center gap-2 rounded-md px-2.5 py-1.5 text-xs transition-colors',\n theme === value\n ? 'bg-muted text-foreground'\n : 'text-muted-foreground hover:bg-muted/50 hover:text-foreground'\n )}\n onClick={() => {\n onSetTheme?.(value)\n setSettingsOpen(false)\n }}\n >\n <Icon className=\"size-3.5\" />\n {label}\n </button>\n ))}\n <div className=\"mx-1.5 my-1 border-t border-foreground/10\" />\n <div className=\"px-2.5 pb-1 pt-1.5 text-[10px] font-medium text-foreground\">Keyboard Shortcuts</div>\n {([\n { label: 'Toggle design mode', keys: isMac ? [<Command key=\"cmd\" className=\"size-2.5\" />,'.' ] : ['Ctrl', '.'] },\n { label: 'Undo', keys: isMac ? [<Command key=\"cmd\" className=\"size-2.5\" />, 'Z'] : ['Ctrl', 'Z'] },\n { label: 'Toggle comments', keys: [<ArrowBigUp key=\"shift\" className=\"size-3\" />, 'C'] },\n { label: 'Toggle rulers', keys: [<ArrowBigUp key=\"shift\" className=\"size-3\" />, 'R'] },\n { label: 'Hover to measure', keys: isMac ? ['Hold', <Option key=\"opt\" className=\"size-2.5\" />] : ['Hold', 'Alt'] },\n { label: 'Back / Exit', keys: ['Esc'] },\n ]).map(({ label, keys }) => (\n <div key={label} className=\"flex w-full items-center justify-between rounded-md px-2.5 py-1.5 text-xs text-muted-foreground\">\n <span>{label}</span>\n <span className=\"flex items-center gap-0.5\">\n {keys.map((k, i) => (\n <kbd key={i} className={popupKbdClass}>{k}</kbd>\n ))}\n </span>\n </div>\n ))}\n </Popover.Popup>\n </Popover.Positioner>\n </ThemePopoverPortal>\n </Popover.Root>\n </div>\n </div>\n </TooltipProvider>\n </div>\n </>\n )\n\n if (container) {\n return createPortal(toolbar, container)\n }\n\n return toolbar\n}\n\nfunction DirectEditToolbarContent() {\n const {\n editModeActive, toggleEditMode, activeTool, setActiveTool, theme, setTheme,\n sessionEditCount, getSessionEdits, exportAllEdits, clearSessionEdits, removeSessionEdit,\n } = useDirectEdit()\n const [rulersVisible, toggleRulers] = useRulersVisible()\n\n return (\n <DirectEditToolbarInner\n editModeActive={editModeActive}\n onToggleEditMode={toggleEditMode}\n rulersVisible={rulersVisible}\n onToggleRulers={toggleRulers}\n activeTool={activeTool}\n onSetActiveTool={setActiveTool}\n theme={theme}\n onSetTheme={setTheme}\n sessionEditCount={sessionEditCount}\n onGetSessionEdits={getSessionEdits}\n onExportAllEdits={exportAllEdits}\n onClearSessionEdits={clearSessionEdits}\n onRemoveSessionEdit={removeSessionEdit}\n />\n )\n}\n\nexport function DirectEditToolbar() {\n const [mounted, setMounted] = React.useState(false)\n\n React.useEffect(() => {\n setMounted(true)\n }, [])\n\n if (!mounted) {\n return null\n }\n\n return <DirectEditToolbarContent />\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { usePortalContainer } from './portal-container'\nimport { useDirectEdit } from './hooks'\nimport { useGuidelines } from './use-guidelines'\nimport type { Guideline } from './types'\n\nconst RULER_SIZE = 20\nconst GUIDELINE_COLOR = '#FF6B6B'\nconst HIT_ZONE = 9\n\nfunction useRulerColors() {\n const [dark, setDark] = React.useState(false)\n\n React.useEffect(() => {\n const mq = window.matchMedia('(prefers-color-scheme: dark)')\n setDark(mq.matches)\n const handler = (e: MediaQueryListEvent) => setDark(e.matches)\n mq.addEventListener('change', handler)\n return () => mq.removeEventListener('change', handler)\n }, [])\n\n return dark\n ? {\n bg: 'rgba(23, 23, 23, 0.95)',\n border: 'rgba(255, 255, 255, 0.1)',\n tick: 'rgba(255, 255, 255, 0.3)',\n label: 'rgba(255, 255, 255, 0.5)',\n }\n : {\n bg: 'rgba(245, 245, 245, 0.95)',\n border: 'rgba(0, 0, 0, 0.1)',\n tick: 'rgba(0, 0, 0, 0.3)',\n label: 'rgba(0, 0, 0, 0.5)',\n }\n}\n\nconst rulerFont: React.CSSProperties = {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n fontSize: '9px',\n fontVariantNumeric: 'tabular-nums',\n}\n\n// --- HorizontalRuler ---\n\nfunction HorizontalRuler({\n scrollOffset,\n onPointerDown,\n}: {\n scrollOffset: { x: number; y: number }\n onPointerDown: (e: React.PointerEvent) => void\n}) {\n const canvasRef = React.useRef<HTMLCanvasElement>(null)\n const viewportWidth = useViewportWidth()\n const colors = useRulerColors()\n\n React.useEffect(() => {\n const canvas = canvasRef.current\n if (!canvas) return\n const dpr = window.devicePixelRatio || 1\n const width = Math.max(0, viewportWidth - RULER_SIZE)\n const height = RULER_SIZE\n\n canvas.width = width * dpr\n canvas.height = height * dpr\n canvas.style.width = `${width}px`\n canvas.style.height = `${height}px`\n\n if (width === 0) return\n\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n ctx.scale(dpr, dpr)\n ctx.clearRect(0, 0, width, height)\n\n const startPx = Math.floor(scrollOffset.x / 10) * 10\n const endPx = scrollOffset.x + width\n\n for (let px = startPx; px <= endPx; px += 10) {\n const x = px - scrollOffset.x\n const isMajor = px % 100 === 0\n const isMid = px % 50 === 0\n\n ctx.beginPath()\n ctx.moveTo(x, height)\n ctx.lineTo(x, height - (isMajor ? 10 : isMid ? 7 : 4))\n ctx.strokeStyle = colors.tick\n ctx.lineWidth = 1\n ctx.stroke()\n\n if (isMajor && px !== 0) {\n ctx.fillStyle = colors.label\n ctx.font = '9px system-ui, -apple-system, sans-serif'\n ctx.textAlign = 'center'\n ctx.fillText(String(px), x, 9)\n }\n }\n }, [scrollOffset.x, viewportWidth, colors])\n\n return (\n <div\n data-direct-edit=\"ruler-horizontal\"\n style={{\n position: 'fixed',\n top: 0,\n left: RULER_SIZE,\n right: 0,\n height: RULER_SIZE,\n background: colors.bg,\n borderBottom: `1px solid ${colors.border}`,\n zIndex: 99994,\n cursor: 's-resize',\n pointerEvents: 'auto',\n overflow: 'hidden',\n }}\n onPointerDown={onPointerDown}\n >\n <canvas ref={canvasRef} style={{ display: 'block' }} />\n </div>\n )\n}\n\n// --- VerticalRuler ---\n\nfunction VerticalRuler({\n scrollOffset,\n onPointerDown,\n}: {\n scrollOffset: { x: number; y: number }\n onPointerDown: (e: React.PointerEvent) => void\n}) {\n const canvasRef = React.useRef<HTMLCanvasElement>(null)\n const viewportHeight = useViewportHeight()\n const colors = useRulerColors()\n\n React.useEffect(() => {\n const canvas = canvasRef.current\n if (!canvas) return\n const dpr = window.devicePixelRatio || 1\n const width = RULER_SIZE\n const height = Math.max(0, viewportHeight - RULER_SIZE)\n\n canvas.width = width * dpr\n canvas.height = height * dpr\n canvas.style.width = `${width}px`\n canvas.style.height = `${height}px`\n\n if (height === 0) return\n\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n ctx.scale(dpr, dpr)\n ctx.clearRect(0, 0, width, height)\n\n const startPx = Math.floor(scrollOffset.y / 10) * 10\n const endPx = scrollOffset.y + height\n\n for (let px = startPx; px <= endPx; px += 10) {\n const y = px - scrollOffset.y\n const isMajor = px % 100 === 0\n const isMid = px % 50 === 0\n\n ctx.beginPath()\n ctx.moveTo(width, y)\n ctx.lineTo(width - (isMajor ? 10 : isMid ? 7 : 4), y)\n ctx.strokeStyle = colors.tick\n ctx.lineWidth = 1\n ctx.stroke()\n\n if (isMajor && px !== 0) {\n ctx.save()\n ctx.fillStyle = colors.label\n ctx.font = '9px system-ui, -apple-system, sans-serif'\n ctx.textAlign = 'center'\n ctx.translate(9, y)\n ctx.rotate(-Math.PI / 2)\n ctx.fillText(String(px), 0, 0)\n ctx.restore()\n }\n }\n }, [scrollOffset.y, viewportHeight, colors])\n\n return (\n <div\n data-direct-edit=\"ruler-vertical\"\n style={{\n position: 'fixed',\n top: RULER_SIZE,\n left: 0,\n bottom: 0,\n width: RULER_SIZE,\n background: colors.bg,\n borderRight: `1px solid ${colors.border}`,\n zIndex: 99994,\n cursor: 'e-resize',\n pointerEvents: 'auto',\n overflow: 'hidden',\n }}\n onPointerDown={onPointerDown}\n >\n <canvas ref={canvasRef} style={{ display: 'block' }} />\n </div>\n )\n}\n\n// --- CornerSquare ---\n\nfunction CornerSquare() {\n const colors = useRulerColors()\n return (\n <div\n data-direct-edit=\"ruler-corner\"\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n width: RULER_SIZE,\n height: RULER_SIZE,\n background: colors.bg,\n borderRight: `1px solid ${colors.border}`,\n borderBottom: `1px solid ${colors.border}`,\n zIndex: 99994,\n pointerEvents: 'auto',\n }}\n />\n )\n}\n\n// --- GuidelineLine ---\n\nfunction GuidelineLine({\n guideline,\n scrollOffset,\n isActive,\n dragPosition,\n onStartDrag,\n onDelete,\n}: {\n guideline: Guideline\n scrollOffset: { x: number; y: number }\n isActive: boolean\n dragPosition: number | null\n onStartDrag: (id: string) => void\n onDelete: (id: string) => void\n}) {\n const isHorizontal = guideline.orientation === 'horizontal'\n const scrollPos = isHorizontal ? scrollOffset.y : scrollOffset.x\n const viewportPos = guideline.position - scrollPos\n\n const handlePointerDown = (e: React.PointerEvent) => {\n e.preventDefault()\n e.stopPropagation()\n onStartDrag(guideline.id)\n }\n\n const handleDoubleClick = (e: React.MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n onDelete(guideline.id)\n }\n\n const displayPos = isActive && dragPosition !== null ? dragPosition : viewportPos\n\n if (isHorizontal) {\n return (\n <>\n {/* Visible line */}\n <div\n data-direct-edit=\"guideline\"\n style={{\n position: 'fixed',\n top: displayPos,\n left: 0,\n right: 0,\n height: 1,\n background: GUIDELINE_COLOR,\n zIndex: 99993,\n pointerEvents: 'none',\n }}\n />\n {/* Hit zone */}\n <div\n style={{\n position: 'fixed',\n top: displayPos - Math.floor(HIT_ZONE / 2),\n left: RULER_SIZE,\n right: 0,\n height: HIT_ZONE,\n zIndex: 99993,\n cursor: 'ns-resize',\n pointerEvents: 'auto',\n }}\n onPointerDown={handlePointerDown}\n onDoubleClick={handleDoubleClick}\n />\n {/* Position label during drag */}\n {isActive && (\n <div\n style={{\n position: 'fixed',\n top: displayPos + 4,\n left: RULER_SIZE + 4,\n background: GUIDELINE_COLOR,\n color: '#fff',\n padding: '1px 4px',\n borderRadius: 2,\n zIndex: 99995,\n pointerEvents: 'none',\n ...rulerFont,\n }}\n >\n {Math.round(guideline.position)}\n </div>\n )}\n </>\n )\n }\n\n // Vertical guideline\n return (\n <>\n <div\n data-direct-edit=\"guideline\"\n style={{\n position: 'fixed',\n left: displayPos,\n top: 0,\n bottom: 0,\n width: 1,\n background: GUIDELINE_COLOR,\n zIndex: 99993,\n pointerEvents: 'none',\n }}\n />\n <div\n style={{\n position: 'fixed',\n left: displayPos - Math.floor(HIT_ZONE / 2),\n top: RULER_SIZE,\n bottom: 0,\n width: HIT_ZONE,\n zIndex: 99993,\n cursor: 'ew-resize',\n pointerEvents: 'auto',\n }}\n onPointerDown={handlePointerDown}\n onDoubleClick={handleDoubleClick}\n />\n {isActive && (\n <div\n style={{\n position: 'fixed',\n left: displayPos + 4,\n top: RULER_SIZE + 4,\n background: GUIDELINE_COLOR,\n color: '#fff',\n padding: '1px 4px',\n borderRadius: 2,\n zIndex: 99995,\n pointerEvents: 'none',\n ...rulerFont,\n }}\n >\n {Math.round(guideline.position)}\n </div>\n )}\n </>\n )\n}\n\n// --- Viewport size hooks ---\n\nfunction useViewportWidth() {\n const [width, setWidth] = React.useState(0)\n React.useEffect(() => {\n setWidth(window.innerWidth)\n const onResize = () => setWidth(window.innerWidth)\n window.addEventListener('resize', onResize)\n return () => window.removeEventListener('resize', onResize)\n }, [])\n return width\n}\n\nfunction useViewportHeight() {\n const [height, setHeight] = React.useState(0)\n React.useEffect(() => {\n setHeight(window.innerHeight)\n const onResize = () => setHeight(window.innerHeight)\n window.addEventListener('resize', onResize)\n return () => window.removeEventListener('resize', onResize)\n }, [])\n return height\n}\n\n// --- Public Components ---\n\nexport function RulersOverlay({ enabled }: { enabled: boolean }) {\n const container = usePortalContainer()\n\n const hostElement = React.useMemo(() => {\n if (!container) return null\n const root = container.getRootNode()\n if (root instanceof ShadowRoot) return root.host as HTMLElement\n return null\n }, [container])\n\n const {\n guidelines,\n activeGuideline,\n dragPosition,\n scrollOffset,\n startCreate,\n startDrag,\n deleteGuideline,\n } = useGuidelines(enabled, hostElement)\n\n if (!enabled || !container) return null\n\n const handleHorizontalPointerDown = (e: React.PointerEvent) => {\n e.preventDefault()\n startCreate('horizontal', e.clientY)\n }\n\n const handleVerticalPointerDown = (e: React.PointerEvent) => {\n e.preventDefault()\n startCreate('vertical', e.clientX)\n }\n\n return createPortal(\n <>\n <CornerSquare />\n <HorizontalRuler scrollOffset={scrollOffset} onPointerDown={handleHorizontalPointerDown} />\n <VerticalRuler scrollOffset={scrollOffset} onPointerDown={handleVerticalPointerDown} />\n {guidelines.map((g) => (\n <GuidelineLine\n key={g.id}\n guideline={g}\n scrollOffset={scrollOffset}\n isActive={activeGuideline?.id === g.id}\n dragPosition={activeGuideline?.id === g.id ? dragPosition : null}\n onStartDrag={startDrag}\n onDelete={deleteGuideline}\n />\n ))}\n </>,\n container,\n )\n}\n\nconst RULERS_VISIBLE_KEY = 'direct-edit-rulers-visible'\nconst RULERS_TOGGLE_EVENT = 'direct-edit-rulers-toggle'\n\nexport function useRulersVisible(): [boolean, () => void] {\n const [visible, setVisible] = React.useState(true)\n\n React.useEffect(() => {\n try {\n if (localStorage.getItem(RULERS_VISIBLE_KEY) === 'false') setVisible(false)\n } catch { /* ignore */ }\n }, [])\n\n React.useEffect(() => {\n function handler(e: Event) {\n setVisible((e as CustomEvent<boolean>).detail)\n }\n window.addEventListener(RULERS_TOGGLE_EVENT, handler)\n return () => window.removeEventListener(RULERS_TOGGLE_EVENT, handler)\n }, [])\n\n const toggle = React.useCallback(() => {\n setVisible((prev) => {\n const next = !prev\n try { localStorage.setItem(RULERS_VISIBLE_KEY, String(next)) } catch {}\n window.dispatchEvent(new CustomEvent(RULERS_TOGGLE_EVENT, { detail: next }))\n return next\n })\n }, [])\n\n return [visible, toggle]\n}\n\nexport function Rulers() {\n const { editModeActive } = useDirectEdit()\n const [rulersVisible, toggleRulers] = useRulersVisible()\n\n React.useEffect(() => {\n if (!editModeActive) return\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.shiftKey && e.key === 'R' && !e.metaKey && !e.ctrlKey && !e.altKey) {\n const active = document.activeElement\n const isInput = active instanceof HTMLInputElement || active instanceof HTMLTextAreaElement || (active instanceof HTMLElement && active.isContentEditable)\n if (isInput) return\n e.preventDefault()\n toggleRulers()\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [editModeActive, toggleRulers])\n\n return <RulersOverlay enabled={editModeActive && rulersVisible} />\n}\n","import * as React from 'react'\n\nexport type DockedEdge = 'top' | 'bottom' | 'left' | 'right'\n\nconst STORAGE_KEY = 'direct-edit-toolbar-dock'\nconst EDGE_MARGIN = 16\nconst DRAG_THRESHOLD = 3\n\nfunction getInitialEdge(): DockedEdge {\n if (typeof window === 'undefined') return 'bottom'\n try {\n const stored = localStorage.getItem(STORAGE_KEY)\n if (stored === 'top' || stored === 'bottom' || stored === 'left' || stored === 'right') {\n return stored\n }\n } catch {}\n return 'bottom'\n}\n\nfunction getDockedPosition(edge: DockedEdge, width: number, height: number) {\n const vw = window.innerWidth\n const vh = window.innerHeight\n\n switch (edge) {\n case 'bottom':\n return { x: (vw - width) / 2, y: vh - height - EDGE_MARGIN }\n case 'top':\n return { x: (vw - width) / 2, y: EDGE_MARGIN }\n case 'left':\n return { x: EDGE_MARGIN, y: (vh - height) / 2 }\n case 'right':\n return { x: vw - width - EDGE_MARGIN, y: (vh - height) / 2 }\n }\n}\n\nfunction getNearestEdge(centerX: number, centerY: number): DockedEdge {\n const vw = window.innerWidth\n const vh = window.innerHeight\n\n const distances: Record<DockedEdge, number> = {\n top: centerY,\n bottom: vh - centerY,\n left: centerX,\n right: vw - centerX,\n }\n\n let nearest: DockedEdge = 'bottom'\n let min = Infinity\n for (const [edge, dist] of Object.entries(distances) as [DockedEdge, number][]) {\n if (dist < min) {\n min = dist\n nearest = edge\n }\n }\n return nearest\n}\n\ntype Phase = 'docked' | 'dragging' | 'snapping'\n\nexport function useToolbarDock(toolbarRef: React.RefObject<HTMLDivElement | null>) {\n const [dockedEdge, setDockedEdge] = React.useState<DockedEdge>(getInitialEdge)\n const [phase, setPhase] = React.useState<Phase>('docked')\n const [dragPosition, setDragPosition] = React.useState<{ x: number; y: number } | null>(null)\n\n const dragOffsetRef = React.useRef({ x: 0, y: 0 })\n const pointerStartRef = React.useRef({ x: 0, y: 0 })\n const pendingDragRef = React.useRef(false)\n const capturedElementRef = React.useRef<HTMLElement | null>(null)\n const snapTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // Compute docked position based on current edge and toolbar size\n const getDockedPos = React.useCallback(() => {\n const el = toolbarRef.current\n if (!el) return { x: 0, y: 0 }\n const rect = el.getBoundingClientRect()\n return getDockedPosition(dockedEdge, rect.width, rect.height)\n }, [dockedEdge, toolbarRef])\n\n // Docked pixel position (recalculated on edge change / resize)\n const [dockedPos, setDockedPos] = React.useState<{ x: number; y: number }>({ x: 0, y: 0 })\n const [ready, setReady] = React.useState(false)\n\n // Initialize docked position once toolbar mounts\n React.useEffect(() => {\n const el = toolbarRef.current\n if (!el) return\n // Wait one frame so the element has layout\n const raf = requestAnimationFrame(() => {\n setDockedPos(getDockedPos())\n setReady(true)\n })\n return () => cancelAnimationFrame(raf)\n }, [getDockedPos, toolbarRef])\n\n // Resize observer + window resize to recalculate docked position\n React.useEffect(() => {\n const el = toolbarRef.current\n if (!el) return\n\n function recalc() {\n const rect = el!.getBoundingClientRect()\n setDockedPos(getDockedPosition(dockedEdge, rect.width, rect.height))\n }\n\n const ro = new ResizeObserver(recalc)\n ro.observe(el)\n window.addEventListener('resize', recalc)\n\n return () => {\n ro.disconnect()\n window.removeEventListener('resize', recalc)\n }\n }, [dockedEdge, toolbarRef])\n\n const handlePointerDown = React.useCallback((e: React.PointerEvent) => {\n const el = toolbarRef.current\n if (!el) return\n\n const rect = el.getBoundingClientRect()\n dragOffsetRef.current = { x: e.clientX - rect.left, y: e.clientY - rect.top }\n pointerStartRef.current = { x: e.clientX, y: e.clientY }\n pendingDragRef.current = true\n capturedElementRef.current = e.currentTarget as HTMLElement\n capturedElementRef.current.setPointerCapture(e.pointerId)\n }, [toolbarRef])\n\n const handlePointerMove = React.useCallback((e: React.PointerEvent) => {\n if (!pendingDragRef.current && phase !== 'dragging') return\n\n const dx = e.clientX - pointerStartRef.current.x\n const dy = e.clientY - pointerStartRef.current.y\n\n // Threshold check\n if (pendingDragRef.current) {\n if (Math.sqrt(dx * dx + dy * dy) < DRAG_THRESHOLD) return\n if (snapTimerRef.current) {\n clearTimeout(snapTimerRef.current)\n snapTimerRef.current = null\n }\n pendingDragRef.current = false\n setPhase('dragging')\n }\n\n const newX = Math.max(0, e.clientX - dragOffsetRef.current.x)\n const newY = Math.max(0, e.clientY - dragOffsetRef.current.y)\n setDragPosition({ x: newX, y: newY })\n }, [phase])\n\n const handlePointerUp = React.useCallback((e: React.PointerEvent) => {\n if (capturedElementRef.current) {\n capturedElementRef.current.releasePointerCapture(e.pointerId)\n capturedElementRef.current = null\n }\n\n if (pendingDragRef.current) {\n // Never exceeded threshold — treat as click\n pendingDragRef.current = false\n return\n }\n\n if (phase !== 'dragging') return\n\n const el = toolbarRef.current\n if (!el) {\n setPhase('docked')\n setDragPosition(null)\n return\n }\n\n const rect = el.getBoundingClientRect()\n const centerX = rect.left + rect.width / 2\n const centerY = rect.top + rect.height / 2\n const newEdge = getNearestEdge(centerX, centerY)\n\n setDockedEdge(newEdge)\n try {\n localStorage.setItem(STORAGE_KEY, newEdge)\n } catch {}\n\n // Compute new docked position using the new edge\n const newPos = getDockedPosition(newEdge, rect.width, rect.height)\n setDockedPos(newPos)\n setPhase('snapping')\n setDragPosition(null)\n\n // After snap animation, settle to docked phase\n if (snapTimerRef.current) clearTimeout(snapTimerRef.current)\n snapTimerRef.current = setTimeout(() => {\n snapTimerRef.current = null\n setPhase('docked')\n }, 350)\n }, [phase, toolbarRef])\n\n const handlePointerCancel = React.useCallback((e: React.PointerEvent) => {\n if (capturedElementRef.current) {\n try {\n capturedElementRef.current.releasePointerCapture(e.pointerId)\n } catch {}\n capturedElementRef.current = null\n }\n pendingDragRef.current = false\n if (phase === 'dragging') {\n setPhase('docked')\n setDragPosition(null)\n }\n }, [phase])\n\n // Clean up snap timer on unmount\n React.useEffect(() => {\n return () => {\n if (snapTimerRef.current) clearTimeout(snapTimerRef.current)\n }\n }, [])\n\n const isDragging = phase === 'dragging'\n const isSnapping = phase === 'snapping'\n\n const style = React.useMemo((): React.CSSProperties => {\n const base: React.CSSProperties = {\n position: 'fixed',\n ...(!ready && { visibility: 'hidden' as const }),\n }\n\n if (phase === 'dragging' && dragPosition) {\n return {\n ...base,\n left: dragPosition.x,\n top: dragPosition.y,\n transform: 'rotate(1.5deg) scale(1.04)',\n transition: 'transform 150ms ease-out, box-shadow 150ms ease-out',\n willChange: 'left, top, transform',\n }\n }\n\n if (phase === 'snapping') {\n const snap = '300ms cubic-bezier(0.34, 1.56, 0.64, 1)'\n return {\n ...base,\n left: dockedPos.x,\n top: dockedPos.y,\n transition: `left ${snap}, top ${snap}, transform 150ms ease-out, box-shadow 150ms ease-out`,\n }\n }\n\n // docked\n return {\n ...base,\n left: dockedPos.x,\n top: dockedPos.y,\n }\n }, [phase, dragPosition, dockedPos, ready])\n\n return {\n dockedEdge,\n isDragging,\n isSnapping,\n style,\n handlePointerDown,\n handlePointerMove,\n handlePointerUp,\n handlePointerCancel,\n }\n}\n","import { DirectEditProvider } from './provider'\nimport { DirectEditPanel } from './panel'\nimport { DirectEditToolbar } from './toolbar'\nimport { Rulers } from './rulers-overlay'\n\nexport function DirectEdit() {\n return (\n <DirectEditProvider>\n <DirectEditPanel />\n <DirectEditToolbar />\n <Rulers />\n </DirectEditProvider>\n )\n}\n","'use client'\n\nimport * as React from 'react'\nimport { DirectEditPanelInner } from './panel'\nimport { DirectEditToolbarInner } from './toolbar'\nimport { buildEditExport, stylesToTailwind, colorPropertyToCSSMap, borderPropertyToCSSMap } from './utils'\nimport { formatColorValue } from './ui/color-utils'\nimport type { SpacingPropertyKey, BorderRadiusPropertyKey, BorderPropertyKey, BorderProperties, SizingPropertyKey, ColorPropertyKey, ColorValue, TypographyPropertyKey, CSSPropertyValue, SizingValue, TypographyProperties, ElementLocator } from './types'\n\nfunction createValue(num: number, unit: 'px' | 'rem' | '%' | 'em' | '' = 'px'): CSSPropertyValue {\n return { numericValue: num, unit, raw: `${num}${unit}` }\n}\n\nfunction camelToKebab(str: string): string {\n return str.replace(/([A-Z])/g, '-$1').toLowerCase()\n}\n\nconst ELEMENT_INFO = {\n tagName: 'div',\n id: 'demo-element',\n classList: ['flex', 'shrink-0', 'items-center', 'gap-4', 'p-4', 'rounded-lg', 'border', 'bg-background'],\n isFlexContainer: true,\n isFlexItem: true,\n isTextElement: true,\n parentElement: null as HTMLElement | null,\n hasChildren: true,\n}\n\nconst DEMO_LOCATOR: ElementLocator = {\n reactStack: [{ name: 'DirectEditDemo' }],\n domSelector: '#demo-element',\n domContextHtml: '<div id=\"demo-element\" data-direct-edit-target=\"true\"></div>',\n targetHtml: '<div id=\"demo-element\"></div>',\n textPreview: 'Demo element',\n tagName: ELEMENT_INFO.tagName,\n id: ELEMENT_INFO.id,\n classList: ELEMENT_INFO.classList,\n}\n\nexport function DirectEditDemo() {\n const [spacing, setSpacing] = React.useState({\n paddingTop: createValue(16),\n paddingRight: createValue(16),\n paddingBottom: createValue(16),\n paddingLeft: createValue(16),\n marginTop: createValue(0),\n marginRight: createValue(0),\n marginBottom: createValue(0),\n marginLeft: createValue(0),\n gap: createValue(16),\n })\n\n const [borderRadius, setBorderRadius] = React.useState({\n borderTopLeftRadius: createValue(8),\n borderTopRightRadius: createValue(8),\n borderBottomRightRadius: createValue(8),\n borderBottomLeftRadius: createValue(8),\n })\n\n const [border, setBorder] = React.useState<BorderProperties>({\n borderTopStyle: 'solid',\n borderTopWidth: createValue(1),\n borderRightStyle: 'solid',\n borderRightWidth: createValue(1),\n borderBottomStyle: 'solid',\n borderBottomWidth: createValue(1),\n borderLeftStyle: 'solid',\n borderLeftWidth: createValue(1),\n })\n\n const [flex, setFlex] = React.useState({\n display: 'flex',\n flexDirection: 'row' as const,\n justifyContent: 'flex-start',\n alignItems: 'center',\n })\n\n const [sizing, setSizing] = React.useState({\n width: { mode: 'fit' as const, value: createValue(300) },\n height: { mode: 'fit' as const, value: createValue(100) },\n })\n\n const [color, setColor] = React.useState({\n backgroundColor: { hex: 'FFFFFF', alpha: 100, raw: 'rgb(255, 255, 255)' } as ColorValue,\n color: { hex: '000000', alpha: 100, raw: 'rgb(0, 0, 0)' } as ColorValue,\n borderColor: { hex: 'DDDDDD', alpha: 100, raw: 'rgb(221, 221, 221)' } as ColorValue,\n outlineColor: { hex: '000000', alpha: 0, raw: 'transparent' } as ColorValue,\n })\n\n const [typography, setTypography] = React.useState<TypographyProperties>({\n fontFamily: 'system-ui, sans-serif',\n fontWeight: '400',\n fontSize: createValue(16),\n lineHeight: createValue(24),\n letterSpacing: createValue(0, 'em'),\n textAlign: 'left',\n textVerticalAlign: 'flex-start',\n })\n\n const [pendingStyles, setPendingStyles] = React.useState<Record<string, string>>({})\n const [editModeActive, setEditModeActive] = React.useState(false)\n\n const handleUpdateSpacing = (key: SpacingPropertyKey, value: CSSPropertyValue) => {\n setSpacing((prev) => ({ ...prev, [key]: value }))\n setPendingStyles((prev) => ({ ...prev, [camelToKebab(key)]: value.raw }))\n }\n\n const handleUpdateBorderRadius = (key: BorderRadiusPropertyKey, value: CSSPropertyValue) => {\n setBorderRadius((prev) => ({ ...prev, [key]: value }))\n setPendingStyles((prev) => ({ ...prev, [camelToKebab(key)]: value.raw }))\n }\n\n const handleUpdateBorder = (key: BorderPropertyKey, value: BorderProperties[BorderPropertyKey]) => {\n setBorder((prev) => ({ ...prev, [key]: value }))\n const cssProperty = borderPropertyToCSSMap[key]\n const cssValue = typeof value === 'string' ? value : value.raw\n setPendingStyles((prev) => ({ ...prev, [cssProperty]: cssValue }))\n }\n\n const handleBatchUpdateBorder = (changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]>) => {\n for (const [key, value] of changes) {\n handleUpdateBorder(key, value)\n }\n }\n\n const handleUpdateFlex = (key: 'flexDirection' | 'justifyContent' | 'alignItems', value: string) => {\n setFlex((prev) => ({ ...prev, [key]: value }))\n setPendingStyles((prev) => ({ ...prev, [camelToKebab(key)]: value }))\n }\n\n const handleUpdateSizing = (key: SizingPropertyKey, value: SizingValue) => {\n setSizing((prev) => ({ ...prev, [key]: value }))\n const cssValue = value.mode === 'fill' ? '100%' : value.mode === 'fit' ? 'fit-content' : value.value.raw\n setPendingStyles((prev) => ({ ...prev, [key]: cssValue }))\n }\n\n const handleUpdateColor = (key: ColorPropertyKey, value: ColorValue) => {\n setColor((prev) => ({ ...prev, [key]: value }))\n const cssProperty = colorPropertyToCSSMap[key]\n setPendingStyles((prev) => ({ ...prev, [cssProperty]: formatColorValue(value) }))\n }\n\n const handleUpdateTypography = (key: TypographyPropertyKey, value: CSSPropertyValue | string) => {\n setTypography((prev) => ({ ...prev, [key]: value }))\n const cssValue = typeof value === 'string' ? value : value.raw\n setPendingStyles((prev) => ({ ...prev, [camelToKebab(key)]: cssValue }))\n }\n\n const handleReset = () => {\n setSpacing({\n paddingTop: createValue(16),\n paddingRight: createValue(16),\n paddingBottom: createValue(16),\n paddingLeft: createValue(16),\n marginTop: createValue(0),\n marginRight: createValue(0),\n marginBottom: createValue(0),\n marginLeft: createValue(0),\n gap: createValue(16),\n })\n setBorderRadius({\n borderTopLeftRadius: createValue(8),\n borderTopRightRadius: createValue(8),\n borderBottomRightRadius: createValue(8),\n borderBottomLeftRadius: createValue(8),\n })\n setBorder({\n borderTopStyle: 'solid',\n borderTopWidth: createValue(1),\n borderRightStyle: 'solid',\n borderRightWidth: createValue(1),\n borderBottomStyle: 'solid',\n borderBottomWidth: createValue(1),\n borderLeftStyle: 'solid',\n borderLeftWidth: createValue(1),\n })\n setFlex({\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'flex-start',\n alignItems: 'center',\n })\n setSizing({\n width: { mode: 'fit', value: createValue(300) },\n height: { mode: 'fit', value: createValue(100) },\n })\n setColor({\n backgroundColor: { hex: 'FFFFFF', alpha: 100, raw: 'rgb(255, 255, 255)' },\n color: { hex: '000000', alpha: 100, raw: 'rgb(0, 0, 0)' },\n borderColor: { hex: 'DDDDDD', alpha: 100, raw: 'rgb(221, 221, 221)' },\n outlineColor: { hex: '000000', alpha: 0, raw: 'transparent' },\n })\n setTypography({\n fontFamily: 'system-ui, sans-serif',\n fontWeight: '400',\n fontSize: createValue(16),\n lineHeight: createValue(24),\n letterSpacing: createValue(0, 'em'),\n textAlign: 'left',\n textVerticalAlign: 'flex-start',\n })\n setPendingStyles({})\n }\n\n const handleExportEdits = async () => {\n if (Object.keys(pendingStyles).length === 0) return false\n const exportMarkdown = buildEditExport(DEMO_LOCATOR, pendingStyles)\n try {\n await navigator.clipboard.writeText(exportMarkdown)\n return true\n } catch {\n return false\n }\n }\n\n return (\n <div className=\"min-h-screen p-8\">\n <div className=\"mx-auto max-w-4xl\">\n <h1 className=\"mb-2 text-2xl font-bold\">Direct Edit Panel</h1>\n <p className=\"mb-8 text-muted-foreground\">\n Interactive showcase of the visual editing panel UI with mock data.\n </p>\n\n <div className=\"mb-8 flex justify-center\">\n <DirectEditToolbarInner\n editModeActive={editModeActive}\n onToggleEditMode={() => setEditModeActive(!editModeActive)}\n rulersVisible={true}\n onToggleRulers={() => {}}\n />\n </div>\n\n <div className=\"grid gap-8 lg:grid-cols-[300px_1fr]\">\n <DirectEditPanelInner\n elementInfo={ELEMENT_INFO}\n computedSpacing={spacing}\n computedBorderRadius={borderRadius}\n computedBorder={border}\n computedFlex={flex}\n computedSizing={sizing}\n computedColor={color}\n computedTypography={typography}\n pendingStyles={pendingStyles}\n onSelectParent={() => {}}\n onUpdateSpacing={handleUpdateSpacing}\n onUpdateBorderRadius={handleUpdateBorderRadius}\n onUpdateBorder={handleUpdateBorder}\n onBatchUpdateBorder={handleBatchUpdateBorder}\n onUpdateFlex={handleUpdateFlex}\n onToggleFlex={() => {}}\n onUpdateSizing={handleUpdateSizing}\n onUpdateColor={handleUpdateColor}\n onUpdateTypography={handleUpdateTypography}\n onReset={handleReset}\n onExportEdits={handleExportEdits}\n onSendToAgent={async () => false}\n />\n\n <div className=\"space-y-6\">\n <div>\n <h2 className=\"mb-3 text-sm font-medium\">Live Preview</h2>\n <div\n className=\"bg-background border flex\"\n style={{\n padding: `${spacing.paddingTop.raw} ${spacing.paddingRight.raw} ${spacing.paddingBottom.raw} ${spacing.paddingLeft.raw}`,\n borderRadius: `${borderRadius.borderTopLeftRadius.raw} ${borderRadius.borderTopRightRadius.raw} ${borderRadius.borderBottomRightRadius.raw} ${borderRadius.borderBottomLeftRadius.raw}`,\n borderTopStyle: border.borderTopStyle,\n borderTopWidth: border.borderTopWidth.raw,\n borderRightStyle: border.borderRightStyle,\n borderRightWidth: border.borderRightWidth.raw,\n borderBottomStyle: border.borderBottomStyle,\n borderBottomWidth: border.borderBottomWidth.raw,\n borderLeftStyle: border.borderLeftStyle,\n borderLeftWidth: border.borderLeftWidth.raw,\n borderColor: `#${color.borderColor.hex}`,\n gap: spacing.gap.raw,\n flexDirection: flex.flexDirection,\n justifyContent: flex.justifyContent,\n alignItems: flex.alignItems,\n }}\n >\n <div className=\"size-12 rounded bg-blue-500/20 border border-blue-500/30\" />\n <div className=\"size-12 rounded bg-green-500/20 border border-green-500/30\" />\n <div className=\"size-12 rounded bg-purple-500/20 border border-purple-500/30\" />\n </div>\n </div>\n\n <div>\n <h2 className=\"mb-3 text-sm font-medium\">Pending Styles</h2>\n <pre className=\"rounded-lg border bg-background p-4 text-xs min-h-[60px]\">\n {Object.keys(pendingStyles).length > 0\n ? JSON.stringify(pendingStyles, null, 2)\n : '// Make changes to see pending styles'}\n </pre>\n </div>\n\n <div>\n <h2 className=\"mb-3 text-sm font-medium\">Tailwind Classes</h2>\n <code className=\"block rounded-lg border bg-background p-4 text-xs min-h-[40px]\">\n {Object.keys(pendingStyles).length > 0\n ? stylesToTailwind(pendingStyles)\n : '// Tailwind classes will appear here'}\n </code>\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n}\n"],"mappings":"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","names":["React","isFlexContainer","containerRect","token","jsx","sendEditToAgent","sendCommentToAgent","active","React","React","jsx","React","jsx","React","jsx","jsx","React","jsx","jsxs","React","jsx","jsxs","React","React","jsx","jsxs","React","React","jsx","BLUE","React","jsx","jsxs","BLUE","React","Fragment","jsx","jsxs","X","Copy","Check","ArrowUp","Send","Fragment","jsx","jsxs","STORAGE_KEY","sendEditToAgent","sendCommentToAgent","React","createPortal","React","createPortal","Fragment","jsx","jsxs","RULER_SIZE","createPortal","React","STORAGE_KEY","DRAG_THRESHOLD","Popover","X","Check","Copy","Fragment","jsx","jsxs","Popover","handlePointerDown","X","Check","Copy","createPortal","jsx","jsxs","React","jsx","jsxs"]}