made-refine 0.1.7 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../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":["'use client'\n\nexport { DirectEdit } from './direct-edit'\nexport { DirectEditDemo } from './demo'\n\nexport { DirectEditProvider } from './provider'\nexport type { DirectEditContextValue } from './provider'\nexport { DirectEditPanel, DirectEditPanelInner } from './panel'\nexport type { DirectEditPanelInnerProps } from './panel'\nexport { DirectEditToolbar, DirectEditToolbarInner } from './toolbar'\nexport type { DirectEditToolbarInnerProps } from './toolbar'\nexport { useDirectEdit } from './hooks'\nexport { useMeasurement } from './use-measurement'\nexport type { UseMeasurementResult } from './use-measurement'\nexport { MeasurementOverlay } from './measurement-overlay'\nexport type { MeasurementOverlayProps } from './measurement-overlay'\nexport { useMove } from './use-move'\nexport type { UseMoveOptions, UseMoveDropTarget, UseMoveResult, MoveInfo } from './use-move'\nexport { SelectionOverlay } from './selection-overlay'\nexport type { SelectionOverlayProps } from './selection-overlay'\nexport { MoveOverlay } from './move-overlay'\nexport type { MoveOverlayProps } from './move-overlay'\nexport { Rulers, RulersOverlay, useRulersVisible } from './rulers-overlay'\nexport { useGuidelines, getStoredGuidelines } from './use-guidelines'\nexport type { UseGuidelinesResult } from './use-guidelines'\nexport { CommentOverlay } from './comment-overlay'\nexport type { CommentOverlayProps } from './comment-overlay'\n\nexport type {\n ElementInfo,\n CSSPropertyValue,\n SpacingProperties,\n BorderRadiusProperties,\n BorderProperties,\n FlexProperties,\n DirectEditState,\n SpacingPropertyKey,\n BorderRadiusPropertyKey,\n BorderStyle,\n BorderPropertyKey,\n FlexPropertyKey,\n SizingMode,\n SizingValue,\n SizingProperties,\n SizingPropertyKey,\n TypographyProperties,\n TypographyPropertyKey,\n MeasurementLine,\n MeasurementState,\n ColorValue,\n ColorProperties,\n ColorPropertyKey,\n ReactComponentFrame,\n ElementLocator,\n DomSourceLocation,\n DragState,\n DropTarget,\n DropIndicator,\n UndoEntry,\n UndoEditEntry,\n UndoSelectionEntry,\n UndoMoveEntry,\n Guideline,\n ActiveTool,\n Theme,\n Comment,\n CommentReply,\n SessionEdit,\n} from './types'\n\nexport {\n parsePropertyValue,\n formatPropertyValue,\n getComputedStyles,\n getComputedBorderStyles,\n stylesToTailwind,\n getElementInfo,\n getDimensionDisplay,\n calculateParentMeasurements,\n calculateElementMeasurements,\n parseColorValue,\n getComputedColorStyles,\n colorToTailwind,\n getElementLocator,\n isFlexContainer,\n getFlexDirection,\n findContainerAtPoint,\n calculateDropPosition,\n elementFromPointWithoutOverlays,\n calculateGuidelineMeasurements,\n buildCommentExport,\n buildSessionExport,\n} from './utils'\n\nexport { formatColorValue } from './ui/color-utils'\n","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 updateRawCSS: (properties: Record<string, string>) => 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 updateRawCSS = React.useCallback(\n (properties: Record<string, string>) => {\n if (!state.selectedElement || Object.keys(properties).length === 0) return\n\n const undoProperties: Array<{ cssProperty: string; previousValue: string | null }> = []\n const pendingUpdates: Record<string, string> = {}\n\n for (const [cssProperty, cssValue] of Object.entries(properties)) {\n const previousValue = state.selectedElement.style.getPropertyValue(cssProperty) || null\n undoProperties.push({ cssProperty, previousValue })\n state.selectedElement.style.setProperty(cssProperty, cssValue)\n pendingUpdates[cssProperty] = cssValue\n }\n\n pushUndo({ type: 'edit', element: state.selectedElement, properties: undoProperties })\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 'outline-style',\n 'outline-width',\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 updateRawCSS,\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 updateRawCSS,\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;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@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-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-700:oklch(37.3% .034 259.733);--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);--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-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-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}.contents{display:contents}.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-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-11{width:calc(var(--spacing)*11)}.w-14{width:calc(var(--spacing)*14)}.w-\\[1\\.5px\\]{width:1.5px}.w-\\[60px\\]{width:60px}.w-\\[68px\\]{width:68px}.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%}.w-px{width:1px}.max-w-0{max-width:calc(var(--spacing)*0)}.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}.origin-\\(--transform-origin\\){transform-origin:var(--transform-origin)}.-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-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-\\[canvas\\]{background-color:canvas}.bg-background{background-color:var(--color-background)}.bg-background\\/85{background-color:#ffffffd9}@supports (color:color-mix(in lab, red, red)){.bg-background\\/85{background-color:color-mix(in oklab,var(--color-background)85%,transparent)}}.bg-blue-500{background-color:var(--color-blue-500)}.bg-border{background-color:var(--color-border)}.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-gray-200{background-color:var(--color-gray-200)}.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-primary{background-color:var(--color-primary)}.bg-transparent{background-color:#0000}.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-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\\.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-3{padding-left:calc(var(--spacing)*3)}.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-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-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-gray-500{color:var(--color-gray-500)}.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)}.shadow-gray-200{--tw-shadow-color:oklch(92.8% .006 264.531)}@supports (color:color-mix(in lab, red, red)){.shadow-gray-200{--tw-shadow-color:color-mix(in oklab,var(--color-gray-200)var(--tw-shadow-alpha),transparent)}}.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)}}.outline-gray-200{outline-color:var(--color-gray-200)}.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-\\[transform\\,scale\\,opacity\\]{transition-property:transform,scale,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-dashed{--tw-outline-style:dashed;outline-style:dashed}.outline-dotted{--tw-outline-style:dotted;outline-style:dotted}.outline-double{--tw-outline-style:double;outline-style:double}.outline-none{--tw-outline-style:none;outline-style:none}.outline-solid{--tw-outline-style:solid;outline-style:solid}.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\\: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-ending-style\\:scale-90[data-ending-style]{--tw-scale-x:90%;--tw-scale-y:90%;--tw-scale-z:90%;scale:var(--tw-scale-x)var(--tw-scale-y)}.data-ending-style\\:opacity-0[data-ending-style]{opacity:0}.data-instant\\:transition-none[data-instant]{transition-property:none}.data-starting-style\\:scale-90[data-starting-style]{--tw-scale-x:90%;--tw-scale-y:90%;--tw-scale-z:90%;scale:var(--tw-scale-x)var(--tw-scale-y)}.data-starting-style\\:opacity-0[data-starting-style]{opacity:0}.data-\\[highlighted\\]\\:bg-muted[data-highlighted]{background-color:var(--color-muted)}.data-\\[highlighted\\]\\:text-foreground[data-highlighted]{color:var(--color-foreground)}@media (prefers-color-scheme:dark){.dark\\:bg-gray-700{background-color:var(--color-gray-700)}.dark\\:text-gray-400{color:var(--color-gray-400)}.dark\\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark\\:-outline-offset-1{outline-offset:calc(1px*-1)}.dark\\:outline-gray-300{outline-color:var(--color-gray-300)}}.\\[\\&_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}}.lucide{stroke-width:1px}@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}@property --tw-scale-x{syntax:\"*\";inherits:false;initial-value:1}@property --tw-scale-y{syntax:\"*\";inherits:false;initial-value:1}@property --tw-scale-z{syntax:\"*\";inherits:false;initial-value:1}@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 TooltipContent,\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\nfunction Tip({ children, label, side = 'top' }: { children: React.ReactElement; label: React.ReactNode; side?: 'top' | 'bottom' | 'left' | 'right' }) {\n return (\n <Tooltip>\n <TooltipTrigger render={children} />\n <TooltipContent side={side}>{label}</TooltipContent>\n </Tooltip>\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 <Tip label=\"Left\">\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 />\n </div>\n </Tip>\n <Tip label=\"Top\">\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 />\n </div>\n </Tip>\n <Tip label=\"Combined mode\">\n <Button\n variant=\"secondary\"\n size=\"icon\"\n className=\"size-7 shrink-0\"\n onClick={() => setIndividual(false)}\n >\n <Columns2 className=\"size-3.5\" />\n </Button>\n </Tip>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Tip label=\"Right\">\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 />\n </div>\n </Tip>\n <Tip label=\"Bottom\">\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 />\n </div>\n </Tip>\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 <Tip label=\"Horizontal (left & right)\">\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 />\n </div>\n </Tip>\n <Tip label=\"Vertical (top & bottom)\">\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 />\n </div>\n </Tip>\n <Tip label=\"Individual mode\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 shrink-0 text-muted-foreground\"\n onClick={() => setIndividual(true)}\n >\n <Grid2x2 className=\"size-3.5\" />\n </Button>\n </Tip>\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 <Tip label=\"Left\">\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 />\n </div>\n </Tip>\n <Tip label=\"Top\">\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 />\n </div>\n </Tip>\n <Tip label=\"Combined mode\">\n <Button\n variant=\"secondary\"\n size=\"icon\"\n className=\"size-7 shrink-0\"\n onClick={() => setIndividual(false)}\n >\n <Columns2 className=\"size-3.5\" />\n </Button>\n </Tip>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Tip label=\"Right\">\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 />\n </div>\n </Tip>\n <Tip label=\"Bottom\">\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 />\n </div>\n </Tip>\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 <Tip label=\"Horizontal (left & right)\">\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 />\n </div>\n </Tip>\n <Tip label=\"Vertical (top & bottom)\">\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 />\n </div>\n </Tip>\n <Tip label=\"Individual mode\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 shrink-0 text-muted-foreground\"\n onClick={() => setIndividual(true)}\n >\n <Grid2x2 className=\"size-3.5\" />\n </Button>\n </Tip>\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 <Tip label=\"Top Left\">\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 />\n </div>\n </Tip>\n <Tip label=\"Top Right\">\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 />\n </div>\n </Tip>\n <Tip label=\"Combined mode\">\n <Button\n variant=\"secondary\"\n size=\"icon\"\n className=\"size-7 shrink-0\"\n onClick={() => setIndividual(false)}\n >\n <Columns2 className=\"size-3.5\" />\n </Button>\n </Tip>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Tip label=\"Bottom Left\">\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 />\n </div>\n </Tip>\n <Tip label=\"Bottom Right\">\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 />\n </div>\n </Tip>\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 <Tip label=\"Individual mode\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 shrink-0 text-muted-foreground\"\n onClick={() => setIndividual(true)}\n >\n <Grid2x2 className=\"size-3.5\" />\n </Button>\n </Tip>\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\ntype BorderPosition = 'border' | 'outline'\nconst BORDER_POSITION_OPTIONS: Array<{ value: BorderPosition; label: string }> = [\n { value: 'border', label: 'Border' },\n { value: 'outline', label: 'Outline' },\n]\n\nconst BORDER_SIDES = ['Top', 'Right', 'Bottom', 'Left'] as const\n\ninterface BorderInputsProps {\n border: BorderProperties\n borderColor?: ColorValue\n outlineColor?: ColorValue\n onChange: (key: BorderPropertyKey, value: BorderProperties[BorderPropertyKey]) => void\n onBatchChange: (changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]>) => void\n onBorderColorChange?: (value: ColorValue) => void\n onOutlineColorChange?: (value: ColorValue) => void\n onSetCSS?: (properties: Record<string, string>) => void\n borderPosition: BorderPosition\n onPositionChange: (position: BorderPosition) => void\n outlineStyle?: BorderStyle\n outlineWidth?: number\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, outlineColor, onChange, onBatchChange, onBorderColorChange, onOutlineColorChange, onSetCSS, borderPosition, onPositionChange, outlineStyle, outlineWidth }: BorderInputsProps) {\n const [selectedSide, setSelectedSide] = React.useState<BorderSideOption>('All')\n\n const isOutline = borderPosition === 'outline'\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 = isOutline\n ? (outlineStyle || 'solid')\n : (stylesMatch ? (border[`border${activeSides[0]}Style` as keyof BorderProperties] as BorderStyle) || 'solid' : 'solid')\n const currentWidth = isOutline\n ? (outlineWidth ?? 0)\n : (widthsMatch ? (border[`border${activeSides[0]}Width` as keyof BorderProperties] as CSSPropertyValue)?.numericValue ?? 0 : null)\n\n const handleStyleChange = (style: BorderStyle) => {\n if (isOutline && onSetCSS) {\n const props: Record<string, string> = { 'outline-style': style }\n if ((outlineWidth ?? 0) <= 0) {\n props['outline-width'] = '1px'\n }\n onSetCSS(props)\n return\n }\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 if (isOutline && onSetCSS) {\n onSetCSS({ 'outline-width': `${clamped}px` })\n return\n }\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 const activeColor = isOutline ? outlineColor : borderColor\n const activeColorChange = isOutline ? onOutlineColorChange : onBorderColorChange\n\n return (\n <div className=\"space-y-2\">\n {/* Row 1: Color */}\n {activeColor && activeColorChange && (\n <ColorInput\n id={isOutline ? 'outline-color' : 'border-color'}\n label={isOutline ? 'Outline' : 'Border'}\n icon={isOutline ? <Focus className=\"size-3.5\" /> : <Square className=\"size-3.5\" />}\n value={activeColor}\n onChange={activeColorChange}\n />\n )}\n\n {/* Row 2: Position + Style + Width + Side — all on one row */}\n <div className=\"flex items-center gap-1.5\">\n <Select value={borderPosition} onValueChange={(val) => val && onPositionChange(val as BorderPosition)}>\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>{BORDER_POSITION_OPTIONS.find((o) => o.value === borderPosition)?.label}</span>\n <SelectIcon>\n <ChevronDown className=\"size-3.5 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-xl outline outline-1 outline-foreground/10 bg-background p-1 text-popover-foreground shadow-lg animate-in fade-in-0 zoom-in-95\">\n {BORDER_POSITION_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.5\" />\n </SelectItemIndicator>\n <SelectItemText>{option.label}</SelectItemText>\n </SelectItem>\n ))}\n </SelectPopup>\n </SelectPositioner>\n </SelectPortal>\n </Select>\n\n <Select value={currentStyle} onValueChange={(val) => val && handleStyleChange(val as BorderStyle)}>\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.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.5 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-xl outline outline-1 outline-foreground/10 bg-background 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.5\" />\n </SelectItemIndicator>\n <SelectItemText>{option.label}</SelectItemText>\n </SelectItem>\n ))}\n </SelectPopup>\n </SelectPositioner>\n </SelectPortal>\n </Select>\n\n <Tip label={isOutline ? 'Outline width' : 'Border width'}>\n <div>\n <NumberInput\n min={0}\n step={0.5}\n value={typeof currentWidth === 'number' ? Math.round(currentWidth * 100) / 100 : 0}\n placeholder={currentWidth === null ? '–' : undefined}\n onValueChange={handleAllWidthChange}\n className=\"h-7 w-11 px-2 text-center text-xs tabular-nums\"\n />\n </div>\n </Tip>\n\n {!isOutline && (\n <Select value={selectedSide} onValueChange={(val) => val && setSelectedSide(val as BorderSideOption)}>\n <Tip label={`Sides: ${selectedSide}`}>\n <SelectTrigger className=\"flex size-7 shrink-0 items-center justify-center rounded-md border-0 bg-muted text-muted-foreground hover:bg-muted-foreground/10 hover:text-foreground focus:outline-none\">\n {selectedSide === 'Custom' ? (\n <Grid2x2 className=\"size-3.5\" strokeWidth={1} />\n ) : selectedSide === 'All' ? (\n <Square className=\"size-3.5\" />\n ) : (\n <BorderSideIcon side={selectedSide} className=\"\" />\n )}\n </SelectTrigger>\n </Tip>\n <SelectPortal>\n <SelectPositioner sideOffset={4} className=\"z-[99999]\">\n <SelectPopup className=\"min-w-[90px] overflow-hidden rounded-xl outline outline-1 outline-foreground/10 bg-background 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.5\" />\n </SelectItemIndicator>\n <SelectItemText>{side}</SelectItemText>\n </SelectItem>\n ))}\n </SelectPopup>\n </SelectPositioner>\n </SelectPortal>\n </Select>\n )}\n </div>\n\n {!isOutline && 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 <Tip label={`Border ${side.toLowerCase()} width`} key={side}>\n <div 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 />\n </div>\n </Tip>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\ninterface BorderSectionProps {\n border: BorderProperties\n borderColor?: ColorValue\n outlineColor?: ColorValue\n onChange: (key: BorderPropertyKey, value: BorderProperties[BorderPropertyKey]) => void\n onBatchChange: (changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]>) => void\n onBorderColorChange?: (value: ColorValue) => void\n onOutlineColorChange?: (value: ColorValue) => void\n onSetCSS?: (properties: Record<string, string>) => void\n pendingStyles?: Record<string, string>\n}\n\nfunction BorderSection({ border, borderColor, outlineColor, onChange, onBatchChange, onBorderColorChange, onOutlineColorChange, onSetCSS, pendingStyles }: BorderSectionProps) {\n // Auto-detect initial position from pending styles\n const hasOutlinePending = Boolean(\n pendingStyles?.['outline-style'] || pendingStyles?.['outline-width']\n )\n const [borderPosition, setBorderPosition] = React.useState<BorderPosition>(\n hasOutlinePending ? 'outline' : 'border'\n )\n\n const isOutline = borderPosition === 'outline'\n\n // Derive outline values from pending styles or computed\n const outlineStyleValue = (pendingStyles?.['outline-style'] as BorderStyle) || 'none'\n const outlineWidthValue = pendingStyles?.['outline-width']\n ? parseFloat(pendingStyles['outline-width'])\n : 0\n\n const hasBorder = isOutline\n ? (outlineStyleValue !== 'none' && outlineWidthValue > 0)\n : 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 if (isOutline && onSetCSS) {\n onSetCSS({ 'outline-style': 'solid', 'outline-width': '1px' })\n return\n }\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 if (isOutline && onSetCSS) {\n onSetCSS({ 'outline-style': 'none', 'outline-width': '0px' })\n return\n }\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 handlePositionChange = (newPosition: BorderPosition) => {\n if (newPosition === borderPosition) return\n\n if (newPosition === 'outline' && onSetCSS) {\n // Transfer border values to outline\n const firstSideStyle = border.borderTopStyle !== 'none' ? border.borderTopStyle : 'solid'\n const firstSideWidth = border.borderTopWidth.numericValue > 0 ? border.borderTopWidth.numericValue : 1\n\n // Clear border props\n const clearChanges: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]> = []\n for (const s of BORDER_SIDES) {\n clearChanges.push([`border${s}Style` as BorderPropertyKey, 'none'])\n clearChanges.push([`border${s}Width` as BorderPropertyKey, { numericValue: 0, unit: 'px', raw: '0px' }])\n }\n onBatchChange(clearChanges)\n\n // Set outline props\n if (hasBorder) {\n onSetCSS({\n 'outline-style': firstSideStyle,\n 'outline-width': `${firstSideWidth}px`,\n })\n // Transfer border color to outline color\n if (borderColor && onOutlineColorChange) {\n onOutlineColorChange(borderColor)\n }\n }\n } else if (newPosition === 'border' && onSetCSS) {\n // Transfer outline values to border\n const style = outlineStyleValue !== 'none' ? outlineStyleValue : 'solid'\n const width = outlineWidthValue > 0 ? outlineWidthValue : 1\n\n // Clear outline props\n onSetCSS({ 'outline-style': 'none', 'outline-width': '0px' })\n\n // Set border props\n if (hasBorder) {\n const changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]> = []\n for (const s of BORDER_SIDES) {\n changes.push([`border${s}Style` as BorderPropertyKey, style])\n changes.push([`border${s}Width` as BorderPropertyKey, { numericValue: width, unit: 'px', raw: `${width}px` }])\n }\n onBatchChange(changes)\n // Transfer outline color to border color\n if (outlineColor && onBorderColorChange) {\n onBorderColorChange(outlineColor)\n }\n }\n }\n\n setBorderPosition(newPosition)\n }\n\n const headerActions = (\n <Tip label={hasBorder ? 'Remove border' : 'Add border'}>\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 >\n {hasBorder ? <Minus className=\"size-3.5\" /> : <Plus className=\"size-3.5\" />}\n </button>\n </Tip>\n )\n\n return (\n <CollapsibleSection title=\"Border\" actions={headerActions}>\n {hasBorder ? (\n <ColorPickerGroup>\n <BorderInputs\n border={border}\n borderColor={borderColor}\n outlineColor={outlineColor}\n onChange={onChange}\n onBatchChange={onBatchChange}\n onBorderColorChange={onBorderColorChange}\n onOutlineColorChange={onOutlineColorChange}\n onSetCSS={onSetCSS}\n borderPosition={borderPosition}\n onPositionChange={handlePositionChange}\n outlineStyle={outlineStyleValue}\n outlineWidth={outlineWidthValue}\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=\"flex flex-col rounded-md bg-[canvas] px-2 py-1 text-xs origin-(--transform-origin) shadow-lg shadow-gray-200 outline-1 outline-gray-200 transition-[transform,scale,opacity] data-starting-style:scale-90 data-starting-style:opacity-0 data-ending-style:scale-90 data-ending-style:opacity-0 data-instant:transition-none dark:shadow-none dark:outline-gray-300 dark:-outline-offset-1\">\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 text-xs 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.5 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-xl outline outline-1 outline-foreground/10 bg-background 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.5\" />\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 <Tip label={locked ? 'Unlock aspect ratio' : 'Lock aspect ratio'}>\n <Button\n variant={locked ? 'secondary' : 'ghost'}\n size=\"icon\"\n className=\"size-7 shrink-0\"\n onClick={handleLockToggle}\n disabled={!canLock}\n >\n {locked ? <Link className=\"size-3.5\" /> : <Unlink className=\"size-3.5\" />}\n </Button>\n </Tip>\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.5 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-xl outline outline-1 outline-foreground/10 bg-background 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.5\" />\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.5 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-xl outline outline-1 outline-foreground/10 bg-background 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.5\" />\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 <Tip label=\"Font Size\">\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 />\n </div>\n </Tip>\n <Tip label=\"Line Height\">\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 />\n </div>\n </Tip>\n <Tip label=\"Letter Spacing (em)\">\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 />\n </div>\n </Tip>\n </div>\n\n <div className=\"flex items-center gap-3\">\n <div className=\"flex gap-1\">\n <Tip label=\"Align Left\">\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 >\n <AlignLeft className=\"size-3.5\" />\n </Button>\n </Tip>\n <Tip label=\"Align Center\">\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 >\n <AlignCenter className=\"size-3.5\" />\n </Button>\n </Tip>\n <Tip label=\"Align Right\">\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 >\n <AlignRight className=\"size-3.5\" />\n </Button>\n </Tip>\n </div>\n\n <div className=\"flex gap-1\">\n <Tip label=\"Align Top\">\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 >\n <AlignVerticalJustifyStart className=\"size-3.5\" />\n </Button>\n </Tip>\n <Tip label=\"Align Middle\">\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 >\n <AlignVerticalJustifyCenter className=\"size-3.5\" />\n </Button>\n </Tip>\n <Tip label=\"Align Bottom\">\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 >\n <AlignVerticalJustifyEnd className=\"size-3.5\" />\n </Button>\n </Tip>\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 (showText) sections.push('text')\n if (showColors) sections.push('colors')\n\n const handleClick = (key: SectionKey) => {\n const scrollEl = scrollRef.current\n if (!scrollEl) return\n if (key === 'layout') {\n scrollEl.scrollTo({ top: 0, behavior: 'smooth' })\n return\n }\n const el = sectionRefs[key].current\n if (!el) 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 bg-background\">\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 onSetCSS: (properties: Record<string, string>) => 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 onSetCSS,\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 <TooltipProvider delayDuration={200}>\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 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 pl-3 pr-2 py-2',\n isDraggable && 'cursor-grab active:cursor-grabbing'\n )}\n onPointerDown={onHeaderPointerDown}\n onPointerMove={onHeaderPointerMove}\n onPointerUp={onHeaderPointerUp}\n >\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 </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {onSelectParent && (\n <Tip label=\"Select Parent\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onSelectParent}\n disabled={!elementInfo.parentElement}\n className=\"size-7\"\n >\n <ChevronUp className=\"size-3.5\" />\n </Button>\n </Tip>\n )}\n {onSelectChild && (\n <Tip label=\"Select Child\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onSelectChild}\n disabled={!elementInfo.hasChildren}\n className=\"size-7\"\n >\n <ChevronDown className=\"size-3.5\" />\n </Button>\n </Tip>\n )}\n {onClose && (\n <>\n <div className=\"mx-0.5 h-4 w-px bg-border\" />\n <Button variant=\"ghost\" size=\"icon\" className=\"size-7\" onClick={onClose}>\n <X className=\"size-3.5\" />\n </Button>\n </>\n )}\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 backdrop-blur-xl bg-background/85\" ref={scrollRef}>\n <CollapsibleSection title=\"Layout\" actions={\n <Tip label={elementInfo.isFlexContainer ? 'Remove flex (Shift+A)' : 'Add flex (Shift+A)'}>\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 >\n {elementInfo.isFlexContainer ? <Minus className=\"size-3.5\" /> : <Plus className=\"size-3.5\" />}\n </button>\n </Tip>\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 <Tip label=\"Row\">\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 >\n <ArrowRight className=\"size-3.5\" />\n </button>\n </Tip>\n <Tip label=\"Column\">\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 >\n <ArrowDown className=\"size-3.5\" />\n </button>\n </Tip>\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.5 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-xl outline outline-1 outline-foreground/10 bg-background 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.5\" />\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 outlineColor={computedColor?.outlineColor}\n onChange={onUpdateBorder}\n onBatchChange={onBatchUpdateBorder}\n onBorderColorChange={(value) => onUpdateColor('borderColor', value)}\n onOutlineColorChange={(value) => onUpdateColor('outlineColor', value)}\n onSetCSS={onSetCSS}\n pendingStyles={pendingStyles}\n />\n </div>\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\n {computedColor && (\n <div ref={sectionRefs.colors}>\n <CollapsibleSection title=\"Selection 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 </div>\n\n <div\n className={cn(\n 'flex shrink-0 items-center gap-1 border-t border-border/50 bg-background 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 <Tip label=\"Copy edits\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleCopy}\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 </Tip>\n <Tip label=\"Apply changes via agent\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={handleSendToAgent}\n disabled={!hasPendingChanges || sendStatus === 'sending'}\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 </Tip>\n </div>\n </div>\n </TooltipProvider>\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 updateRawCSS,\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] 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 onSetCSS={updateRawCSS}\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-sm 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 [&::-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 'rounded-md bg-[canvas] px-2 py-1 text-xs origin-(--transform-origin) shadow-lg shadow-gray-200 outline-1 outline-gray-200 transition-[transform,scale,opacity] data-starting-style:scale-90 data-starting-style:opacity-0 data-ending-style:scale-90 data-ending-style:opacity-0 data-instant:transition-none dark:shadow-none dark:outline-gray-300 dark:-outline-offset-1',\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-xs 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-xs 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-xl outline outline-1 outline-foreground/10 bg-background 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-xs text-muted-foreground\">#</span>\n <HexInput value={currentHex} onChange={handleHexInput} />\n <span className=\"text-xs text-muted-foreground\">/</span>\n <AlphaInput value={alpha} onChange={handleAlphaInput} />\n <span className=\"text-xs 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-xs 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-xs 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, ElementLocator } from './types'\nimport { cn } from './cn'\nimport { ChevronLeft, Check, Copy, Trash2, ArrowUp, Send, X } from 'lucide-react'\nimport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from './ui/tooltip'\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\nfunction ElementLabel({ locator }: { locator: ElementLocator }) {\n return (\n <span className=\"truncate text-[10px] text-muted-foreground\">\n <code className=\"font-medium\">&lt;{locator.tagName.toLowerCase()}&gt;</code>\n {locator.id && <span>#{locator.id}</span>}\n {!locator.id && locator.classList.length > 0 && (\n <span>.{locator.classList.slice(0, 2).join('.')}{locator.classList.length > 2 ? `\\u2026` : ''}</span>\n )}\n </span>\n )\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 [elementRect, setElementRect] = React.useState<DOMRect | null>(null)\n const [flipHorizontal, setFlipHorizontal] = React.useState(false)\n const [flipVertical, setFlipVertical] = React.useState(false)\n const [autoExport, setAutoExport] = 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 setElementRect(rect)\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 {isActive && elementRect && (\n <svg\n data-direct-edit=\"comment-highlight\"\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={elementRect.left}\n y={elementRect.top}\n width={elementRect.width}\n height={elementRect.height}\n fill=\"rgba(59, 130, 246, 0.06)\"\n stroke=\"#3B82F6\"\n strokeWidth={1}\n />\n </svg>\n )}\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) => {\n onUpdateText(text)\n setAutoExport(true)\n }}\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={(text) => {\n onAddReply(text)\n setAutoExport(true)\n }}\n onDelete={onDelete}\n onExport={onExport}\n onSendToAgent={onSendToAgent}\n autoExport={autoExport}\n onAutoExportDone={() => setAutoExport(false)}\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-xl 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 autoExport: boolean\n onAutoExportDone: () => void\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 autoExport,\n onAutoExportDone,\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 React.useEffect(() => {\n if (autoExport) {\n onAutoExportDone()\n onExport().then((success) => {\n if (success) {\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n })\n }\n }, [autoExport])\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-xl 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 <TooltipProvider delayDuration={300} closeDelay={0}>\n <div className=\"flex items-center justify-between border-b border-border/50 px-2 py-1.5\">\n <div className=\"flex min-w-0 items-center gap-1\">\n <Tooltip>\n <TooltipTrigger\n render={\n <button\n type=\"button\"\n className=\"flex size-6 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n onClick={onClose}\n />\n }\n >\n <ChevronLeft className=\"size-3.5\" />\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">Back</TooltipContent>\n </Tooltip>\n <ElementLabel locator={comment.locator} />\n </div>\n <div className=\"flex shrink-0 items-center gap-0.5\">\n <Tooltip>\n <TooltipTrigger\n render={\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 />\n }\n >\n {copied ? (\n <Check className=\"size-3.5 text-green-500\" />\n ) : (\n <Copy className=\"size-3.5\" />\n )}\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{copied ? 'Copied' : 'Copy'}</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger\n render={\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 />\n }\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 </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {sendStatus === 'sent' ? 'Sent' : sendStatus === 'offline' ? 'Offline' : 'Send to Agent'}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger\n render={\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 />\n }\n >\n <Trash2 className=\"size-3.5\" />\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">Delete</TooltipContent>\n </Tooltip>\n </div>\n </div>\n </TooltipProvider>\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-gray-200 text-gray-500 px-1.5 py-0.5 font-mono text-[10px] min-w-[20px] min-h-[18px] dark:bg-gray-700 dark:text-gray-400'\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-xl 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 */}\n <div className={cn(\n 'flex shrink-0 cursor-grab items-center justify-center',\n isVertical ? 'w-full pt-0 pb-1.5' : 'h-full pl-0 pr-1.5'\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-xl 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-xl 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 onSetCSS={() => {}}\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,SAAuB;;;ACAvB,YAAuB;;;ACAvB;;;AD0CI;AAtCJ,IAAM,yBAA+B,oBAAkC,IAAI;AAEpE,SAAS,qBAAqB;AACnC,SAAa,iBAAW,sBAAsB;AAChD;AAEO,SAAS,wBAAwB,EAAE,SAAS,GAAkC;AACnF,QAAM,CAAC,WAAW,YAAY,IAAU,eAA6B,IAAI;AAEzE,EAAM,gBAAU,MAAM;AACpB,UAAM,sBAAsB,SAAS,gBAAgB,aAAa,iCAAiC;AACnG,UAAM,OAAO,SAAS,cAAc,KAAK;AACzC,SAAK,aAAa,yBAAyB,EAAE;AAC7C,WAAO,OAAO,KAAK,OAAO;AAAA,MACxB,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB,CAAC;AAED,UAAM,SAAS,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AACjD,QAAI,CAAC,qBAAqB;AACxB,YAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,YAAM,cAAc;AACpB,aAAO,YAAY,KAAK;AAAA,IAC1B;AAEA,UAAM,OAAO,SAAS,cAAc,KAAK;AACzC,SAAK,aAAa,yBAAyB,EAAE;AAC7C,WAAO,YAAY,IAAI;AAEvB,aAAS,KAAK,YAAY,IAAI;AAC9B,iBAAa,IAAI;AAEjB,WAAO,MAAM;AAAE,WAAK,OAAO;AAAA,IAAE;AAAA,EAC/B,GAAG,CAAC,CAAC;AAEL,SACE,4CAAC,uBAAuB,UAAvB,EAAgC,OAAO,WACrC,UACH;AAEJ;;;AEPO,SAAS,mBAAmB,OAAiC;AAClE,QAAM,MAAM,MAAM,KAAK;AACvB,QAAM,QAAQ,IAAI,MAAM,+BAA+B;AAEvD,MAAI,OAAO;AACT,WAAO;AAAA,MACL,cAAc,WAAW,MAAM,CAAC,CAAC;AAAA,MACjC,MAAO,MAAM,CAAC,KAAkC;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,cAAc;AAAA,IACd,MAAM;AAAA,IACN;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,OAAiC;AACnE,MAAI,MAAM,QAAQ,UAAU,MAAM,QAAQ,aAAa,MAAM,QAAQ,WAAW;AAC9E,WAAO,MAAM;AAAA,EACf;AACA,SAAO,GAAG,MAAM,YAAY,GAAG,MAAM,IAAI;AAC3C;AAEO,SAAS,kBAAkB,SAIhC;AACA,QAAM,WAAW,OAAO,iBAAiB,OAAO;AAEhD,SAAO;AAAA,IACL,SAAS;AAAA,MACP,YAAY,mBAAmB,SAAS,UAAU;AAAA,MAClD,cAAc,mBAAmB,SAAS,YAAY;AAAA,MACtD,eAAe,mBAAmB,SAAS,aAAa;AAAA,MACxD,aAAa,mBAAmB,SAAS,WAAW;AAAA,MACpD,WAAW,mBAAmB,SAAS,SAAS;AAAA,MAChD,aAAa,mBAAmB,SAAS,WAAW;AAAA,MACpD,cAAc,mBAAmB,SAAS,YAAY;AAAA,MACtD,YAAY,mBAAmB,SAAS,UAAU;AAAA,MAClD,KAAK,mBAAmB,SAAS,OAAO,KAAK;AAAA,IAC/C;AAAA,IACA,cAAc;AAAA,MACZ,qBAAqB,mBAAmB,SAAS,mBAAmB;AAAA,MACpE,sBAAsB,mBAAmB,SAAS,oBAAoB;AAAA,MACtE,yBAAyB,mBAAmB,SAAS,uBAAuB;AAAA,MAC5E,wBAAwB,mBAAmB,SAAS,sBAAsB;AAAA,IAC5E;AAAA,IACA,MAAM;AAAA,MACJ,SAAS,SAAS;AAAA,MAClB,eAAe,SAAS;AAAA,MACxB,gBAAgB,SAAS;AAAA,MACzB,YAAY,SAAS;AAAA,IACvB;AAAA,EACF;AACF;AAEO,SAAS,wBAAwB,SAAwC;AAC9E,QAAM,WAAW,OAAO,iBAAiB,OAAO;AAEhD,QAAM,WAAW,SAAS;AAC1B,QAAM,aAAa,SAAS;AAC5B,QAAM,cAAc,SAAS;AAC7B,QAAM,YAAY,SAAS;AAE3B,QAAM,WAAW,mBAAmB,SAAS,cAAc;AAC3D,QAAM,aAAa,mBAAmB,SAAS,gBAAgB;AAC/D,QAAM,cAAc,mBAAmB,SAAS,iBAAiB;AACjE,QAAM,YAAY,mBAAmB,SAAS,eAAe;AAE7D,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,EACnB;AACF;AAEO,SAAS,wBAAwB,SAA8C;AACpF,QAAM,SAAiC,CAAC;AACxC,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAW,QAAQ,eAAe;AAChC,UAAM,QAAQ,QAAQ,MAAM,iBAAiB,IAAI;AACjD,QAAI,OAAO;AACT,aAAO,IAAI,IAAI;AAAA,IACjB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,mBAAsF;AAAA,EAC1F,eAAe;AAAA,IACb,QAAQ;AAAA,IACR,OAAO,EAAE,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI;AAAA,EAClG;AAAA,EACA,iBAAiB;AAAA,IACf,QAAQ;AAAA,IACR,OAAO,EAAE,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI;AAAA,EAClG;AAAA,EACA,kBAAkB;AAAA,IAChB,QAAQ;AAAA,IACR,OAAO,EAAE,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI;AAAA,EAClG;AAAA,EACA,gBAAgB;AAAA,IACd,QAAQ;AAAA,IACR,OAAO,EAAE,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI;AAAA,EAClG;AAAA,EACA,cAAc;AAAA,IACZ,QAAQ;AAAA,IACR,OAAO,EAAE,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI;AAAA,EAClG;AAAA,EACA,gBAAgB;AAAA,IACd,QAAQ;AAAA,IACR,OAAO,EAAE,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI;AAAA,EAClG;AAAA,EACA,iBAAiB;AAAA,IACf,QAAQ;AAAA,IACR,OAAO,EAAE,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI;AAAA,EAClG;AAAA,EACA,eAAe;AAAA,IACb,QAAQ;AAAA,IACR,OAAO,EAAE,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI;AAAA,EAClG;AAAA,EACA,KAAK;AAAA,IACH,QAAQ;AAAA,IACR,OAAO,EAAE,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI;AAAA,EAClG;AAAA,EACA,gBAAgB;AAAA,IACd,QAAQ;AAAA,IACR,OAAO,EAAE,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI;AAAA,EACjD;AAAA,EACA,oBAAoB;AAAA,IAClB,QAAQ;AAAA,IACR,OAAO,EAAE,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI;AAAA,EACjD;AAAA,EACA,sBAAsB;AAAA,IACpB,QAAQ;AAAA,IACR,OAAO,EAAE,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI;AAAA,EACjD;AAAA,EACA,uBAAuB;AAAA,IACrB,QAAQ;AAAA,IACR,OAAO,EAAE,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI;AAAA,EACjD;AAAA,EACA,qBAAqB;AAAA,IACnB,QAAQ;AAAA,IACR,OAAO,EAAE,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI;AAAA,EACjD;AAAA,EACA,iBAAiB;AAAA,IACf,QAAQ;AAAA,IACR,OAAO,EAAE,GAAG,QAAQ,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,IAAI,MAAM,IAAI,OAAO,IAAI,OAAO,MAAM,OAAO;AAAA,EACrG;AAAA,EACA,0BAA0B;AAAA,IACxB,QAAQ;AAAA,IACR,OAAO,EAAE,GAAG,QAAQ,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,IAAI,MAAM,IAAI,OAAO,IAAI,OAAO,MAAM,OAAO;AAAA,EACrG;AAAA,EACA,2BAA2B;AAAA,IACzB,QAAQ;AAAA,IACR,OAAO,EAAE,GAAG,QAAQ,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,IAAI,MAAM,IAAI,OAAO,IAAI,OAAO,MAAM,OAAO;AAAA,EACrG;AAAA,EACA,8BAA8B;AAAA,IAC5B,QAAQ;AAAA,IACR,OAAO,EAAE,GAAG,QAAQ,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,IAAI,MAAM,IAAI,OAAO,IAAI,OAAO,MAAM,OAAO;AAAA,EACrG;AAAA,EACA,6BAA6B;AAAA,IAC3B,QAAQ;AAAA,IACR,OAAO,EAAE,GAAG,QAAQ,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,IAAI,MAAM,IAAI,OAAO,IAAI,OAAO,MAAM,OAAO;AAAA,EACrG;AACF;AAEA,IAAM,mBAA2C;AAAA,EAC/C,KAAK;AAAA,EACL,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,kBAAkB;AACpB;AAEA,IAAM,oBAA4C;AAAA,EAChD,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,KAAK;AACP;AAEA,IAAM,gBAAwC;AAAA,EAC5C,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS;AAAA,EACT,OAAO;AAAA,EACP,KAAK;AACP;AAEA,SAAS,mBAAmB,OAAe,OAA8C;AACvF,MAAI,OAAO,UAAU,eAAe,KAAK,OAAO,KAAK,GAAG;AACtD,WAAO,MAAM,KAAK;AAAA,EACpB;AACA,SAAO;AACT;AAEO,SAAS,iBAAiB,QAAwC;AACvE,QAAM,UAAoB,CAAC;AAE3B,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAClD,QAAI,iBAAiB,IAAI,GAAG;AAC1B,YAAM,SAAS,mBAAmB,KAAK;AACvC,YAAM,UAAU,iBAAiB,IAAI;AACrC,UAAI,UAAU,QAAQ;AACpB,gBAAQ,KAAK,GAAG,QAAQ,MAAM,OAAO;AACrC;AAAA,MACF;AACA,UAAI,OAAO,SAAS,MAAM;AACxB,cAAM,aAAa,mBAAmB,OAAO,cAAc,QAAQ,KAAK;AACxE,YAAI,eAAe,MAAM;AACvB,cAAI,eAAe,IAAI;AACrB,oBAAQ,KAAK,QAAQ,MAAM;AAAA,UAC7B,OAAO;AACL,oBAAQ,KAAK,GAAG,QAAQ,MAAM,IAAI,UAAU,EAAE;AAAA,UAChD;AACA;AAAA,QACF;AAAA,MACF;AACA,cAAQ,KAAK,GAAG,QAAQ,MAAM,KAAK,KAAK,GAAG;AAC3C;AAAA,IACF;AAEA,QAAI,SAAS,oBAAoB,iBAAiB,KAAK,GAAG;AACxD,cAAQ,KAAK,iBAAiB,KAAK,CAAC;AACpC;AAAA,IACF;AAEA,QAAI,SAAS,qBAAqB,kBAAkB,KAAK,GAAG;AAC1D,cAAQ,KAAK,kBAAkB,KAAK,CAAC;AACrC;AAAA,IACF;AAEA,QAAI,SAAS,iBAAiB,cAAc,KAAK,GAAG;AAClD,cAAQ,KAAK,cAAc,KAAK,CAAC;AACjC;AAAA,IACF;AAEA,QAAI,SAAS,WAAW;AACtB,UAAI,UAAU,OAAQ,SAAQ,KAAK,MAAM;AAAA,eAChC,UAAU,cAAe,SAAQ,KAAK,aAAa;AAAA,eACnD,UAAU,OAAQ,SAAQ,KAAK,MAAM;AAAA,eACrC,UAAU,QAAS,SAAQ,KAAK,OAAO;AAAA,eACvC,UAAU,eAAgB,SAAQ,KAAK,cAAc;AAAA,eACrD,UAAU,OAAQ,SAAQ,KAAK,QAAQ;AAChD;AAAA,IACF;AAEA,QAAI,SAAS,SAAS;AACpB,UAAI,UAAU,OAAQ,SAAQ,KAAK,QAAQ;AAAA,eAClC,UAAU,cAAe,SAAQ,KAAK,OAAO;AAAA,eAC7C,UAAU,OAAQ,SAAQ,KAAK,QAAQ;AAAA,UAC3C,SAAQ,KAAK,MAAM,KAAK,GAAG;AAChC;AAAA,IACF;AAEA,QAAI,SAAS,UAAU;AACrB,UAAI,UAAU,OAAQ,SAAQ,KAAK,QAAQ;AAAA,eAClC,UAAU,cAAe,SAAQ,KAAK,OAAO;AAAA,eAC7C,UAAU,OAAQ,SAAQ,KAAK,QAAQ;AAAA,UAC3C,SAAQ,KAAK,MAAM,KAAK,GAAG;AAChC;AAAA,IACF;AAEA,QAAI,SAAS,oBAAoB;AAC/B,YAAM,aAAa,gBAAgB,KAAK;AACxC,cAAQ,KAAK,gBAAgB,mBAAmB,UAAU,CAAC;AAC3D;AAAA,IACF;AAEA,QAAI,SAAS,SAAS;AACpB,YAAM,aAAa,gBAAgB,KAAK;AACxC,cAAQ,KAAK,gBAAgB,SAAS,UAAU,CAAC;AACjD;AAAA,IACF;AAEA,QAAI,SAAS,gBAAgB;AAC3B,YAAM,aAAa,gBAAgB,KAAK;AACxC,cAAQ,KAAK,gBAAgB,eAAe,UAAU,CAAC;AACvD;AAAA,IACF;AAEA,QAAI,SAAS,gBAAgB;AAC3B,YAAM,WAAmC;AAAA,QACvC,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AACA,cAAQ,KAAK,SAAS,KAAK,KAAK,iBAAiB,KAAK,GAAG;AACzD;AAAA,IACF;AAGA,QAAI,SAAS,sBAAsB,SAAS,wBAAwB,SAAS,yBAAyB,SAAS,qBAAqB;AAClI,YAAM,aACJ,sBAAsB,UACtB,wBAAwB,UACxB,yBAAyB,UACzB,uBAAuB;AACzB,UAAI,YAAY;AAEd,YAAI,SAAS,oBAAoB;AAC/B,gBAAM,UACJ,OAAO,kBAAkB,MAAM,OAAO,oBAAoB,KAC1D,OAAO,kBAAkB,MAAM,OAAO,qBAAqB,KAC3D,OAAO,kBAAkB,MAAM,OAAO,mBAAmB;AAC3D,cAAI,SAAS;AACX,kBAAM,WAAmC;AAAA,cACvC,MAAM;AAAA,cACN,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR,QAAQ;AAAA,YACV;AACA,oBAAQ,KAAK,SAAS,KAAK,KAAK,iBAAiB,KAAK,GAAG;AAAA,UAC3D,OAAO;AAEL,oBAAQ,KAAK,qBAAqB,OAAO,kBAAkB,CAAC,GAAG;AAC/D,oBAAQ,KAAK,uBAAuB,OAAO,oBAAoB,CAAC,GAAG;AACnE,oBAAQ,KAAK,wBAAwB,OAAO,qBAAqB,CAAC,GAAG;AACrE,oBAAQ,KAAK,sBAAsB,OAAO,mBAAmB,CAAC,GAAG;AAAA,UACnE;AAAA,QACF;AAAA,MACF,OAAO;AAEL,gBAAQ,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG;AAAA,MACnC;AACA;AAAA,IACF;AAEA,QAAI,SAAS,iBAAiB;AAC5B,YAAM,aAAa,gBAAgB,KAAK;AACxC,cAAQ,KAAK,gBAAgB,gBAAgB,UAAU,CAAC;AACxD;AAAA,IACF;AAEA,QAAI,SAAS,aAAa;AACxB,cAAQ,KAAK,SAAS,KAAK,GAAG;AAC9B;AAAA,IACF;AAEA,QAAI,SAAS,eAAe;AAC1B,YAAM,YAAoC;AAAA,QACxC,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AACA,cAAQ,KAAK,UAAU,KAAK,KAAK,SAAS,KAAK,GAAG;AAClD;AAAA,IACF;AAEA,QAAI,SAAS,eAAe;AAC1B,cAAQ,KAAK,YAAY,KAAK,GAAG;AACjC;AAAA,IACF;AAEA,QAAI,SAAS,kBAAkB;AAC7B,cAAQ,KAAK,aAAa,KAAK,GAAG;AAClC;AAAA,IACF;AAEA,QAAI,SAAS,cAAc;AACzB,YAAM,WAAmC;AAAA,QACvC,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,SAAS;AAAA,MACX;AACA,UAAI,SAAS,KAAK,EAAG,SAAQ,KAAK,SAAS,KAAK,CAAC;AACjD;AAAA,IACF;AAEA,QAAI,SAAS,eAAe;AAC1B,cAAQ,KAAK,SAAS,MAAM,QAAQ,QAAQ,GAAG,CAAC,GAAG;AACnD;AAAA,IACF;AAAA,EACF;AAEA,SAAO,QAAQ,KAAK,GAAG;AACzB;AAEO,IAAM,mBAAuD;AAAA,EAClE,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,eAAe;AAAA,EACf,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AAAA,EACb,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,KAAK;AACP;AAEO,IAAM,+BAAwE;AAAA,EACnF,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,yBAAyB;AAAA,EACzB,wBAAwB;AAC1B;AAEO,IAAM,yBAA4D;AAAA,EACvE,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,iBAAiB;AACnB;AAEO,IAAM,uBAAwD;AAAA,EACnE,SAAS;AAAA,EACT,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,YAAY;AACd;AAEO,IAAM,yBAA4D;AAAA,EACvE,OAAO;AAAA,EACP,QAAQ;AACV;AAEO,IAAM,6BAAoE;AAAA,EAC/E,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,WAAW;AAAA,EACX,mBAAmB;AACrB;AAEA,IAAM,oBAAoB,oBAAI,IAAI;AAAA,EAChC;AAAA,EAAK;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EACnC;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAK;AAAA,EAAU;AAAA,EAAM;AAAA,EACtC;AAAA,EAAc;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAW;AAAA,EAC3C;AAAA,EAAU;AAAA,EAAM;AAAA,EAAM;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAChD,CAAC;AAED,SAAS,2BAA2B,SAA+B;AACjE,SAAO,MAAM,KAAK,QAAQ,UAAU,EAAE;AAAA,IACpC,CAAC,SAAS,KAAK,aAAa,KAAK,aAAa,QAAQ,KAAK,aAAa,KAAK,CAAC;AAAA,EAChF;AACF;AAEO,SAAS,cAAc,SAA+B;AAC3D,QAAM,UAAU,QAAQ,QAAQ,YAAY;AAC5C,MAAI,kBAAkB,IAAI,OAAO,GAAG;AAClC,WAAO;AAAA,EACT;AACA,MAAI,2BAA2B,OAAO,GAAG;AACvC,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,SAAS,WAAW,KAAK,QAAQ,aAAa,KAAK,GAAG;AAChE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,sBAAsB,SAA4C;AAChF,QAAM,WAAW,OAAO,iBAAiB,OAAO;AAEhD,MAAI,oBAA+D;AACnE,MAAI,SAAS,YAAY,UAAU,SAAS,YAAY,eAAe;AACrE,UAAM,aAAa,SAAS;AAC5B,QAAI,eAAe,SAAU,qBAAoB;AAAA,aACxC,eAAe,cAAc,eAAe,MAAO,qBAAoB;AAAA,EAClF;AAGA,QAAM,aAAa,SAAS,eAAe,WACvC,EAAE,cAAc,WAAW,SAAS,QAAQ,IAAI,KAAK,MAAM,MAAe,KAAK,GAAG,KAAK,MAAM,WAAW,SAAS,QAAQ,IAAI,GAAG,CAAC,KAAK,IACtI,mBAAmB,SAAS,UAAU;AAG1C,QAAM,WAAW,WAAW,SAAS,QAAQ;AAC7C,MAAI;AACJ,MAAI,SAAS,kBAAkB,UAAU;AACvC,oBAAgB,EAAE,cAAc,GAAG,MAAM,MAAe,KAAK,MAAM;AAAA,EACrE,OAAO;AACL,UAAM,SAAS,mBAAmB,SAAS,aAAa;AACxD,QAAI,OAAO,SAAS,QAAQ,WAAW,GAAG;AACxC,YAAM,UAAU,KAAK,MAAO,OAAO,eAAe,WAAY,GAAG,IAAI;AACrE,sBAAgB,EAAE,cAAc,SAAS,MAAM,MAAe,KAAK,GAAG,OAAO,KAAK;AAAA,IACpF,OAAO;AACL,sBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,YAAY,SAAS;AAAA,IACrB,YAAY,SAAS;AAAA,IACrB,UAAU,mBAAmB,SAAS,QAAQ;AAAA,IAC9C;AAAA,IACA;AAAA,IACA,WAAW,SAAS;AAAA,IACpB;AAAA,EACF;AACF;AAEO,SAAS,iBACd,SACA,WACY;AACZ,QAAM,WAAW,OAAO,iBAAiB,OAAO;AAChD,QAAM,cAAc,QAAQ,MAAM,SAAS;AAE3C,MAAI,gBAAgB,OAAQ,QAAO;AACnC,MAAI,gBAAgB,UAAU,gBAAgB,cAAe,QAAO;AAEpE,QAAM,gBAAgB,SAAS,SAAS;AAExC,MAAI,kBAAkB,OAAQ,QAAO;AACrC,MACE,kBAAkB,UAClB,kBAAkB,iBAClB,kBAAkB,eAClB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,QAAQ;AACvB,MAAI,QAAQ;AACV,UAAM,iBAAiB,OAAO,iBAAiB,MAAM;AACrD,QAAI,eAAe,YAAY,UAAU,eAAe,YAAY,eAAe;AACjF,YAAM,WAAW,SAAS;AAC1B,UAAI,aAAa,KAAK;AACpB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,MAAI,cAAc,SAAS;AACzB,QAAI,SAAS,YAAY,WAAW,CAAC,aAAa;AAChD,aAAO;AAAA,IACT;AACA,QACE,SAAS,YAAY,kBACrB,SAAS,YAAY,iBACrB,SAAS,YAAY,UACrB;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,cAAc,UAAU;AAC1B,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,eAAe,SAAsB,WAA4C;AAC/F,QAAM,OAAO,iBAAiB,SAAS,SAAS;AAChD,QAAM,OAAO,QAAQ,sBAAsB;AAC3C,QAAM,eAAe,KAAK,MAAM,cAAc,UAAU,KAAK,QAAQ,KAAK,MAAM;AAEhF,SAAO;AAAA,IACL;AAAA,IACA,OAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN,KAAK,GAAG,YAAY;AAAA,IACtB;AAAA,EACF;AACF;AAEO,SAAS,kBAAkB,SAAwC;AACxE,SAAO;AAAA,IACL,OAAO,eAAe,SAAS,OAAO;AAAA,IACtC,QAAQ,eAAe,SAAS,QAAQ;AAAA,EAC1C;AACF;AAEO,SAAS,iBAAiB,QAA6B;AAC5D,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,GAAG,OAAO,MAAM,YAAY,GAAG,OAAO,MAAM,IAAI;AAAA,EAC3D;AACF;AAeA,SAAS,cAAc,KAAyB;AAC9C,QAAM,MAAM;AACZ,MAAI,IAAI,IAAI,QAAQ,KAAK,EAAE;AAG3B,MAAI,EAAE,WAAW,GAAG;AAClB,QAAI,EACD,MAAM,EAAE,EACR,IAAI,CAAC,MAAM,IAAI,CAAC,EAChB,KAAK,EAAE;AAAA,EACZ;AAGA,MAAI,EAAE,WAAW,GAAG;AAClB,UAAM,QAAQ,KAAK,MAAO,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,MAAO,GAAG;AAClE,WAAO,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,IAAI;AAAA,EACxD;AAEA,SAAO,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,KAAK,IAAI;AACjD;AAEA,SAAS,eAAe,MAA0B;AAChD,QAAM,QAAQ,KAAK,MAAM,mDAAmD;AAC5E,MAAI,CAAC,OAAO;AACV,WAAO,EAAE,KAAK,UAAU,OAAO,KAAK,KAAK,KAAK;AAAA,EAChD;AAEA,QAAM,IAAI,SAAS,MAAM,CAAC,CAAC;AAC3B,QAAM,IAAI,SAAS,MAAM,CAAC,CAAC;AAC3B,QAAM,IAAI,SAAS,MAAM,CAAC,CAAC;AAC3B,QAAM,IAAI,MAAM,CAAC,IAAI,WAAW,MAAM,CAAC,CAAC,IAAI;AAE5C,QAAM,MAAM,CAAC,GAAG,GAAG,CAAC,EACjB,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAC1C,KAAK,EAAE,EACP,YAAY;AACf,QAAM,QAAQ,KAAK,MAAM,IAAI,GAAG;AAEhC,SAAO,EAAE,KAAK,OAAO,KAAK,KAAK;AACjC;AAEA,SAAS,gBAAgB,MAA0B;AAEjD,QAAM,MAAM,SAAS,cAAc,QAAQ,EAAE,WAAW,IAAI;AAC5D,MAAI,CAAC,KAAK;AACR,WAAO,EAAE,KAAK,UAAU,OAAO,KAAK,KAAK,KAAK;AAAA,EAChD;AAEA,MAAI,YAAY;AAChB,QAAM,WAAW,IAAI;AAErB,MAAI,SAAS,WAAW,GAAG,GAAG;AAC5B,WAAO,cAAc,QAAQ;AAAA,EAC/B;AACA,SAAO,eAAe,QAAQ;AAChC;AAEO,SAAS,gBAAgB,UAA8B;AAC5D,QAAM,MAAM,SAAS,KAAK;AAG1B,MAAI,QAAQ,eAAe;AACzB,WAAO,EAAE,KAAK,UAAU,OAAO,GAAG,IAAI;AAAA,EACxC;AAGA,MAAI,IAAI,WAAW,GAAG,GAAG;AACvB,WAAO,cAAc,GAAG;AAAA,EAC1B;AAGA,MAAI,IAAI,WAAW,KAAK,GAAG;AACzB,WAAO,eAAe,GAAG;AAAA,EAC3B;AAGA,SAAO,gBAAgB,GAAG;AAC5B;AAEA,IAAM,oBAAgC,EAAE,KAAK,UAAU,OAAO,GAAG,KAAK,cAAc;AAE7E,SAAS,uBAAuB,SAAuC;AAC5E,QAAM,WAAW,OAAO,iBAAiB,OAAO;AAEhD,QAAM,cAAc;AAAA,IAClB,EAAE,OAAO,SAAS,gBAAgB,OAAO,SAAS,gBAAgB,OAAO,SAAS,eAAe;AAAA,IACjG,EAAE,OAAO,SAAS,kBAAkB,OAAO,SAAS,kBAAkB,OAAO,SAAS,iBAAiB;AAAA,IACvG,EAAE,OAAO,SAAS,mBAAmB,OAAO,SAAS,mBAAmB,OAAO,SAAS,kBAAkB;AAAA,IAC1G,EAAE,OAAO,SAAS,iBAAiB,OAAO,SAAS,iBAAiB,OAAO,SAAS,gBAAgB;AAAA,EACtG;AACA,QAAM,oBAAoB,YAAY;AAAA,IACpC,CAAC,SAAS,KAAK,UAAU,UAAU,KAAK,UAAU,YAAY,WAAW,KAAK,KAAK,IAAI;AAAA,EACzF;AACA,QAAM,YAAY,QAAQ,iBAAiB;AAC3C,QAAM,aACJ,SAAS,iBAAiB,UAAU,WAAW,SAAS,YAAY,IAAI;AAE1E,SAAO;AAAA,IACL,iBAAiB,gBAAgB,SAAS,eAAe;AAAA,IACzD,OAAO,gBAAgB,SAAS,KAAK;AAAA,IACrC,aAAa,aAAa,oBAAoB,gBAAgB,kBAAkB,KAAK,IAAI;AAAA,IACzF,cAAc,aAAa,gBAAgB,SAAS,YAAY,IAAI;AAAA,EACtE;AACF;AAEO,IAAM,wBAA0D;AAAA,EACrE,iBAAiB;AAAA,EACjB,OAAO;AAAA,EACP,aAAa;AAAA,EACb,cAAc;AAChB;AAEA,IAAM,yBAA2D;AAAA,EAC/D,iBAAiB;AAAA,EACjB,OAAO;AAAA,EACP,aAAa;AAAA,EACb,cAAc;AAChB;AAEO,SAAS,gBACd,UACA,YACQ;AACR,QAAM,SAAS,uBAAuB,QAAQ;AAG9C,MAAI,WAAW,UAAU,KAAK;AAC5B,WAAO,GAAG,MAAM,MAAM,WAAW,GAAG;AAAA,EACtC;AACA,SAAO,GAAG,MAAM,MAAM,WAAW,GAAG,KAAK,WAAW,KAAK;AAC3D;AAEO,SAAS,eAAe,SAAmC;AAChE,QAAM,WAAW,OAAO,iBAAiB,OAAO;AAChD,QAAM,gBAAgB,QAAQ;AAE9B,QAAMC,mBAAkB,SAAS,YAAY,UAAU,SAAS,YAAY;AAE5E,MAAI,aAAa;AACjB,MAAI,eAAe;AACjB,UAAM,iBAAiB,OAAO,iBAAiB,aAAa;AAC5D,iBAAa,eAAe,YAAY,UAAU,eAAe,YAAY;AAAA,EAC/E;AAEA,SAAO;AAAA,IACL,SAAS,QAAQ,QAAQ,YAAY;AAAA,IACrC,IAAI,QAAQ,MAAM;AAAA,IAClB,WAAW,MAAM,KAAK,QAAQ,SAAS;AAAA,IACvC,iBAAAA;AAAA,IACA;AAAA,IACA,eAAe,cAAc,OAAO;AAAA,IACpC;AAAA,IACA,aAAa,QAAQ,SAAS,SAAS;AAAA,EACzC;AACF;AAOA,SAAS,YAAY,SAAsB,WAAwC;AACjF,QAAM,WAAW,OAAO,iBAAiB,OAAO;AAChD,QAAM,cAAc,QAAQ,MAAM,SAAS;AAE3C,MAAI,gBAAgB,OAAQ,QAAO;AAEnC,QAAM,gBAAgB,SAAS,SAAS;AAExC,MAAI,CAAC,aAAa;AAChB,UAAM,SAAS,QAAQ;AACvB,QAAI,QAAQ;AACV,YAAM,iBAAiB,OAAO,iBAAiB,MAAM;AACrD,UAAI,eAAe,YAAY,UAAU,eAAe,YAAY,eAAe;AACjF,cAAM,YAAY,SAAS;AAC3B,cAAM,WAAW,SAAS;AAC1B,YAAI,cAAc,UAAU,aAAa,KAAK;AAC5C,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,QAAI,cAAc,SAAS;AACzB,UAAI,SAAS,YAAY,WAAW,CAAC,aAAa;AAChD,eAAO;AAAA,MACT;AACA,UACE,SAAS,YAAY,kBACrB,SAAS,YAAY,iBACrB,SAAS,YAAY,UACrB;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,cAAc,UAAU;AAC1B,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAEA,MAAI,cAAc,SAAS,aAAa,KAAK,cAAc,SAAS,aAAa,GAAG;AAClF,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,oBAAoB,SAAwC;AAC1E,QAAM,OAAO,QAAQ,sBAAsB;AAC3C,QAAM,QAAQ,KAAK,MAAM,KAAK,KAAK;AACnC,QAAM,SAAS,KAAK,MAAM,KAAK,MAAM;AAErC,QAAM,aAAa,YAAY,SAAS,OAAO;AAC/C,QAAM,cAAc,YAAY,SAAS,QAAQ;AAEjD,SAAO;AAAA,IACL,OAAO,aAAa,OAAO,KAAK,KAAK,GAAG,KAAK;AAAA,IAC7C,QAAQ,cAAc,OAAO,MAAM,KAAK,GAAG,MAAM;AAAA,EACnD;AACF;AAGO,SAAS,4BAA4B,SAAsB,WAA4C;AAC5G,QAAM,SAAS,aAAa,QAAQ;AACpC,MAAI,CAAC,OAAQ,QAAO,CAAC;AAErB,QAAM,cAAc,QAAQ,sBAAsB;AAClD,QAAM,aAAa,OAAO,sBAAsB;AAIhD,QAAM,iBAAiB,WAAW,OAAO,OAAO;AAChD,QAAM,gBAAgB,WAAW,MAAM,OAAO;AAC9C,QAAM,kBAAkB,WAAW,OAAO,OAAO,aAAa,OAAO;AACrE,QAAM,mBAAmB,WAAW,MAAM,OAAO,YAAY,OAAO;AAEpE,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,MAAI,WAAW;AAIb,sBAAkB;AAClB,qBAAiB;AACjB,uBAAmB;AACnB,wBAAoB;AAAA,EACtB,OAAO;AAGL,UAAM,eAAe,OAAO,iBAAiB,MAAM;AACnD,sBAAkB,kBAAkB,WAAW,aAAa,WAAW,KAAK;AAC5E,qBAAiB,iBAAiB,WAAW,aAAa,UAAU,KAAK;AACzE,uBAAmB,mBAAmB,WAAW,aAAa,YAAY,KAAK;AAC/E,wBAAoB,oBAAoB,WAAW,aAAa,aAAa,KAAK;AAAA,EACpF;AAEA,QAAM,eAAkC,CAAC;AAEzC,QAAM,cAAc,KAAK,MAAM,YAAY,MAAM,cAAc;AAC/D,MAAI,cAAc,GAAG;AACnB,UAAM,OAAO,YAAY,OAAO,YAAY,QAAQ;AACpD,iBAAa,KAAK;AAAA,MAChB,WAAW;AAAA,MACX,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI,YAAY;AAAA,MAChB,UAAU;AAAA,MACV,eAAe,EAAE,GAAG,MAAM,IAAI,iBAAiB,YAAY,OAAO,EAAE;AAAA,IACtE,CAAC;AAAA,EACH;AAEA,QAAM,iBAAiB,KAAK,MAAM,oBAAoB,YAAY,MAAM;AACxE,MAAI,iBAAiB,GAAG;AACtB,UAAM,OAAO,YAAY,OAAO,YAAY,QAAQ;AACpD,iBAAa,KAAK;AAAA,MAChB,WAAW;AAAA,MACX,IAAI;AAAA,MACJ,IAAI,YAAY;AAAA,MAChB,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,eAAe,EAAE,GAAG,MAAM,IAAI,YAAY,SAAS,qBAAqB,EAAE;AAAA,IAC5E,CAAC;AAAA,EACH;AAEA,QAAM,eAAe,KAAK,MAAM,YAAY,OAAO,eAAe;AAClE,MAAI,eAAe,GAAG;AACpB,UAAM,OAAO,YAAY,MAAM,YAAY,SAAS;AACpD,iBAAa,KAAK;AAAA,MAChB,WAAW;AAAA,MACX,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI,YAAY;AAAA,MAChB,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,eAAe,EAAE,IAAI,kBAAkB,YAAY,QAAQ,GAAG,GAAG,KAAK;AAAA,IACxE,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,KAAK,MAAM,mBAAmB,YAAY,KAAK;AACrE,MAAI,gBAAgB,GAAG;AACrB,UAAM,OAAO,YAAY,MAAM,YAAY,SAAS;AACpD,iBAAa,KAAK;AAAA,MAChB,WAAW;AAAA,MACX,IAAI,YAAY;AAAA,MAChB,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,eAAe,EAAE,IAAI,YAAY,QAAQ,oBAAoB,GAAG,GAAG,KAAK;AAAA,IAC1E,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEO,SAAS,6BACd,MACA,IACmB;AACnB,QAAM,WAAW,KAAK,sBAAsB;AAC5C,QAAM,SAAS,GAAG,sBAAsB;AACxC,QAAM,eAAkC,CAAC;AAEzC,QAAM,oBACJ,SAAS,OAAO,OAAO,SAAS,SAAS,QAAQ,OAAO;AAC1D,QAAM,kBACJ,SAAS,MAAM,OAAO,UAAU,SAAS,SAAS,OAAO;AAE3D,MAAI,iBAAiB;AACnB,UAAM,aAAa,KAAK,IAAI,SAAS,KAAK,OAAO,GAAG;AACpD,UAAM,gBAAgB,KAAK,IAAI,SAAS,QAAQ,OAAO,MAAM;AAC7D,UAAM,QAAQ,aAAa,iBAAiB;AAE5C,QAAI,SAAS,SAAS,OAAO,MAAM;AACjC,YAAM,WAAW,KAAK,MAAM,OAAO,OAAO,SAAS,KAAK;AACxD,mBAAa,KAAK;AAAA,QAChB,WAAW;AAAA,QACX,IAAI,SAAS;AAAA,QACb,IAAI;AAAA,QACJ,IAAI,OAAO;AAAA,QACX,IAAI;AAAA,QACJ;AAAA,QACA,eAAe,EAAE,IAAI,SAAS,QAAQ,OAAO,QAAQ,GAAG,GAAG,KAAK;AAAA,MAClE,CAAC;AAAA,IACH,WAAW,SAAS,QAAQ,OAAO,OAAO;AACxC,YAAM,WAAW,KAAK,MAAM,SAAS,OAAO,OAAO,KAAK;AACxD,mBAAa,KAAK;AAAA,QAChB,WAAW;AAAA,QACX,IAAI,OAAO;AAAA,QACX,IAAI;AAAA,QACJ,IAAI,SAAS;AAAA,QACb,IAAI;AAAA,QACJ;AAAA,QACA,eAAe,EAAE,IAAI,OAAO,QAAQ,SAAS,QAAQ,GAAG,GAAG,KAAK;AAAA,MAClE,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,mBAAmB;AACrB,UAAM,cAAc,KAAK,IAAI,SAAS,MAAM,OAAO,IAAI;AACvD,UAAM,eAAe,KAAK,IAAI,SAAS,OAAO,OAAO,KAAK;AAC1D,UAAM,QAAQ,cAAc,gBAAgB;AAE5C,QAAI,SAAS,UAAU,OAAO,KAAK;AACjC,YAAM,WAAW,KAAK,MAAM,OAAO,MAAM,SAAS,MAAM;AACxD,mBAAa,KAAK;AAAA,QAChB,WAAW;AAAA,QACX,IAAI;AAAA,QACJ,IAAI,SAAS;AAAA,QACb,IAAI;AAAA,QACJ,IAAI,OAAO;AAAA,QACX;AAAA,QACA,eAAe,EAAE,GAAG,MAAM,IAAI,SAAS,SAAS,OAAO,OAAO,EAAE;AAAA,MAClE,CAAC;AAAA,IACH,WAAW,SAAS,OAAO,OAAO,QAAQ;AACxC,YAAM,WAAW,KAAK,MAAM,SAAS,MAAM,OAAO,MAAM;AACxD,mBAAa,KAAK;AAAA,QAChB,WAAW;AAAA,QACX,IAAI;AAAA,QACJ,IAAI,OAAO;AAAA,QACX,IAAI;AAAA,QACJ,IAAI,SAAS;AAAA,QACb;AAAA,QACA,eAAe,EAAE,GAAG,MAAM,IAAI,OAAO,SAAS,SAAS,OAAO,EAAE;AAAA,MAClE,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,CAAC,qBAAqB,CAAC,iBAAiB;AAC1C,UAAM,cAAc,SAAS,OAAO,SAAS,QAAQ;AACrD,UAAM,cAAc,SAAS,MAAM,SAAS,SAAS;AACrD,UAAM,YAAY,OAAO,OAAO,OAAO,QAAQ;AAC/C,UAAM,YAAY,OAAO,MAAM,OAAO,SAAS;AAE/C,UAAM,YAAY,YAAY,cAC1B,KAAK,MAAM,OAAO,OAAO,SAAS,KAAK,IACvC,KAAK,MAAM,SAAS,OAAO,OAAO,KAAK;AAE3C,QAAI,YAAY,GAAG;AACjB,YAAM,SAAS,YAAY,cAAc,SAAS,QAAQ,SAAS;AACnE,YAAM,OAAO,YAAY,cAAc,OAAO,OAAO,OAAO;AAC5D,YAAM,KAAK,cAAc,aAAa;AACtC,mBAAa,KAAK;AAAA,QAChB,WAAW;AAAA,QACX,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,UAAU;AAAA,QACV,eAAe,EAAE,IAAI,SAAS,QAAQ,GAAG,EAAE;AAAA,MAC7C,CAAC;AAAA,IACH;AAEA,UAAM,YAAY,YAAY,cAC1B,KAAK,MAAM,OAAO,MAAM,SAAS,MAAM,IACvC,KAAK,MAAM,SAAS,MAAM,OAAO,MAAM;AAE3C,QAAI,YAAY,GAAG;AACjB,YAAM,KAAK,cAAc,aAAa;AACtC,YAAM,SAAS,YAAY,cAAc,SAAS,SAAS,SAAS;AACpE,YAAM,OAAO,YAAY,cAAc,OAAO,MAAM,OAAO;AAC3D,mBAAa,KAAK;AAAA,QAChB,WAAW;AAAA,QACX,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,UAAU;AAAA,QACV,eAAe,EAAE,GAAG,IAAI,SAAS,QAAQ,EAAE;AAAA,MAC7C,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,sBAAsB;AAErB,SAAS,+BACd,SACA,YACA,eACmB;AACnB,MAAI,WAAW,WAAW,EAAG,QAAO,CAAC;AAErC,QAAM,OAAO,QAAQ,sBAAsB;AAC3C,QAAM,UAAU,OAAO;AACvB,QAAM,UAAU,OAAO;AACvB,QAAM,eAAkC,CAAC;AAEzC,aAAW,KAAK,YAAY;AAC1B,QAAI,EAAE,gBAAgB,cAAc;AAClC,YAAM,KAAK,EAAE,WAAW;AACxB,YAAM,OAAO,KAAK,OAAO,KAAK,QAAQ;AAGtC,UAAI,iBAAiB,KAAK,IAAI,cAAc,IAAI,EAAE,IAAI,oBAAqB;AAE3E,UAAI,KAAK,KAAK,KAAK;AACjB,cAAM,WAAW,KAAK,MAAM,KAAK,MAAM,EAAE;AACzC,YAAI,WAAW,GAAG;AAChB,uBAAa,KAAK;AAAA,YAChB,WAAW;AAAA,YACX,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,IAAI,KAAK;AAAA,YACT;AAAA,YACA,eAAe,EAAE,GAAG,MAAM,IAAI,KAAK,KAAK,OAAO,EAAE;AAAA,UACnD,CAAC;AAAA,QACH;AAAA,MACF,WAAW,KAAK,KAAK,QAAQ;AAC3B,cAAM,WAAW,KAAK,MAAM,KAAK,KAAK,MAAM;AAC5C,YAAI,WAAW,GAAG;AAChB,uBAAa,KAAK;AAAA,YAChB,WAAW;AAAA,YACX,IAAI;AAAA,YACJ,IAAI,KAAK;AAAA,YACT,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ;AAAA,YACA,eAAe,EAAE,GAAG,MAAM,IAAI,KAAK,SAAS,MAAM,EAAE;AAAA,UACtD,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,OAAO;AACL,YAAM,KAAK,EAAE,WAAW;AACxB,YAAM,OAAO,KAAK,MAAM,KAAK,SAAS;AAGtC,UAAI,iBAAiB,KAAK,IAAI,cAAc,IAAI,EAAE,IAAI,oBAAqB;AAE3E,UAAI,KAAK,KAAK,MAAM;AAClB,cAAM,WAAW,KAAK,MAAM,KAAK,OAAO,EAAE;AAC1C,YAAI,WAAW,GAAG;AAChB,uBAAa,KAAK;AAAA,YAChB,WAAW;AAAA,YACX,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,IAAI,KAAK;AAAA,YACT,IAAI;AAAA,YACJ;AAAA,YACA,eAAe,EAAE,IAAI,KAAK,KAAK,QAAQ,GAAG,GAAG,KAAK;AAAA,UACpD,CAAC;AAAA,QACH;AAAA,MACF,WAAW,KAAK,KAAK,OAAO;AAC1B,cAAM,WAAW,KAAK,MAAM,KAAK,KAAK,KAAK;AAC3C,YAAI,WAAW,GAAG;AAChB,uBAAa,KAAK;AAAA,YAChB,WAAW;AAAA,YACX,IAAI,KAAK;AAAA,YACT,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ;AAAA,YACA,eAAe,EAAE,IAAI,KAAK,QAAQ,MAAM,GAAG,GAAG,KAAK;AAAA,UACrD,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,gBAAgB,SAA+B;AAC7D,QAAM,WAAW,OAAO,iBAAiB,OAAO;AAChD,SAAO,SAAS,YAAY,UAAU,SAAS,YAAY;AAC7D;AAEO,SAAS,iBACd,SACqD;AACrD,QAAM,WAAW,OAAO,iBAAiB,OAAO;AAChD,SAAO,SAAS;AAClB;AAEO,SAAS,wBACd,WACA,SACwD;AACxD,QAAM,WAAW,OAAO,iBAAiB,SAAS;AAGlD,MAAI,SAAS,YAAY,UAAU,SAAS,YAAY,eAAe;AACrE,UAAM,MAAM,SAAS;AACrB,WAAO;AAAA,MACL,MAAO,QAAQ,SAAS,QAAQ,gBAAiB,eAAe;AAAA,MAChE,UAAU,QAAQ,iBAAiB,QAAQ;AAAA,IAC7C;AAAA,EACF;AAGA,QAAM,UAAyB,CAAC;AAChC,aAAW,KAAK,UAAU,UAAU;AAClC,QAAI,EAAE,aAAa,gBAAgB,MAAM,QAAS;AAClD,UAAM,KAAK,OAAO,iBAAiB,CAAC;AACpC,QAAI,GAAG,YAAY,UAAU,GAAG,aAAa,cAAc,GAAG,aAAa,QAAS;AACpF,YAAQ,KAAK,CAAC;AACd,QAAI,QAAQ,WAAW,EAAG;AAAA,EAC5B;AAEA,MAAI,QAAQ,SAAS,EAAG,QAAO,EAAE,MAAM,YAAY,UAAU,MAAM;AAEnE,QAAM,QAAQ,QAAQ,CAAC,EAAE,sBAAsB;AAC/C,QAAM,SAAS,QAAQ,CAAC,EAAE,sBAAsB;AAChD,QAAM,WAAW,MAAM,SAAS,IAAI,OAAO,OAAO,OAAO,SAAS,IAAI,MAAM;AAE5E,MAAI,UAAU;AACZ,WAAO,EAAE,MAAM,cAAc,UAAU,OAAO,QAAQ,MAAM,KAAK;AAAA,EACnE;AACA,SAAO,EAAE,MAAM,YAAY,UAAU,OAAO,SAAS,MAAM,IAAI;AACjE;AAEA,SAAS,aAAa,IAAgC;AACpD,SAAO,MAAM,KAAK,GAAG,QAAQ,EAAE;AAAA,IAC7B,CAAC,UAAgC,iBAAiB;AAAA,EACpD;AACF;AAGA,SAAS,iBACP,SACA,UACwD;AACxD,MAAI,UAA8B;AAClC,SAAO,WAAW,YAAY,SAAS,MAAM;AAC3C,UAAM,SAA6B,QAAQ;AAC3C,QAAI,CAAC,OAAQ;AACb,UAAM,UAAU,iBAAiB,MAAM,EAAE;AACzC,QAAI,YAAY,UAAU,YAAY,eAAe;AACnD,aAAO,EAAE,YAAY,QAAQ,OAAO,QAAQ;AAAA,IAC9C;AACA,QAAI,YAAY,WAAW,SAAU;AACrC,cAAU;AAAA,EACZ;AACA,SAAO;AACT;AAEO,SAAS,sBACd,cACA,iBACgE;AAChE,MACE,CAAC,gBACD,iBAAiB,SAAS,QAC1B,iBAAiB,SAAS,mBAC1B,aAAa,QAAQ,oBAAoB,KACzC,aAAa,QAAQ,yBAAyB,KAC9C,iBAAiB,iBACjB;AACA,WAAO;AAAA,EACT;AAGA,QAAM,WAAW,iBAAiB,SAAS,YAAY,IAAI,kBAAkB;AAE7E,QAAM,aAAa,iBAAiB,YAAY,EAAE;AAClD,MAAI,eAAe,UAAU,eAAe,eAAe;AACzD,WAAO,EAAE,eAAe,cAAc,UAAU,aAAa,YAAY,EAAE;AAAA,EAC7E;AAEA,QAAM,QAAQ,iBAAiB,cAAc,QAAQ;AACrD,MAAI,OAAO;AACT,WAAO,EAAE,eAAe,MAAM,YAAY,UAAU,aAAa,MAAM,UAAU,EAAE;AAAA,EACrF;AAEA,SAAO,EAAE,eAAe,cAAc,UAAU,CAAC,EAAE;AACrD;AAEO,SAAS,qBACd,cACA,iBACa;AACb,QAAM,WAAW,iBAAiB,SAAS,YAAY,IAAI,kBAAkB;AAC7E,QAAM,QAAQ,iBAAiB,cAAc,QAAQ;AACrD,MAAI,SAAS,MAAM,eAAe,SAAU,QAAO;AACnD,SAAO,OAAO,SAAS;AACzB;AAsGO,SAAS,iBACd,QACA,SACA,SACoB;AACpB,QAAM,WAAW,aAAa,MAAM;AACpC,MAAI,SAAS,WAAW,EAAG,QAAO;AAGlC,QAAM,MAAM,SAAS,KAAK,CAAC,UAAU;AACnC,UAAM,IAAI,MAAM,sBAAsB;AACtC,WAAO,WAAW,EAAE,QAAQ,WAAW,EAAE,SAAS,WAAW,EAAE,OAAO,WAAW,EAAE;AAAA,EACrF,CAAC;AACD,MAAI,IAAK,QAAO;AAGhB,MAAI,SAAS,WAAW,KAAK,CAAC,2BAA2B,MAAM,EAAG,QAAO,SAAS,CAAC;AAEnF,SAAO;AACT;AAEO,SAAS,gCAAgC,GAAW,GAA+B;AACxF,QAAM,OAAO,SAAS,cAA2B,yBAAyB;AAC1E,MAAI,KAAM,MAAK,MAAM,UAAU;AAC/B,QAAM,KAAK,SAAS,iBAAiB,GAAG,CAAC;AACzC,MAAI,KAAM,MAAK,MAAM,UAAU;AAC/B,SAAO;AACT;AAEA,SAAS,kBAAkB,SAA+B;AACxD,QAAM,UAAU,OAAO,iBAAiB,OAAO,EAAE;AACjD,SACE,YAAY,UACZ,YAAY,iBACZ,YAAY,UACZ,YAAY;AAEhB;AAEA,SAAS,iBAAiB,SAA+B;AACvD,QAAM,UAAU,OAAO,iBAAiB,OAAO,EAAE;AACjD,SAAO,YAAY,WAAW,YAAY,eACnC,YAAY,kBAAkB,YAAY;AACnD;AAEA,SAAS,YAAY,IAAiB,SAAsC;AAC1E,MAAI,WAAW,QAAQ,SAAS,EAAE,EAAG,QAAO;AAC5C,MAAI,OAAO,SAAS,QAAQ,OAAO,SAAS,gBAAiB,QAAO;AACpE,MAAI,GAAG,QAAQ,oBAAoB,KAAK,GAAG,QAAQ,yBAAyB,EAAG,QAAO;AACtF,SAAO;AACT;AAEA,SAAS,0BAA0B,GAAW,GAAW,SAAiD;AACxG,QAAM,KAAK,gCAAgC,GAAG,CAAC;AAC/C,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI,UAA8B;AAClC,SAAO,SAAS;AACd,QAAI,CAAC,YAAY,SAAS,OAAO,GAAG;AAClC,UAAI,kBAAkB,OAAO,KAAK,iBAAiB,OAAO,EAAG,QAAO;AAAA,IACtE;AACA,cAAU,QAAQ;AAAA,EACpB;AACA,SAAO;AACT;AAEO,SAAS,qBACd,GACA,GACA,SACA,iBACoB;AACpB,QAAM,OAAO,SAAS,cAA2B,yBAAyB;AAC1E,MAAI,KAAM,MAAK,MAAM,UAAU;AAE/B,QAAM,WAAW,SAAS,kBAAkB,GAAG,CAAC;AAEhD,MAAI,KAAM,MAAK,MAAM,UAAU;AAG/B,aAAW,MAAM,UAAU;AACzB,QAAI,YAAY,IAAI,OAAO,EAAG;AAC9B,QAAI,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,EAAG,QAAO;AAAA,EAC5D;AAGA,MAAI,oBAAoB,kBAAkB,eAAe,KAAK,iBAAiB,eAAe,IAAI;AAChG,eAAW,MAAM,UAAU;AACzB,UAAI,OAAO,gBAAiB,QAAO;AAAA,IACrC;AAAA,EACF;AAGA,SAAO,0BAA0B,GAAG,GAAG,OAAO;AAChD;AAEO,SAAS,sBACd,WACA,UACA,UACA,gBACuE;AACvE,QAAM,EAAE,MAAM,UAAU,WAAW,IAAI,wBAAwB,WAAW,cAAc;AACxF,QAAM,eAAe,SAAS;AAE9B,QAAM,WAAW,MAAM,KAAK,UAAU,QAAQ,EAAE;AAAA,IAC9C,CAAC,UAAU,UAAU,kBAAkB,iBAAiB;AAAA,EAC1D;AAEA,MAAI,SAAS,WAAW,GAAG;AACzB,UAAMC,iBAAgB,UAAU,sBAAsB;AACtD,WAAO;AAAA,MACL,cAAc;AAAA,MACd,WAAW;AAAA,QACT,GAAGA,eAAc,OAAO;AAAA,QACxB,GAAGA,eAAc,MAAM;AAAA,QACvB,OAAO,eAAe,IAAIA,eAAc,QAAQ;AAAA,QAChD,QAAQ,eAAeA,eAAc,SAAS,IAAI;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB,UAAU,sBAAsB;AACtD,MAAI,eAAmC;AACvC,MAAI,oBAAoB;AAExB,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,UAAM,QAAQ,SAAS,CAAC;AACxB,UAAM,OAAO,MAAM,sBAAsB;AACzC,UAAM,WAAW,eACb,KAAK,OAAO,KAAK,QAAQ,IACzB,KAAK,MAAM,KAAK,SAAS;AAE7B,UAAM,UAAU,eAAe,WAAW;AAE1C,UAAM,iBAAiB,aAAa,UAAU,WAAW,UAAU;AAEnE,QAAI,gBAAgB;AAClB,qBAAe;AACf,0BAAoB,eAAe,KAAK,OAAO,KAAK;AACpD;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,cAAc;AACjB,UAAM,YAAY,SAAS,SAAS,SAAS,CAAC;AAC9C,UAAM,WAAW,UAAU,sBAAsB;AACjD,wBAAoB,eAAe,SAAS,QAAQ,SAAS;AAAA,EAC/D;AAEA,QAAM,YAA2B,eAC7B;AAAA,IACE,GAAG;AAAA,IACH,GAAG,cAAc,MAAM;AAAA,IACvB,OAAO;AAAA,IACP,QAAQ,cAAc,SAAS;AAAA,EACjC,IACA;AAAA,IACE,GAAG,cAAc,OAAO;AAAA,IACxB,GAAG;AAAA,IACH,OAAO,cAAc,QAAQ;AAAA,IAC7B,QAAQ;AAAA,EACV;AAEJ,SAAO,EAAE,cAAc,UAAU;AACnC;AAMA,SAAS,mBAAmB,SAAkC;AAC5D,MAAI,OAAO,WAAW,aAAa;AACjC,UAAM,WAAW,OAAO;AACxB,QAAI,UAAU,oBAAoB;AAChC,YAAM,QAAQ,SAAS,mBAAmB,OAAO;AACjD,UAAI,MAAO,QAAO;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,WAAW,OAAO,KAAK,OAAO,EAAE;AAAA,IACpC,CAAC,QAAQ,IAAI,WAAW,eAAe,KAAK,IAAI,WAAW,0BAA0B;AAAA,EACvF;AAEA,MAAI,CAAC,SAAU,QAAO;AACtB,SAAQ,QAAgB,QAAQ,KAAK;AACvC;AAGA,SAAS,mBAAmB,OAMnB;AACP,QAAM,cAAc,OAAO;AAC3B,MAAI,aAAa,SAAU,QAAO;AAElC,QAAM,QAAQ,OAAO;AACrB,QAAM,eAAe,OAAO,cAAc;AAC1C,MAAI,cAAc,SAAU,QAAO;AAEnC,QAAM,YAAY,OAAO,eAAe;AACxC,MAAI,WAAW,SAAU,QAAO;AAEhC,QAAM,UAAU,OAAO,cAAc;AACrC,MAAI,SAAS,SAAU,QAAO;AAE9B,QAAM,OAAO,OAAO,eAAe;AACnC,MAAI,MAAM,SAAU,QAAO;AAE3B,SAAO;AACT;AAGA,SAAS,WAAW,OAAwC;AAC1D,QAAM,OAAO,OAAO;AACpB,MAAI,OAAO,SAAS,cAAc,OAAO,SAAS,SAAU,QAAO;AAEnE,QAAM,OAAO,MAAM,eAAe,MAAM,QAAQ;AAChD,MAAI,CAAC,QAAQ,SAAS,WAAY,QAAO;AAEzC,QAAM,QAA6B,EAAE,KAAK;AAC1C,QAAM,SAAS,mBAAmB,KAAK;AACvC,MAAI,QAAQ,UAAU;AACpB,UAAM,OAAO,OAAO;AACpB,QAAI,OAAO,OAAO,eAAe,UAAU;AACzC,YAAM,OAAO,OAAO;AAAA,IACtB;AACA,QAAI,OAAO,OAAO,iBAAiB,UAAU;AAC3C,YAAM,SAAS,OAAO;AAAA,IACxB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBACP,OACA,WACS;AACT,MAAI,CAAC,UAAW,QAAO;AACvB,MAAI,MAAM,SAAS,UAAU,KAAM,QAAO;AAC1C,MAAI,CAAC,UAAU,QAAQ,MAAM,KAAM,QAAO;AAC1C,MAAI,UAAU,QAAQ,MAAM,QAAQ,UAAU,QAAQ,QAAQ,MAAM,QAAQ,KAAM,QAAO;AACzF,MACE,UAAU,QACV,MAAM,QACN,UAAU,QAAQ,QAClB,MAAM,QAAQ,QACd,UAAU,UAAU,QACpB,MAAM,UAAU,MAChB;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAGA,SAAS,cAAc,OAAmC;AACxD,QAAM,SAAgC,CAAC;AACvC,MAAI,UAAU;AACd,MAAI,YAAwC;AAE5C,SAAO,SAAS;AACd,UAAM,QAAQ,WAAW,OAAO;AAChC,QAAI,SAAS,mBAAmB,OAAO,SAAS,GAAG;AACjD,aAAO,KAAK,KAAK;AACjB,kBAAY;AAAA,IACd;AACA,cAAU,QAAQ;AAAA,EACpB;AAEA,SAAO;AACT;AAGA,SAAS,eAAe,OAAmC;AACzD,QAAM,SAAgC,CAAC;AACvC,MAAI,UAAU;AACd,MAAI,YAAwC;AAE5C,SAAO,SAAS;AACd,UAAM,QAAQ,WAAW,OAAO;AAChC,QAAI,SAAS,mBAAmB,OAAO,SAAS,GAAG;AACjD,aAAO,KAAK,KAAK;AACjB,kBAAY;AAAA,IACd;AACA,cAAU,QAAQ;AAAA,EACpB;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,SAA6C;AAC3E,QAAM,QAAQ,mBAAmB,OAAO;AACxC,MAAI,CAAC,MAAO,QAAO,CAAC;AAEpB,QAAM,aAAa,cAAc,KAAK;AACtC,MAAI,WAAW,SAAS,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,SAAO,eAAe,KAAK;AAC7B;AAEO,SAAS,sBAAsB,SAA8B;AAClE,SAAO,QAAQ,QAAQ,YAAY;AACrC;AAEA,IAAM,oBAAoB,CAAC,eAAe,WAAW,WAAW,cAAc,MAAM;AACpF,IAAM,qBAAqB;AAE3B,SAAS,oBAAoB,OAAuB;AAClD,MAAI,OAAO,QAAQ,eAAe,OAAO,IAAI,WAAW,YAAY;AAClE,WAAO,IAAI,OAAO,KAAK;AAAA,EACzB;AACA,SAAO,MAAM,QAAQ,mBAAmB,CAAC,SAAS,KAAK,IAAI,EAAE;AAC/D;AAEA,SAAS,qBAAqB,OAAuB;AACnD,SAAO,MAAM,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK;AACzD;AAEA,SAAS,iBAAiB,UAA2B;AACnD,MAAI,OAAO,aAAa,YAAa,QAAO;AAC5C,MAAI;AACF,WAAO,SAAS,iBAAiB,QAAQ,EAAE,WAAW;AAAA,EACxD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,oBAAoB,SAAqC;AAChE,MAAI,CAAC,QAAQ,GAAI,QAAO;AACxB,QAAM,WAAW,IAAI,oBAAoB,QAAQ,EAAE,CAAC;AACpD,SAAO,iBAAiB,QAAQ,IAAI,WAAW;AACjD;AAEA,SAAS,2BAA2B,SAAqC;AACvE,QAAM,UAAU,QAAQ,QAAQ,YAAY;AAC5C,aAAW,QAAQ,mBAAmB;AACpC,UAAM,QAAQ,QAAQ,aAAa,IAAI;AACvC,QAAI,CAAC,MAAO;AACZ,UAAM,WAAW,GAAG,OAAO,IAAI,IAAI,KAAK,qBAAqB,KAAK,CAAC;AACnE,QAAI,iBAAiB,QAAQ,GAAG;AAC9B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,SAA8B;AAC1D,QAAM,UAAU,QAAQ,QAAQ,YAAY;AAC5C,QAAM,UAAU,MAAM,KAAK,QAAQ,SAAS,EACzC,OAAO,CAAC,cAAc,aAAa,CAAC,UAAU,WAAW,aAAa,CAAC,EACvE,MAAM,GAAG,CAAC;AACb,QAAM,gBAAgB,QAAQ,IAAI,CAAC,cAAc,IAAI,oBAAoB,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE;AAE9F,MAAI,YAAY;AAChB,QAAM,SAAS,QAAQ;AACvB,MAAI,QAAQ;AACV,UAAM,WAAW,MAAM,KAAK,OAAO,QAAQ,EAAE;AAAA,MAC3C,CAAC,UAAW,MAAsB,QAAQ,YAAY,MAAM;AAAA,IAC9D;AACA,QAAI,SAAS,SAAS,GAAG;AACvB,YAAM,QAAQ,SAAS,QAAQ,OAAO,IAAI;AAC1C,kBAAY,gBAAgB,KAAK;AAAA,IACnC;AAAA,EACF;AAEA,SAAO,GAAG,OAAO,GAAG,aAAa,GAAG,SAAS;AAC/C;AAEA,SAAS,iBAAiB,SAA8B;AACtD,MAAI,OAAO,aAAa,aAAa;AACnC,WAAO,QAAQ,QAAQ,YAAY;AAAA,EACrC;AACA,MAAI,QAAQ,QAAQ,oBAAoB,EAAG,QAAO;AAElD,QAAM,WAAW,oBAAoB,OAAO;AAC5C,MAAI,SAAU,QAAO;AAErB,QAAM,kBAAkB,2BAA2B,OAAO;AAC1D,MAAI,gBAAiB,QAAO;AAE5B,QAAM,WAAqB,CAAC;AAC5B,MAAI,UAA8B;AAClC,MAAI,QAAQ;AAEZ,SAAO,WAAW,YAAY,SAAS,QAAQ,QAAQ,oBAAoB;AACzE,QAAI,QAAQ,aAAa,kBAAkB,GAAG;AAC5C,gBAAU,QAAQ;AAClB;AAAA,IACF;AAEA,QAAI,QAAQ,GAAG;AACb,YAAM,WAAW,oBAAoB,OAAO;AAC5C,UAAI,UAAU;AACZ,iBAAS,QAAQ,QAAQ;AACzB;AAAA,MACF;AACA,YAAM,mBAAmB,2BAA2B,OAAO;AAC3D,UAAI,kBAAkB;AACpB,iBAAS,QAAQ,gBAAgB;AACjC;AAAA,MACF;AAAA,IACF;AAEA,aAAS,QAAQ,qBAAqB,OAAO,CAAC;AAC9C,cAAU,QAAQ;AAClB,aAAS;AAAA,EACX;AAEA,SAAO,SAAS,KAAK,KAAK;AAC5B;AAEA,SAAS,qBAAqB,MAAe;AAC3C,QAAM,QAAQ,KAAK,iBAAiB,oBAAoB;AACxD,QAAM,QAAQ,CAAC,SAAS,KAAK,OAAO,CAAC;AACvC;AAEA,SAAS,gBAAgB,SAA8B;AACrD,QAAM,UAAU,QAAQ,QAAQ,YAAY;AAC5C,QAAM,QAAkB,CAAC;AACzB,QAAM,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,gBAAgB;AAEtB,aAAW,QAAQ,WAAW;AAC5B,UAAM,QAAQ,QAAQ,aAAa,IAAI;AACvC,QAAI,CAAC,MAAO;AACZ,UAAM,UAAU,MAAM,SAAS,gBAAgB,GAAG,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,QAAQ;AAC3F,UAAM,KAAK,GAAG,IAAI,KAAK,qBAAqB,OAAO,CAAC,GAAG;AAAA,EACzD;AAEA,QAAM,OAAO,eAAe,OAAO;AACnC,QAAM,aAAa,MAAM,SAAS,IAAI,IAAI,MAAM,KAAK,GAAG,CAAC,KAAK;AAE9D,MAAI,MAAM;AACR,WAAO,IAAI,OAAO,GAAG,UAAU;AAAA,IAAQ,WAAW,IAAI,CAAC;AAAA,IAAO,OAAO;AAAA,EACvE;AAEA,SAAO,IAAI,OAAO,GAAG,UAAU,MAAM,OAAO;AAC9C;AAEA,SAAS,iBAAiB,MAAsB;AAC9C,QAAM,aAAa,KAChB,QAAQ,OAAO,GAAG,EAClB,QAAQ,mBAAmB,EAAE,EAC7B,QAAQ,iBAAiB,EAAE,EAC3B,QAAQ,cAAc,EAAE,EACxB,QAAQ,WAAW,EAAE,EACrB,QAAQ,UAAU,EAAE;AACvB,QAAM,gBAAgB,WAAW,QAAQ,YAAY;AACrD,MAAI,kBAAkB,IAAI;AACxB,WAAO,aAAa,WAAW,MAAM,aAAa,CAAC;AAAA,EACrD;AACA,QAAM,WAAW,WAAW,QAAQ,OAAO;AAC3C,MAAI,aAAa,IAAI;AACnB,WAAO,aAAa,WAAW,MAAM,QAAQ,CAAC;AAAA,EAChD;AACA,QAAM,WAAW,WAAW,QAAQ,OAAO;AAC3C,MAAI,aAAa,IAAI;AACnB,WAAO,aAAa,WAAW,MAAM,QAAQ,CAAC;AAAA,EAChD;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,MAAc,MAAe,QAAyB;AAClF,QAAM,YAAY,iBAAiB,IAAI;AACvC,MAAI,OAAO,SAAS,UAAU;AAC5B,UAAM,eAAe,OAAO,WAAW,WAAW,IAAI,MAAM,KAAK;AACjE,WAAO,GAAG,SAAS,IAAI,IAAI,GAAG,YAAY;AAAA,EAC5C;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,MAAuB;AAC/C,QAAM,aAAa,KAAK,QAAQ,OAAO,GAAG;AAC1C,MACE,WAAW,SAAS,cAAc,KAClC,WAAW,SAAS,WAAW,KAC/B,WAAW,SAAS,OAAO,KAC3B,WAAW,SAAS,WAAW,KAC/B,WAAW,SAAS,aAAa,GACjC;AACA,WAAO;AAAA,EACT;AACA,SACE,WAAW,SAAS,OAAO,KAC3B,WAAW,SAAS,OAAO,KAC3B,WAAW,SAAS,YAAY,KAChC,WAAW,WAAW,IAAI;AAE9B;AAEA,SAAS,gBAAgB,SAAqD;AAC5E,aAAW,SAAS,QAAQ,YAAY;AACtC,QAAI,MAAM,QAAQ,iBAAiB,MAAM,IAAI,GAAG;AAC9C,aAAO;AAAA,IACT;AAAA,EACF;AACA,aAAW,SAAS,QAAQ,YAAY;AACtC,QAAI,MAAM,MAAM;AACd,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,QAAQ,WAAW,CAAC,KAAK;AAClC;AAEA,SAAS,WAAW,OAAuB;AACzC,SAAO,MACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ;AAC3B;AAEA,SAAS,oBACP,SACA,SACQ;AACR,QAAM,SAAS,QAAQ;AACvB,MAAI,CAAC,QAAQ;AACX,WAAO,QAAQ;AAAA,EACjB;AAEA,QAAM,cAAc,OAAO,UAAU,KAAK;AAC1C,QAAM,WAAW,MAAM,KAAK,OAAO,QAAQ;AAC3C,QAAM,gBAAgB,SAAS,QAAQ,OAAO;AAC9C,MAAI,QAAQ;AAEZ,MAAI,SAAS,gBAAgB,QAAQ,eAAe,KAAK,iBAAiB,GAAG;AAC3E,UAAM,QAAQ,KAAK,IAAI,GAAG,gBAAgB,QAAQ,YAAY;AAC9D,UAAM,MAAM,KAAK,IAAI,SAAS,QAAQ,gBAAgB,QAAQ,eAAe,CAAC;AAC9E,YAAQ,SAAS,MAAM,OAAO,GAAG;AAAA,EACnC;AAEA,aAAW,WAAW,OAAO;AAC3B,QAAI,QAAQ,QAAQ,oBAAoB,EAAG;AAC3C,UAAM,QAAQ,QAAQ,UAAU,IAAI;AACpC,QAAI,YAAY,SAAS;AACvB,YAAM,aAAa,2BAA2B,MAAM;AAAA,IACtD;AACA,yBAAqB,KAAK;AAC1B,gBAAY,YAAY,KAAK;AAAA,EAC/B;AAEA,SAAO,YAAY;AACrB;AAEA,SAAS,eAAe,SAA8B;AACpD,QAAM,OAAO,QAAQ,eAAe;AACpC,QAAM,UAAU,KAAK,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAC/C,MAAI,QAAQ,UAAU,KAAK;AACzB,WAAO;AAAA,EACT;AACA,SAAO,GAAG,QAAQ,MAAM,GAAG,GAAG,CAAC;AACjC;AAEA,SAAS,eAAe,SAAgD;AACtE,QAAM,QAAQ,QAAQ,aAAa,yBAAyB;AAC5D,MAAI,CAAC,MAAO,QAAO;AAEnB,MAAI,OAAO;AACX,MAAI;AACJ,MAAI;AAEJ,QAAM,YAAY,MAAM,YAAY,GAAG;AACvC,MAAI,cAAc,IAAI;AACpB,UAAM,cAAc,OAAO,MAAM,MAAM,YAAY,CAAC,CAAC;AACrD,QAAI,CAAC,OAAO,MAAM,WAAW,GAAG;AAC9B,eAAS;AACT,aAAO,MAAM,MAAM,GAAG,SAAS;AAE/B,YAAM,YAAY,KAAK,YAAY,GAAG;AACtC,UAAI,cAAc,IAAI;AACpB,cAAM,YAAY,OAAO,KAAK,MAAM,YAAY,CAAC,CAAC;AAClD,YAAI,CAAC,OAAO,MAAM,SAAS,GAAG;AAC5B,iBAAO;AACP,iBAAO,KAAK,MAAM,GAAG,SAAS;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,MAAM,OAAO;AAC9B;AAEO,SAAS,kBAAkB,SAAsC;AACtE,QAAM,cAAc,eAAe,OAAO;AAC1C,MAAI,YAAY,eAAe,OAAO;AAItC,MAAI,CAAC,WAAW;AACd,UAAM,QAAQ,mBAAmB,OAAO;AACxC,QAAI,OAAO;AACT,YAAM,cAAc,mBAAmB,KAAK;AAC5C,UAAI,aAAa,UAAU;AACzB,oBAAY;AAAA,UACV,MAAM,YAAY;AAAA,UAClB,MAAM,YAAY;AAAA,UAClB,QAAQ,YAAY;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,YAAY,uBAAuB,OAAO;AAAA,IAC1C,aAAa,iBAAiB,OAAO;AAAA,IACrC,gBAAgB,oBAAoB,OAAO;AAAA,IAC3C,YAAY,gBAAgB,OAAO;AAAA,IACnC,aAAa,eAAe,OAAO;AAAA,IACnC,SAAS,YAAY;AAAA,IACrB,IAAI,YAAY;AAAA,IAChB,WAAW,YAAY;AAAA,IACvB,WAAW,aAAa;AAAA,EAC1B;AACF;AAQO,SAAS,oBAAoB,SAAiC;AACnE,QAAM,QAAkB,CAAC;AAEzB,QAAM,eAAe,gBAAgB,OAAO;AAC5C,QAAM,iBAAiB,cAAc,OAAO,aAAa,OAAO,QAAQ;AACxE,QAAM,kBAAkB,QAAQ,WAAW,OACvC,qBAAqB,QAAQ,UAAU,MAAM,QAAQ,UAAU,MAAM,QAAQ,UAAU,MAAM,IAC7F,cAAc,OACZ,qBAAqB,aAAa,MAAM,aAAa,MAAM,aAAa,MAAM,IAC9E;AAEN,QAAM,KAAK,KAAK,cAAc,GAAG;AACjC,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,QAAQ,cAAc,QAAQ,kBAAkB,EAAE;AAC7D,QAAM,KAAK,MAAM,mBAAmB,sBAAsB,EAAE;AAE5D,MAAI,CAAC,iBAAiB;AACpB,UAAM,WAAW,QAAQ,aAAa,KAAK;AAC3C,UAAM,OAAO,QAAQ,aAAa,KAAK;AACvC,QAAI,UAAU;AACZ,YAAM,KAAK,aAAa,QAAQ,EAAE;AAAA,IACpC;AACA,QAAI,MAAM;AACR,YAAM,KAAK,SAAS,IAAI,EAAE;AAAA,IAC5B;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAgBO,SAAS,gBACd,MACA,MACA,MACA,MACA,MACA,MACA,MACQ;AACR,QAAM,YAAY,QAAQ,QAAQ,OAAO,SAAS,YAAY,iBAAiB,IAAI;AACnF,MAAI,CAAC,WAAW;AACd,SAAK;AACL,SAAK;AACL,SAAK;AAAA,EACP;AACA,QAAM,iBAAiB,YAAa,OAAkC,SAAS,CAAC;AAChF,QAAM,WAAW,aAAa,QAAQ,OAAO,SAAS,YAAY,kBAAkB,OAC/E,OACD;AACJ,MAAI;AAEJ,MAAI,WAAW;AACb,cAAU;AAAA,EACZ,OAAO;AACL,UAAM,UAAU;AAChB,UAAM,cAAc;AACpB,cAAU,UACN,kBAAkB,OAAO,IACzB;AAAA,MACE,YAAY,CAAC;AAAA,MACb,aAAa,YAAY,KAAK,IAAI,YAAY,EAAE,KAAK,YAAY;AAAA,MACjE,gBAAgB,IAAI,YAAY,OAAO,GAAG,YAAY,KAAK,QAAQ,YAAY,EAAE,MAAM,EAAE,qCAAqC,YAAY,OAAO;AAAA,MACjJ,YAAY,IAAI,YAAY,OAAO,GAAG,YAAY,KAAK,QAAQ,YAAY,EAAE,MAAM,EAAE,MAAM,YAAY,OAAO;AAAA,MAC9G,aAAa;AAAA,MACb,SAAS,YAAY;AAAA,MACrB,IAAI,YAAY;AAAA,MAChB,WAAW,YAAY;AAAA,IACzB;AAAA,EACN;AAEA,QAAM,UAA0B,CAAC;AAEjC,aAAW,CAAC,UAAU,KAAK,KAAK,OAAO,QAAQ,aAAa,GAAG;AAC7D,UAAM,gBAAgB,iBAAiB,EAAE,CAAC,QAAQ,GAAG,MAAM,CAAC;AAC5D,YAAQ,KAAK;AAAA,MACX;AAAA,MACA;AAAA,MACA,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,QAAM,QAAkB,CAAC;AAEzB,QAAM,eAAe,gBAAgB,OAAO;AAC5C,QAAM,iBAAiB,cAAc,OAAO,aAAa,OAAO,QAAQ;AACxE,QAAM,kBAAkB,QAAQ,WAAW,OACvC,qBAAqB,QAAQ,UAAU,MAAM,QAAQ,UAAU,MAAM,QAAQ,UAAU,MAAM,IAC7F,cAAc,OACZ,qBAAqB,aAAa,MAAM,aAAa,MAAM,aAAa,MAAM,IAC9E;AAEN,QAAM,KAAK,KAAK,cAAc,GAAG;AACjC,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,QAAQ,cAAc,QAAQ,kBAAkB,EAAE;AAC7D,QAAM,KAAK,MAAM,mBAAmB,sBAAsB,EAAE;AAE5D,MAAI,CAAC,iBAAiB;AACpB,UAAM,WAAW,QAAQ,aAAa,KAAK;AAC3C,UAAM,OAAO,QAAQ,aAAa,KAAK;AACvC,QAAI,UAAU;AACZ,YAAM,KAAK,aAAa,QAAQ,EAAE;AAAA,IACpC;AACA,QAAI,MAAM;AACR,YAAM,KAAK,SAAS,IAAI,EAAE;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,KAAK,EAAE;AACb,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,KAAK,QAAQ;AACnB,eAAW,UAAU,SAAS;AAC5B,YAAM,WAAW,OAAO,WAAW,KAAK,OAAO,QAAQ,MAAM;AAC7D,YAAM,KAAK,GAAG,OAAO,QAAQ,KAAK,OAAO,KAAK,GAAG,QAAQ,EAAE;AAAA,IAC7D;AAAA,EACF;AAEA,MAAI,UAAU;AACZ,UAAM,KAAK,uBAAuB;AAClC,UAAM,KAAK,UAAU,SAAS,YAAY,GAAG;AAC7C,UAAM,KAAK,QAAQ,SAAS,OAAO,GAAG;AAAA,EACxC;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,mBACd,SACA,aACA,SACQ;AACR,QAAM,QAAkB,CAAC;AAEzB,QAAM,eAAe,gBAAgB,OAAO;AAC5C,QAAM,iBAAiB,cAAc,OAAO,aAAa,OAAO,QAAQ;AACxE,QAAM,kBAAkB,QAAQ,WAAW,OACvC,qBAAqB,QAAQ,UAAU,MAAM,QAAQ,UAAU,MAAM,QAAQ,UAAU,MAAM,IAC7F,cAAc,OACZ,qBAAqB,aAAa,MAAM,aAAa,MAAM,aAAa,MAAM,IAC9E;AAEN,QAAM,KAAK,KAAK,cAAc,GAAG;AACjC,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,QAAQ,cAAc,QAAQ,kBAAkB,EAAE;AAC7D,QAAM,KAAK,MAAM,mBAAmB,sBAAsB,EAAE;AAE5D,MAAI,CAAC,iBAAiB;AACpB,UAAM,WAAW,QAAQ,aAAa,KAAK;AAC3C,UAAM,OAAO,QAAQ,aAAa,KAAK;AACvC,QAAI,UAAU;AACZ,YAAM,KAAK,aAAa,QAAQ,EAAE;AAAA,IACpC;AACA,QAAI,MAAM;AACR,YAAM,KAAK,SAAS,IAAI,EAAE;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,YAAY,WAAW,EAAE;AACpC,MAAI,WAAW,QAAQ,SAAS,GAAG;AACjC,eAAW,SAAS,SAAS;AAC3B,YAAM,KAAK,UAAU,MAAM,IAAI,EAAE;AAAA,IACnC;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,eACP,eACA,cACQ;AACR,MAAI,iBAAiB,aAAc,QAAO,UAAU,aAAa;AACjE,MAAI,iBAAiB,CAAC,aAAc,QAAO,UAAU,aAAa;AAClE,MAAI,CAAC,iBAAiB,aAAc,QAAO,WAAW,YAAY;AAClE,SAAO;AACT;AAEO,SAAS,mBAAmB,OAA8B;AAC/D,QAAM,SAAmB,CAAC;AAE1B,aAAW,QAAQ,OAAO;AACxB,QAAI,QAAQ,gBAAgB,KAAK,SAAS,KAAK,eAAe,KAAK,QAAQ;AAC3E,QAAI,KAAK,MAAM;AACb,YAAM,eAAe,eAAe,KAAK,KAAK,mBAAmB,KAAK,KAAK,gBAAgB;AAC3F,YAAM,aAAa,eAAe,KAAK,KAAK,iBAAiB,KAAK,KAAK,cAAc;AACrF,UAAI,KAAK,KAAK,mBAAmB,KAAK,KAAK,cAAc;AACvD,iBAAS;AAAA,aAAgB,KAAK,KAAK,YAAY,WAAW,YAAY,OAAO,UAAU;AAAA,MACzF,OAAO;AACL,iBAAS;AAAA,eAAkB,KAAK,KAAK,cAAc,KAAK,YAAY,QAAQ,KAAK,KAAK,YAAY,KAAK,UAAU;AAAA,MACnH;AAAA,IACF;AACA,WAAO,KAAK,KAAK;AAAA,EACnB;AAEA,SAAO,OAAO,KAAK,aAAa;AAClC;;;AC1vEO,SAAS,iBAAiB,OAA2B;AAC1D,QAAM,IAAI,SAAS,MAAM,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AAC5C,QAAM,IAAI,SAAS,MAAM,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AAC5C,QAAM,IAAI,SAAS,MAAM,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AAC5C,QAAM,IAAI,MAAM,QAAQ;AAExB,MAAI,MAAM,GAAG;AACX,WAAO,IAAI,MAAM,GAAG;AAAA,EACtB;AACA,SAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;AACpC;AAEO,SAAS,SAAS,KAAkD;AACzE,QAAM,IAAI,IAAI,QAAQ,KAAK,EAAE;AAC7B,SAAO;AAAA,IACL,GAAG,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IAC7B,GAAG,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IAC7B,GAAG,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,EAC/B;AACF;AAEO,SAAS,SAAS,GAAW,GAAW,GAAmB;AAChE,SAAO,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY;AAChG;AAEO,SAAS,SAAS,GAAW,GAAW,GAAgD;AAC7F,OAAK;AACL,OAAK;AACL,OAAK;AACL,QAAM,MAAM,KAAK,IAAI,GAAG,GAAG,CAAC;AAC5B,QAAM,MAAM,KAAK,IAAI,GAAG,GAAG,CAAC;AAC5B,QAAM,IAAI,MAAM;AAChB,MAAI,IAAI;AACR,QAAM,IAAI,QAAQ,IAAI,IAAK,IAAI,MAAO;AACtC,QAAM,IAAI,MAAM;AAChB,MAAI,MAAM,GAAG;AACX,YAAQ,KAAK;AAAA,MACX,KAAK;AAAG,cAAM,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,MAAM;AAAI;AAAA,MAClD,KAAK;AAAG,cAAM,IAAI,KAAK,IAAI,KAAK;AAAI;AAAA,MACpC,KAAK;AAAG,cAAM,IAAI,KAAK,IAAI,KAAK;AAAI;AAAA,IACtC;AAAA,EACF;AACA,SAAO,EAAE,GAAG,GAAG,EAAE;AACnB;AAEO,SAAS,SAAS,GAAW,GAAW,GAAgD;AAC7F,OAAK;AACL,OAAK;AACL,QAAM,IAAI,IAAI;AACd,QAAM,IAAI,KAAK,IAAI,KAAK,IAAM,IAAI,KAAM,IAAK,CAAC;AAC9C,QAAM,IAAI,IAAI;AACd,MAAI,IAAI,GAAG,IAAI,GAAG,IAAI;AACtB,MAAI,IAAI,IAAI;AAAE,QAAI;AAAG,QAAI;AAAA,EAAE,WAClB,IAAI,KAAK;AAAE,QAAI;AAAG,QAAI;AAAA,EAAE,WACxB,IAAI,KAAK;AAAE,QAAI;AAAG,QAAI;AAAA,EAAE,WACxB,IAAI,KAAK;AAAE,QAAI;AAAG,QAAI;AAAA,EAAE,WACxB,IAAI,KAAK;AAAE,QAAI;AAAG,QAAI;AAAA,EAAE,OAC5B;AAAE,QAAI;AAAG,QAAI;AAAA,EAAE;AACpB,SAAO;AAAA,IACL,GAAG,KAAK,OAAO,IAAI,KAAK,GAAG;AAAA,IAC3B,GAAG,KAAK,OAAO,IAAI,KAAK,GAAG;AAAA,IAC3B,GAAG,KAAK,OAAO,IAAI,KAAK,GAAG;AAAA,EAC7B;AACF;AAEO,SAAS,SAAS,GAAW,GAAW,GAAgD;AAC7F,OAAK;AACL,OAAK;AACL,OAAK;AACL,QAAM,MAAM,KAAK,IAAI,GAAG,GAAG,CAAC;AAC5B,QAAM,MAAM,KAAK,IAAI,GAAG,GAAG,CAAC;AAC5B,QAAM,KAAK,MAAM,OAAO;AACxB,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,QAAQ,KAAK;AACf,UAAM,IAAI,MAAM;AAChB,QAAI,IAAI,MAAM,KAAK,IAAI,MAAM,OAAO,KAAK,MAAM;AAC/C,YAAQ,KAAK;AAAA,MACX,KAAK;AAAG,cAAM,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,MAAM;AAAI;AAAA,MAClD,KAAK;AAAG,cAAM,IAAI,KAAK,IAAI,KAAK;AAAI;AAAA,MACpC,KAAK;AAAG,cAAM,IAAI,KAAK,IAAI,KAAK;AAAI;AAAA,IACtC;AAAA,EACF;AACA,SAAO,EAAE,GAAG,GAAG,IAAI,KAAK,GAAG,IAAI,IAAI;AACrC;AAEO,SAAS,SAAS,GAAW,GAAW,GAAgD;AAC7F,OAAK;AACL,OAAK;AACL,QAAM,KAAK,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK;AACtC,QAAM,IAAI,KAAK,IAAI,KAAK,IAAM,IAAI,KAAM,IAAK,CAAC;AAC9C,QAAM,IAAI,IAAI,IAAI;AAClB,MAAI,IAAI,GAAG,IAAI,GAAG,IAAI;AACtB,MAAI,IAAI,IAAI;AAAE,QAAI;AAAG,QAAI;AAAA,EAAE,WAClB,IAAI,KAAK;AAAE,QAAI;AAAG,QAAI;AAAA,EAAE,WACxB,IAAI,KAAK;AAAE,QAAI;AAAG,QAAI;AAAA,EAAE,WACxB,IAAI,KAAK;AAAE,QAAI;AAAG,QAAI;AAAA,EAAE,WACxB,IAAI,KAAK;AAAE,QAAI;AAAG,QAAI;AAAA,EAAE,OAC5B;AAAE,QAAI;AAAG,QAAI;AAAA,EAAE;AACpB,SAAO;AAAA,IACL,GAAG,KAAK,OAAO,IAAI,KAAK,GAAG;AAAA,IAC3B,GAAG,KAAK,OAAO,IAAI,KAAK,GAAG;AAAA,IAC3B,GAAG,KAAK,OAAO,IAAI,KAAK,GAAG;AAAA,EAC7B;AACF;;;AC1GA,IAAM,WAAW;AAEjB,IAAI,cAA6B;AAEjC,eAAe,gBAAgB,eAAe,OAA+B;AAC3E,MAAI,CAAC,gBAAgB,YAAa,QAAO;AACzC,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,GAAG,QAAQ,eAAe,EAAE,QAAQ,YAAY,QAAQ,GAAI,EAAE,CAAC;AACvF,QAAI,CAAC,IAAI,GAAI,QAAO;AACpB,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,kBAAc,OAAO,KAAK,iBAAiB,WAAW,KAAK,eAAe;AAC1E,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,qBACb,MACA,SACsC;AACtC,QAAM,OAAO,OAAOC,WAAyB;AAC3C,UAAM,UAAkC,EAAE,gBAAgB,mBAAmB;AAC7E,QAAIA,OAAO,SAAQ,iBAAiB,IAAIA;AACxC,WAAO,MAAM,GAAG,QAAQ,GAAG,IAAI,IAAI;AAAA,MACjC,QAAQ;AAAA,MACR;AAAA,MACA,MAAM,KAAK,UAAU,OAAO;AAAA,IAC9B,CAAC;AAAA,EACH;AAEA,MAAI,QAAQ,MAAM,gBAAgB;AAClC,MAAI,MAAM,MAAM,KAAK,KAAK;AAE1B,MAAI,IAAI,WAAW,KAAK;AACtB,kBAAc;AACd,YAAQ,MAAM,gBAAgB,IAAI;AAClC,UAAM,MAAM,KAAK,KAAK;AAAA,EACxB;AAEA,SAAO,IAAI,KAAK;AAClB;AAEA,eAAsB,gBACpB,MACsC;AACtC,SAAO,qBAAqB,aAAa,IAAI;AAC/C;AAEA,eAAsB,mBACpB,SACsC;AACtC,SAAO,qBAAqB,gBAAgB,OAAO;AACrD;;;ALu5CM,IAAAC,sBAAA;AAl3CN,IAAM,oBAA0B,qBAA6C,IAAI;AAE1E,SAAS,gBAAwC;AACtD,QAAM,UAAgB,kBAAW,iBAAiB;AAClD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AACA,SAAO;AACT;AAMO,SAAS,mBAAmB,EAAE,SAAS,GAA4B;AAExE,QAAM,CAAC,OAAO,QAAQ,IAAU,gBAA0B;AAAA,IACxD,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,sBAAsB;AAAA,IACtB,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,oBAAoB;AAAA,IACpB,gBAAgB,CAAC;AAAA,IACjB,eAAe,CAAC;AAAA,IAChB,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,UAAU,CAAC;AAAA,IACX,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,EACtB,CAAC;AAGD,EAAM,iBAAU,MAAM;AACpB,QAAI;AACF,YAAM,SAAS,aAAa,QAAQ,mBAAmB;AACvD,UAAI,WAAW,WAAW,WAAW,UAAU,WAAW,UAAU;AAClE,iBAAS,CAAC,UAAU,EAAE,GAAG,MAAM,OAAO,OAAO,EAAE;AAAA,MACjD;AAAA,IACF,QAAQ;AAAA,IAAC;AAAA,EACX,GAAG,CAAC,CAAC;AAEL,QAAM,eAAqB,cAAoB,CAAC,CAAC;AACjD,QAAM,kBAAwB,cAAsC,oBAAI,IAAI,CAAC;AAC7E,QAAM,yBAA+B,cAA6B,oBAAI,QAAQ,CAAC;AAC/E,QAAM,CAAC,kBAAkB,mBAAmB,IAAU,gBAAS,CAAC;AAChE,QAAM,WAAiB,cAAO,KAAK;AACnC,EAAM,iBAAU,MAAM;AACpB,aAAS,UAAU;AAAA,EACrB,CAAC;AAED,QAAM,WAAiB,mBAAY,CAAC,UAAqB;AACvD,iBAAa,QAAQ,KAAK,KAAK;AAC/B,QAAI,aAAa,QAAQ,SAAS,IAAI;AACpC,mBAAa,UAAU,aAAa,QAAQ,MAAM,GAAG;AAAA,IACvD;AACA,QAAI,MAAM,SAAS,UAAU,MAAM,SAAS,UAAU,MAAM,SAAS,YAAY;AAC/E,6BAAuB,QAAQ,OAAO,MAAM,OAAO;AAAA,IACrD;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,uBAA6B,mBAAY,MAAM;AACnD,UAAM,UAAU,SAAS;AACzB,UAAM,KAAK,QAAQ;AACnB,QAAI,CAAC,GAAI;AACT,QAAI,uBAAuB,QAAQ,IAAI,EAAE,EAAG;AAE5C,UAAM,WAAW,gBAAgB,QAAQ,IAAI,EAAE;AAC/C,UAAM,gBAAgB,EAAE,GAAG,QAAQ,cAAc;AACjD,UAAM,mBAAmB,OAAO,KAAK,aAAa,EAAE,SAAS;AAC7D,UAAM,UAAU,QAAQ,UAAU,IAAI;AACtC,UAAM,cAAc,QAAQ,UAAU,QAAQ;AAE9C,QAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,aAAa;AACjD,UAAI,gBAAgB,QAAQ,OAAO,EAAE,GAAG;AACtC,4BAAoB,gBAAgB,QAAQ,IAAI;AAAA,MAClD;AACA;AAAA,IACF;AAEA,UAAM,UAAU,kBAAkB,EAAE;AACpC,oBAAgB,QAAQ,IAAI,IAAI;AAAA,MAC9B,SAAS;AAAA,MACT;AAAA,MACA,gBAAgB,UAAU,kBAAkB,EAAE,GAAG,QAAQ,eAAe;AAAA,MACxE;AAAA,MACA,MAAM,UAAU,QAAQ;AAAA,MACxB,UAAU,UAAU,YAAY;AAAA,IAClC,CAAC;AACD,wBAAoB,gBAAgB,QAAQ,IAAI;AAAA,EAClD,GAAG,CAAC,CAAC;AAEL,EAAM,iBAAU,MAAM;AACpB,QAAI,CAAC,MAAM,gBAAiB;AAC5B,yBAAqB;AAAA,EACvB,GAAG,CAAC,MAAM,iBAAiB,MAAM,eAAe,oBAAoB,CAAC;AAErE,QAAM,gBAAsB,mBAAY,CAAC,YAAyB;AAChE,yBAAqB;AACrB,UAAM,UAAU,SAAS;AACzB,QAAI,QAAQ,mBAAmB,QAAQ,QAAQ;AAC7C,eAAS;AAAA,QACP,MAAM;AAAA,QACN,iBAAiB,QAAQ;AAAA,QACzB,wBAAwB,EAAE,GAAG,QAAQ,eAAe;AAAA,QACpD,uBAAuB,EAAE,GAAG,QAAQ,cAAc;AAAA,MACpD,CAAC;AAAA,IACH;AAEA,UAAM,EAAE,SAAS,cAAc,KAAK,IAAI,kBAAkB,OAAO;AACjE,UAAM,SAAS,wBAAwB,OAAO;AAC9C,UAAM,SAAS,kBAAkB,OAAO;AACxC,UAAM,QAAQ,uBAAuB,OAAO;AAC5C,UAAM,aAAa,sBAAsB,OAAO;AAChD,UAAM,iBAAiB,wBAAwB,OAAO;AACtD,UAAM,cAAc,eAAe,OAAO;AAE1C,aAAS,CAAC,UAAU;AAAA,MAClB,QAAQ;AAAA,MACR,iBAAiB;AAAA,MACjB;AAAA,MACA,iBAAiB;AAAA,MACjB,sBAAsB;AAAA,MACtB,gBAAgB;AAAA,MAChB,cAAc;AAAA,MACd,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,oBAAoB;AAAA,MACpB;AAAA,MACA,eAAe,CAAC;AAAA,MAChB,gBAAgB,KAAK;AAAA,MACrB,YAAY,KAAK;AAAA,MACjB,OAAO,KAAK;AAAA,MACZ,UAAU,KAAK;AAAA,MACf,iBAAiB,KAAK;AAAA,MACtB,oBAAoB;AAAA,IACtB,EAAE;AAGF,UAAM,UAAU,kBAAkB,OAAO;AACzC,UAAM,UAAU,oBAAoB,OAAO;AAC3C,cAAU,UAAU,UAAU;AAAA;AAAA,EAAiC,OAAO,EAAE,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC1F,GAAG,CAAC,UAAU,oBAAoB,CAAC;AAEnC,QAAM,sBAA4B,mBAAY,CAAC,mBAAgC;AAC7E,UAAM,UAAU,eAAe,eAAe;AAC9C,UAAM,WAAW,gBAAgB,QAAQ,IAAI,cAAc;AAC3D,UAAM,eAAe,UAAU,UAAU,gBACpC,eAAe,aAAa,gCAAgC,KAC5D;AACL,UAAM,eAAe,UAAU,UAAU,WAAW;AAEpD,mBAAe,gBAAgB,iBAAiB;AAChD,mBAAe,gBAAgB,gCAAgC;AAC/D,mBAAe,MAAM,UAAU;AAC/B,mBAAe,MAAM,gBAAgB;AACrC,mBAAe,KAAK;AAEpB,QAAI,YAAY,cAAc;AAC5B,eAAS,EAAE,MAAM,YAAY,SAAS,gBAAgB,cAAc,aAAa,CAAC;AAClF,6BAAuB,QAAQ,OAAO,cAAc;AAEpD,UAAI,YAAY,cAAc;AAE5B,YAAI,UAAU;AACZ,cAAI,OAAO,KAAK,SAAS,aAAa,EAAE,SAAS,KAAK,SAAS,MAAM;AACnE,4BAAgB,QAAQ,IAAI,gBAAgB,EAAE,GAAG,UAAU,UAAU,KAAK,CAAC;AAAA,UAC7E,OAAO;AACL,4BAAgB,QAAQ,OAAO,cAAc;AAAA,UAC/C;AAAA,QACF;AAAA,MACF,OAAO;AACL,cAAM,UAAU,SAAS;AACzB,cAAM,UAAU,UAAU,WAAW,kBAAkB,cAAc;AACrE,cAAM,iBAAiB,UAAU,mBAC3B,QAAQ,oBAAoB,iBAAiB,EAAE,GAAG,QAAQ,eAAe,IAAI,CAAC;AACpF,cAAM,gBAAgB,UAAU,kBAC1B,QAAQ,oBAAoB,iBAAiB,EAAE,GAAG,QAAQ,cAAc,IAAI,CAAC;AACnF,wBAAgB,QAAQ,IAAI,gBAAgB;AAAA,UAC1C,SAAS;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA,MAAM,UAAU,QAAQ;AAAA,UACxB,UAAU,EAAE,cAAc,QAAQ;AAAA,QACpC,CAAC;AAAA,MACH;AACA,0BAAoB,gBAAgB,QAAQ,IAAI;AAAA,IAClD;AAEA,aAAS,CAAC,SAAU,KAAK,qBAAqB,EAAE,GAAG,MAAM,oBAAoB,KAAK,IAAI,IAAK;AAAA,EAC7F,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,aAAmB,mBAAY,MAAM;AACzC,aAAS,CAAC,UAAU;AAAA,MAClB,GAAG;AAAA,MACH,QAAQ;AAAA,IACV,EAAE;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAuB,mBAAY,MAAM;AAC7C,UAAM,UAAU,SAAS;AACzB,QAAI,QAAQ,kBAAkB,QAAQ,oBAAoB;AACxD,0BAAoB,QAAQ,kBAAkB;AAAA,IAChD;AAEA,aAAS,CAAC,UAAU;AAAA,MAClB,GAAG;AAAA,MACH,gBAAgB,CAAC,KAAK;AAAA,MACtB,YAAY,KAAK,iBAAiB,WAAW,KAAK;AAAA,MAClD,iBAAiB,KAAK,iBAAiB,OAAO,KAAK;AAAA,IACrD,EAAE;AAAA,EACJ,GAAG,CAAC,mBAAmB,CAAC;AAExB,QAAM,eAAqB,mBAAY,MAAM;AAC3C,QAAI,MAAM,iBAAiB,eAAe;AACxC,oBAAc,MAAM,gBAAgB,aAAa;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,MAAM,iBAAiB,aAAa,CAAC;AAEzC,QAAM,cAAoB,mBAAY,MAAM;AAC1C,UAAM,aAAa,MAAM,iBAAiB;AAC1C,QAAI,YAAY;AACd,oBAAc,UAAU;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,MAAM,iBAAiB,aAAa,CAAC;AAEzC,QAAM,wBAA8B;AAAA,IAClC,CAAC,KAAyB,UAA4B;AACpD,UAAI,CAAC,MAAM,gBAAiB;AAE5B,YAAM,cAAc,iBAAiB,GAAG;AACxC,YAAM,WAAW,oBAAoB,KAAK;AAE1C,YAAM,gBAAgB,MAAM,gBAAgB,MAAM,iBAAiB,WAAW,KAAK;AACnF,eAAS,EAAE,MAAM,QAAQ,SAAS,MAAM,iBAAiB,YAAY,CAAC,EAAE,aAAa,cAAc,CAAC,EAAE,CAAC;AAEvG,YAAM,gBAAgB,MAAM,YAAY,aAAa,QAAQ;AAE7D,eAAS,CAAC,UAAU;AAAA,QAClB,GAAG;AAAA,QACH,iBAAiB,KAAK,kBAClB;AAAA,UACE,GAAG,KAAK;AAAA,UACR,CAAC,GAAG,GAAG;AAAA,QACT,IACA;AAAA,QACJ,eAAe;AAAA,UACb,GAAG,KAAK;AAAA,UACR,CAAC,WAAW,GAAG;AAAA,QACjB;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,IACA,CAAC,MAAM,iBAAiB,QAAQ;AAAA,EAClC;AAEA,QAAM,6BAAmC;AAAA,IACvC,CAAC,KAA8B,UAA4B;AACzD,UAAI,CAAC,MAAM,gBAAiB;AAE5B,YAAM,cAAc,6BAA6B,GAAG;AACpD,YAAM,WAAW,oBAAoB,KAAK;AAE1C,YAAM,gBAAgB,MAAM,gBAAgB,MAAM,iBAAiB,WAAW,KAAK;AACnF,eAAS,EAAE,MAAM,QAAQ,SAAS,MAAM,iBAAiB,YAAY,CAAC,EAAE,aAAa,cAAc,CAAC,EAAE,CAAC;AAEvG,YAAM,gBAAgB,MAAM,YAAY,aAAa,QAAQ;AAE7D,eAAS,CAAC,UAAU;AAAA,QAClB,GAAG;AAAA,QACH,sBAAsB,KAAK,uBACvB;AAAA,UACE,GAAG,KAAK;AAAA,UACR,CAAC,GAAG,GAAG;AAAA,QACT,IACA;AAAA,QACJ,eAAe;AAAA,UACb,GAAG,KAAK;AAAA,UACR,CAAC,WAAW,GAAG;AAAA,QACjB;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,IACA,CAAC,MAAM,iBAAiB,QAAQ;AAAA,EAClC;AAEA,QAAM,uBAA6B;AAAA,IACjC,CAAC,KAAwB,UAA+C;AACtE,UAAI,CAAC,MAAM,gBAAiB;AAE5B,YAAM,cAAc,uBAAuB,GAAG;AAC9C,YAAM,WAAW,OAAO,UAAU,WAAW,QAAQ,oBAAoB,KAAK;AAE9E,YAAM,gBAAgB,MAAM,gBAAgB,MAAM,iBAAiB,WAAW,KAAK;AACnF,eAAS,EAAE,MAAM,QAAQ,SAAS,MAAM,iBAAiB,YAAY,CAAC,EAAE,aAAa,cAAc,CAAC,EAAE,CAAC;AAEvG,YAAM,gBAAgB,MAAM,YAAY,aAAa,QAAQ;AAE7D,YAAM,SAAS,wBAAwB,MAAM,eAAe;AAC5D,YAAM,QAAQ,uBAAuB,MAAM,eAAe;AAE1D,eAAS,CAAC,UAAU;AAAA,QAClB,GAAG;AAAA,QACH,gBAAgB;AAAA,QAChB,eAAe;AAAA,QACf,eAAe;AAAA,UACb,GAAG,KAAK;AAAA,UACR,CAAC,WAAW,GAAG;AAAA,QACjB;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,IACA,CAAC,MAAM,iBAAiB,QAAQ;AAAA,EAClC;AAEA,QAAM,yBAA+B;AAAA,IACnC,CAAC,YAA6E;AAC5E,UAAI,CAAC,MAAM,mBAAmB,QAAQ,WAAW,EAAG;AAEpD,YAAM,aAA2E,CAAC;AAClF,YAAM,iBAAyC,CAAC;AAEhD,iBAAW,CAAC,KAAK,KAAK,KAAK,SAAS;AAClC,cAAM,cAAc,uBAAuB,GAAG;AAC9C,cAAM,WAAW,OAAO,UAAU,WAAW,QAAQ,oBAAoB,KAAK;AAE9E,cAAM,gBAAgB,MAAM,gBAAgB,MAAM,iBAAiB,WAAW,KAAK;AACnF,mBAAW,KAAK,EAAE,aAAa,cAAc,CAAC;AAE9C,cAAM,gBAAgB,MAAM,YAAY,aAAa,QAAQ;AAC7D,uBAAe,WAAW,IAAI;AAAA,MAChC;AAEA,eAAS,EAAE,MAAM,QAAQ,SAAS,MAAM,iBAAiB,WAAW,CAAC;AAErE,YAAM,SAAS,wBAAwB,MAAM,eAAe;AAC5D,YAAM,QAAQ,uBAAuB,MAAM,eAAe;AAE1D,eAAS,CAAC,UAAU;AAAA,QAClB,GAAG;AAAA,QACH,gBAAgB;AAAA,QAChB,eAAe;AAAA,QACf,eAAe;AAAA,UACb,GAAG,KAAK;AAAA,UACR,GAAG;AAAA,QACL;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,IACA,CAAC,MAAM,iBAAiB,QAAQ;AAAA,EAClC;AAEA,QAAM,eAAqB;AAAA,IACzB,CAAC,eAAuC;AACtC,UAAI,CAAC,MAAM,mBAAmB,OAAO,KAAK,UAAU,EAAE,WAAW,EAAG;AAEpE,YAAM,iBAA+E,CAAC;AACtF,YAAM,iBAAyC,CAAC;AAEhD,iBAAW,CAAC,aAAa,QAAQ,KAAK,OAAO,QAAQ,UAAU,GAAG;AAChE,cAAM,gBAAgB,MAAM,gBAAgB,MAAM,iBAAiB,WAAW,KAAK;AACnF,uBAAe,KAAK,EAAE,aAAa,cAAc,CAAC;AAClD,cAAM,gBAAgB,MAAM,YAAY,aAAa,QAAQ;AAC7D,uBAAe,WAAW,IAAI;AAAA,MAChC;AAEA,eAAS,EAAE,MAAM,QAAQ,SAAS,MAAM,iBAAiB,YAAY,eAAe,CAAC;AAErF,YAAM,SAAS,wBAAwB,MAAM,eAAe;AAC5D,YAAM,QAAQ,uBAAuB,MAAM,eAAe;AAE1D,eAAS,CAAC,UAAU;AAAA,QAClB,GAAG;AAAA,QACH,gBAAgB;AAAA,QAChB,eAAe;AAAA,QACf,eAAe;AAAA,UACb,GAAG,KAAK;AAAA,UACR,GAAG;AAAA,QACL;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,IACA,CAAC,MAAM,iBAAiB,QAAQ;AAAA,EAClC;AAEA,QAAM,qBAA2B;AAAA,IAC/B,CAAC,KAAsB,UAAkB;AACvC,UAAI,CAAC,MAAM,gBAAiB;AAE5B,YAAM,cAAc,qBAAqB,GAAG;AAE5C,YAAM,gBAAgB,MAAM,gBAAgB,MAAM,iBAAiB,WAAW,KAAK;AACnF,eAAS,EAAE,MAAM,QAAQ,SAAS,MAAM,iBAAiB,YAAY,CAAC,EAAE,aAAa,cAAc,CAAC,EAAE,CAAC;AAEvG,YAAM,gBAAgB,MAAM,YAAY,aAAa,KAAK;AAE1D,eAAS,CAAC,UAAU;AAAA,QAClB,GAAG;AAAA,QACH,cAAc,KAAK,eACf;AAAA,UACE,GAAG,KAAK;AAAA,UACR,CAAC,GAAG,GAAG;AAAA,QACT,IACA;AAAA,QACJ,eAAe;AAAA,UACb,GAAG,KAAK;AAAA,UACR,CAAC,WAAW,GAAG;AAAA,QACjB;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,IACA,CAAC,MAAM,iBAAiB,QAAQ;AAAA,EAClC;AAEA,QAAM,mBAAyB,mBAAY,MAAM;AAC/C,QAAI,CAAC,MAAM,gBAAiB;AAE5B,UAAM,UAAU,MAAM;AACtB,UAAM,YAAY,CAAC,WAAW,kBAAkB,mBAAmB,aAAa;AAChF,UAAM,aAAa,UAAU,IAAI,CAAC,iBAAiB;AAAA,MACjD;AAAA,MACA,eAAe,QAAQ,MAAM,iBAAiB,WAAW,KAAK;AAAA,IAChE,EAAE;AAEF,aAAS,EAAE,MAAM,QAAQ,SAAS,WAAW,CAAC;AAE9C,UAAM,kBAAkB,MAAM,aAAa,mBAAmB;AAE9D,QAAI,iBAAiB;AACnB,iBAAW,eAAe,WAAW;AACnC,gBAAQ,MAAM,eAAe,WAAW;AAAA,MAC1C;AAAA,IACF,OAAO;AACL,cAAQ,MAAM,YAAY,WAAW,MAAM;AAAA,IAC7C;AAEA,UAAM,EAAE,SAAS,cAAc,KAAK,IAAI,kBAAkB,OAAO;AACjE,UAAM,SAAS,kBAAkB,OAAO;AACxC,UAAM,cAAc,eAAe,OAAO;AAE1C,UAAM,aAAa,EAAE,GAAG,SAAS,QAAQ,cAAc;AACvD,QAAI,iBAAiB;AACnB,iBAAW,eAAe,WAAW;AACnC,eAAO,WAAW,WAAW;AAAA,MAC/B;AAAA,IACF,OAAO;AACL,iBAAW,SAAS,IAAI;AAAA,IAC1B;AAEA,aAAS,CAAC,UAAU;AAAA,MAClB,GAAG;AAAA,MACH,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,sBAAsB;AAAA,MACtB,gBAAgB;AAAA,MAChB;AAAA,MACA,eAAe;AAAA,IACjB,EAAE;AAAA,EACJ,GAAG,CAAC,MAAM,iBAAiB,MAAM,aAAa,QAAQ,CAAC;AAEvD,QAAM,uBAA6B;AAAA,IACjC,CAAC,KAAwB,UAAuB;AAC9C,UAAI,CAAC,MAAM,gBAAiB;AAE5B,YAAM,cAAc,uBAAuB,GAAG;AAC9C,YAAM,WAAW,iBAAiB,KAAK;AAEvC,YAAM,gBAAgB,MAAM,gBAAgB,MAAM,iBAAiB,WAAW,KAAK;AACnF,eAAS,EAAE,MAAM,QAAQ,SAAS,MAAM,iBAAiB,YAAY,CAAC,EAAE,aAAa,cAAc,CAAC,EAAE,CAAC;AAEvG,YAAM,gBAAgB,MAAM,YAAY,aAAa,QAAQ;AAE7D,eAAS,CAAC,UAAU;AAAA,QAClB,GAAG;AAAA,QACH,gBAAgB,KAAK,iBACjB;AAAA,UACE,GAAG,KAAK;AAAA,UACR,CAAC,GAAG,GAAG;AAAA,QACT,IACA;AAAA,QACJ,eAAe;AAAA,UACb,GAAG,KAAK;AAAA,UACR,CAAC,WAAW,GAAG;AAAA,QACjB;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,IACA,CAAC,MAAM,iBAAiB,QAAQ;AAAA,EAClC;AAEA,QAAM,sBAA4B;AAAA,IAChC,CAAC,KAAuB,UAAsB;AAC5C,UAAI,CAAC,MAAM,gBAAiB;AAE5B,YAAM,cAAc,sBAAsB,GAAG;AAC7C,YAAM,WAAW,iBAAiB,KAAK;AAEvC,YAAM,gBAAgB,MAAM,gBAAgB,MAAM,iBAAiB,WAAW,KAAK;AACnF,eAAS,EAAE,MAAM,QAAQ,SAAS,MAAM,iBAAiB,YAAY,CAAC,EAAE,aAAa,cAAc,CAAC,EAAE,CAAC;AAEvG,YAAM,gBAAgB,MAAM,YAAY,aAAa,QAAQ;AAE7D,eAAS,CAAC,UAAU;AAAA,QAClB,GAAG;AAAA,QACH,eAAe,KAAK,gBAChB;AAAA,UACE,GAAG,KAAK;AAAA,UACR,CAAC,GAAG,GAAG;AAAA,QACT,IACA;AAAA,QACJ,eAAe;AAAA,UACb,GAAG,KAAK;AAAA,UACR,CAAC,WAAW,GAAG;AAAA,QACjB;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,IACA,CAAC,MAAM,iBAAiB,QAAQ;AAAA,EAClC;AAEA,QAAM,2BAAiC;AAAA,IACrC,CAAC,KAA4B,UAAqC;AAChE,UAAI,CAAC,MAAM,gBAAiB;AAE5B,YAAM,cAAc,2BAA2B,GAAG;AAClD,YAAM,WAAW,OAAO,UAAU,WAAW,QAAQ,oBAAoB,KAAK;AAE9E,UAAI,QAAQ,qBAAqB;AAC/B,cAAM,cAAc,MAAM,gBAAgB,MAAM,iBAAiB,SAAS,KAAK;AAC/E,cAAM,iBAAiB,MAAM,gBAAgB,MAAM,iBAAiB,aAAa,KAAK;AACtF,iBAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,MAAM;AAAA,UACf,YAAY;AAAA,YACV,EAAE,aAAa,WAAW,eAAe,YAAY;AAAA,YACrD,EAAE,aAAa,eAAe,eAAe,eAAe;AAAA,UAC9D;AAAA,QACF,CAAC;AAED,cAAM,WAAW,OAAO,iBAAiB,MAAM,eAAe;AAC9D,cAAM,WAAW,SAAS,YAAY,YAAY,SAAS,YAAY;AACvE,cAAM,eAAe,WAAW,gBAAgB;AAChD,cAAM,gBAAgB,MAAM,YAAY,WAAW,YAAY;AAC/D,cAAM,gBAAgB,MAAM,YAAY,eAAe,QAAQ;AAAA,MACjE,OAAO;AACL,cAAM,gBAAgB,MAAM,gBAAgB,MAAM,iBAAiB,WAAW,KAAK;AACnF,iBAAS,EAAE,MAAM,QAAQ,SAAS,MAAM,iBAAiB,YAAY,CAAC,EAAE,aAAa,cAAc,CAAC,EAAE,CAAC;AAEvG,cAAM,gBAAgB,MAAM,YAAY,aAAa,QAAQ;AAAA,MAC/D;AAEA,eAAS,CAAC,SAAS;AACjB,YAAI,eAAe;AACnB,YAAI,QAAQ,uBAAuB,MAAM,iBAAiB;AACxD,gBAAM,WAAW,OAAO,iBAAiB,MAAM,eAAe;AAC9D,gBAAM,WAAW,SAAS,YAAY,iBAAiB,KAAK,cAAc,YAAY;AACtF,yBAAe,WAAW,gBAAgB;AAAA,QAC5C;AAEA,eAAO;AAAA,UACL,GAAG;AAAA,UACH,oBAAoB,KAAK,qBACrB;AAAA,YACE,GAAG,KAAK;AAAA,YACR,CAAC,GAAG,GAAG;AAAA,UACT,IACA;AAAA,UACJ,eAAe;AAAA,YACb,GAAG,KAAK;AAAA,YACR,GAAI,QAAQ,sBACR,EAAE,SAAS,cAAc,eAAe,SAAS,IACjD,EAAE,CAAC,WAAW,GAAG,SAAS;AAAA,UAChC;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,CAAC,MAAM,iBAAiB,QAAQ;AAAA,EAClC;AAEA,QAAM,kBAAwB,mBAAY,MAAM;AAC9C,QAAI,CAAC,MAAM,gBAAiB;AAE5B,UAAM,KAAK,MAAM;AACjB,UAAM,eAAe,gBAAgB,QAAQ,IAAI,EAAE;AACnD,QAAI,cAAc,UAAU;AAC1B,SAAG,cAAc,aAAa,SAAS;AAAA,IACzC;AACA,QAAI,cAAc,MAAM;AACtB,sBAAgB,QAAQ,IAAI,IAAI,EAAE,GAAG,cAAc,eAAe,CAAC,GAAG,UAAU,KAAK,CAAC;AAAA,IACxF,OAAO;AACL,sBAAgB,QAAQ,OAAO,EAAE;AAAA,IACnC;AACA,wBAAoB,gBAAgB,QAAQ,IAAI;AAChD,iBAAa,UAAU,aAAa,QAAQ;AAAA,MAC1C,CAAC,UAAU,GAAG,MAAM,SAAS,UAAU,MAAM,SAAS,eAAe,MAAM,YAAY;AAAA,IACzF;AAEA,UAAM,cAAc;AAAA,MAClB,GAAG,OAAO,OAAO,gBAAgB;AAAA,MACjC,GAAG,OAAO,OAAO,4BAA4B;AAAA,MAC7C,GAAG,OAAO,OAAO,sBAAsB;AAAA,MACvC,GAAG,OAAO,OAAO,oBAAoB;AAAA,MACrC,GAAG,OAAO,OAAO,sBAAsB;AAAA,MACvC,GAAG,OAAO,OAAO,qBAAqB;AAAA,MACtC,GAAG,OAAO,OAAO,0BAA0B;AAAA,MAC3C;AAAA,MACA;AAAA,IACF;AAEA,eAAW,QAAQ,aAAa;AAC9B,YAAM,gBAAgB,MAAM,eAAe,IAAI;AAAA,IACjD;AAEA,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,MAAM,cAAc,GAAG;AAChE,YAAM,gBAAgB,MAAM,YAAY,MAAM,KAAK;AAAA,IACrD;AAEA,UAAM,EAAE,SAAS,cAAc,KAAK,IAAI,kBAAkB,MAAM,eAAe;AAC/E,UAAM,SAAS,wBAAwB,MAAM,eAAe;AAC5D,UAAM,SAAS,kBAAkB,MAAM,eAAe;AACtD,UAAM,QAAQ,uBAAuB,MAAM,eAAe;AAC1D,UAAM,aAAa,sBAAsB,MAAM,eAAe;AAE9D,aAAS,CAAC,UAAU;AAAA,MAClB,GAAG;AAAA,MACH,iBAAiB;AAAA,MACjB,sBAAsB;AAAA,MACtB,gBAAgB;AAAA,MAChB,cAAc;AAAA,MACd,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,oBAAoB;AAAA,MACpB,eAAe,CAAC;AAAA,IAClB,EAAE;AAAA,EACJ,GAAG,CAAC,MAAM,iBAAiB,MAAM,cAAc,CAAC;AAEhD,QAAM,OAAa,mBAAY,MAAM;AACnC,UAAM,QAAQ,aAAa,QAAQ,IAAI;AACvC,QAAI,CAAC,MAAO;AAEZ,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK,QAAQ;AACX,YAAI,CAAC,MAAM,QAAQ,YAAa;AAChC,mBAAW,EAAE,aAAa,cAAc,KAAK,MAAM,YAAY;AAC7D,cAAI,kBAAkB,MAAM;AAC1B,kBAAM,QAAQ,MAAM,eAAe,WAAW;AAAA,UAChD,OAAO;AACL,kBAAM,QAAQ,MAAM,YAAY,aAAa,aAAa;AAAA,UAC5D;AAAA,QACF;AACA,cAAM,UAAU,SAAS;AACzB,YAAI,QAAQ,oBAAoB,MAAM,SAAS;AAC7C,gBAAM,EAAE,SAAS,cAAc,KAAK,IAAI,kBAAkB,MAAM,OAAO;AACvE,gBAAM,SAAS,wBAAwB,MAAM,OAAO;AACpD,gBAAM,SAAS,kBAAkB,MAAM,OAAO;AAC9C,gBAAM,QAAQ,uBAAuB,MAAM,OAAO;AAClD,gBAAM,aAAa,sBAAsB,MAAM,OAAO;AACtD,gBAAM,cAAc,eAAe,MAAM,OAAO;AAChD,gBAAM,aAAa,EAAE,GAAG,QAAQ,cAAc;AAC9C,qBAAW,EAAE,aAAa,cAAc,KAAK,MAAM,YAAY;AAC7D,gBAAI,kBAAkB,MAAM;AAC1B,qBAAO,WAAW,WAAW;AAAA,YAC/B,OAAO;AACL,yBAAW,WAAW,IAAI;AAAA,YAC5B;AAAA,UACF;AACA,mBAAS,CAAC,UAAU;AAAA,YAClB,GAAG;AAAA,YACH,iBAAiB;AAAA,YACjB,sBAAsB;AAAA,YACtB,gBAAgB;AAAA,YAChB,cAAc;AAAA,YACd,gBAAgB;AAAA,YAChB,eAAe;AAAA,YACf,oBAAoB;AAAA,YACpB;AAAA,YACA,eAAe;AAAA,UACjB,EAAE;AAAA,QACJ;AACA;AAAA,MACF;AAAA,MACA,KAAK,aAAa;AAChB,cAAM,SAAS,MAAM;AACrB,YAAI,UAAU,CAAC,OAAO,YAAa;AACnC,YAAI,QAAQ;AACV,qBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,MAAM,qBAAqB,GAAG;AACvE,mBAAO,MAAM,YAAY,MAAM,KAAK;AAAA,UACtC;AACA,gBAAM,EAAE,SAAS,cAAc,KAAK,IAAI,kBAAkB,MAAM;AAChE,gBAAM,SAAS,wBAAwB,MAAM;AAC7C,gBAAM,SAAS,kBAAkB,MAAM;AACvC,gBAAM,QAAQ,uBAAuB,MAAM;AAC3C,gBAAM,aAAa,sBAAsB,MAAM;AAC/C,gBAAM,cAAc,eAAe,MAAM;AACzC,mBAAS,CAAC,UAAU;AAAA,YAClB,QAAQ;AAAA,YACR,iBAAiB;AAAA,YACjB;AAAA,YACA,iBAAiB;AAAA,YACjB,sBAAsB;AAAA,YACtB,gBAAgB;AAAA,YAChB,cAAc;AAAA,YACd,gBAAgB;AAAA,YAChB,eAAe;AAAA,YACf,oBAAoB;AAAA,YACpB,gBAAgB,MAAM;AAAA,YACtB,eAAe,MAAM;AAAA,YACrB,gBAAgB,KAAK;AAAA,YACrB,YAAY,KAAK;AAAA,YACjB,OAAO,KAAK;AAAA,YACZ,UAAU,KAAK;AAAA,YACf,iBAAiB,KAAK;AAAA,YACtB,oBAAoB;AAAA,UACtB,EAAE;AAAA,QACJ,OAAO;AACL,mBAAS,CAAC,UAAU;AAAA,YAClB,GAAG;AAAA,YACH,QAAQ;AAAA,YACR,iBAAiB;AAAA,YACjB,aAAa;AAAA,YACb,iBAAiB;AAAA,YACjB,sBAAsB;AAAA,YACtB,gBAAgB;AAAA,YAChB,cAAc;AAAA,YACd,gBAAgB;AAAA,YAChB,eAAe;AAAA,YACf,oBAAoB;AAAA,YACpB,gBAAgB,CAAC;AAAA,YACjB,eAAe,CAAC;AAAA,UAClB,EAAE;AAAA,QACJ;AACA;AAAA,MACF;AAAA,MACA,KAAK,QAAQ;AACX,YAAI,CAAC,MAAM,QAAQ,YAAa;AAChC,YAAI;AACF,cAAI,MAAM,qBAAqB;AAC7B,kBAAM,eAAe,aAAa,MAAM,SAAS,MAAM,mBAAmB;AAAA,UAC5E,OAAO;AACL,kBAAM,eAAe,YAAY,MAAM,OAAO;AAAA,UAChD;AAAA,QACF,QAAQ;AAAA,QAER;AACA,cAAM,eAAe,gBAAgB,QAAQ,IAAI,MAAM,OAAO;AAC9D,YAAI,cAAc;AAChB,gBAAM,eAAe,MAAM;AAC3B,cAAI,OAAO,KAAK,aAAa,aAAa,EAAE,SAAS,KAAK,gBAAgB,aAAa,UAAU;AAC/F,4BAAgB,QAAQ,IAAI,MAAM,SAAS,EAAE,GAAG,cAAc,MAAM,aAAa,CAAC;AAAA,UACpF,OAAO;AACL,4BAAgB,QAAQ,OAAO,MAAM,OAAO;AAAA,UAC9C;AACA,8BAAoB,gBAAgB,QAAQ,IAAI;AAAA,QAClD;AACA,cAAM,UAAU,SAAS;AACzB,YAAI,QAAQ,oBAAoB,MAAM,SAAS;AAC7C,gBAAM,cAAc,eAAe,MAAM,OAAO;AAChD,mBAAS,CAAC,UAAU,EAAE,GAAG,MAAM,YAAY,EAAE;AAAA,QAC/C;AACA;AAAA,MACF;AAAA,MACA,KAAK,YAAY;AACf,YAAI,CAAC,MAAM,QAAQ,YAAa;AAChC,cAAM,QAAQ,cAAc,MAAM;AAElC,cAAM,kBAAkB,MAAM,iBAAiB,MAAM,eACjD,OACA,EAAE,cAAc,MAAM,cAAc,SAAS,MAAM,aAAa;AACpE,cAAM,eAAe,gBAAgB,QAAQ,IAAI,MAAM,OAAO;AAE9D,YAAI,cAAc;AAChB,cAAI,iBAAiB;AACnB,4BAAgB,QAAQ,IAAI,MAAM,SAAS;AAAA,cACzC,GAAG;AAAA,cACH,UAAU;AAAA,YACZ,CAAC;AAAA,UACH,WAAW,OAAO,KAAK,aAAa,aAAa,EAAE,SAAS,KAAK,aAAa,MAAM;AAClF,4BAAgB,QAAQ,IAAI,MAAM,SAAS,EAAE,GAAG,cAAc,UAAU,KAAK,CAAC;AAAA,UAChF,OAAO;AACL,4BAAgB,QAAQ,OAAO,MAAM,OAAO;AAAA,UAC9C;AAAA,QACF,WAAW,iBAAiB;AAC1B,gBAAM,UAAU,SAAS;AACzB,0BAAgB,QAAQ,IAAI,MAAM,SAAS;AAAA,YACzC,SAAS,MAAM;AAAA,YACf,SAAS,kBAAkB,MAAM,OAAO;AAAA,YACxC,gBAAgB,QAAQ,oBAAoB,MAAM,UAAU,EAAE,GAAG,QAAQ,eAAe,IAAI,CAAC;AAAA,YAC7F,eAAe,QAAQ,oBAAoB,MAAM,UAAU,EAAE,GAAG,QAAQ,cAAc,IAAI,CAAC;AAAA,YAC3F,MAAM;AAAA,YACN,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAEA,4BAAoB,gBAAgB,QAAQ,IAAI;AAChD;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,qBAA2B;AAAA,IAC/B,CAAC,SAAsB,aAA8B;AACnD,UAAI,UAAU;AACZ,cAAM,WAAW,gBAAgB,QAAQ,IAAI,OAAO;AACpD,iBAAS;AAAA,UACP,MAAM;AAAA,UACN;AAAA,UACA,gBAAgB,SAAS;AAAA,UACzB,qBAAqB,SAAS;AAAA,UAC9B,qBAAqB,UAAU,QAAQ;AAAA,QACzC,CAAC;AACD,cAAM,UAAU,UAAU,WAAW,kBAAkB,OAAO;AAC9D,cAAM,YAAY,QAAQ;AAG1B,cAAM,aAAa,UAAU,OACzB;AAAA,UACE,gBAAgB,SAAS,KAAK;AAAA,UAC9B,mBAAmB,SAAS,KAAK;AAAA,UACjC,kBAAkB,SAAS,KAAK;AAAA,QAClC,IACA;AAAA,UACE,gBAAgB,sBAAsB,SAAS,cAAc;AAAA,UAC7D,mBAAmB,SAAS,0BACxB,sBAAsB,SAAS,uBAAuB,IACtD;AAAA,UACJ,kBAAkB,SAAS,sBACvB,sBAAsB,SAAS,mBAAmB,IAClD;AAAA,QACN;AAEJ,wBAAgB,QAAQ,IAAI,SAAS;AAAA,UACnC;AAAA,UACA;AAAA,UACA,gBAAgB,UAAU,kBAAkB,EAAE,GAAG,SAAS,QAAQ,eAAe;AAAA,UACjF,eAAe,UAAU,iBAAiB,EAAE,GAAG,SAAS,QAAQ,cAAc;AAAA,UAC9E,UAAU,UAAU,YAAY;AAAA,UAChC,MAAM,YACF;AAAA,YACE,GAAG;AAAA,YACH,cAAc,sBAAsB,SAAS;AAAA,YAC7C,iBAAiB,QAAQ,yBACrB,sBAAsB,QAAQ,sBAAqC,IACnE;AAAA,YACJ,gBAAgB,QAAQ,qBACpB,sBAAsB,QAAQ,kBAAiC,IAC/D;AAAA,UACN,IACA;AAAA,QACN,CAAC;AACD,4BAAoB,gBAAgB,QAAQ,IAAI;AAAA,MAClD;AAGA,YAAM,EAAE,SAAS,cAAc,KAAK,IAAI,kBAAkB,OAAO;AACjE,YAAM,SAAS,wBAAwB,OAAO;AAC9C,YAAM,SAAS,kBAAkB,OAAO;AACxC,YAAM,QAAQ,uBAAuB,OAAO;AAC5C,YAAM,aAAa,sBAAsB,OAAO;AAChD,YAAM,cAAc,eAAe,OAAO;AAE1C,eAAS,CAAC,UAAU;AAAA,QAClB,QAAQ;AAAA,QACR,iBAAiB;AAAA,QACjB;AAAA,QACA,iBAAiB;AAAA,QACjB,sBAAsB;AAAA,QACtB,gBAAgB;AAAA,QAChB,cAAc;AAAA,QACd,gBAAgB;AAAA,QAChB,eAAe;AAAA,QACf,oBAAoB;AAAA,QACpB,gBAAgB,KAAK;AAAA,QACrB,eAAe,KAAK;AAAA,QACpB,gBAAgB,KAAK;AAAA,QACrB,YAAY,KAAK;AAAA,QACjB,OAAO,KAAK;AAAA,QACZ,UAAU,KAAK;AAAA,QACf,iBAAiB,KAAK;AAAA,QACtB,oBAAoB;AAAA,MACtB,EAAE;AAAA,IACJ;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,gBAAsB,mBAAY,CAAC,SAAqB;AAC5D,aAAS,CAAC,UAAU;AAAA,MAClB,GAAG;AAAA,MACH,YAAY;AAAA,MACZ,iBAAiB;AAAA,IACnB,EAAE;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,QAAM,WAAiB,mBAAY,CAAC,UAAiB;AACnD,aAAS,CAAC,UAAU,EAAE,GAAG,MAAM,MAAM,EAAE;AACvC,QAAI;AAAE,mBAAa,QAAQ,qBAAqB,KAAK;AAAA,IAAE,QAAQ;AAAA,IAAC;AAAA,EAClE,GAAG,CAAC,CAAC;AAEL,QAAM,aAAmB,mBAAY,CAAC,SAAsB,kBAA4C;AACtG,UAAM,UAAU,kBAAkB,OAAO;AACzC,UAAM,OAAO,QAAQ,sBAAsB;AAC3C,UAAM,mBAAmB;AAAA,MACvB,GAAG,cAAc,IAAI,KAAK;AAAA,MAC1B,GAAG,cAAc,IAAI,KAAK;AAAA,IAC5B;AACA,UAAM,KAAK,WAAW,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAC1E,UAAM,UAAmB;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,WAAW,KAAK,IAAI;AAAA,MACpB,SAAS,CAAC;AAAA,IACZ;AACA,aAAS,CAAC,UAAU;AAAA,MAClB,GAAG;AAAA,MACH,UAAU,CAAC,GAAG,KAAK,UAAU,OAAO;AAAA,MACpC,iBAAiB;AAAA,IACnB,EAAE;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,QAAM,oBAA0B,mBAAY,CAAC,IAAY,SAAiB;AACxE,aAAS,CAAC,UAAU;AAAA,MAClB,GAAG;AAAA,MACH,UAAU,KAAK,SAAS,IAAI,CAAC,MAAO,EAAE,OAAO,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,CAAE;AAAA,IACvE,EAAE;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAwB,mBAAY,CAAC,IAAY,SAAiB;AACtE,aAAS,CAAC,UAAU;AAAA,MAClB,GAAG;AAAA,MACH,UAAU,KAAK,SAAS;AAAA,QAAI,CAAC,MAC3B,EAAE,OAAO,KACL,EAAE,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,WAAW,KAAK,IAAI,EAAE,CAAC,EAAE,IACjE;AAAA,MACN;AAAA,IACF,EAAE;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAsB,mBAAY,CAAC,OAAe;AACtD,aAAS,CAAC,UAAU;AAAA,MAClB,GAAG;AAAA,MACH,UAAU,KAAK,SAAS,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,MACjD,iBAAiB,KAAK,oBAAoB,KAAK,OAAO,KAAK;AAAA,IAC7D,EAAE;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAsB,mBAAY,OAAO,OAAe;AAC5D,UAAM,UAAU,SAAS,QAAQ,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACjE,QAAI,CAAC,QAAS,QAAO;AAErB,UAAM,iBAAiB,mBAAmB,QAAQ,SAAS,QAAQ,MAAM,QAAQ,OAAO;AACxF,QAAI;AACF,YAAM,UAAU,UAAU,UAAU;AAAA;AAAA,EAAiC,cAAc,EAAE;AACrF,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,qBAA2B,mBAAY,CAAC,OAAsB;AAClE,aAAS,CAAC,SAAS;AACjB,UAAI,WAAW,KAAK;AACpB,UAAI,KAAK,mBAAmB,KAAK,oBAAoB,IAAI;AACvD,cAAM,SAAS,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,eAAe;AACjE,YAAI,UAAU,OAAO,SAAS,IAAI;AAChC,qBAAW,SAAS,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,eAAe;AAAA,QACjE;AAAA,MACF;AACA,aAAO,EAAE,GAAG,MAAM,UAAU,iBAAiB,GAAG;AAAA,IAClD,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAyB,mBAAY,CAAC,YAAyB;AACnE,QAAI,CAAC,cAAc,OAAO,EAAG;AAC7B,QAAI,SAAS,QAAQ,mBAAoB;AAGzC,UAAM,WAAW,gBAAgB,QAAQ,IAAI,OAAO;AACpD,UAAM,eAAe,UAAU,UAAU,iBAAiB,QAAQ,eAAe;AACjF,YAAQ,aAAa,kCAAkC,YAAY;AAEnE,YAAQ,aAAa,mBAAmB,MAAM;AAC9C,YAAQ,MAAM,UAAU;AACxB,YAAQ,MAAM,gBAAgB;AAC9B,YAAQ,MAAM;AAGd,UAAM,YAAY,OAAO,aAAa;AACtC,QAAI,WAAW;AACb,YAAM,QAAQ,SAAS,YAAY;AACnC,YAAM,mBAAmB,OAAO;AAChC,gBAAU,gBAAgB;AAC1B,gBAAU,SAAS,KAAK;AAAA,IAC1B;AAEA,aAAS,CAAC,UAAU,EAAE,GAAG,MAAM,oBAAoB,QAAQ,EAAE;AAAA,EAC/D,GAAG,CAAC,CAAC;AAEL,QAAM,oBAA0B,mBAAY,MAAM;AAChD,UAAM,iBAAiB,SAAS,QAAQ;AACxC,QAAI,CAAC,eAAgB;AAErB,wBAAoB,cAAc;AAAA,EACpC,GAAG,CAAC,mBAAmB,CAAC;AAGxB,EAAM,iBAAU,MAAM;AACpB,UAAM,iBAAiB,MAAM;AAC7B,QAAI,CAAC,eAAgB;AAErB,aAAS,gBAAgB,GAAe;AACtC,UAAI,CAAC,eAAgB,SAAS,EAAE,MAAc,GAAG;AAC/C,0BAAkB;AAAA,MACpB;AAAA,IACF;AAGA,UAAM,QAAQ,sBAAsB,MAAM;AACxC,eAAS,iBAAiB,aAAa,iBAAiB,IAAI;AAAA,IAC9D,CAAC;AAED,WAAO,MAAM;AACX,2BAAqB,KAAK;AAC1B,eAAS,oBAAoB,aAAa,iBAAiB,IAAI;AAAA,IACjE;AAAA,EACF,GAAG,CAAC,MAAM,oBAAoB,iBAAiB,CAAC;AAEhD,QAAM,kBAAwB,mBAAY,MAAqB;AAC7D,yBAAqB;AACrB,UAAM,QAAuB,CAAC;AAC9B,eAAW,QAAQ,gBAAgB,QAAQ,OAAO,GAAG;AACnD,UAAI,CAAC,KAAK,QAAQ,aAAa;AAC7B,wBAAgB,QAAQ,OAAO,KAAK,OAAO;AAC3C;AAAA,MACF;AACA,YAAM,KAAK,IAAI;AAAA,IACjB;AACA,wBAAoB,gBAAgB,QAAQ,IAAI;AAChD,WAAO;AAAA,EACT,GAAG,CAAC,oBAAoB,CAAC;AAEzB,QAAM,iBAAuB,mBAAY,YAA8B;AACrE,UAAM,QAAQ,gBAAgB;AAC9B,QAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,UAAM,OAAO,mBAAmB,KAAK;AACrC,QAAI;AACF,YAAM,UAAU,UAAU,UAAU;AAAA;AAAA,EAAiC,IAAI,EAAE;AAC3E,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,sBAA4B,mBAAY,CAAC,SAAsB,gBAA6B;AAChG,eAAW,QAAQ,OAAO,KAAK,YAAY,aAAa,GAAG;AACzD,cAAQ,MAAM,eAAe,IAAI;AAAA,IACnC;AACA,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,YAAY,cAAc,GAAG;AACtE,cAAQ,MAAM,YAAY,MAAM,KAAK;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,yBAA+B,mBAAY,MAAM;AACrD,UAAM,UAAU,SAAS;AACzB,QAAI,CAAC,QAAQ,gBAAiB;AAC9B,UAAM,KAAK,QAAQ;AACnB,UAAM,EAAE,SAAS,cAAc,KAAK,IAAI,kBAAkB,EAAE;AAC5D,UAAM,SAAS,kBAAkB,EAAE;AACnC,UAAM,QAAQ,uBAAuB,EAAE;AACvC,UAAM,aAAa,sBAAsB,EAAE;AAC3C,UAAM,SAAS,wBAAwB,EAAE;AACzC,aAAS,CAAC,UAAU;AAAA,MAClB,GAAG;AAAA,MACH,iBAAiB;AAAA,MACjB,sBAAsB;AAAA,MACtB,cAAc;AAAA,MACd,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,gBAAgB,wBAAwB,EAAE;AAAA,MAC1C,eAAe,CAAC;AAAA,IAClB,EAAE;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,QAAM,oBAA0B,mBAAY,CAAC,YAAyB;AACpE,UAAM,cAAc,gBAAgB,QAAQ,IAAI,OAAO;AACvD,QAAI,aAAa;AACf,0BAAoB,SAAS,WAAW;AACxC,UAAI,YAAY,UAAU;AACxB,gBAAQ,cAAc,YAAY,SAAS;AAAA,MAC7C;AAAA,IACF;AACA,oBAAgB,QAAQ,OAAO,OAAO;AACtC,2BAAuB,QAAQ,IAAI,OAAO;AAC1C,wBAAoB,gBAAgB,QAAQ,IAAI;AAChD,QAAI,SAAS,QAAQ,oBAAoB,SAAS;AAChD,6BAAuB;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,qBAAqB,sBAAsB,CAAC;AAEhD,QAAM,oBAA0B,mBAAY,MAAM;AAChD,eAAW,CAAC,IAAI,WAAW,KAAK,gBAAgB,QAAQ,QAAQ,GAAG;AACjE,0BAAoB,IAAI,WAAW;AACnC,UAAI,YAAY,UAAU;AACxB,WAAG,cAAc,YAAY,SAAS;AAAA,MACxC;AACA,6BAAuB,QAAQ,IAAI,EAAE;AAAA,IACvC;AACA,UAAM,UAAU,SAAS;AACzB,QAAI,QAAQ,iBAAiB;AAE3B,UAAI,CAAC,gBAAgB,QAAQ,IAAI,QAAQ,eAAe,GAAG;AACzD,mBAAW,QAAQ,OAAO,KAAK,QAAQ,aAAa,GAAG;AACrD,kBAAQ,gBAAgB,MAAM,eAAe,IAAI;AAAA,QACnD;AACA,mBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,QAAQ,cAAc,GAAG;AAClE,kBAAQ,gBAAgB,MAAM,YAAY,MAAM,KAAK;AAAA,QACvD;AAAA,MACF;AACA,6BAAuB,QAAQ,IAAI,QAAQ,eAAe;AAAA,IAC5D;AACA,oBAAgB,QAAQ,MAAM;AAC9B,wBAAoB,CAAC;AACrB,2BAAuB;AAAA,EACzB,GAAG,CAAC,qBAAqB,sBAAsB,CAAC;AAEhD,QAAM,cAAoB,mBAAY,YAAY;AAChD,QAAI,CAAC,MAAM,mBAAmB,CAAC,MAAM,YAAa,QAAO;AACzD,UAAM,cAAc,gBAAgB,QAAQ,IAAI,MAAM,eAAe;AACrE,UAAM,mBAAmB,OAAO,KAAK,MAAM,aAAa,EAAE,SAAS;AACnE,UAAM,cAAc,QAAQ,aAAa,QAAQ;AAEjD,UAAM,UAAU,kBAAkB,MAAM,eAAe;AACvD,UAAM,iBAAiB,oBAAoB,cACvC,gBAAgB,SAAS,MAAM,eAAe,aAAa,QAAQ,IACnE,oBAAoB,OAAO;AAC/B,QAAI;AACF,YAAM,UAAU,UAAU,UAAU;AAAA;AAAA,EAAiC,cAAc,EAAE;AACrF,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,GAAG;AAAA,IACD,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN;AAAA,EACF,CAAC;AAED,QAAMC,mBAAwB,mBAAY,YAAY;AACpD,QAAI,CAAC,MAAM,mBAAmB,CAAC,MAAM,YAAa,QAAO;AACzD,UAAM,cAAc,gBAAgB,QAAQ,IAAI,MAAM,eAAe;AACrE,UAAM,mBAAmB,OAAO,KAAK,MAAM,aAAa,EAAE,SAAS;AACnE,UAAM,cAAc,QAAQ,aAAa,QAAQ;AACjD,QAAI,CAAC,oBAAoB,CAAC,YAAa,QAAO;AAE9C,UAAM,UAAU,kBAAkB,MAAM,eAAe;AACvD,UAAM,iBAAiB,gBAAgB,SAAS,MAAM,eAAe,aAAa,QAAQ;AAC1F,UAAM,UAAU,OAAO,QAAQ,MAAM,aAAa,EAAE,IAAI,CAAC,CAAC,aAAa,QAAQ,OAAO;AAAA,MACpF;AAAA,MACA;AAAA,MACA,eAAe,iBAAiB,EAAE,CAAC,WAAW,GAAG,SAAS,CAAC;AAAA,IAC7D,EAAE;AAEF,QAAI;AACF,YAAM,SAAS,MAAM,gBAAgB;AAAA,QACnC,SAAS;AAAA,UACP,SAAS,QAAQ;AAAA,UACjB,IAAI,QAAQ;AAAA,UACZ,WAAW,QAAQ;AAAA,UACnB,aAAa,QAAQ;AAAA,UACrB,YAAY,QAAQ;AAAA,UACpB,aAAa,QAAQ;AAAA,QACvB;AAAA,QACA,QAAQ,QAAQ,aAAa;AAAA,QAC7B,YAAY,QAAQ;AAAA,QACpB;AAAA,QACA,YAAY,aAAa,YAAY;AAAA,QACrC;AAAA,MACF,CAAC;AACD,aAAO,OAAO;AAAA,IAChB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,GAAG;AAAA,IACD,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN;AAAA,EACF,CAAC;AAED,QAAMC,sBAA2B,mBAAY,OAAO,OAAe;AACjE,UAAM,UAAU,SAAS,QAAQ,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACjE,QAAI,CAAC,QAAS,QAAO;AAErB,UAAM,iBAAiB,mBAAmB,QAAQ,SAAS,QAAQ,MAAM,QAAQ,OAAO;AAExF,QAAI;AACF,YAAM,SAAS,MAAM,mBAAmB;AAAA,QACtC,SAAS;AAAA,UACP,SAAS,QAAQ,QAAQ;AAAA,UACzB,IAAI,QAAQ,QAAQ;AAAA,UACpB,WAAW,QAAQ,QAAQ;AAAA,UAC3B,aAAa,QAAQ,QAAQ;AAAA,UAC7B,YAAY,QAAQ,QAAQ;AAAA,UAC5B,aAAa,QAAQ,QAAQ;AAAA,QAC/B;AAAA,QACA,QAAQ,QAAQ,QAAQ,aAAa;AAAA,QACrC,YAAY,QAAQ,QAAQ;AAAA,QAC5B,aAAa,QAAQ;AAAA,QACrB,SAAS,QAAQ;AAAA,QACjB;AAAA,MACF,CAAC;AACD,aAAO,OAAO;AAAA,IAChB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,CAAC;AAKL,EAAM,iBAAU,MAAM;AACpB,aAAS,aAAa,GAAkB;AACtC,WAAK,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,EAAE,SAAS,YAAY,EAAE,QAAQ,MAAM;AAClG,UAAE,eAAe;AACjB,uBAAe;AAAA,MACjB;AAAA,IACF;AACA,WAAO,iBAAiB,WAAW,cAAc,IAAI;AACrD,WAAO,MAAM,OAAO,oBAAoB,WAAW,cAAc,IAAI;AAAA,EACvE,GAAG,CAAC,cAAc,CAAC;AAEnB,EAAM,iBAAU,MAAM;AACpB,aAAS,cAAc,GAAkB;AACvC,WAAK,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,OAAO,CAAC,EAAE,UAAU;AAC5D,YAAI,MAAM,mBAAoB;AAC9B,UAAE,eAAe;AACjB,aAAK;AACL;AAAA,MACF;AAEA,UAAI,EAAE,QAAQ,OAAO,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,MAAM,gBAAgB;AAChG,cAAM,SAAS,SAAS;AACxB,cAAM,UAAU,kBAAkB,oBAAoB,kBAAkB,uBAAwB,kBAAkB,eAAe,OAAO;AACxI,YAAI,CAAC,SAAS;AACZ,YAAE,eAAe;AACjB,mBAAS,CAAC,SAAS;AACjB,gBAAI,WAAW,KAAK;AACpB,gBAAI,KAAK,iBAAiB;AACxB,oBAAMC,UAAS,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,eAAe;AACjE,kBAAIA,WAAUA,QAAO,SAAS,IAAI;AAChC,2BAAW,SAAS,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,eAAe;AAAA,cACjE;AAAA,YACF;AACA,mBAAO;AAAA,cACL,GAAG;AAAA,cACH;AAAA,cACA,YAAY,KAAK,eAAe,YAAY,WAAW;AAAA,cACvD,iBAAiB;AAAA,YACnB;AAAA,UACF,CAAC;AACD;AAAA,QACF;AAAA,MACF;AAEA,UAAI,EAAE,QAAQ,OAAO,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,MAAM,kBAAkB,MAAM,iBAAiB;AACzH,cAAM,SAAS,SAAS;AACxB,cAAM,UAAU,kBAAkB,oBAAoB,kBAAkB,uBAAwB,kBAAkB,eAAe,OAAO;AACxI,YAAI,CAAC,SAAS;AACZ,YAAE,eAAe;AACjB,2BAAiB;AACjB;AAAA,QACF;AAAA,MACF;AAEA,UAAI,EAAE,QAAQ,WAAW,MAAM,kBAAkB,CAAC,MAAM,sBAAsB,MAAM,iBAAiB;AACnG,cAAM,SAAS,SAAS;AACxB,cAAM,UAAU,kBAAkB,oBAAoB,kBAAkB,uBAAwB,kBAAkB,eAAe,OAAO;AACxI,YAAI,CAAC,WAAW,cAAc,MAAM,eAAe,GAAG;AACpD,YAAE,eAAe;AACjB,2BAAiB,MAAM,eAAe;AACtC;AAAA,QACF;AAAA,MACF;AAEA,UAAI,EAAE,QAAQ,UAAU;AACtB,YAAI,MAAM,oBAAoB;AAC5B,4BAAkB;AAClB;AAAA,QACF;AACA,YAAI,MAAM,iBAAiB;AACzB,mBAAS,CAAC,SAAS;AACjB,gBAAI,WAAW,KAAK;AACpB,kBAAM,SAAS,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,eAAe;AACjE,gBAAI,UAAU,OAAO,SAAS,IAAI;AAChC,yBAAW,SAAS,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,eAAe;AAAA,YACjE;AACA,mBAAO,EAAE,GAAG,MAAM,UAAU,iBAAiB,KAAK;AAAA,UACpD,CAAC;AAAA,QACH,WAAW,MAAM,eAAe,WAAW;AACzC,mBAAS,CAAC,UAAU,EAAE,GAAG,MAAM,YAAY,SAAS,EAAE;AAAA,QACxD,WAAW,MAAM,QAAQ;AACvB,qBAAW;AAAA,QACb,WAAW,MAAM,gBAAgB;AAC/B,yBAAe;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAEA,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,EAClE,GAAG,CAAC,MAAM,QAAQ,MAAM,gBAAgB,MAAM,iBAAiB,MAAM,YAAY,MAAM,oBAAoB,MAAM,iBAAiB,YAAY,gBAAgB,kBAAkB,MAAM,mBAAmB,gBAAgB,CAAC;AAE1N,QAAM,eAAqB,eAAgC,OAAO;AAAA,IAChE,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAAF;AAAA,IACA,oBAAAC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACAD;AAAA,IACAC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SACE,6CAAC,2BACC,wDAAC,kBAAkB,UAAlB,EAA2B,OAAO,cACjC;AAAA,iDAAC,gBAAa;AAAA,IACb;AAAA,KACH,GACF;AAEJ;AAEA,SAAS,eAAe;AACtB,QAAM,EAAE,MAAM,IAAI,cAAc;AAChC,QAAM,YAAY,mBAAmB;AAErC,EAAM,iBAAU,MAAM;AACpB,QAAI,CAAC,UAAW;AAChB,UAAM,OAAQ,UAAU,YAAY,EAAiB;AACrD,QAAI,UAAU,UAAU;AACtB,WAAK,gBAAgB,YAAY;AAAA,IACnC,OAAO;AACL,WAAK,aAAa,cAAc,KAAK;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,WAAW,KAAK,CAAC;AAErB,SAAO;AACT;;;AMn+CA,IAAAE,UAAuB;AACvB,uBAA6B;;;ACD7B,IAAAC,SAAuB;;;ACAvB,kBAAsC;AACtC,4BAAwB;AAEjB,SAAS,MAAM,QAAsB;AAC1C,aAAO,mCAAQ,kBAAK,MAAM,CAAC;AAC7B;;;ADwBM,IAAAC,sBAAA;AA1BN,IAAM,iBAAiB;AAAA,EACrB,MAAM;AAAA,EACN,SAAS;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,SAAS;AAAA,IACT,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,EACR;AACF;AAOA,IAAM,SAAe;AAAA,EACnB,CAAC,EAAE,WAAW,UAAU,WAAW,OAAO,WAAW,GAAG,MAAM,GAAG,QAAQ;AACvE,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT,eAAe;AAAA,UACf,eAAe,QAAQ,OAAO;AAAA,UAC9B,eAAe,KAAK,IAAI;AAAA,UACxB;AAAA,QACF;AAAA,QACA;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,OAAO,cAAc;;;AE1CrB,IAAAC,SAAuB;AAMjB,IAAAC,sBAAA;AAHN,IAAM,QAAc;AAAA,EAClB,CAAC,EAAE,WAAW,MAAM,GAAG,MAAM,GAAG,QAAQ;AACtC,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,MAAM,cAAc;;;AClBpB,IAAAC,SAAuB;AACvB,qBAA4C;AAgB1C,IAAAC,sBAAA;AAZF,IAAM,kBAAkB,CAAC;AAAA,EACvB;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,GAAG;AACL,MAME,6CAAC,eAAAC,QAAiB,UAAjB,EAA0B,OAAO,SAAS,eAAe,YAAyB,GAAG,OACnF,UACH;AAGF,IAAM,UAAU,eAAAA,QAAiB;AAEjC,IAAM,iBAAiB,eAAAA,QAAiB;AAExC,IAAM,iBAAuB,kBAO3B,CAAC,EAAE,WAAW,MAAM,OAAO,aAAa,GAAG,GAAG,MAAM,GAAG,QAAQ;AAC/D,QAAM,YAAY,mBAAmB;AACrC,SACE,6CAAC,eAAAA,QAAiB,QAAjB,EAAwB,WACvB,uDAAC,eAAAA,QAAiB,YAAjB,EAA4B,MAAY,OAAc,YAAwB,WAAU,mBACvF;AAAA,IAAC,eAAAA,QAAiB;AAAA,IAAjB;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN,GACF,GACF;AAEJ,CAAC;AACD,eAAe,cAAc;AAE7B,IAAM,sBAAsB,eAAAA,QAAiB;AAE7C,SAAS,cAAc,OAAuE;AAC5F,QAAM,YAAY,mBAAmB;AACrC,SAAO,6CAAC,eAAAA,QAAiB,QAAjB,EAAwB,WAAuB,GAAG,OAAO;AACnE;AAEA,IAAM,oBAAoB,eAAAA,QAAiB;AAC3C,IAAM,eAAe,eAAAA,QAAiB;;;AC5DtC,oBAA0C;AAUjC,IAAAC,sBAAA;AAPT,IAAM,SAAS,cAAAC,OAAgB;AAC/B,IAAM,gBAAgB,cAAAA,OAAgB;AACtC,IAAM,cAAc,cAAAA,OAAgB;AACpC,IAAM,aAAa,cAAAA,OAAgB;AAEnC,SAAS,aAAa,OAAsE;AAC1F,QAAM,YAAY,mBAAmB;AACrC,SAAO,6CAAC,cAAAA,OAAgB,QAAhB,EAAuB,WAAuB,GAAG,OAAO;AAClE;AAEA,SAAS,iBAAiB,OAA0E;AAClG,SAAO,6CAAC,cAAAA,OAAgB,YAAhB,EAA4B,GAAG,OAAO,OAAO,EAAE,eAAe,QAAQ,GAAG,MAAM,MAAM,GAAG;AAClG;AACA,IAAM,cAAc,cAAAA,OAAgB;AACpC,IAAM,aAAa,cAAAA,OAAgB;AACnC,IAAM,sBAAsB,cAAAA,OAAgB;AAC5C,IAAM,iBAAiB,cAAAA,OAAgB;;;ACnBvC,IAAAC,SAAuB;AACvB,qBAAwB;AAef,IAAAC,sBAAA;AAFT,SAAS,kBAAkB,OAA8D;AACvF,QAAM,YAAY,mBAAmB;AACrC,SAAO,6CAAC,uBAAQ,QAAR,EAAe,WAAuB,GAAG,OAAO;AAC1D;AAOA,IAAM,0BAAgC,qBAAmD,IAAI;AAEtF,SAAS,iBAAiB,EAAE,SAAS,GAAkC;AAC5E,QAAM,CAAC,gBAAgB,iBAAiB,IAAU,gBAAwB,IAAI;AAC9E,SACE,6CAAC,wBAAwB,UAAxB,EAAiC,OAAO,EAAE,gBAAgB,kBAAkB,GAC1E,UACH;AAEJ;AAEA,SAAS,QAAQ,QAAuD;AACtE,QAAM,MAAY,cAAuB,IAAI;AAE7C,QAAM,qBAA2B;AAAA,IAC/B,CAAC,MAAyC;AACxC,YAAM,KAAK,IAAI;AACf,UAAI,CAAC,GAAI;AACT,YAAM,OAAO,GAAG,sBAAsB;AACtC,YAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,EAAE,UAAU,KAAK,MAAM,KAAK,KAAK,CAAC;AACjE,YAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,EAAE,UAAU,KAAK,KAAK,KAAK,MAAM,CAAC;AACjE,aAAO,GAAG,GAAG,IAAI;AAAA,IACnB;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,gBAAsB;AAAA,IAC1B,CAAC,MAA0B;AACzB,QAAE,eAAe;AACjB,UAAI,SAAS,kBAAkB,EAAE,SAAS;AAC1C,yBAAmB,CAAC;AAAA,IACtB;AAAA,IACA,CAAC,kBAAkB;AAAA,EACrB;AAEA,QAAM,gBAAsB;AAAA,IAC1B,CAAC,MAA0B;AACzB,UAAI,EAAE,YAAY,EAAG;AACrB,yBAAmB,CAAC;AAAA,IACtB;AAAA,IACA,CAAC,kBAAkB;AAAA,EACrB;AAEA,SAAO,EAAE,KAAK,eAAe,cAAc;AAC7C;AASA,SAAS,oBAAoB,EAAE,KAAK,YAAY,OAAO,SAAS,GAA6B;AAC3F,QAAM,OAAO,QAAQ,CAAC,GAAG,IAAI,SAAS;AACpC,aAAU,IAAI,KAAK,QAAS,MAAM,IAAI,KAAK,KAAK,UAAU,GAAG;AAAA,EAC/D,CAAC;AAED,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK,KAAK;AAAA,MACV,eAAe,KAAK;AAAA,MACpB,eAAe,KAAK;AAAA,MACpB,WAAU;AAAA,MACV,OAAO,EAAE,iBAAiB,OAAO,GAAG,eAAe;AAAA,MAEnD;AAAA,qDAAC,SAAI,WAAU,mDAAkD,OAAO,EAAE,YAAY,+CAA+C,GAAG;AAAA,QACxI,6CAAC,SAAI,WAAU,mDAAkD,OAAO,EAAE,YAAY,gDAAgD,GAAG;AAAA,QACzI;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,MAAM,GAAG,UAAU,KAAK,KAAK,GAAG,MAAM,KAAK,IAAI;AAAA;AAAA,QAC1D;AAAA;AAAA;AAAA,EACF;AAEJ;AAUA,SAAS,eAAe,EAAE,OAAO,KAAK,YAAY,UAAU,aAAa,GAAwB;AAC/F,QAAM,OAAO,QAAQ,CAAC,IAAI,GAAG,SAAS;AACpC,aAAU,IAAI,KAAK,SAAU,GAAG;AAAA,EAClC,CAAC;AAED,QAAM,MAAO,QAAQ,MAAO;AAE5B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK,KAAK;AAAA,MACV,eAAe,KAAK;AAAA,MACpB,eAAe,KAAK;AAAA,MACpB,WAAU;AAAA,MACV,OACE,eACI;AAAA,QACE,iBACE;AAAA,QACF,gBAAgB;AAAA,MAClB,IACA;AAAA,MAGN;AAAA,qDAAC,SAAI,WAAU,mDAAkD,OAAO,EAAE,WAAW,GAAG;AAAA,QACxF;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,KAAK,GAAG,GAAG,IAAI;AAAA;AAAA,QAC1B;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,CAAC,OAAO,QAAQ,IAAU,gBAAS,KAAK,MAAM,KAAK,EAAE,SAAS,CAAC;AAErE,EAAM,iBAAU,MAAM;AACpB,aAAS,KAAK,MAAM,KAAK,EAAE,SAAS,CAAC;AAAA,EACvC,GAAG,CAAC,KAAK,CAAC;AAEV,SACE,8CAAC,SAAI,WAAU,2BACb;AAAA,iDAAC,UAAK,WAAU,qCAAqC,iBAAM;AAAA,IAC3D;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU,CAAC,MAAM;AACf,mBAAS,EAAE,OAAO,KAAK;AACvB,gBAAM,IAAI,SAAS,EAAE,OAAO,KAAK;AACjC,cAAI,CAAC,MAAM,CAAC,KAAK,KAAK,KAAK,KAAK,IAAK,UAAS,CAAC;AAAA,QACjD;AAAA,QACA,QAAQ,MAAM,SAAS,KAAK,MAAM,KAAK,EAAE,SAAS,CAAC;AAAA,QACnD,WAAU;AAAA;AAAA,IACZ;AAAA,KACF;AAEJ;AASO,SAAS,mBAAmB,EAAE,IAAI,OAAO,UAAU,SAAS,GAA4B;AAC7F,QAAM,QAAc,kBAAW,uBAAuB;AACtD,QAAM,MAAM,SAAS,MAAM,GAAG;AAC9B,QAAM,aAAa,SAAS,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE/C,QAAM,CAAC,KAAK,MAAM,IAAU,gBAAS,EAAE,GAAG,WAAW,GAAG,GAAG,WAAW,GAAG,GAAG,WAAW,EAAE,CAAC;AAC1F,QAAM,CAAC,OAAO,QAAQ,IAAU,gBAAS,MAAM,KAAK;AAGpD,QAAM,gBAAsB,cAAO,MAAM,GAAG;AAE5C,EAAM,iBAAU,MAAM;AACpB,QAAI,MAAM,QAAQ,cAAc,SAAS;AACvC,YAAM,SAAS,SAAS,MAAM,GAAG;AACjC,YAAM,SAAS,SAAS,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAEpD,aAAO,CAAC,UAAU;AAAA,QAChB,GAAG,OAAO,MAAM,KAAK,OAAO,MAAM,IAAI,KAAK,IAAI,OAAO;AAAA,QACtD,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,MACZ,EAAE;AACF,oBAAc,UAAU,MAAM;AAAA,IAChC;AACA,aAAS,MAAM,KAAK;AAAA,EACtB,GAAG,CAAC,MAAM,KAAK,MAAM,KAAK,CAAC;AAE3B,QAAM,aAAmB;AAAA,IACvB,CAAC,GAAW,GAAW,GAAW,MAAc;AAC9C,YAAM,SAAS,SAAS,GAAG,GAAG,CAAC;AAC/B,YAAM,MAAM,SAAS,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AACjD,oBAAc,UAAU;AACxB,eAAS;AAAA,QACP;AAAA,QACA,OAAO;AAAA,QACP,KAAK,iBAAiB,EAAE,KAAK,OAAO,GAAG,KAAK,GAAG,CAAC;AAAA,MAClD,CAAC;AAAA,IACH;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,iBAAiB,CAAC,GAAW,MAAc;AAC/C,WAAO,CAAC,UAAU,EAAE,GAAG,MAAM,GAAG,EAAE,EAAE;AACpC,eAAW,IAAI,GAAG,GAAG,GAAG,KAAK;AAAA,EAC/B;AAEA,QAAM,kBAAkB,CAAC,MAAc;AACrC,WAAO,CAAC,UAAU,EAAE,GAAG,MAAM,EAAE,EAAE;AACjC,eAAW,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK;AAAA,EACnC;AAEA,QAAM,oBAAoB,CAAC,MAAc;AACvC,UAAM,UAAU,KAAK,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,IAAI,IAAI,OAAO,GAAG,CAAC,CAAC;AAC1E,aAAS,OAAO;AAChB,eAAW,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO;AAAA,EACzC;AAGA,QAAM,aAAa,SAAS,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAC/C,QAAM,aAAa,SAAS,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;AACpE,QAAM,aAAa,SAAS,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;AAEpE,QAAM,kBAAkB,CAAC,OAAwB,QAAgB;AAC/D,UAAM,SAAS,EAAE,GAAG,YAAY,CAAC,KAAK,GAAG,IAAI;AAC7C,UAAM,SAAS,SAAS,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AACpD,UAAM,SAAS,SAAS,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAEpD,WAAO,CAAC,UAAU;AAAA,MAChB,GAAG,UAAU,MAAM,MAAM,OAAO,MAAM,KAAK,OAAO,MAAM,IAAI,KAAK,IAAI,OAAO;AAAA,MAC5E,GAAG,OAAO;AAAA,MACV,GAAG,OAAO;AAAA,IACZ,EAAE;AACF,UAAM,MAAM,SAAS,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AACjD,kBAAc,UAAU;AACxB,aAAS,EAAE,KAAK,OAAO,KAAK,iBAAiB,EAAE,KAAK,OAAO,KAAK,GAAG,CAAC,EAAE,CAAC;AAAA,EACzE;AAEA,QAAM,kBAAkB,CAAC,OAAwB,QAAgB;AAC/D,UAAM,SAAS,EAAE,GAAG,YAAY,CAAC,KAAK,GAAG,IAAI;AAC7C,UAAM,SAAS,SAAS,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AACpD,WAAO,CAAC,UAAU;AAAA,MAChB,GAAG,OAAO,MAAM,KAAK,OAAO,MAAM,IAAI,KAAK,IAAI,OAAO;AAAA,MACtD,GAAG,OAAO;AAAA,MACV,GAAG,OAAO;AAAA,IACZ,EAAE;AACF,UAAM,MAAM,SAAS,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AACjD,kBAAc,UAAU;AACxB,aAAS,EAAE,KAAK,OAAO,KAAK,iBAAiB,EAAE,KAAK,OAAO,KAAK,GAAG,CAAC,EAAE,CAAC;AAAA,EACzE;AAEA,QAAM,iBAAiB,CAAC,UAAkB;AACxC,UAAM,UAAU,MAAM,QAAQ,KAAK,EAAE,EAAE,YAAY;AACnD,QAAI,gBAAgB,KAAK,OAAO,GAAG;AACjC,YAAM,SAAS,SAAS,OAAO;AAC/B,YAAM,SAAS,SAAS,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AACpD,aAAO,CAAC,UAAU;AAAA,QAChB,GAAG,OAAO,MAAM,KAAK,OAAO,MAAM,IAAI,KAAK,IAAI,OAAO;AAAA,QACtD,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,MACZ,EAAE;AACF,oBAAc,UAAU;AACxB,eAAS,EAAE,KAAK,SAAS,OAAO,KAAK,iBAAiB,EAAE,KAAK,SAAS,OAAO,KAAK,GAAG,CAAC,EAAE,CAAC;AAAA,IAC3F;AAAA,EACF;AAEA,QAAM,mBAAmB,CAAC,UAAkB;AAC1C,UAAM,IAAI,SAAS,KAAK;AACxB,QAAI,CAAC,MAAM,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK;AACnC,eAAS,CAAC;AACV,iBAAW,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC;AAAA,IACnC;AAAA,EACF;AAEA,QAAM,gBAAgB,+BAA+B,UAAU;AAE/D,QAAM,eAAe,UAAU,QAAQ,OAAO;AAC9C,QAAM,SAAS,eAAe,MAAM,mBAAmB,KAAK;AAC5D,QAAM,mBAAmB,eACrB,CAAC,SAAkB;AAAE,UAAM,kBAAkB,OAAO,KAAK,IAAI;AAAA,EAAE,IAC/D;AAGJ,QAAM,WAAiB,cAAuB,IAAI;AAClD,QAAM,aAAmB,cAA0B,IAAI;AACvD,QAAM,aAAmB,cAAmB;AAC5C,aAAW,UAAU,MAAM,OAAO,kBAAkB,IAAI;AAExD,EAAM,iBAAU,MAAM;AACpB,QAAI,CAAC,OAAQ;AAEb,aAAS,kBAAkB,GAAiB;AAC1C,YAAM,OAAO,EAAE,aAAa;AAC5B,UAAI,SAAS,WAAW,KAAK,SAAS,SAAS,OAAO,EAAG;AACzD,UAAI,WAAW,WAAW,KAAK,SAAS,WAAW,OAAO,EAAG;AAC7D,iBAAW,UAAU;AAAA,IACvB;AAEA,UAAM,MAAM,sBAAsB,MAAM;AACtC,eAAS,iBAAiB,eAAe,iBAAiB;AAAA,IAC5D,CAAC;AAED,WAAO,MAAM;AACX,2BAAqB,GAAG;AACxB,eAAS,oBAAoB,eAAe,iBAAiB;AAAA,IAC/D;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,SACE,8CAAC,uBAAQ,MAAR,EAAa,MAAM,QAAQ,cAAc,kBACxC;AAAA,iDAAC,uBAAQ,SAAR,EAAgB,KAAK,YAAY,QAAQ,6CAAC,YAAO,MAAK,UAAS,GAAI,WAAU,8EAC3E,UACH;AAAA,IACA,6CAAC,qBACC,uDAAC,uBAAQ,YAAR,EAAmB,MAAK,UAAS,OAAM,SAAQ,YAAY,GAAG,WAAU,mBAAkB,OAAO,EAAE,eAAe,OAAO,GACxH,wDAAC,uBAAQ,OAAR,EAAc,KAAK,UAAU,WAAU,4FAEtC;AAAA,oDAAC,SAAI,WAAU,cACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK,IAAI;AAAA,YACT,YAAY,IAAI;AAAA,YAChB,OAAO,IAAI;AAAA,YACX,UAAU;AAAA;AAAA,QACZ;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,IAAI;AAAA,YACX,KAAK;AAAA,YACL,YAAW;AAAA,YACX,UAAU;AAAA;AAAA,QACZ;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,QAAQ,IAAI,QAAQ,OAAO;AAAA,YAC3B,KAAK;AAAA,YACL,YAAY;AAAA,YACZ,UAAU;AAAA,YACV,cAAY;AAAA;AAAA,QACd;AAAA,SACF;AAAA,MAGA,8CAAC,SAAI,WAAU,qBACb;AAAA,qDAAC,gBAAa,OAAM,KAAI,OAAO,WAAW,GAAG,KAAK,KAAK,UAAU,CAAC,MAAM,gBAAgB,KAAK,CAAC,GAAG;AAAA,QACjG,6CAAC,gBAAa,OAAM,KAAI,OAAO,WAAW,GAAG,KAAK,KAAK,UAAU,CAAC,MAAM,gBAAgB,KAAK,CAAC,GAAG;AAAA,QACjG,6CAAC,gBAAa,OAAM,KAAI,OAAO,WAAW,GAAG,KAAK,KAAK,UAAU,CAAC,MAAM,gBAAgB,KAAK,CAAC,GAAG;AAAA,SACnG;AAAA,MAGA,8CAAC,SAAI,WAAU,qBACb;AAAA,qDAAC,gBAAa,OAAM,KAAI,OAAO,WAAW,GAAG,KAAK,KAAK,UAAU,CAAC,MAAM,gBAAgB,KAAK,CAAC,GAAG;AAAA,QACjG,6CAAC,gBAAa,OAAM,KAAI,OAAO,WAAW,GAAG,KAAK,KAAK,UAAU,CAAC,MAAM,gBAAgB,KAAK,CAAC,GAAG;AAAA,QACjG,6CAAC,gBAAa,OAAM,KAAI,OAAO,WAAW,GAAG,KAAK,KAAK,UAAU,CAAC,MAAM,gBAAgB,KAAK,CAAC,GAAG;AAAA,SACnG;AAAA,MAGA,8CAAC,SAAI,WAAU,oCACb;AAAA,qDAAC,UAAK,WAAU,iCAAgC,eAAC;AAAA,QACjD,6CAAC,YAAS,OAAO,YAAY,UAAU,gBAAgB;AAAA,QACvD,6CAAC,UAAK,WAAU,iCAAgC,eAAC;AAAA,QACjD,6CAAC,cAAW,OAAO,OAAO,UAAU,kBAAkB;AAAA,QACtD,6CAAC,UAAK,WAAU,iCAAgC,eAAC;AAAA,SACnD;AAAA,OACF,GACF,GACF;AAAA,KACF;AAEJ;AAEA,SAAS,SAAS,EAAE,OAAO,SAAS,GAAqD;AACvF,QAAM,CAAC,OAAO,QAAQ,IAAU,gBAAS,KAAK;AAE9C,EAAM,iBAAU,MAAM;AACpB,aAAS,KAAK;AAAA,EAChB,GAAG,CAAC,KAAK,CAAC;AAEV,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,OAAO;AAAA,MACP,UAAU,CAAC,MAAM;AACf,iBAAS,EAAE,OAAO,MAAM,YAAY,CAAC;AACrC,iBAAS,EAAE,OAAO,KAAK;AAAA,MACzB;AAAA,MACA,QAAQ,MAAM,SAAS,KAAK;AAAA,MAC5B,WAAU;AAAA,MACV,WAAW;AAAA;AAAA,EACb;AAEJ;AAEA,SAAS,WAAW,EAAE,OAAO,SAAS,GAAqD;AACzF,QAAM,CAAC,OAAO,QAAQ,IAAU,gBAAS,MAAM,SAAS,CAAC;AAEzD,EAAM,iBAAU,MAAM;AACpB,aAAS,MAAM,SAAS,CAAC;AAAA,EAC3B,GAAG,CAAC,KAAK,CAAC;AAEV,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,OAAO;AAAA,MACP,UAAU,CAAC,MAAM;AACf,iBAAS,EAAE,OAAO,KAAK;AACvB,iBAAS,EAAE,OAAO,KAAK;AAAA,MACzB;AAAA,MACA,QAAQ,MAAM,SAAS,MAAM,SAAS,CAAC;AAAA,MACvC,WAAU;AAAA,MACV,WAAW;AAAA;AAAA,EACb;AAEJ;;;AC9aA,IAAAC,SAAuB;AACvB,oBAA0C;AAapC,IAAAC,sBAAA;AAVN,IAAM,SAAe,kBAGnB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC,cAAAC,OAAgB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW,GAAG,mBAAmB,SAAS;AAAA,IACzC,GAAG;AAAA,IAEJ,uDAAC,cAAAA,OAAgB,SAAhB,EAAwB,WAAU,6DACjC,wDAAC,cAAAA,OAAgB,OAAhB,EAAsB,WAAU,oCAC/B;AAAA,mDAAC,cAAAA,OAAgB,WAAhB,EAA0B,WAAU,qCAAoC;AAAA,MACzE,6CAAC,cAAAA,OAAgB,OAAhB,EAAsB,WAAU,6LAA4L;AAAA,OAC/N,GACF;AAAA;AACF,CACD;AACD,OAAO,cAAc;;;ACrBrB,IAAAC,SAAuB;AAWvB,IAAM,gBAAgB;AAAA,EACpB,gBAAgB;AAAA,EAChB,cAAc,CAAC;AACjB;AAEO,SAAS,eAAe,iBAA2D;AACxF,QAAM,CAAC,SAAS,UAAU,IAAU,gBAAS,KAAK;AAClD,QAAM,CAAC,OAAO,QAAQ,IAAU,gBAAS,aAAa;AACtD,QAAM,CAAC,eAAe,gBAAgB,IAAU,gBAA0C,IAAI;AAC9F,QAAM,SAAe,cAAsB,IAAI;AAC/C,QAAM,mBAAyB,cAAwC,IAAI;AAE3E,QAAM,kBAAwB,mBAAY,CAAC,GAAW,MAAkC;AACtF,UAAM,UAAU,gCAAgC,GAAG,CAAC;AACpD,QAAI,SAAS,QAAQ,yBAAyB,EAAG,QAAO;AACxD,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,EAAM,iBAAU,MAAM;AACpB,aAAS,cAAc,GAAkB;AACvC,UAAI,EAAE,QAAQ,OAAO;AACnB,UAAE,eAAe;AACjB,mBAAW,IAAI;AAAA,MACjB;AAAA,IACF;AAEA,aAAS,YAAY,GAAkB;AACrC,UAAI,EAAE,QAAQ,OAAO;AACnB,mBAAW,KAAK;AAChB,iBAAS,aAAa;AAAA,MACxB;AAAA,IACF;AAEA,aAAS,QAAQ;AACf,iBAAW,KAAK;AAChB,eAAS,aAAa;AAAA,IACxB;AAEA,aAAS,yBAAyB;AAChC,UAAI,SAAS,OAAQ,OAAM;AAAA,IAC7B;AAEA,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,iBAAiB,SAAS,WAAW;AAC5C,WAAO,iBAAiB,QAAQ,KAAK;AACrC,aAAS,iBAAiB,oBAAoB,sBAAsB;AAEpE,WAAO,MAAM;AACX,aAAO,oBAAoB,WAAW,aAAa;AACnD,aAAO,oBAAoB,SAAS,WAAW;AAC/C,aAAO,oBAAoB,QAAQ,KAAK;AACxC,eAAS,oBAAoB,oBAAoB,sBAAsB;AAAA,IACzE;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,EAAM,iBAAU,MAAM;AACpB,QAAI,CAAC,WAAW,CAAC,iBAAiB;AAChC,eAAS,aAAa;AACtB;AAAA,IACF;AAEA,UAAM,SAAS;AAEf,aAAS,qBAAqB;AAC5B,YAAM,MAAM,iBAAiB;AAE7B,UAAI,CAAC,KAAK;AACR,iBAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,cAAc,4BAA4B,MAAM;AAAA,QAClD,CAAC;AACD;AAAA,MACF;AAEA,YAAM,UAAU,gBAAgB,IAAI,GAAG,IAAI,CAAC;AAC5C,YAAM,eACJ,WACA,YAAY,UACZ,YAAY,SAAS,QACrB,YAAY,SAAS;AAEvB,UAAI,cAAc;AAChB,cAAM,aAAa,QAAQ,SAAS,MAAM;AAC1C,iBAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,cAAc,aACV,4BAA4B,QAAQ,OAAO,IAC3C,6BAA6B,QAAQ,OAAO;AAAA,QAClD,CAAC;AAAA,MACH,OAAO;AACL,iBAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,cAAc,4BAA4B,MAAM;AAAA,QAClD,CAAC;AAAA,MACH;AAAA,IACF;AAEA,aAAS,gBAAgB,GAAe;AACtC,uBAAiB,UAAU,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ;AAExD,UAAI,OAAO,YAAY,MAAM;AAC3B,6BAAqB,OAAO,OAAO;AAAA,MACrC;AAEA,aAAO,UAAU,sBAAsB,MAAM;AAC3C,yBAAiB,iBAAiB,OAAO;AACzC,2BAAmB;AACnB,eAAO,UAAU;AAAA,MACnB,CAAC;AAAA,IACH;AAEA,uBAAmB;AACnB,WAAO,iBAAiB,aAAa,eAAe;AAEpD,WAAO,MAAM;AACX,aAAO,oBAAoB,aAAa,eAAe;AACvD,UAAI,OAAO,YAAY,MAAM;AAC3B,6BAAqB,OAAO,OAAO;AAAA,MACrC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,SAAS,iBAAiB,eAAe,CAAC;AAE9C,SAAO;AAAA,IACL,UAAU,WAAW,oBAAoB;AAAA,IACzC,gBAAgB,MAAM;AAAA,IACtB,cAAc,MAAM;AAAA,IACpB,eAAe,UAAU,gBAAgB;AAAA,EAC3C;AACF;;;AC3IA,IAAAC,SAAuB;AAsBnB,IAAAC,sBAAA;AAnBJ,IAAM,SAAS;AACf,IAAM,OAAO;AACb,IAAM,eAAe;AAcrB,SAAS,OAAO,EAAE,GAAG,GAAG,UAAU,GAAgB;AAChD,QAAM,eAAe,cAAc;AACnC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,IAAI,eAAe,IAAI,IAAI;AAAA,MAC3B,IAAI,eAAe,IAAI,eAAe;AAAA,MACtC,IAAI,eAAe,IAAI,IAAI;AAAA,MAC3B,IAAI,eAAe,IAAI,eAAe;AAAA,MACtC,QAAQ;AAAA,MACR,aAAa;AAAA;AAAA,EACf;AAEJ;AAEA,SAAS,yBAAyB,EAAE,KAAK,GAA8B;AACrE,QAAM,EAAE,IAAI,IAAI,IAAI,IAAI,UAAU,WAAW,cAAc,IAAI;AAE/D,MAAI,YAAY,EAAG,QAAO;AAE1B,QAAM,aAAa,KAAK,IAAI,OAAO,QAAQ,EAAE,SAAS,IAAI,GAAG,EAAE;AAE/D,SACE,8CAAC,OACC;AAAA,iDAAC,UAAK,IAAQ,IAAQ,IAAQ,IAAQ,QAAQ,QAAQ,aAAa,KAAK;AAAA,IACxE,6CAAC,UAAO,GAAG,IAAI,GAAG,IAAI,WAAsB;AAAA,IAC5C,6CAAC,UAAO,GAAG,IAAI,GAAG,IAAI,WAAsB;AAAA,IAC5C,8CAAC,OAAE,WAAW,aAAa,cAAc,CAAC,KAAK,cAAc,CAAC,KAC5D;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAG,CAAC,aAAa;AAAA,UACjB,GAAG;AAAA,UACH,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,IAAI;AAAA,UACJ,MAAM;AAAA;AAAA,MACR;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,GAAG;AAAA,UACH,GAAG;AAAA,UACH,YAAW;AAAA,UACX,kBAAiB;AAAA,UACjB,MAAK;AAAA,UACL,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,YAAW;AAAA,UAEV;AAAA;AAAA,MACH;AAAA,OACF;AAAA,KACF;AAEJ;AAQA,SAAS,iBAAiB,EAAE,SAAS,OAAO,WAAW,MAAM,GAA0B;AACrF,QAAM,OAAO,QAAQ,sBAAsB;AAE3C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,GAAG,KAAK;AAAA,MACR,GAAG,KAAK;AAAA,MACR,OAAO,KAAK;AAAA,MACZ,QAAQ,KAAK;AAAA,MACb,MAAK;AAAA,MACL,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,iBAAiB,WAAW,QAAQ;AAAA;AAAA,EACtC;AAEJ;AAEO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AAC1B,QAAM,CAAC,EAAE,WAAW,IAAU,kBAAW,CAAC,MAAM,IAAI,GAAG,CAAC;AAExD,EAAM,iBAAU,MAAM;AACpB,aAAS,eAAe;AACtB,4BAAsB,WAAW;AAAA,IACnC;AAEA,WAAO,iBAAiB,UAAU,cAAc,IAAI;AACpD,WAAO,iBAAiB,UAAU,YAAY;AAE9C,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,cAAc,IAAI;AACvD,aAAO,oBAAoB,UAAU,YAAY;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,eAAe,CAAC;AAEpB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,oBAAiB;AAAA,MACjB,OAAO;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,QACP,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,eAAe;AAAA,QACf,QAAQ;AAAA,MACV;AAAA,MAEA;AAAA,qDAAC,oBAAiB,SAAS,iBAAiB,OAAO,MAAM;AAAA,QACxD,kBACC,6CAAC,oBAAiB,SAAS,gBAAgB,OAAO,QAAQ,UAAQ,MAAC;AAAA,QAEpE,aAAa,IAAI,CAAC,MAAM,MACvB,6CAAC,4BAAiC,QAAH,CAAe,CAC/C;AAAA;AAAA;AAAA,EACH;AAEJ;;;ACxIA,IAAAC,UAAuB;AA+BvB,IAAM,qBAAgC;AAAA,EACpC,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,yBAAyB;AAAA,EACzB,qBAAqB;AAAA,EACrB,eAAe,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EAC5B,YAAY,EAAE,GAAG,GAAG,GAAG,EAAE;AAC3B;AAEO,SAAS,QAAQ,EAAE,eAAe,GAAkC;AACzE,QAAM,CAAC,WAAW,YAAY,IAAU,iBAAoB,kBAAkB;AAC9E,QAAM,CAAC,YAAY,aAAa,IAAU,iBAAmC,IAAI;AACjF,QAAM,CAAC,eAAe,gBAAgB,IAAU,iBAA+B,IAAI;AAEnF,QAAM,eAAqB,eAAO,SAAS;AAC3C,QAAM,gBAAsB,eAAO,UAAU;AAC7C,QAAM,oBAA0B,eAAO,cAAc;AAErD,EAAM,kBAAU,MAAM;AACpB,iBAAa,UAAU;AACvB,kBAAc,UAAU;AACxB,sBAAkB,UAAU;AAAA,EAC9B,CAAC;AAED,QAAM,aAAmB,oBAAY,MAAM;AACzC,UAAM,UAAU,aAAa;AAC7B,QAAI,QAAQ,gBAAgB;AAC1B,cAAQ,eAAe,MAAM,UAAU;AAAA,IACzC;AACA,iBAAa,kBAAkB;AAC/B,kBAAc,IAAI;AAClB,qBAAiB,IAAI;AAAA,EACvB,GAAG,CAAC,CAAC;AAEL,QAAM,eAAqB,oBAAY,MAAM;AAC3C,UAAM,UAAU,aAAa;AAC7B,UAAM,SAAS,cAAc;AAC7B,UAAM,EAAE,gBAAgB,gBAAgB,yBAAyB,oBAAoB,IAAI;AAEzF,QAAI,CAAC,gBAAgB;AACnB,iBAAW;AACX;AAAA,IACF;AAEA,mBAAe,MAAM,UAAU;AAE/B,QAAI,UAAU;AACd,QAAI,QAAQ;AACV,YAAM,iBACJ,OAAO,cAAc,kBACrB,OAAO,iBAAiB;AAC1B,YAAM,kBACJ,OAAO,cAAc,kBACrB,eAAe,SAAS,OAAO,SAAS,MACvC,OAAO,eAAe,eAAe,SAAS,OAAO,YAAY,IAAI;AAExE,UAAI,CAAC,kBAAkB,CAAC,iBAAiB;AACvC,YAAI;AACF,cAAI,OAAO,cAAc;AACvB,mBAAO,UAAU,aAAa,gBAAgB,OAAO,YAAY;AAAA,UACnE,OAAO;AACL,mBAAO,UAAU,YAAY,cAAc;AAAA,UAC7C;AACA,oBAAU;AAAA,QACZ,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAEA,iBAAa,kBAAkB;AAC/B,kBAAc,IAAI;AAClB,qBAAiB,IAAI;AAErB,QAAI,kBAAkB,WAAW,gBAAgB;AAC/C,YAAM,WAA4B,WAAW,iBACzC,EAAE,gBAAgB,yBAAyB,oBAAoB,IAC/D;AACJ,wBAAkB,QAAQ,gBAAgB,QAAQ;AAAA,IACpD;AAAA,EACF,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,YAAkB;AAAA,IACtB,CAAC,GAAuB,YAAyB;AAC/C,YAAM,OAAO,QAAQ,sBAAsB;AAC3C,YAAM,SAAS,QAAQ;AACvB,YAAM,kBAAkB,QAAQ;AAChC,YAAM,cAAc,QAAQ;AAE5B,mBAAa;AAAA,QACX,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,gBAAgB;AAAA,QAChB,yBAAyB;AAAA,QACzB,qBAAqB;AAAA,QACrB,eAAe,EAAE,GAAG,KAAK,MAAM,GAAG,KAAK,IAAI;AAAA,QAC3C,YAAY,EAAE,GAAG,EAAE,UAAU,KAAK,MAAM,GAAG,EAAE,UAAU,KAAK,IAAI;AAAA,MAClE,CAAC;AAED,cAAQ,MAAM,UAAU;AAAA,IAC1B;AAAA,IACA,CAAC;AAAA,EACH;AAEA,EAAM,kBAAU,MAAM;AACpB,QAAI,CAAC,UAAU,WAAY;AAE3B,aAAS,kBAAkB,GAAiB;AAC1C,YAAM,UAAU,aAAa;AAC7B,YAAM,EAAE,gBAAgB,YAAY,eAAe,IAAI;AAEvD,mBAAa,CAAC,UAAU;AAAA,QACtB,GAAG;AAAA,QACH,eAAe;AAAA,UACb,GAAG,EAAE,UAAU,WAAW;AAAA,UAC1B,GAAG,EAAE,UAAU,WAAW;AAAA,QAC5B;AAAA,MACF,EAAE;AAEF,YAAM,YAAY;AAAA,QAChB,EAAE;AAAA,QACF,EAAE;AAAA,QACF;AAAA,QACA;AAAA,MACF;AAEA,UAAI,aAAa,gBAAgB;AAC/B,cAAM,UAAU;AAAA,UACd;AAAA,UACA,EAAE;AAAA,UACF,EAAE;AAAA,UACF;AAAA,QACF;AAEA,YAAI,SAAS;AACX,wBAAc;AAAA,YACZ;AAAA,YACA,cAAc,QAAQ;AAAA,YACtB,gBAAgB,MAAM;AACpB,oBAAM,EAAE,MAAM,SAAS,IAAI,wBAAwB,WAAW,cAAc;AAC5E,kBAAI,SAAS,aAAc,QAAO,WAAW,gBAAgB;AAC7D,qBAAO,WAAW,mBAAmB;AAAA,YACvC,GAAG;AAAA,UACL,CAAC;AACD,2BAAiB,QAAQ,SAAS;AAAA,QACpC;AAAA,MACF,OAAO;AACL,sBAAc,IAAI;AAClB,yBAAiB,IAAI;AAAA,MACvB;AAAA,IACF;AAEA,aAAS,kBAAkB;AACzB,mBAAa;AAAA,IACf;AAEA,aAAS,cAAc,GAAkB;AACvC,UAAI,EAAE,QAAQ,UAAU;AACtB,mBAAW;AAAA,MACb;AAAA,IACF;AAEA,WAAO,iBAAiB,eAAe,iBAAiB;AACxD,WAAO,iBAAiB,aAAa,eAAe;AACpD,WAAO,iBAAiB,WAAW,aAAa;AAEhD,WAAO,MAAM;AACX,aAAO,oBAAoB,eAAe,iBAAiB;AAC3D,aAAO,oBAAoB,aAAa,eAAe;AACvD,aAAO,oBAAoB,WAAW,aAAa;AAAA,IACrD;AAAA,EACF,GAAG,CAAC,UAAU,YAAY,cAAc,UAAU,CAAC;AAEnD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACnNA,IAAAC,UAAuB;AAGvB,IAAM,cAAc;AAcpB,SAAS,iBAA8B;AACrC,MAAI,OAAO,WAAW,YAAa,QAAO,CAAC;AAC3C,MAAI;AACF,UAAM,SAAS,aAAa,QAAQ,WAAW;AAC/C,WAAO,SAAS,KAAK,MAAM,MAAM,IAAI,CAAC;AAAA,EACxC,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,sBAAmC;AACjD,SAAO,eAAe;AACxB;AAEA,SAAS,eAAe,YAAyB;AAC/C,MAAI,OAAO,WAAW,YAAa;AACnC,MAAI;AACF,iBAAa,QAAQ,aAAa,KAAK,UAAU,UAAU,CAAC;AAAA,EAC9D,QAAQ;AAAA,EAER;AACF;AAEA,IAAI,YAAY;AAChB,SAAS,aAAqB;AAC5B,SAAO,MAAM,KAAK,IAAI,CAAC,IAAI,WAAW;AACxC;AAEA,IAAM,aAAa;AAEnB,SAAS,mBACP,aACA,OACA,MACQ;AACR,MAAI,CAAC,YAAa,QAAO;AACzB,QAAM,OAAO,YAAY,sBAAsB;AAC/C,QAAM,SAAS,SAAS,MAAM,KAAK,OAAO,KAAK;AAC/C,QAAM,OAAO,SAAS,MAAM,KAAK,QAAQ,KAAK;AAC9C,QAAM,UAAU,SAAS,MAAM,YAAY,cAAc,YAAY;AACrE,MAAI,SAAS,EAAG,QAAO;AACvB,UAAQ,QAAQ,WAAW,UAAU;AACvC;AAEO,SAAS,cAAc,SAAkB,aAAuD;AACrG,QAAM,CAAC,YAAY,aAAa,IAAU,iBAAsB,CAAC,CAAC;AAClE,QAAM,CAAC,UAAU,WAAW,IAAU,iBAAS,KAAK;AACpD,QAAM,CAAC,mBAAmB,oBAAoB,IAAU,iBAAwB,IAAI;AACpF,QAAM,CAAC,cAAc,eAAe,IAAU,iBAAwB,IAAI;AAC1E,QAAM,CAAC,YAAY,aAAa,IAAU,iBAAS,KAAK;AACxD,QAAM,CAAC,cAAc,eAAe,IAAU,iBAAS,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AAErE,QAAM,UAAgB,eAA2B,eAAe,IAAI;AACpE,UAAQ,UAAU,eAAe;AAEjC,QAAM,CAAC,UAAU,WAAW,IAAU,iBAAS,KAAK;AAEpD,QAAM,gBAAsB,eAAO,UAAU;AAC7C,gBAAc,UAAU;AAExB,QAAM,cAAoB,eAIhB,IAAI;AAGd,EAAM,kBAAU,MAAM;AACpB,kBAAc,eAAe,CAAC;AAC9B,gBAAY,IAAI;AAAA,EAClB,GAAG,CAAC,CAAC;AAGL,EAAM,kBAAU,MAAM;AACpB,QAAI,CAAC,SAAU;AACf,mBAAe,UAAU;AAAA,EAC3B,GAAG,CAAC,YAAY,QAAQ,CAAC;AAGzB,EAAM,kBAAU,MAAM;AACpB,QAAI,CAAC,QAAS;AAEd,aAAS,SAAS;AAChB,sBAAgB,EAAE,GAAG,OAAO,SAAS,GAAG,OAAO,QAAQ,CAAC;AAAA,IAC1D;AAEA,WAAO;AACP,WAAO,iBAAiB,UAAU,QAAQ,IAAI;AAC9C,WAAO,iBAAiB,UAAU,MAAM;AACxC,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,QAAQ,IAAI;AACjD,aAAO,oBAAoB,UAAU,MAAM;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,UAAgB,oBAAY,MAAM;AACtC,UAAM,cAAc,YAAY,SAAS,cAAc;AACvD,gBAAY,UAAU;AACtB,gBAAY,KAAK;AACjB,yBAAqB,IAAI;AACzB,oBAAgB,IAAI;AACpB,QAAI,YAAa,eAAc,KAAK;AAAA,EACtC,GAAG,CAAC,CAAC;AAGL,EAAM,kBAAU,MAAM;AACpB,QAAI,CAAC,SAAU;AAEf,UAAM,OAAO,YAAY;AACzB,QAAI,CAAC,KAAM;AAEX,UAAM,EAAE,aAAa,YAAY,IAAI;AACrC,UAAM,OAAO,gBAAgB,eAAe,MAAe;AAE3D,aAAS,aAAa,GAAyB;AAC7C,YAAM,MAAM,gBAAgB,eAAe,EAAE,UAAU,EAAE;AACzD,aAAO,mBAAmB,QAAQ,SAAS,KAAK,IAAI;AAAA,IACtD;AAEA,aAAS,cAAc,GAAiB;AACtC,YAAM,MAAM,aAAa,CAAC;AAC1B,sBAAgB,GAAG;AACnB,YAAM,gBAAgB,gBAAgB,eAAe,OAAO,UAAU,OAAO;AAC7E;AAAA,QAAc,CAAC,SACb,KAAK,IAAI,CAAC,MAAO,EAAE,OAAO,cAAc,EAAE,GAAG,GAAG,UAAU,MAAM,cAAc,IAAI,CAAE;AAAA,MACtF;AAAA,IACF;AAEA,aAAS,YAAY,GAAiB;AACpC,YAAM,MAAM,aAAa,CAAC;AAC1B,UAAI,OAAO,YAAY;AACrB,sBAAc,CAAC,SAAS,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,WAAW,CAAC;AAAA,MAClE;AACA,cAAQ;AAAA,IACV;AAEA,WAAO,iBAAiB,eAAe,aAAa;AACpD,WAAO,iBAAiB,aAAa,WAAW;AAEhD,WAAO,MAAM;AACX,aAAO,oBAAoB,eAAe,aAAa;AACvD,aAAO,oBAAoB,aAAa,WAAW;AAAA,IACrD;AAAA,EACF,GAAG,CAAC,UAAU,OAAO,CAAC;AAGtB,EAAM,kBAAU,MAAM;AACpB,QAAI,CAAC,WAAW,UAAU;AACxB,cAAQ;AAAA,IACV;AAAA,EACF,GAAG,CAAC,SAAS,UAAU,OAAO,CAAC;AAE/B,QAAM,kBAAwB;AAAA,IAC5B,MAAM,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,iBAAiB,KAAK;AAAA,IAC5D,CAAC,YAAY,iBAAiB;AAAA,EAChC;AAEA,QAAM,cAAoB;AAAA,IACxB,CAAC,aAAwC,qBAA6B;AACpE,YAAM,OAAO,gBAAgB,eAAe,MAAe;AAC3D,YAAM,MAAM,mBAAmB,QAAQ,SAAS,kBAAkB,IAAI;AACtE,YAAM,YAAY,gBAAgB,eAAe,OAAO,UAAU,OAAO;AACzE,YAAM,KAAK,WAAW;AACtB,YAAM,eAA0B,EAAE,IAAI,aAAa,UAAU,MAAM,UAAU;AAE7E,oBAAc,CAAC,SAAS,CAAC,GAAG,MAAM,YAAY,CAAC;AAC/C,2BAAqB,EAAE;AACvB,sBAAgB,GAAG;AACnB,oBAAc,IAAI;AAClB,kBAAY,UAAU,EAAE,aAAa,IAAI,aAAa,YAAY,KAAK;AACvE,kBAAY,IAAI;AAAA,IAClB;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,YAAkB,oBAAY,CAAC,gBAAwB;AAC3D,UAAM,YAAY,cAAc,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,WAAW;AACxE,QAAI,CAAC,UAAW;AAEhB,UAAM,YAAY,UAAU,gBAAgB,eAAe,OAAO,UAAU,OAAO;AACnF,yBAAqB,WAAW;AAChC,oBAAgB,UAAU,WAAW,SAAS;AAC9C,gBAAY,UAAU,EAAE,aAAa,aAAa,UAAU,aAAa,YAAY,MAAM;AAC3F,gBAAY,IAAI;AAAA,EAClB,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAwB,oBAAY,CAAC,gBAAwB;AACjE,kBAAc,CAAC,SAAS,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,WAAW,CAAC;AAAA,EAClE,GAAG,CAAC,CAAC;AAEL,QAAM,WAAiB,oBAAY,MAAM;AACvC,kBAAc,CAAC,CAAC;AAAA,EAClB,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACrMM,IAAAC,uBAAA;AAvBN,IAAMC,QAAO;AAMN,SAAS,YAAY,EAAE,cAAc,GAAqB;AAC/D,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,oBAAiB;AAAA,MACjB,OAAO;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,QACP,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,eAAe;AAAA,QACf,QAAQ;AAAA,MACV;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,GAAG,cAAc;AAAA,UACjB,GAAG,cAAc;AAAA,UACjB,OAAO,cAAc;AAAA,UACrB,QAAQ,cAAc;AAAA,UACtB,MAAMA;AAAA;AAAA,MACR;AAAA;AAAA,EACF;AAEJ;;;AClCA,IAAAC,UAAuB;AAqInB,IAAAC,uBAAA;AAlIJ,IAAMC,QAAO;AACb,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AAahB,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,QAAM,CAAC,MAAM,OAAO,IAAU,iBAAS,MAAM,gBAAgB,sBAAsB,CAAC;AACpF,QAAM,aAAmB,eAA4B,IAAI;AACzD,QAAM,uBAA6B,eAA6C,IAAI;AAEpF,EAAM,kBAAU,MAAM;AACpB,aAAS,aAAa;AACpB,cAAQ,gBAAgB,sBAAsB,CAAC;AAAA,IACjD;AAEA,eAAW;AAEX,WAAO,iBAAiB,UAAU,YAAY,IAAI;AAClD,WAAO,iBAAiB,UAAU,UAAU;AAE5C,UAAM,WAAW,IAAI,iBAAiB,UAAU;AAChD,aAAS,QAAQ,iBAAiB;AAAA,MAChC,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,SAAS;AAAA,IACX,CAAC;AAED,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,YAAY,IAAI;AACrD,aAAO,oBAAoB,UAAU,UAAU;AAC/C,eAAS,WAAW;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,eAAe,CAAC;AAEpB,EAAM,kBAAU,MAAM;AACpB,WAAO,MAAM;AACX,iBAAW,UAAU;AACrB,UAAI,qBAAqB,QAAS,cAAa,qBAAqB,OAAO;AAAA,IAC7E;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAoB,CAAC,MAA0B;AACnD,QAAI,EAAE,WAAW,EAAG;AACpB,MAAE,gBAAgB;AAGlB,eAAW,UAAU;AACrB,QAAI,qBAAqB,SAAS;AAChC,mBAAa,qBAAqB,OAAO;AACzC,2BAAqB,UAAU;AAAA,IACjC;AAEA,UAAM,SAAS,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ;AAC5C,UAAM,aAAa;AAEnB,UAAM,SAAS,CAAC,cAA4B;AAC1C,YAAM,KAAK,UAAU,UAAU,OAAO;AACtC,YAAM,KAAK,UAAU,UAAU,OAAO;AACtC,UAAI,KAAK,KAAK,KAAK,MAAM,iBAAiB,gBAAgB;AACxD,gBAAQ;AACR,oBAAY,UAAU;AAAA,MACxB;AAAA,IACF;AAEA,UAAM,OAAO,CAAC,YAA0B;AACtC,cAAQ;AACR,UAAI,gBAAgB;AAClB,cAAM,EAAE,SAAS,QAAQ,IAAI;AAC7B,6BAAqB,UAAU,WAAW,MAAM;AAC9C,+BAAqB,UAAU;AAC/B,yBAAe,SAAS,OAAO;AAAA,QACjC,GAAG,cAAc;AAAA,MACnB;AAAA,IACF;AAEA,UAAM,UAAU,MAAM;AACpB,aAAO,oBAAoB,eAAe,MAAM;AAChD,aAAO,oBAAoB,aAAa,IAAI;AAC5C,iBAAW,UAAU;AAAA,IACvB;AAEA,WAAO,iBAAiB,eAAe,MAAM;AAC7C,WAAO,iBAAiB,aAAa,IAAI;AACzC,eAAW,UAAU;AAAA,EACvB;AAEA,QAAM,oBAAoB,CAAC,MAAwB;AACjD,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAClB,eAAW,UAAU;AACrB,QAAI,qBAAqB,SAAS;AAChC,mBAAa,qBAAqB,OAAO;AACzC,2BAAqB,UAAU;AAAA,IACjC;AACA,oBAAgB,EAAE,SAAS,EAAE,OAAO;AAAA,EACtC;AAEA,QAAM,kBAAkB,CAAC,MAAwB;AAC/C,QAAI,CAAC,eAAgB;AACrB,UAAM,eAAe,gCAAgC,EAAE,SAAS,EAAE,OAAO;AACzE,mBAAe,YAAY;AAAA,EAC7B;AAEA,QAAM,mBAAmB,MAAM;AAC7B,qBAAiB,IAAI;AAAA,EACvB;AAEA,QAAM,WAAW,cAAc,gBAAgB,cAAc,IAAI,KAAK;AACtE,QAAM,WAAW,cAAc,gBAAgB,cAAc,IAAI,KAAK;AAEtE,SACE,gFACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,oBAAiB;AAAA,QACjB,OAAO;AAAA,UACL,UAAU;AAAA,UACV,OAAO;AAAA,UACP,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,eAAe;AAAA,UACf,QAAQ;AAAA,QACV;AAAA,QAEC,WAAC,iBACA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH,GAAG;AAAA,YACH,OAAO,KAAK;AAAA,YACZ,QAAQ,KAAK;AAAA,YACb,MAAK;AAAA,YACL,QAAQA;AAAA,YACR,aAAa;AAAA;AAAA,QACf;AAAA;AAAA,IAEJ;AAAA,IAEC,CAAC,cAAc,CAAC,iBACf;AAAA,MAAC;AAAA;AAAA,QACC,oBAAiB;AAAA,QACjB,OAAO;AAAA,UACL,UAAU;AAAA,UACV,MAAM,KAAK;AAAA,UACX,KAAK,KAAK;AAAA,UACV,OAAO,KAAK;AAAA,UACZ,QAAQ,KAAK;AAAA,UACb,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,eAAe;AAAA,QACjB;AAAA,QACA,eAAe;AAAA,QACf,eAAe;AAAA,QACf,aAAa;AAAA,QACb,cAAc;AAAA;AAAA,IAChB;AAAA,KAEJ;AAEJ;;;ACnLA,IAAAC,UAAuB;AAGvB,0BAAmE;AAiB7D,IAAAC,uBAAA;AAdN,SAAS,mBAAmB,WAA2B;AACrD,QAAM,UAAU,KAAK,OAAO,KAAK,IAAI,IAAI,aAAa,GAAI;AAC1D,MAAI,UAAU,GAAI,QAAO;AACzB,QAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,MAAI,UAAU,GAAI,QAAO,GAAG,OAAO;AACnC,QAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AACrC,MAAI,QAAQ,GAAI,QAAO,GAAG,KAAK;AAC/B,QAAM,OAAO,KAAK,MAAM,QAAQ,EAAE;AAClC,SAAO,GAAG,IAAI;AAChB;AAEA,SAAS,aAAa,EAAE,QAAQ,GAAgC;AAC9D,SACE,+CAAC,UAAK,WAAU,8CACd;AAAA,mDAAC,UAAK,WAAU,eAAc;AAAA;AAAA,MAAK,QAAQ,QAAQ,YAAY;AAAA,MAAE;AAAA,OAAI;AAAA,IACpE,QAAQ,MAAM,+CAAC,UAAK;AAAA;AAAA,MAAE,QAAQ;AAAA,OAAG;AAAA,IACjC,CAAC,QAAQ,MAAM,QAAQ,UAAU,SAAS,KACzC,+CAAC,UAAK;AAAA;AAAA,MAAE,QAAQ,UAAU,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AAAA,MAAG,QAAQ,UAAU,SAAS,IAAI,WAAW;AAAA,OAAG;AAAA,KAElG;AAEJ;AAaO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AACtB,MAAI,SAAS,WAAW,EAAG,QAAO;AAElC,SACE,+EACG,mBAAS,IAAI,CAAC,SAAS,UACtB;AAAA,IAAC;AAAA;AAAA,MAEC;AAAA,MACA,OAAO,QAAQ;AAAA,MACf,UAAU,oBAAoB,QAAQ;AAAA,MACtC,YAAY,MAAM,mBAAmB,QAAQ,EAAE;AAAA,MAC/C,SAAS,MAAM,mBAAmB,IAAI;AAAA,MACtC,cAAc,CAAC,SAAS,aAAa,QAAQ,IAAI,IAAI;AAAA,MACrD,YAAY,CAAC,SAAS,WAAW,QAAQ,IAAI,IAAI;AAAA,MACjD,UAAU,MAAM,SAAS,QAAQ,EAAE;AAAA,MACnC,UAAU,MAAM,SAAS,QAAQ,EAAE;AAAA,MACnC,eAAe,MAAM,cAAc,QAAQ,EAAE;AAAA;AAAA,IAVxC,QAAQ;AAAA,EAWf,CACD,GACH;AAEJ;AAeA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoB;AAClB,QAAM,CAAC,UAAU,WAAW,IAAU,iBAAS,QAAQ,aAAa;AACpE,QAAM,CAAC,aAAa,cAAc,IAAU,iBAAyB,IAAI;AACzE,QAAM,CAAC,gBAAgB,iBAAiB,IAAU,iBAAS,KAAK;AAChE,QAAM,CAAC,cAAc,eAAe,IAAU,iBAAS,KAAK;AAC5D,QAAM,CAAC,YAAY,aAAa,IAAU,iBAAS,KAAK;AAExD,EAAM,kBAAU,MAAM;AACpB,aAAS,iBAAiB;AACxB,UAAI,CAAC,QAAQ,QAAQ,YAAa;AAClC,YAAM,OAAO,QAAQ,QAAQ,sBAAsB;AACnD,kBAAY;AAAA,QACV,GAAG,KAAK,OAAO,QAAQ,iBAAiB;AAAA,QACxC,GAAG,KAAK,MAAM,QAAQ,iBAAiB;AAAA,MACzC,CAAC;AACD,qBAAe,IAAI;AAAA,IACrB;AAEA,mBAAe;AACf,WAAO,iBAAiB,UAAU,gBAAgB,IAAI;AACtD,WAAO,iBAAiB,UAAU,cAAc;AAChD,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,gBAAgB,IAAI;AACzD,aAAO,oBAAoB,UAAU,cAAc;AAAA,IACrD;AAAA,EACF,GAAG,CAAC,QAAQ,SAAS,QAAQ,gBAAgB,CAAC;AAE9C,EAAM,kBAAU,MAAM;AACpB,QAAI,UAAU;AACZ,YAAM,UAAU,QAAQ,SAAS;AACjC,YAAM,YAAY,UAAU,MAAM;AAClC,YAAM,aAAa,UAAU,MAAM;AACnC,YAAM,UAAU;AAChB,wBAAkB,SAAS,IAAI,UAAU,YAAY,OAAO,UAAU;AACtE,sBAAgB,SAAS,IAAI,aAAa,OAAO,WAAW;AAAA,IAC9D;AAAA,EACF,GAAG,CAAC,UAAU,UAAU,QAAQ,IAAI,CAAC;AAErC,SACE,gFACG;AAAA,gBAAY,eACX;AAAA,MAAC;AAAA;AAAA,QACC,oBAAiB;AAAA,QACjB,OAAO;AAAA,UACL,UAAU;AAAA,UACV,OAAO;AAAA,UACP,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,eAAe;AAAA,UACf,QAAQ;AAAA,QACV;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,YAAY;AAAA,YACf,GAAG,YAAY;AAAA,YACf,OAAO,YAAY;AAAA,YACnB,QAAQ,YAAY;AAAA,YACpB,MAAK;AAAA,YACL,QAAO;AAAA,YACP,aAAa;AAAA;AAAA,QACf;AAAA;AAAA,IACF;AAAA,IAGF;AAAA,MAAC;AAAA;AAAA,QACC,oBAAiB;AAAA,QACjB,WAAU;AAAA,QACV,OAAO;AAAA,UACL,MAAM,SAAS,IAAI;AAAA,UACnB,KAAK,SAAS,IAAI;AAAA,UAClB,eAAe;AAAA,QACjB;AAAA,QACA,SAAS,CAAC,MAAM;AACd,YAAE,gBAAgB;AAClB,qBAAW;AAAA,QACb;AAAA,QAEA,wDAAC,UAAK,WAAU,gFACb,iBACH;AAAA;AAAA,IACF;AAAA,IAEC,aACC,QAAQ,SAAS,KACf;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,CAAC,SAAS;AAClB,uBAAa,IAAI;AACjB,wBAAc,IAAI;AAAA,QACpB;AAAA,QACA,UAAU;AAAA;AAAA,IACZ,IAEA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,CAAC,SAAS;AACpB,qBAAW,IAAI;AACf,wBAAc,IAAI;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,kBAAkB,MAAM,cAAc,KAAK;AAAA;AAAA,IAC7C;AAAA,KAGN;AAEJ;AAUA,SAAS,gBAAgB,EAAE,UAAU,gBAAgB,cAAc,UAAU,SAAS,GAAyB;AAC7G,QAAM,CAAC,MAAM,OAAO,IAAU,iBAAS,EAAE;AACzC,QAAM,WAAiB,eAAyB,IAAI;AAEpD,EAAM,kBAAU,MAAM;AACpB,aAAS,SAAS,MAAM;AAAA,EAC1B,GAAG,CAAC,CAAC;AAEL,SACE;AAAA,IAAC;AAAA;AAAA,MACC,oBAAiB;AAAA,MACjB,WAAU;AAAA,MACV,OAAO;AAAA,QACL,OAAO;AAAA,QACP,MAAM,iBAAiB,SAAS,IAAI,MAAM,IAAI,SAAS,IAAI;AAAA,QAC3D,KAAK,eAAe,SAAS,IAAI,KAAK,SAAS,IAAI;AAAA,QACnD,eAAe;AAAA,MACjB;AAAA,MACA,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,MAElC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,MAAK;AAAA,YACL,WAAU;AAAA,YACV,aAAY;AAAA,YACZ,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,QAAQ,EAAE,OAAO,KAAK;AAAA,YACvC,WAAW,CAAC,MAAM;AAChB,gBAAE,gBAAgB;AAClB,kBAAI,EAAE,QAAQ,WAAW,KAAK,KAAK,GAAG;AACpC,yBAAS,KAAK,KAAK,CAAC;AAAA,cACtB,WAAW,EAAE,QAAQ,UAAU;AAC7B,yBAAS;AAAA,cACX;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAW;AAAA,cACT;AAAA,cACA,KAAK,KAAK,IACN,6CACA;AAAA,YACN;AAAA,YACA,UAAU,CAAC,KAAK,KAAK;AAAA,YACrB,SAAS,MAAM;AACb,kBAAI,KAAK,KAAK,EAAG,UAAS,KAAK,KAAK,CAAC;AAAA,YACvC;AAAA,YAEA,wDAAC,+BAAQ,WAAU,YAAW;AAAA;AAAA,QAChC;AAAA;AAAA;AAAA,EACF;AAEJ;AAiBA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuB;AACrB,QAAM,CAAC,WAAW,YAAY,IAAU,iBAAS,EAAE;AACnD,QAAM,CAAC,QAAQ,SAAS,IAAU,iBAAS,KAAK;AAChD,QAAM,CAAC,YAAY,aAAa,IAAU,iBAAkD,MAAM;AAClG,QAAM,WAAiB,eAAyB,IAAI;AAEpD,EAAM,kBAAU,MAAM;AACpB,aAAS,SAAS,MAAM;AAAA,EAC1B,GAAG,CAAC,CAAC;AAEL,EAAM,kBAAU,MAAM;AACpB,QAAI,YAAY;AACd,uBAAiB;AACjB,eAAS,EAAE,KAAK,CAAC,YAAY;AAC3B,YAAI,SAAS;AACX,oBAAU,IAAI;AACd,qBAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,QACzC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,aAAa,YAAY;AAC7B,UAAM,UAAU,MAAM,SAAS;AAC/B,QAAI,SAAS;AACX,gBAAU,IAAI;AACd,iBAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,IACzC;AAAA,EACF;AAEA,QAAM,oBAAoB,YAAY;AACpC,QAAI,eAAe,UAAW;AAC9B,kBAAc,SAAS;AACvB,UAAM,UAAU,MAAM,cAAc;AACpC,QAAI,SAAS;AACX,oBAAc,MAAM;AACpB,iBAAW,MAAM,cAAc,MAAM,GAAG,GAAI;AAAA,IAC9C,OAAO;AACL,oBAAc,SAAS;AACvB,iBAAW,MAAM,cAAc,MAAM,GAAG,GAAI;AAAA,IAC9C;AAAA,EACF;AAEA,QAAM,oBAAoB,MAAM;AAC9B,QAAI,UAAU,KAAK,GAAG;AACpB,iBAAW,UAAU,KAAK,CAAC;AAC3B,mBAAa,EAAE;AAAA,IACjB;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,oBAAiB;AAAA,MACjB,WAAU;AAAA,MACV,OAAO;AAAA,QACL,MAAM,iBAAiB,SAAS,IAAI,MAAM,IAAI,SAAS,IAAI;AAAA,QAC3D,KAAK,eAAe,SAAS,IAAI,MAAM,SAAS,IAAI;AAAA,QACpD,eAAe;AAAA,MACjB;AAAA,MACA,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,MAGlC;AAAA,sDAAC,mBAAgB,eAAe,KAAK,YAAY,GAC/C,yDAAC,SAAI,WAAU,2EACb;AAAA,yDAAC,SAAI,WAAU,mCACb;AAAA,2DAAC,WACC;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,QACE;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,WAAU;AAAA,sBACV,SAAS;AAAA;AAAA,kBACX;AAAA,kBAGF,wDAAC,mCAAY,WAAU,YAAW;AAAA;AAAA,cACpC;AAAA,cACA,8CAAC,kBAAe,MAAK,UAAS,kBAAI;AAAA,eACpC;AAAA,YACA,8CAAC,gBAAa,SAAS,QAAQ,SAAS;AAAA,aAC1C;AAAA,UACA,+CAAC,SAAI,WAAU,sCACb;AAAA,2DAAC,WACC;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,QACE;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,WAAU;AAAA,sBACV,SAAS;AAAA;AAAA,kBACX;AAAA,kBAGD,mBACC,8CAAC,6BAAM,WAAU,2BAA0B,IAE3C,8CAAC,4BAAK,WAAU,YAAW;AAAA;AAAA,cAE/B;AAAA,cACA,8CAAC,kBAAe,MAAK,UAAU,mBAAS,WAAW,QAAO;AAAA,eAC5D;AAAA,YACA,+CAAC,WACC;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,QACE;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,WAAU;AAAA,sBACV,SAAS;AAAA;AAAA,kBACX;AAAA,kBAGD,yBAAe,SACd,8CAAC,6BAAM,WAAU,2BAA0B,IACzC,eAAe,YACjB,8CAAC,yBAAE,WAAU,yBAAwB,IAErC,8CAAC,4BAAK,WAAU,YAAW;AAAA;AAAA,cAE/B;AAAA,cACA,8CAAC,kBAAe,MAAK,UAClB,yBAAe,SAAS,SAAS,eAAe,YAAY,YAAY,iBAC3E;AAAA,eACF;AAAA,YACA,+CAAC,WACC;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,QACE;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,WAAU;AAAA,sBACV,SAAS;AAAA;AAAA,kBACX;AAAA,kBAGF,wDAAC,8BAAO,WAAU,YAAW;AAAA;AAAA,cAC/B;AAAA,cACA,8CAAC,kBAAe,MAAK,UAAS,oBAAM;AAAA,eACtC;AAAA,aACF;AAAA,WACF,GACF;AAAA,QAGA,+CAAC,SAAI,WAAU,4BAEb;AAAA,yDAAC,SAAI,WAAU,eACb;AAAA,2DAAC,SAAI,WAAU,kCACb;AAAA,4DAAC,SAAI,WAAU,8GACZ,iBACH;AAAA,cACA,+CAAC,UAAK,WAAU,uCAAsC;AAAA;AAAA,gBAAU;AAAA,iBAAM;AAAA,cACtE,8CAAC,UAAK,WAAU,qCAAqC,6BAAmB,QAAQ,SAAS,GAAE;AAAA,eAC7F;AAAA,YACA,8CAAC,OAAE,WAAU,2CAA2C,kBAAQ,MAAK;AAAA,aACvE;AAAA,UAGC,QAAQ,QAAQ,IAAI,CAAC,OAAO,MAC3B,+CAAC,SAAY,WAAU,yCACrB;AAAA,2DAAC,SAAI,WAAU,gCACb;AAAA,4DAAC,SAAI,WAAU,8GACZ,iBACH;AAAA,cACA,8CAAC,UAAK,WAAU,qCAAqC,6BAAmB,MAAM,SAAS,GAAE;AAAA,eAC3F;AAAA,YACA,8CAAC,OAAE,WAAU,2CAA2C,gBAAM,MAAK;AAAA,eAP3D,CAQV,CACD;AAAA,WACH;AAAA,QAGA,+CAAC,SAAI,WAAU,mEACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,MAAK;AAAA,cACL,WAAU;AAAA,cACV,aAAY;AAAA,cACZ,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,aAAa,EAAE,OAAO,KAAK;AAAA,cAC5C,WAAW,CAAC,MAAM;AAChB,kBAAE,gBAAgB;AAClB,oBAAI,EAAE,QAAQ,SAAS;AACrB,oCAAkB;AAAA,gBACpB,WAAW,EAAE,QAAQ,UAAU;AAC7B,0BAAQ;AAAA,gBACV;AAAA,cACF;AAAA;AAAA,UACF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAW;AAAA,gBACT;AAAA,gBACA,UAAU,KAAK,IACX,6CACA;AAAA,cACN;AAAA,cACA,UAAU,CAAC,UAAU,KAAK;AAAA,cAC1B,SAAS;AAAA,cAET,wDAAC,+BAAQ,WAAU,YAAW;AAAA;AAAA,UAChC;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AdhdA,IAAAC,uBAmCO;AAqBH,IAAAC,uBAAA;AAnBJ,IAAMC,eAAc;AACpB,IAAM,cAAc;AACpB,IAAM,eAAe;AAErB,IAAM,gBAAgB,CAAC,MAA0C,EAAE,OAAO,OAAO;AAOjF,SAAS,YAAY,EAAE,OAAO,WAAW,eAAe,GAAG,MAAM,GAAqB;AACpF,QAAM,CAAC,YAAY,aAAa,IAAU,iBAAS,OAAO,SAAS,CAAC;AAEpE,EAAM,kBAAU,MAAM;AACpB,kBAAc,OAAO,SAAS,CAAC;AAAA,EACjC,GAAG,CAAC,SAAS,CAAC;AAEd,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,MAAK;AAAA,MACL,OAAO;AAAA,MACP,UAAU,CAAC,MAAM;AACf,sBAAc,EAAE,OAAO,KAAK;AAC5B,cAAM,SAAS,WAAW,EAAE,OAAO,KAAK;AACxC,YAAI,CAAC,MAAM,MAAM,EAAG,eAAc,MAAM;AAAA,MAC1C;AAAA,MACA,QAAQ,MAAM;AACZ,YAAI,eAAe,MAAM,MAAM,WAAW,UAAU,CAAC,GAAG;AACtD,wBAAc,OAAO,SAAS,CAAC;AAAA,QACjC;AAAA,MACF;AAAA,MACA,SAAS;AAAA;AAAA,EACX;AAEJ;AAEA,SAAS,IAAI,EAAE,UAAU,OAAO,OAAO,MAAM,GAAyG;AACpJ,SACE,+CAAC,WACC;AAAA,kDAAC,kBAAe,QAAQ,UAAU;AAAA,IAClC,8CAAC,kBAAe,MAAa,iBAAM;AAAA,KACrC;AAEJ;AAOA,SAAS,qBAA+B;AACtC,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EACtB;AAEA,MAAI;AACF,UAAM,SAAS,aAAa,QAAQA,YAAW;AAC/C,QAAI,QAAQ;AACV,aAAO,KAAK,MAAM,MAAM;AAAA,IAC1B;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO;AAAA,IACL,GAAG,OAAO,aAAa,cAAc;AAAA,IACrC,GAAG,OAAO,cAAc,eAAe;AAAA,EACzC;AACF;AAEA,IAAM,mBAAmB,CAAC,SAAS,iBAAiB,gBAAgB,cAAc;AAElF,IAAM,oBAAoD;AAAA,EACxD,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,gBAAgB;AAClB;AAaA,SAAS,cAAc,EAAE,QAAQ,SAAS,GAAuB;AAC/D,QAAM,CAAC,YAAY,aAAa,IAAU,iBAAS,KAAK;AAExD,QAAM,eAAe,CAAC,OAAgD,iBAAyB;AAC7F,UAAM,WAA6B;AAAA,MACjC;AAAA,MACA,MAAM;AAAA,MACN,KAAK,GAAG,YAAY;AAAA,IACtB;AAEA,eAAW,QAAQ,OAAO;AACxB,YAAM,MAAM,UAAU,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC;AAClE,eAAS,KAAK,QAAQ;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,kBACJ,OAAO,KAAK,iBAAiB,OAAO,MAAM,eACtC,OAAO,KAAK,eACZ,OAAO,KAAK;AAClB,QAAM,gBACJ,OAAO,IAAI,iBAAiB,OAAO,OAAO,eACtC,OAAO,IAAI,eACX,OAAO,IAAI;AAEjB,MAAI,YAAY;AACd,WACE,+CAAC,SAAI,WAAU,eACb;AAAA,qDAAC,SAAI,WAAU,6BACb;AAAA,sDAAC,OAAI,OAAM,QACT,yDAAC,SAAI,WAAU,mBACb;AAAA,wDAAC,kCAAU,WAAU,2EAA0E;AAAA,UAC/F;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,OAAO,MAAM,gBAAgB;AAAA,cACpC,eAAe,CAAC,QAAQ,aAAa,CAAC,MAAM,GAAG,GAAG;AAAA,cAClD,WAAU;AAAA;AAAA,UACZ;AAAA,WACF,GACF;AAAA,QACA,8CAAC,OAAI,OAAM,OACT,yDAAC,SAAI,WAAU,mBACb;AAAA,wDAAC,gCAAQ,WAAU,2EAA0E;AAAA,UAC7F;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,OAAO,KAAK,gBAAgB;AAAA,cACnC,eAAe,CAAC,QAAQ,aAAa,CAAC,KAAK,GAAG,GAAG;AAAA,cACjD,WAAU;AAAA;AAAA,UACZ;AAAA,WACF,GACF;AAAA,QACA,8CAAC,OAAI,OAAM,iBACT;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM,cAAc,KAAK;AAAA,YAElC,wDAAC,iCAAS,WAAU,YAAW;AAAA;AAAA,QACjC,GACF;AAAA,SACF;AAAA,MACA,+CAAC,SAAI,WAAU,6BACb;AAAA,sDAAC,OAAI,OAAM,SACT,yDAAC,SAAI,WAAU,mBACb;AAAA,wDAAC,mCAAW,WAAU,2EAA0E;AAAA,UAChG;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,OAAO,OAAO,gBAAgB;AAAA,cACrC,eAAe,CAAC,QAAQ,aAAa,CAAC,OAAO,GAAG,GAAG;AAAA,cACnD,WAAU;AAAA;AAAA,UACZ;AAAA,WACF,GACF;AAAA,QACA,8CAAC,OAAI,OAAM,UACT,yDAAC,SAAI,WAAU,mBACb;AAAA,wDAAC,kCAAU,WAAU,2EAA0E;AAAA,UAC/F;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,OAAO,QAAQ,gBAAgB;AAAA,cACtC,eAAe,CAAC,QAAQ,aAAa,CAAC,QAAQ,GAAG,GAAG;AAAA,cACpD,WAAU;AAAA;AAAA,UACZ;AAAA,WACF,GACF;AAAA,QACA,8CAAC,SAAI,WAAU,mBAAkB;AAAA,SACnC;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,+CAAC,SAAI,WAAU,6BACb;AAAA,kDAAC,OAAI,OAAM,6BACT,yDAAC,SAAI,WAAU,mBACb;AAAA,oDAAC,uCAAe,WAAU,2EAA0E;AAAA,MACpG;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,eAAe,CAAC,QAAQ,aAAa,CAAC,QAAQ,OAAO,GAAG,GAAG;AAAA,UAC3D,WAAU;AAAA;AAAA,MACZ;AAAA,OACF,GACF;AAAA,IACA,8CAAC,OAAI,OAAM,2BACT,yDAAC,SAAI,WAAU,mBACb;AAAA,oDAAC,qCAAa,WAAU,2EAA0E;AAAA,MAClG;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,eAAe,CAAC,QAAQ,aAAa,CAAC,OAAO,QAAQ,GAAG,GAAG;AAAA,UAC3D,WAAU;AAAA;AAAA,MACZ;AAAA,OACF,GACF;AAAA,IACA,8CAAC,OAAI,OAAM,mBACT;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM,cAAc,IAAI;AAAA,QAEjC,wDAAC,gCAAQ,WAAU,YAAW;AAAA;AAAA,IAChC,GACF;AAAA,KACF;AAEJ;AAYA,SAAS,aAAa,EAAE,QAAQ,SAAS,GAAsB;AAC7D,QAAM,CAAC,YAAY,aAAa,IAAU,iBAAS,KAAK;AAExD,QAAM,eAAe,CAAC,OAAgD,iBAAyB;AAC7F,UAAM,WAA6B;AAAA,MACjC;AAAA,MACA,MAAM;AAAA,MACN,KAAK,GAAG,YAAY;AAAA,IACtB;AAEA,eAAW,QAAQ,OAAO;AACxB,YAAM,MAAM,SAAS,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC;AACjE,eAAS,KAAK,QAAQ;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,kBACJ,OAAO,KAAK,iBAAiB,OAAO,MAAM,eACtC,OAAO,KAAK,eACZ,OAAO,KAAK;AAClB,QAAM,gBACJ,OAAO,IAAI,iBAAiB,OAAO,OAAO,eACtC,OAAO,IAAI,eACX,OAAO,IAAI;AAEjB,MAAI,YAAY;AACd,WACE,+CAAC,SAAI,WAAU,eACb;AAAA,qDAAC,SAAI,WAAU,6BACb;AAAA,sDAAC,OAAI,OAAM,QACT,yDAAC,SAAI,WAAU,mBACb;AAAA,wDAAC,kCAAU,WAAU,2EAA0E;AAAA,UAC/F;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,OAAO,MAAM,gBAAgB;AAAA,cACpC,eAAe,CAAC,QAAQ,aAAa,CAAC,MAAM,GAAG,GAAG;AAAA,cAClD,WAAU;AAAA;AAAA,UACZ;AAAA,WACF,GACF;AAAA,QACA,8CAAC,OAAI,OAAM,OACT,yDAAC,SAAI,WAAU,mBACb;AAAA,wDAAC,gCAAQ,WAAU,2EAA0E;AAAA,UAC7F;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,OAAO,KAAK,gBAAgB;AAAA,cACnC,eAAe,CAAC,QAAQ,aAAa,CAAC,KAAK,GAAG,GAAG;AAAA,cACjD,WAAU;AAAA;AAAA,UACZ;AAAA,WACF,GACF;AAAA,QACA,8CAAC,OAAI,OAAM,iBACT;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM,cAAc,KAAK;AAAA,YAElC,wDAAC,iCAAS,WAAU,YAAW;AAAA;AAAA,QACjC,GACF;AAAA,SACF;AAAA,MACA,+CAAC,SAAI,WAAU,6BACb;AAAA,sDAAC,OAAI,OAAM,SACT,yDAAC,SAAI,WAAU,mBACb;AAAA,wDAAC,mCAAW,WAAU,2EAA0E;AAAA,UAChG;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,OAAO,OAAO,gBAAgB;AAAA,cACrC,eAAe,CAAC,QAAQ,aAAa,CAAC,OAAO,GAAG,GAAG;AAAA,cACnD,WAAU;AAAA;AAAA,UACZ;AAAA,WACF,GACF;AAAA,QACA,8CAAC,OAAI,OAAM,UACT,yDAAC,SAAI,WAAU,mBACb;AAAA,wDAAC,kCAAU,WAAU,2EAA0E;AAAA,UAC/F;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,OAAO,QAAQ,gBAAgB;AAAA,cACtC,eAAe,CAAC,QAAQ,aAAa,CAAC,QAAQ,GAAG,GAAG;AAAA,cACpD,WAAU;AAAA;AAAA,UACZ;AAAA,WACF,GACF;AAAA,QACA,8CAAC,SAAI,WAAU,mBAAkB;AAAA,SACnC;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,+CAAC,SAAI,WAAU,6BACb;AAAA,kDAAC,OAAI,OAAM,6BACT,yDAAC,SAAI,WAAU,mBACb;AAAA,oDAAC,uCAAe,WAAU,2EAA0E;AAAA,MACpG;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,eAAe,CAAC,QAAQ,aAAa,CAAC,QAAQ,OAAO,GAAG,GAAG;AAAA,UAC3D,WAAU;AAAA;AAAA,MACZ;AAAA,OACF,GACF;AAAA,IACA,8CAAC,OAAI,OAAM,2BACT,yDAAC,SAAI,WAAU,mBACb;AAAA,oDAAC,qCAAa,WAAU,2EAA0E;AAAA,MAClG;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,eAAe,CAAC,QAAQ,aAAa,CAAC,OAAO,QAAQ,GAAG,GAAG;AAAA,UAC3D,WAAU;AAAA;AAAA,MACZ;AAAA,OACF,GACF;AAAA,IACA,8CAAC,OAAI,OAAM,mBACT;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM,cAAc,IAAI;AAAA,QAEjC,wDAAC,gCAAQ,WAAU,YAAW;AAAA;AAAA,IAChC,GACF;AAAA,KACF;AAEJ;AAYA,IAAM,qBAAqB;AAC3B,IAAM,2BAA2B;AAGjC,SAAS,cAAc,WAA2B;AAChD,SAAO,aAAa,2BAA2B,qBAAqB;AACtE;AAEA,SAAS,cAAc,OAAuB;AAC5C,SAAO,SAAS,qBAAqB,2BAA2B,KAAK,IAAI,OAAO,2BAA2B,CAAC;AAC9G;AAEA,SAAS,iBAAiB,EAAE,QAAQ,UAAU,GAA0F;AACtI,QAAM,QAAgC;AAAA,IACpC,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,aAAa;AAAA,EACf;AACA,SACE,8CAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAa,GAAG,eAAc,SAAQ,gBAAe,SAAQ,WAAW,GAAG,UAAU,SAAS,GACvJ,wDAAC,UAAK,GAAG,MAAM,MAAM,GAAG,GAC1B;AAEJ;AAEA,SAAS,mBAAmB,EAAE,QAAQ,SAAS,GAA4B;AACzE,QAAM,CAAC,YAAY,aAAa,IAAU,iBAAS,KAAK;AAExD,QAAM,eAAe,CACnB,SACA,iBACG;AACH,UAAM,WAA6B;AAAA,MACjC;AAAA,MACA,MAAM;AAAA,MACN,KAAK,GAAG,YAAY;AAAA,IACtB;AAEA,eAAW,UAAU,SAAS;AAC5B,YAAM,MAAM,SAAS,OAAO,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,MAAM,CAAC,CAAC;AACrE,eAAS,KAAK,QAAQ;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,wBAAwB,CAC5B,SACA,eACG;AACH,QAAI,WAAW,YAAY,MAAM,QAAQ;AACvC,mBAAa,SAAS,kBAAkB;AAAA,IAC1C,OAAO;AACL,YAAM,eAAe,WAAW,UAAU,KAAK;AAC/C,mBAAa,SAAS,YAAY;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,UACJ,OAAO,QAAQ,iBAAiB,OAAO,SAAS,gBAChD,OAAO,SAAS,iBAAiB,OAAO,YAAY,gBACpD,OAAO,YAAY,iBAAiB,OAAO,WAAW;AACxD,QAAM,eAAe,UAAU,OAAO,QAAQ,eAAe,OAAO,QAAQ;AAE5E,MAAI,YAAY;AACd,WACE,+CAAC,SAAI,WAAU,eACb;AAAA,qDAAC,SAAI,WAAU,6BACb;AAAA,sDAAC,OAAI,OAAM,YACT,yDAAC,SAAI,WAAU,mBACb;AAAA,wDAAC,oBAAiB,QAAO,WAAU,WAAU,oEAAmE;AAAA,UAChH;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,OAAO,SAAS,gBAAgB;AAAA,cACvC,eAAe,CAAC,QAAQ,aAAa,CAAC,SAAS,GAAG,GAAG;AAAA,cACrD,WAAU;AAAA;AAAA,UACZ;AAAA,WACF,GACF;AAAA,QACA,8CAAC,OAAI,OAAM,aACT,yDAAC,SAAI,WAAU,mBACb;AAAA,wDAAC,oBAAiB,QAAO,YAAW,WAAU,oEAAmE;AAAA,UACjH;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,OAAO,UAAU,gBAAgB;AAAA,cACxC,eAAe,CAAC,QAAQ,aAAa,CAAC,UAAU,GAAG,GAAG;AAAA,cACtD,WAAU;AAAA;AAAA,UACZ;AAAA,WACF,GACF;AAAA,QACA,8CAAC,OAAI,OAAM,iBACT;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM,cAAc,KAAK;AAAA,YAElC,wDAAC,iCAAS,WAAU,YAAW;AAAA;AAAA,QACjC,GACF;AAAA,SACF;AAAA,MACA,+CAAC,SAAI,WAAU,6BACb;AAAA,sDAAC,OAAI,OAAM,eACT,yDAAC,SAAI,WAAU,mBACb;AAAA,wDAAC,oBAAiB,QAAO,cAAa,WAAU,oEAAmE;AAAA,UACnH;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,OAAO,YAAY,gBAAgB;AAAA,cAC1C,eAAe,CAAC,QAAQ,aAAa,CAAC,YAAY,GAAG,GAAG;AAAA,cACxD,WAAU;AAAA;AAAA,UACZ;AAAA,WACF,GACF;AAAA,QACA,8CAAC,OAAI,OAAM,gBACT,yDAAC,SAAI,WAAU,mBACb;AAAA,wDAAC,oBAAiB,QAAO,eAAc,WAAU,oEAAmE;AAAA,UACpH;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,OAAO,aAAa,gBAAgB;AAAA,cAC3C,eAAe,CAAC,QAAQ,aAAa,CAAC,aAAa,GAAG,GAAG;AAAA,cACzD,WAAU;AAAA;AAAA,UACZ;AAAA,WACF,GACF;AAAA,QACA,8CAAC,SAAI,WAAU,mBAAkB;AAAA,SACnC;AAAA,OACF;AAAA,EAEJ;AAEA,QAAM,SAAS,gBAAgB;AAC/B,QAAM,eAAe,SAAS,SAAS,OAAO,YAAY;AAC1D,QAAM,cAAc,cAAc,YAAY;AAE9C,SACE,+CAAC,SAAI,WAAU,6BACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP,eAAe,CAAC,QAAQ;AACtB,gBAAM,YAAY,OAAO,QAAQ,WAAW,MAAM,IAAI,CAAC;AACvD;AAAA,YACE,CAAC,WAAW,YAAY,eAAe,YAAY;AAAA,YACnD,cAAc,SAAS;AAAA,UACzB;AAAA,QACF;AAAA,QACA,KAAK;AAAA,QACL,MAAM;AAAA,QACN,WAAU;AAAA;AAAA,IACZ;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU,CAAC,MACT;AAAA,UACE,CAAC,WAAW,YAAY,eAAe,YAAY;AAAA,UACnD,EAAE,OAAO;AAAA,QACX;AAAA,QAEF,SAAS;AAAA,QACT,WAAU;AAAA;AAAA,IACZ;AAAA,IACA,8CAAC,OAAI,OAAM,mBACT;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM,cAAc,IAAI;AAAA,QAEjC,wDAAC,gCAAQ,WAAU,YAAW;AAAA;AAAA,IAChC,GACF;AAAA,KACF;AAEJ;AAEA,SAAS,eAAe,EAAE,MAAM,UAAU,GAAsE;AAC9G,SACE,+CAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,WAAW,GAAG,UAAU,SAAS,GAEpE;AAAA;AAAA,MAAC;AAAA;AAAA,QAAK,IAAG;AAAA,QAAI,IAAG;AAAA,QAAI,IAAG;AAAA,QAAK,IAAG;AAAA,QAC7B,QAAO;AAAA,QACP,aAAa,SAAS,QAAQ,MAAM;AAAA,QACpC,iBAAiB,SAAS,QAAQ,SAAS;AAAA,QAC3C,eAAe,SAAS,QAAQ,IAAI;AAAA;AAAA,IACtC;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QAAK,IAAG;AAAA,QAAK,IAAG;AAAA,QAAI,IAAG;AAAA,QAAK,IAAG;AAAA,QAC9B,QAAO;AAAA,QACP,aAAa,SAAS,UAAU,MAAM;AAAA,QACtC,iBAAiB,SAAS,UAAU,SAAS;AAAA,QAC7C,eAAe,SAAS,UAAU,IAAI;AAAA;AAAA,IACxC;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QAAK,IAAG;AAAA,QAAI,IAAG;AAAA,QAAK,IAAG;AAAA,QAAK,IAAG;AAAA,QAC9B,QAAO;AAAA,QACP,aAAa,SAAS,WAAW,MAAM;AAAA,QACvC,iBAAiB,SAAS,WAAW,SAAS;AAAA,QAC9C,eAAe,SAAS,WAAW,IAAI;AAAA;AAAA,IACzC;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QAAK,IAAG;AAAA,QAAI,IAAG;AAAA,QAAI,IAAG;AAAA,QAAI,IAAG;AAAA,QAC5B,QAAO;AAAA,QACP,aAAa,SAAS,SAAS,MAAM;AAAA,QACrC,iBAAiB,SAAS,SAAS,SAAS;AAAA,QAC5C,eAAe,SAAS,SAAS,IAAI;AAAA;AAAA,IACvC;AAAA,KACF;AAEJ;AAEA,IAAM,uBAAqE;AAAA,EACzE,EAAE,OAAO,SAAS,OAAO,QAAQ;AAAA,EACjC,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,EACnC,EAAE,OAAO,UAAU,OAAO,SAAS;AACrC;AAGA,IAAM,0BAA2E;AAAA,EAC/E,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,EACnC,EAAE,OAAO,WAAW,OAAO,UAAU;AACvC;AAEA,IAAM,eAAe,CAAC,OAAO,SAAS,UAAU,MAAM;AAiBtD,IAAM,sBAAsB,CAAC,OAAO,OAAO,SAAS,UAAU,QAAQ,QAAQ;AAG9E,SAAS,aAAa,EAAE,QAAQ,aAAa,cAAc,UAAU,eAAe,qBAAqB,sBAAsB,UAAU,gBAAgB,kBAAkB,cAAc,aAAa,GAAsB;AAC1N,QAAM,CAAC,cAAc,eAAe,IAAU,iBAA2B,KAAK;AAE9E,QAAM,YAAY,mBAAmB;AAErC,QAAM,cAAc,iBAAiB,SAAS,iBAAiB,WAC3D,eACA,CAAC,YAAY;AAEjB,QAAM,cAAc,YAAY;AAAA,IAC9B,CAAC,MAAO,OAAO,SAAS,CAAC,OAAiC,MAAuB,OAAO,SAAS,YAAY,CAAC,CAAC,OAAiC;AAAA,EAClJ;AACA,QAAM,cAAc,YAAY,MAAM,CAAC,MAAM;AAC3C,UAAM,IAAI,OAAO,SAAS,CAAC,OAAiC;AAC5D,UAAM,QAAQ,OAAO,SAAS,YAAY,CAAC,CAAC,OAAiC;AAC7E,WAAO,EAAE,iBAAiB,MAAM;AAAA,EAClC,CAAC;AAED,QAAM,eAAe,YAChB,gBAAgB,UAChB,cAAe,OAAO,SAAS,YAAY,CAAC,CAAC,OAAiC,KAAqB,UAAU;AAClH,QAAM,eAAe,YAChB,gBAAgB,IAChB,cAAe,OAAO,SAAS,YAAY,CAAC,CAAC,OAAiC,GAAwB,gBAAgB,IAAI;AAE/H,QAAM,oBAAoB,CAAC,UAAuB;AAChD,QAAI,aAAa,UAAU;AACzB,YAAM,QAAgC,EAAE,iBAAiB,MAAM;AAC/D,WAAK,gBAAgB,MAAM,GAAG;AAC5B,cAAM,eAAe,IAAI;AAAA,MAC3B;AACA,eAAS,KAAK;AACd;AAAA,IACF;AACA,UAAM,UAA2E,CAAC;AAClF,eAAW,KAAK,aAAa;AAC3B,YAAM,IAAI,OAAO,SAAS,CAAC,OAAiC;AAC5D,UAAI,EAAE,gBAAgB,GAAG;AACvB,gBAAQ,KAAK,CAAC,SAAS,CAAC,SAA8B,EAAE,cAAc,GAAG,MAAM,MAAM,KAAK,MAAM,CAAC,CAAC;AAAA,MACpG;AACA,cAAQ,KAAK,CAAC,SAAS,CAAC,SAA8B,KAAK,CAAC;AAAA,IAC9D;AACA,kBAAc,OAAO;AAAA,EACvB;AAEA,QAAM,uBAAuB,CAAC,iBAAyB;AACrD,UAAM,UAAU,KAAK,IAAI,GAAG,YAAY;AACxC,QAAI,aAAa,UAAU;AACzB,eAAS,EAAE,iBAAiB,GAAG,OAAO,KAAK,CAAC;AAC5C;AAAA,IACF;AACA,UAAM,QAA0B,EAAE,cAAc,SAAS,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK;AACzF,UAAM,UAA2E,CAAC;AAClF,eAAW,KAAK,aAAa;AAC3B,cAAQ,KAAK,CAAC,SAAS,CAAC,SAA8B,KAAK,CAAC;AAAA,IAC9D;AACA,kBAAc,OAAO;AAAA,EACvB;AAEA,QAAM,wBAAwB,CAAC,MAAc,iBAAyB;AACpE,UAAM,UAAU,KAAK,IAAI,GAAG,YAAY;AACxC,aAAS,SAAS,IAAI,SAA8B;AAAA,MAClD,cAAc;AAAA,MACd,MAAM;AAAA,MACN,KAAK,GAAG,OAAO;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,QAAM,cAAc,YAAY,eAAe;AAC/C,QAAM,oBAAoB,YAAY,uBAAuB;AAE7D,SACE,+CAAC,SAAI,WAAU,aAEZ;AAAA,mBAAe,qBACd;AAAA,MAAC;AAAA;AAAA,QACC,IAAI,YAAY,kBAAkB;AAAA,QAClC,OAAO,YAAY,YAAY;AAAA,QAC/B,MAAM,YAAY,8CAAC,8BAAM,WAAU,YAAW,IAAK,8CAAC,+BAAO,WAAU,YAAW;AAAA,QAChF,OAAO;AAAA,QACP,UAAU;AAAA;AAAA,IACZ;AAAA,IAIF,+CAAC,SAAI,WAAU,6BACb;AAAA,qDAAC,UAAO,OAAO,gBAAgB,eAAe,CAAC,QAAQ,OAAO,iBAAiB,GAAqB,GAClG;AAAA,uDAAC,iBAAc,WAAU,0IACvB;AAAA,wDAAC,UAAM,kCAAwB,KAAK,CAAC,MAAM,EAAE,UAAU,cAAc,GAAG,OAAM;AAAA,UAC9E,8CAAC,cACC,wDAAC,oCAAY,WAAU,kCAAiC,GAC1D;AAAA,WACF;AAAA,QACA,8CAAC,gBACC,wDAAC,oBAAiB,YAAY,GAAG,WAAU,aACzC,wDAAC,eAAY,WAAU,wKACpB,kCAAwB,IAAI,CAAC,WAC5B;AAAA,UAAC;AAAA;AAAA,YAEC,OAAO,OAAO;AAAA,YACd,WAAU;AAAA,YAEV;AAAA,4DAAC,uBAAoB,WAAU,sDAC7B,wDAAC,8BAAM,WAAU,YAAW,GAC9B;AAAA,cACA,8CAAC,kBAAgB,iBAAO,OAAM;AAAA;AAAA;AAAA,UAPzB,OAAO;AAAA,QAQd,CACD,GACH,GACF,GACF;AAAA,SACF;AAAA,MAEA,+CAAC,UAAO,OAAO,cAAc,eAAe,CAAC,QAAQ,OAAO,kBAAkB,GAAkB,GAC9F;AAAA,uDAAC,iBAAc,WAAU,0IACvB;AAAA,yDAAC,UAAK,WAAU,6BACd;AAAA,0DAAC,+BAAO,WAAU,kCAAiC;AAAA,YACnD,8CAAC,UAAM,+BAAqB,KAAK,CAAC,MAAM,EAAE,UAAU,YAAY,GAAG,SAAS,cAAa;AAAA,aAC3F;AAAA,UACA,8CAAC,cACC,wDAAC,oCAAY,WAAU,kCAAiC,GAC1D;AAAA,WACF;AAAA,QACA,8CAAC,gBACC,wDAAC,oBAAiB,YAAY,GAAG,WAAU,aACzC,wDAAC,eAAY,WAAU,wKACpB,+BAAqB,IAAI,CAAC,WACzB;AAAA,UAAC;AAAA;AAAA,YAEC,OAAO,OAAO;AAAA,YACd,WAAU;AAAA,YAEV;AAAA,4DAAC,uBAAoB,WAAU,sDAC7B,wDAAC,8BAAM,WAAU,YAAW,GAC9B;AAAA,cACA,8CAAC,kBAAgB,iBAAO,OAAM;AAAA;AAAA;AAAA,UAPzB,OAAO;AAAA,QAQd,CACD,GACH,GACF,GACF;AAAA,SACF;AAAA,MAEA,8CAAC,OAAI,OAAO,YAAY,kBAAkB,gBACxC,wDAAC,SACC;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,MAAM;AAAA,UACN,OAAO,OAAO,iBAAiB,WAAW,KAAK,MAAM,eAAe,GAAG,IAAI,MAAM;AAAA,UACjF,aAAa,iBAAiB,OAAO,WAAM;AAAA,UAC3C,eAAe;AAAA,UACf,WAAU;AAAA;AAAA,MACZ,GACF,GACF;AAAA,MAEC,CAAC,aACA,+CAAC,UAAO,OAAO,cAAc,eAAe,CAAC,QAAQ,OAAO,gBAAgB,GAAuB,GACjG;AAAA,sDAAC,OAAI,OAAO,UAAU,YAAY,IAChC,wDAAC,iBAAc,WAAU,6KACtB,2BAAiB,WAChB,8CAAC,gCAAQ,WAAU,YAAW,aAAa,GAAG,IAC5C,iBAAiB,QACnB,8CAAC,+BAAO,WAAU,YAAW,IAE7B,8CAAC,kBAAe,MAAM,cAAc,WAAU,IAAG,GAErD,GACF;AAAA,QACA,8CAAC,gBACC,wDAAC,oBAAiB,YAAY,GAAG,WAAU,aACzC,wDAAC,eAAY,WAAU,uKACpB,8BAAoB,IAAI,CAAC,SACxB;AAAA,UAAC;AAAA;AAAA,YAEC,OAAO;AAAA,YACP,WAAU;AAAA,YAEV;AAAA,4DAAC,uBAAoB,WAAU,sDAC7B,wDAAC,8BAAM,WAAU,YAAW,GAC9B;AAAA,cACA,8CAAC,kBAAgB,gBAAK;AAAA;AAAA;AAAA,UAPjB;AAAA,QAQP,CACD,GACH,GACF,GACF;AAAA,SACF;AAAA,OAEJ;AAAA,IAEC,CAAC,aAAa,iBAAiB,YAC9B,8CAAC,SAAI,WAAU,4BACZ,uBAAa,IAAI,CAAC,SAAS;AAC1B,YAAM,IAAI,OAAO,SAAS,IAAI,OAAiC;AAC/D,aACE,8CAAC,OAAI,OAAO,UAAU,KAAK,YAAY,CAAC,UACtC,yDAAC,SAAI,WAAU,YACb;AAAA,sDAAC,kBAAe,MAAY,WAAU,kEAAiE;AAAA,QACvG;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,MAAM;AAAA,YACN,OAAO,KAAK,MAAM,EAAE,eAAe,GAAG,IAAI;AAAA,YAC1C,eAAe,CAAC,QAAQ,sBAAsB,MAAM,GAAG;AAAA,YACvD,WAAU;AAAA;AAAA,QACZ;AAAA,SACF,KAVqD,IAWvD;AAAA,IAEJ,CAAC,GACH;AAAA,KAEJ;AAEJ;AAcA,SAAS,cAAc,EAAE,QAAQ,aAAa,cAAc,UAAU,eAAe,qBAAqB,sBAAsB,UAAU,cAAc,GAAuB;AAE7K,QAAM,oBAAoB;AAAA,IACxB,gBAAgB,eAAe,KAAK,gBAAgB,eAAe;AAAA,EACrE;AACA,QAAM,CAAC,gBAAgB,iBAAiB,IAAU;AAAA,IAChD,oBAAoB,YAAY;AAAA,EAClC;AAEA,QAAM,YAAY,mBAAmB;AAGrC,QAAM,oBAAqB,gBAAgB,eAAe,KAAqB;AAC/E,QAAM,oBAAoB,gBAAgB,eAAe,IACrD,WAAW,cAAc,eAAe,CAAC,IACzC;AAEJ,QAAM,YAAY,YACb,sBAAsB,UAAU,oBAAoB,IACrD,aAAa,KAAK,CAAC,MAAM;AACvB,UAAM,QAAQ,OAAO,SAAS,CAAC,OAAiC;AAChE,UAAM,QAAQ,OAAO,SAAS,CAAC,OAAiC;AAChE,WAAO,UAAU,UAAU,MAAM,eAAe;AAAA,EAClD,CAAC;AAEL,QAAM,kBAAkB,MAAM;AAC5B,QAAI,aAAa,UAAU;AACzB,eAAS,EAAE,iBAAiB,SAAS,iBAAiB,MAAM,CAAC;AAC7D;AAAA,IACF;AACA,UAAM,UAA2E,CAAC;AAClF,eAAW,KAAK,cAAc;AAC5B,cAAQ,KAAK,CAAC,SAAS,CAAC,SAA8B,OAAO,CAAC;AAC9D,YAAM,IAAI,OAAO,SAAS,CAAC,OAAiC;AAC5D,UAAI,EAAE,gBAAgB,GAAG;AACvB,gBAAQ,KAAK,CAAC,SAAS,CAAC,SAA8B,EAAE,cAAc,GAAG,MAAM,MAAM,KAAK,MAAM,CAAC,CAAC;AAAA,MACpG;AAAA,IACF;AACA,kBAAc,OAAO;AAAA,EACvB;AAEA,QAAM,qBAAqB,MAAM;AAC/B,QAAI,aAAa,UAAU;AACzB,eAAS,EAAE,iBAAiB,QAAQ,iBAAiB,MAAM,CAAC;AAC5D;AAAA,IACF;AACA,UAAM,UAA2E,CAAC;AAClF,eAAW,KAAK,cAAc;AAC5B,cAAQ,KAAK,CAAC,SAAS,CAAC,SAA8B,MAAM,CAAC;AAC7D,cAAQ,KAAK,CAAC,SAAS,CAAC,SAA8B,EAAE,cAAc,GAAG,MAAM,MAAM,KAAK,MAAM,CAAC,CAAC;AAAA,IACpG;AACA,kBAAc,OAAO;AAAA,EACvB;AAEA,QAAM,uBAAuB,CAAC,gBAAgC;AAC5D,QAAI,gBAAgB,eAAgB;AAEpC,QAAI,gBAAgB,aAAa,UAAU;AAEzC,YAAM,iBAAiB,OAAO,mBAAmB,SAAS,OAAO,iBAAiB;AAClF,YAAM,iBAAiB,OAAO,eAAe,eAAe,IAAI,OAAO,eAAe,eAAe;AAGrG,YAAM,eAAgF,CAAC;AACvF,iBAAW,KAAK,cAAc;AAC5B,qBAAa,KAAK,CAAC,SAAS,CAAC,SAA8B,MAAM,CAAC;AAClE,qBAAa,KAAK,CAAC,SAAS,CAAC,SAA8B,EAAE,cAAc,GAAG,MAAM,MAAM,KAAK,MAAM,CAAC,CAAC;AAAA,MACzG;AACA,oBAAc,YAAY;AAG1B,UAAI,WAAW;AACb,iBAAS;AAAA,UACP,iBAAiB;AAAA,UACjB,iBAAiB,GAAG,cAAc;AAAA,QACpC,CAAC;AAED,YAAI,eAAe,sBAAsB;AACvC,+BAAqB,WAAW;AAAA,QAClC;AAAA,MACF;AAAA,IACF,WAAW,gBAAgB,YAAY,UAAU;AAE/C,YAAM,QAAQ,sBAAsB,SAAS,oBAAoB;AACjE,YAAM,QAAQ,oBAAoB,IAAI,oBAAoB;AAG1D,eAAS,EAAE,iBAAiB,QAAQ,iBAAiB,MAAM,CAAC;AAG5D,UAAI,WAAW;AACb,cAAM,UAA2E,CAAC;AAClF,mBAAW,KAAK,cAAc;AAC5B,kBAAQ,KAAK,CAAC,SAAS,CAAC,SAA8B,KAAK,CAAC;AAC5D,kBAAQ,KAAK,CAAC,SAAS,CAAC,SAA8B,EAAE,cAAc,OAAO,MAAM,MAAM,KAAK,GAAG,KAAK,KAAK,CAAC,CAAC;AAAA,QAC/G;AACA,sBAAc,OAAO;AAErB,YAAI,gBAAgB,qBAAqB;AACvC,8BAAoB,YAAY;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAEA,sBAAkB,WAAW;AAAA,EAC/B;AAEA,QAAM,gBACJ,8CAAC,OAAI,OAAO,YAAY,kBAAkB,cACxC;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAU;AAAA,MACV,SAAS,YAAY,qBAAqB;AAAA,MAEzC,sBAAY,8CAAC,8BAAM,WAAU,YAAW,IAAK,8CAAC,6BAAK,WAAU,YAAW;AAAA;AAAA,EAC3E,GACF;AAGF,SACE,8CAAC,sBAAmB,OAAM,UAAS,SAAS,eACzC,sBACC,8CAAC,oBACC;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,kBAAkB;AAAA,MAClB,cAAc;AAAA,MACd,cAAc;AAAA;AAAA,EAChB,GACF,IACE,MACN;AAEJ;AAQA,SAAS,cAAc,EAAE,gBAAgB,YAAY,SAAS,GAAuB;AACnF,QAAM,gBAAgB,CAAC,cAAc,UAAU,UAAU;AACzD,QAAM,cAAc,CAAC,cAAc,UAAU,UAAU;AAEvD,QAAM,mBAAmB,CAAC,QAAgB;AACxC,QAAI,QAAQ,QAAS,QAAO;AAC5B,QAAI,QAAQ,MAAO,QAAO;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,CAAC,QAAgB;AACtC,QAAI,QAAQ,QAAS,QAAO;AAC5B,QAAI,QAAQ,MAAO,QAAO;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,iBAAiB,cAAc;AACtD,QAAM,eAAe,eAAe,UAAU;AAE9C,QAAM,gBAAgB,oBAAwD;AAE9E,SACE,+CAAC,mBAAgB,eAAe,KAAK,YAAY,KAC/C;AAAA,kDAAC,SAAI,WAAU,sDACZ,sBAAY;AAAA,MAAI,CAAC,UAChB,cAAc,IAAI,CAAC,YAAY;AAC7B,cAAM,WAAW,mBAAmB,WAAW,iBAAiB;AAChE,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,QAAQ;AAAA,YACR,SAAS,EAAE,SAAS,MAAM;AAAA,YAC1B,QACE;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAW;AAAA,kBACT;AAAA,kBACA,WACI,4BACA;AAAA,gBACN;AAAA,gBACA,SAAS,MAAM,SAAS,SAAS,KAAK;AAAA,gBAErC,qBACC;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,OAAO,EAAE,gBAAgB,SAAS,YAAY,MAAM;AAAA,oBAEpD;AAAA,oEAAC,UAAK,WAAU,0CAAyC;AAAA,sBACzD,8CAAC,UAAK,WAAU,0CAAyC;AAAA,sBACzD,8CAAC,UAAK,WAAU,0CAAyC;AAAA;AAAA;AAAA,gBAC3D,IAEA,8CAAC,UAAK,WAAU,8CAA6C;AAAA;AAAA,YAEjE;AAAA;AAAA,UA1BG,GAAG,OAAO,IAAI,KAAK;AAAA,QA4B1B;AAAA,MAEJ,CAAC;AAAA,IACH,GACF;AAAA,IACA,8CAAC,WAAQ,QAAQ,eACd,WAAC,EAAE,QAAQ,MACV,8CAAC,iBACC,wDAAC,qBAAkB,MAAK,UAAS,YAAY,GAAG,WAAU,mBACxD,yDAAC,gBAAa,WAAU,6XAA4X;AAAA;AAAA,MACxY,SAAS;AAAA,MAAQ;AAAA,MAAU,SAAS;AAAA,OAChD,GACF,GACF,GAEJ;AAAA,KACF;AAEJ;AAEA,IAAM,iBAAyD;AAAA,EAC7D,EAAE,OAAO,SAAS,OAAO,QAAQ;AAAA,EACjC,EAAE,OAAO,QAAQ,OAAO,iBAAiB;AAAA,EACzC,EAAE,OAAO,OAAO,OAAO,cAAc;AACvC;AAEA,SAAS,iBAAiB,EAAE,OAAO,cAAc,GAA0D;AACzG,QAAM,CAAC,YAAY,aAAa,IAAU,iBAAS,OAAO,KAAK,CAAC;AAEhE,EAAM,kBAAU,MAAM;AACpB,kBAAc,OAAO,KAAK,CAAC;AAAA,EAC7B,GAAG,CAAC,KAAK,CAAC;AAEV,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,OAAO;AAAA,MACP,UAAU,CAAC,MAAM;AACf,sBAAc,EAAE,OAAO,KAAK;AAC5B,cAAM,SAAS,WAAW,EAAE,OAAO,KAAK;AACxC,YAAI,CAAC,MAAM,MAAM,EAAG,eAAc,MAAM;AAAA,MAC1C;AAAA,MACA,QAAQ,MAAM;AACZ,YAAI,eAAe,MAAM,MAAM,WAAW,UAAU,CAAC,GAAG;AACtD,wBAAc,OAAO,KAAK,CAAC;AAAA,QAC7B;AAAA,MACF;AAAA,MACA,SAAS;AAAA,MACT,WAAU;AAAA;AAAA,EACZ;AAEJ;AAQA,SAAS,eAAe,EAAE,OAAO,OAAO,SAAS,GAAwB;AACvE,QAAM,yBAAyB,CAAC,iBAAyB;AACvD,aAAS;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,QACL;AAAA,QACA,MAAM;AAAA,QACN,KAAK,GAAG,YAAY;AAAA,MACtB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SACE,+CAAC,SAAI,WAAU,qFACb;AAAA,mDAAC,UAAK,WAAU,yCACd;AAAA,oDAAC,UAAK,WAAU,yBAAyB,iBAAM;AAAA,MAC9C,MAAM,SAAS,UACd;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,KAAK,MAAM,MAAM,MAAM,YAAY;AAAA,UAC1C,eAAe;AAAA;AAAA,MACjB,IAEA,+CAAC,UAAK,WAAU,kCACd;AAAA,sDAAC,UAAK,WAAU,sCAAsC,eAAK,MAAM,MAAM,MAAM,YAAY,GAAE;AAAA,QAC3F,8CAAC,UAAM,gBAAM,SAAS,SAAS,SAAS,OAAM;AAAA,SAChD;AAAA,OAEJ;AAAA,IACA,+CAAC,UAAO,OAAO,MAAM,MAAM,eAAe,CAAC,QAAQ;AACjD,UAAI,IAAK,UAAS,EAAE,MAAM,KAAmB,OAAO,MAAM,MAAM,CAAC;AAAA,IACnE,GACE;AAAA,oDAAC,iBAAc,WAAU,yGACvB,wDAAC,uCAAe,WAAU,kCAAiC,GAC7D;AAAA,MACA,8CAAC,gBACC,wDAAC,oBAAiB,MAAK,UAAS,YAAY,GAAG,sBAAsB,OAAO,WAAU,aACpF,wDAAC,eAAY,WAAU,wKACpB,yBAAe,IAAI,CAAC,WACnB,+CAAC,cAA8B,OAAO,OAAO,OAAO,WAAU,qJAC5D;AAAA,sDAAC,uBAAoB,WAAU,sDAC7B,wDAAC,8BAAM,WAAU,YAAW,GAC9B;AAAA,QACA,8CAAC,kBAAgB,iBAAO,OAAM;AAAA,WAJf,OAAO,KAKxB,CACD,GACH,GACF,GACF;AAAA,OACF;AAAA,KACF;AAEJ;AASA,SAAS,aAAa,EAAE,OAAO,QAAQ,eAAe,eAAe,GAAsB;AACzF,QAAM,EAAE,gBAAgB,IAAI,cAAc;AAC1C,QAAM,CAAC,QAAQ,SAAS,IAAU,iBAAS,KAAK;AAChD,QAAM,WAAiB,eAAe,CAAC;AAEvC,EAAM,kBAAU,MAAM;AACpB,cAAU,KAAK;AAAA,EACjB,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,UAAU,MAAM,SAAS,WAAW,OAAO,SAAS,WAAW,OAAO,MAAM,eAAe,KAAK,MAAM,MAAM,eAAe;AAEjI,QAAM,mBAAmB,MAAM;AAC7B,QAAI,CAAC,UAAU,SAAS;AACtB,eAAS,UAAU,MAAM,MAAM,eAAe,OAAO,MAAM;AAAA,IAC7D;AACA,cAAU,CAAC,MAAM;AAAA,EACnB;AAEA,QAAM,oBAAoB,CAAC,UAAuB;AAChD,kBAAc,KAAK;AACnB,QAAI,UAAU,MAAM,SAAS,WAAW,OAAO,SAAS,WAAW,SAAS,UAAU,GAAG;AACvF,YAAM,YAAY,KAAK,MAAM,MAAM,MAAM,eAAe,SAAS,OAAO;AACxE,qBAAe;AAAA,QACb,MAAM;AAAA,QACN,OAAO,EAAE,cAAc,WAAW,MAAM,OAAO,MAAM,MAAM,KAAK,GAAG,SAAS,GAAG,OAAO,MAAM,IAAI,GAAG;AAAA,MACrG,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,qBAAqB,CAAC,UAAuB;AACjD,mBAAe,KAAK;AACpB,QAAI,UAAU,MAAM,SAAS,WAAW,MAAM,SAAS,WAAW,SAAS,UAAU,GAAG;AACtF,YAAM,WAAW,KAAK,MAAM,MAAM,MAAM,eAAe,SAAS,OAAO;AACvE,oBAAc;AAAA,QACZ,MAAM;AAAA,QACN,OAAO,EAAE,cAAc,UAAU,MAAM,MAAM,MAAM,MAAM,KAAK,GAAG,QAAQ,GAAG,MAAM,MAAM,IAAI,GAAG;AAAA,MACjG,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SACE,+CAAC,SAAI,WAAU,2BACb;AAAA,kDAAC,kBAAe,OAAM,KAAI,OAAO,OAAO,UAAU,mBAAmB;AAAA,IACrE,8CAAC,kBAAe,OAAM,KAAI,OAAO,QAAQ,UAAU,oBAAoB;AAAA,IACvE,8CAAC,OAAI,OAAO,SAAS,wBAAwB,qBAC3C;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,SAAS,cAAc;AAAA,QAChC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS;AAAA,QACT,UAAU,CAAC;AAAA,QAEV,mBAAS,8CAAC,6BAAK,WAAU,YAAW,IAAK,8CAAC,+BAAO,WAAU,YAAW;AAAA;AAAA,IACzE,GACF;AAAA,KACF;AAEJ;AAUA,SAAS,WAAW,EAAE,IAAI,OAAO,MAAM,OAAO,SAAS,GAAoB;AACzE,QAAM,CAAC,UAAU,WAAW,IAAU,iBAAS,MAAM,GAAG;AACxD,QAAM,CAAC,YAAY,aAAa,IAAU,iBAAS,MAAM,MAAM,SAAS,CAAC;AAGzE,EAAM,kBAAU,MAAM;AACpB,gBAAY,MAAM,GAAG;AACrB,kBAAc,MAAM,MAAM,SAAS,CAAC;AAAA,EACtC,GAAG,CAAC,MAAM,KAAK,MAAM,KAAK,CAAC;AAE3B,QAAM,kBAAkB,CAAC,WAAmB;AAE1C,UAAM,UAAU,OAAO,QAAQ,KAAK,EAAE,EAAE,YAAY;AACpD,gBAAY,OAAO;AAGnB,QAAI,gBAAgB,KAAK,OAAO,GAAG;AACjC,eAAS;AAAA,QACP,KAAK;AAAA,QACL,OAAO,MAAM;AAAA,QACb,KAAK,iBAAiB,EAAE,KAAK,SAAS,OAAO,MAAM,OAAO,KAAK,GAAG,CAAC;AAAA,MACrE,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,oBAAoB,CAAC,aAAqB;AAC9C,kBAAc,QAAQ;AAEtB,UAAM,WAAW,SAAS,QAAQ;AAClC,QAAI,CAAC,MAAM,QAAQ,KAAK,YAAY,KAAK,YAAY,KAAK;AACxD,eAAS;AAAA,QACP,KAAK,MAAM;AAAA,QACX,OAAO;AAAA,QACP,KAAK,iBAAiB,EAAE,KAAK,MAAM,KAAK,OAAO,UAAU,KAAK,GAAG,CAAC;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SACE,8CAAC,SACC,yDAAC,SAAI,WAAU,sDAEb;AAAA,kDAAC,SAAI,WAAU,QACb,wDAAC,sBAAmB,IAAQ,OAAc,UACxC;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,EAAE,iBAAiB,IAAI,MAAM,GAAG,GAAG;AAAA;AAAA,IAC5C,GACF,GACF;AAAA,IAGA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,gBAAgB,EAAE,OAAO,KAAK;AAAA,QAC/C,QAAQ,MAAM,YAAY,MAAM,GAAG;AAAA,QACnC,WAAU;AAAA,QACV,WAAW;AAAA,QACX,aAAY;AAAA;AAAA,IACd;AAAA,IAGA,8CAAC,UAAK,WAAU,iCAAgC,eAAC;AAAA,IAGjD;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,kBAAkB,EAAE,OAAO,KAAK;AAAA,QACjD,QAAQ,MAAM,cAAc,MAAM,MAAM,SAAS,CAAC;AAAA,QAClD,WAAU;AAAA,QACV,KAAK;AAAA,QACL,KAAK;AAAA;AAAA,IACP;AAAA,IACA,8CAAC,UAAK,WAAU,sCAAqC,eAAC;AAAA,KACxD,GACF;AAEJ;AAEA,IAAM,gBAAgB;AAAA,EACpB,EAAE,OAAO,yBAAyB,OAAO,oBAAoB;AAAA,EAC7D,EAAE,OAAO,kBAAkB,OAAO,eAAe;AAAA,EACjD,EAAE,OAAO,2BAA2B,OAAO,cAAc;AAAA,EACzD,EAAE,OAAO,qBAAqB,OAAO,QAAQ;AAAA,EAC7C,EAAE,OAAO,sBAAsB,OAAO,SAAS;AAAA,EAC/C,EAAE,OAAO,qBAAqB,OAAO,QAAQ;AAC/C;AAEA,IAAM,eAAe;AAAA,EACnB,EAAE,OAAO,OAAO,OAAO,OAAO;AAAA,EAC9B,EAAE,OAAO,OAAO,OAAO,cAAc;AAAA,EACrC,EAAE,OAAO,OAAO,OAAO,QAAQ;AAAA,EAC/B,EAAE,OAAO,OAAO,OAAO,UAAU;AAAA,EACjC,EAAE,OAAO,OAAO,OAAO,SAAS;AAAA,EAChC,EAAE,OAAO,OAAO,OAAO,WAAW;AAAA,EAClC,EAAE,OAAO,OAAO,OAAO,OAAO;AAAA,EAC9B,EAAE,OAAO,OAAO,OAAO,aAAa;AAAA,EACpC,EAAE,OAAO,OAAO,OAAO,QAAQ;AACjC;AAOA,SAAS,iBAAiB,EAAE,YAAY,SAAS,GAA0B;AACzE,QAAM,uBAAuB,CAAC,UAAkB;AAC9C,aAAS,YAAY,EAAE,cAAc,OAAO,MAAM,MAAM,KAAK,GAAG,KAAK,KAAK,CAAC;AAAA,EAC7E;AAEA,QAAM,yBAAyB,CAAC,UAAkB;AAChD,aAAS,cAAc,EAAE,cAAc,OAAO,MAAM,MAAM,KAAK,GAAG,KAAK,KAAK,CAAC;AAAA,EAC/E;AAEA,QAAM,4BAA4B,CAAC,UAAkB;AACnD,aAAS,iBAAiB,EAAE,cAAc,OAAO,MAAM,MAAM,KAAK,GAAG,KAAK,KAAK,CAAC;AAAA,EAClF;AAEA,QAAM,qBAAqB,CAAC,UAAkB;AAC5C,UAAM,aAAa,MAAM,YAAY;AACrC,UAAM,SAAS,cAAc,KAAK,CAAC,MAAM;AACvC,YAAM,aAAa,EAAE,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY;AAC5D,aAAO,WAAW,WAAW,UAAU,KAAK,WAAW,WAAW,IAAI,UAAU,GAAG;AAAA,IACrF,CAAC;AACD,WAAO,QAAQ,SAAS;AAAA,EAC1B;AAEA,QAAM,qBAAqB,CAAC,UAAkB;AAC5C,UAAM,SAAS,aAAa,KAAK,CAAC,MAAM,EAAE,UAAU,KAAK;AACzD,WAAO,QAAQ,SAAS;AAAA,EAC1B;AAEA,SACE,+CAAC,SAAI,WAAU,aACb;AAAA,mDAAC,UAAO,OAAO,WAAW,YAAY,eAAe,CAAC,QAAQ,OAAO,SAAS,cAAc,GAAG,GAC7F;AAAA,qDAAC,iBAAc,WAAU,0IACvB;AAAA,uDAAC,UAAK,WAAU,2BACd;AAAA,wDAAC,6BAAK,WAAU,kCAAiC;AAAA,UACjD,8CAAC,UAAM,6BAAmB,WAAW,UAAU,GAAE;AAAA,WACnD;AAAA,QACA,8CAAC,cACC,wDAAC,oCAAY,WAAU,kCAAiC,GAC1D;AAAA,SACF;AAAA,MACA,8CAAC,gBACC,wDAAC,oBAAiB,YAAY,GAAG,WAAU,aACzC,wDAAC,eAAY,WAAU,wKACpB,wBAAc,IAAI,CAAC,WAClB;AAAA,QAAC;AAAA;AAAA,UAEC,OAAO,OAAO;AAAA,UACd,WAAU;AAAA,UAEV;AAAA,0DAAC,uBAAoB,WAAU,oDAC7B,wDAAC,8BAAM,WAAU,YAAW,GAC9B;AAAA,YACA,8CAAC,kBAAgB,iBAAO,OAAM;AAAA;AAAA;AAAA,QAPzB,OAAO;AAAA,MAQd,CACD,GACH,GACF,GACF;AAAA,OACF;AAAA,IAEA,+CAAC,UAAO,OAAO,WAAW,YAAY,eAAe,CAAC,QAAQ,OAAO,SAAS,cAAc,GAAG,GAC7F;AAAA,qDAAC,iBAAc,WAAU,0IACvB;AAAA,uDAAC,UAAK,WAAU,2BACd;AAAA,wDAAC,oCAAY,WAAU,kCAAiC;AAAA,UACxD,8CAAC,UAAM,6BAAmB,WAAW,UAAU,GAAE;AAAA,WACnD;AAAA,QACA,8CAAC,cACC,wDAAC,oCAAY,WAAU,kCAAiC,GAC1D;AAAA,SACF;AAAA,MACA,8CAAC,gBACC,wDAAC,oBAAiB,YAAY,GAAG,WAAU,aACzC,wDAAC,eAAY,WAAU,wKACpB,uBAAa,IAAI,CAAC,WACjB;AAAA,QAAC;AAAA;AAAA,UAEC,OAAO,OAAO;AAAA,UACd,WAAU;AAAA,UAEV;AAAA,0DAAC,uBAAoB,WAAU,oDAC7B,wDAAC,8BAAM,WAAU,YAAW,GAC9B;AAAA,YACA,8CAAC,kBAAgB,iBAAO,OAAM;AAAA;AAAA;AAAA,QAPzB,OAAO;AAAA,MAQd,CACD,GACH,GACF,GACF;AAAA,OACF;AAAA,IAEA,+CAAC,SAAI,WAAU,cACb;AAAA,oDAAC,OAAI,OAAM,aACT,yDAAC,SAAI,WAAU,mBACb;AAAA,sDAAC,iCAAS,WAAU,2EAA0E;AAAA,QAC9F;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,KAAK,MAAM,WAAW,SAAS,YAAY;AAAA,YAClD,eAAe;AAAA,YACf,WAAU;AAAA;AAAA,QACZ;AAAA,SACF,GACF;AAAA,MACA,8CAAC,OAAI,OAAM,eACT,yDAAC,SAAI,WAAU,mBACb;AAAA,sDAAC,iCAAS,WAAU,2EAA0E;AAAA,QAC9F;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,KAAK,MAAM,WAAW,WAAW,YAAY;AAAA,YACpD,eAAe;AAAA,YACf,WAAU;AAAA;AAAA,QACZ;AAAA,SACF,GACF;AAAA,MACA,8CAAC,OAAI,OAAM,uBACT,yDAAC,SAAI,WAAU,mBACb;AAAA,sDAAC,mCAAW,WAAU,2EAA0E;AAAA,QAChG;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO,KAAK,MAAM,WAAW,cAAc,eAAe,GAAG,IAAI;AAAA,YACjE,eAAe;AAAA,YACf,WAAU;AAAA;AAAA,QACZ;AAAA,SACF,GACF;AAAA,OACF;AAAA,IAEA,+CAAC,SAAI,WAAU,2BACb;AAAA,qDAAC,SAAI,WAAU,cACb;AAAA,sDAAC,OAAI,OAAM,cACT;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,WAAW,WAAW,cAAc,UAAU,WAAW,cAAc,UAAU,oCAAoC;AAAA,YACrH,SAAS,MAAM,SAAS,aAAa,MAAM;AAAA,YAE3C,wDAAC,kCAAU,WAAU,YAAW;AAAA;AAAA,QAClC,GACF;AAAA,QACA,8CAAC,OAAI,OAAM,gBACT;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,WAAW,WAAW,cAAc,WAAW,oCAAoC;AAAA,YACnF,SAAS,MAAM,SAAS,aAAa,QAAQ;AAAA,YAE7C,wDAAC,oCAAY,WAAU,YAAW;AAAA;AAAA,QACpC,GACF;AAAA,QACA,8CAAC,OAAI,OAAM,eACT;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,WAAW,WAAW,cAAc,WAAW,WAAW,cAAc,QAAQ,oCAAoC;AAAA,YACpH,SAAS,MAAM,SAAS,aAAa,OAAO;AAAA,YAE5C,wDAAC,mCAAW,WAAU,YAAW;AAAA;AAAA,QACnC,GACF;AAAA,SACF;AAAA,MAEA,+CAAC,SAAI,WAAU,cACb;AAAA,sDAAC,OAAI,OAAM,aACT;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,WAAW,WAAW,sBAAsB,eAAe,oCAAoC;AAAA,YAC/F,SAAS,MAAM,SAAS,qBAAqB,YAAY;AAAA,YAEzD,wDAAC,kDAA0B,WAAU,YAAW;AAAA;AAAA,QAClD,GACF;AAAA,QACA,8CAAC,OAAI,OAAM,gBACT;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,WAAW,WAAW,sBAAsB,WAAW,oCAAoC;AAAA,YAC3F,SAAS,MAAM,SAAS,qBAAqB,QAAQ;AAAA,YAErD,wDAAC,mDAA2B,WAAU,YAAW;AAAA;AAAA,QACnD,GACF;AAAA,QACA,8CAAC,OAAI,OAAM,gBACT;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,WAAW,WAAW,sBAAsB,aAAa,oCAAoC;AAAA,YAC7F,SAAS,MAAM,SAAS,qBAAqB,UAAU;AAAA,YAEvD,wDAAC,gDAAwB,WAAU,YAAW;AAAA;AAAA,QAChD,GACF;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEJ;AAiBA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AACnB,SACE,8CAAC,oBACC,yDAAC,SAAI,WAAU,aACZ;AAAA,2BACC;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,OAAM;AAAA,QACN,MAAM,8CAAC,mCAAW,WAAU,YAAW;AAAA,QACvC,OAAO;AAAA,QACP,UAAU;AAAA;AAAA,IACZ;AAAA,IAGD,kBACC;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,OAAM;AAAA,QACN,MAAM,8CAAC,6BAAK,WAAU,YAAW;AAAA,QACjC,OAAO;AAAA,QACP,UAAU;AAAA;AAAA,IACZ;AAAA,IAGD,mBAAmB,eAAe,uBACjC;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,OAAM;AAAA,QACN,MAAM,8CAAC,+BAAO,WAAU,YAAW;AAAA,QACnC,OAAO;AAAA,QACP,UAAU;AAAA;AAAA,IACZ;AAAA,IAGD,oBAAoB,gBAAgB,wBACnC;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,OAAM;AAAA,QACN,MAAM,8CAAC,8BAAM,WAAU,YAAW;AAAA,QAClC,OAAO;AAAA,QACP,UAAU;AAAA;AAAA,IACZ;AAAA,KAEJ,GACF;AAEJ;AAOA,SAAS,mBAAmB,EAAE,OAAO,SAAS,SAAS,GAA4B;AACjF,SACE,+CAAC,SACC;AAAA,mDAAC,SAAI,WAAU,sHACb;AAAA,oDAAC,UAAM,iBAAM;AAAA,MACZ;AAAA,OACH;AAAA,IACC,YAAY,QAAQ,8CAAC,SAAI,WAAU,eAAe,UAAS;AAAA,KAC9D;AAEJ;AAIA,IAAM,iBAA6C;AAAA,EACjD,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AACR;AAEA,SAAS,cAAc,aAAyE;AAC9F,QAAM,YAAkB,eAAuB,IAAI;AACnD,QAAM,CAAC,eAAe,gBAAgB,IAAU,iBAAqB,QAAQ;AAE7E,EAAM,kBAAU,MAAM;AACpB,UAAM,WAAW,UAAU;AAC3B,QAAI,CAAC,SAAU;AAEf,UAAM,eAAe,MAAM;AACzB,YAAM,OAAO,OAAO,KAAK,WAAW;AACpC,UAAI,UAAsB;AAC1B,UAAI,cAAc;AAElB,iBAAW,OAAO,MAAM;AACtB,cAAM,KAAK,YAAY,GAAG,EAAE;AAC5B,YAAI,CAAC,GAAI;AACT,cAAM,OAAO,KAAK,IAAI,GAAG,sBAAsB,EAAE,MAAM,SAAS,sBAAsB,EAAE,GAAG;AAC3F,YAAI,OAAO,aAAa;AACtB,wBAAc;AACd,oBAAU;AAAA,QACZ;AAAA,MACF;AAEA,uBAAiB,OAAO;AAAA,IAC1B;AAEA,aAAS,iBAAiB,UAAU,cAAc,EAAE,SAAS,KAAK,CAAC;AACnE,WAAO,MAAM,SAAS,oBAAoB,UAAU,YAAY;AAAA,EAClE,GAAG,CAAC,WAAW,CAAC;AAEhB,SAAO,EAAE,WAAW,cAAc;AACpC;AAEA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,QAAM,WAAyB,CAAC,UAAU,UAAU,QAAQ;AAC5D,MAAI,SAAU,UAAS,KAAK,MAAM;AAClC,MAAI,WAAY,UAAS,KAAK,QAAQ;AAEtC,QAAM,cAAc,CAAC,QAAoB;AACvC,UAAM,WAAW,UAAU;AAC3B,QAAI,CAAC,SAAU;AACf,QAAI,QAAQ,UAAU;AACpB,eAAS,SAAS,EAAE,KAAK,GAAG,UAAU,SAAS,CAAC;AAChD;AAAA,IACF;AACA,UAAM,KAAK,YAAY,GAAG,EAAE;AAC5B,QAAI,CAAC,GAAI;AACT,UAAM,MAAM,GAAG,YAAY,SAAS;AACpC,aAAS,SAAS,EAAE,KAAK,UAAU,SAAS,CAAC;AAAA,EAC/C;AAEA,SACE,8CAAC,SAAI,WAAU,2EACZ,mBAAS,IAAI,CAAC,QACb;AAAA,IAAC;AAAA;AAAA,MAEC,MAAK;AAAA,MACL,WAAW;AAAA,QACT;AAAA,QACA,kBAAkB,MACd,6BACA;AAAA,MACN;AAAA,MACA,SAAS,MAAM,YAAY,GAAG;AAAA,MAE7B,yBAAe,GAAG;AAAA;AAAA,IAVd;AAAA,EAWP,CACD,GACH;AAEJ;AAyEO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA8B;AAC5B,QAAM,CAAC,QAAQ,SAAS,IAAU,iBAAS,KAAK;AAChD,QAAM,CAAC,WAAW,YAAY,IAAU,iBAAS,KAAK;AACtD,QAAM,CAAC,YAAY,aAAa,IAAU,iBAAkD,MAAM;AAClG,QAAM,iBACJ,cAAc,mBAAmB,mBACjC,cAAc,mBAAmB,kBACjC,cAAc,mBAAmB,iBAC7B,aAAa,iBACb;AACN,QAAM,oBAAoB,mBAAmB;AAE7C,QAAM,aAAa,YAAY;AAC7B,UAAM,UAAU,MAAM,cAAc;AACpC,QAAI,SAAS;AACX,mBAAa,KAAK;AAClB,gBAAU,IAAI;AACd,iBAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AACvC;AAAA,IACF;AACA,cAAU,KAAK;AACf,iBAAa,IAAI;AACjB,eAAW,MAAM,aAAa,KAAK,GAAG,GAAI;AAAA,EAC5C;AAEA,QAAM,oBAAoB,YAAY;AACpC,QAAI,eAAe,UAAW;AAC9B,kBAAc,SAAS;AACvB,UAAM,UAAU,MAAM,cAAc;AACpC,QAAI,SAAS;AACX,oBAAc,MAAM;AACpB,iBAAW,MAAM,cAAc,MAAM,GAAG,GAAI;AAAA,IAC9C,OAAO;AACL,oBAAc,SAAS;AACvB,iBAAW,MAAM,cAAc,MAAM,GAAG,GAAI;AAAA,IAC9C;AAAA,EACF;AAEA,QAAM,oBAAoB,OAAO,KAAK,aAAa,EAAE,SAAS;AAC9D,QAAM,cAAc,wBAAwB;AAE5C,QAAM,cAAc;AAAA,IAClB,QAAc,eAAuB,IAAI;AAAA,IACzC,QAAc,eAAuB,IAAI;AAAA,IACzC,QAAc,eAAuB,IAAI;AAAA,IACzC,QAAc,eAAuB,IAAI;AAAA,IACzC,MAAY,eAAuB,IAAI;AAAA,EACzC;AACA,QAAM,EAAE,WAAW,cAAc,IAAI,cAAc,WAAW;AAE9D,SACE,8CAAC,mBAAgB,eAAe,KAChC;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,oBAAiB;AAAA,MACjB,WAAW;AAAA,QACT;AAAA,QACA,cAAc;AAAA,QACd;AAAA,MACF;AAAA,MACA,OAAO,EAAE,OAAO,aAAa,GAAG,MAAM;AAAA,MAEtC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,eAAe;AAAA,YACjB;AAAA,YACA,eAAe;AAAA,YACf,eAAe;AAAA,YACf,aAAa;AAAA,YAEb;AAAA,6DAAC,SAAI,WAAU,kBACb;AAAA,+DAAC,UAAK,WAAU,uCAAsC;AAAA;AAAA,kBAC/C,YAAY;AAAA,kBAAQ;AAAA,mBAC3B;AAAA,gBACC,YAAY,MACX,+CAAC,UAAK,WAAU,wCAAuC;AAAA;AAAA,kBAAE,YAAY;AAAA,mBAAG;AAAA,iBAE5E;AAAA,cACA,+CAAC,SAAI,WAAU,oCACZ;AAAA,kCACC,8CAAC,OAAI,OAAM,iBACT;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,SAAS;AAAA,oBACT,UAAU,CAAC,YAAY;AAAA,oBACvB,WAAU;AAAA,oBAEV,wDAAC,kCAAU,WAAU,YAAW;AAAA;AAAA,gBAClC,GACF;AAAA,gBAED,iBACC,8CAAC,OAAI,OAAM,gBACT;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,SAAS;AAAA,oBACT,UAAU,CAAC,YAAY;AAAA,oBACvB,WAAU;AAAA,oBAEV,wDAAC,oCAAY,WAAU,YAAW;AAAA;AAAA,gBACpC,GACF;AAAA,gBAED,WACC,gFACE;AAAA,gEAAC,SAAI,WAAU,6BAA4B;AAAA,kBAC3C,8CAAC,UAAO,SAAQ,SAAQ,MAAK,QAAO,WAAU,UAAS,SAAS,SAC9D,wDAAC,0BAAE,WAAU,YAAW,GAC1B;AAAA,mBACF;AAAA,iBAEJ;AAAA;AAAA;AAAA,QACF;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,YAAY,CAAC,CAAC;AAAA,YACd,UAAU,YAAY,iBAAiB,CAAC,CAAC;AAAA,YACzC;AAAA;AAAA,QACF;AAAA,QAEA,+CAAC,SAAI,WAAU,4DAA2D,KAAK,WAC7E;AAAA,wDAAC,sBAAmB,OAAM,UAAS,SACjC,8CAAC,OAAI,OAAO,YAAY,kBAAkB,0BAA0B,sBAClE;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS;AAAA,cAER,sBAAY,kBAAkB,8CAAC,8BAAM,WAAU,YAAW,IAAK,8CAAC,6BAAK,WAAU,YAAW;AAAA;AAAA,UAC7F,GACF,GAEA,yDAAC,SAAI,WAAU,aAAY,KAAK,YAAY,QACzC;AAAA,wBAAY,mBACX,+CAAC,SACC;AAAA,4DAAC,SAAI,WAAU,kDAAiD,kBAAI;AAAA,cACpE,+CAAC,SAAI,WAAU,0BACb;AAAA,+DAAC,SAAI,WAAU,aACb;AAAA,iEAAC,SAAI,WAAU,8CACb;AAAA,kEAAC,OAAI,OAAM,OACT;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,WAAW;AAAA,0BACT;AAAA,0BACA,aAAa,kBAAkB,QAC3B,0CACA;AAAA,wBACN;AAAA,wBACA,SAAS,MAAM,aAAa,iBAAiB,KAAK;AAAA,wBAElD,wDAAC,mCAAW,WAAU,YAAW;AAAA;AAAA,oBACnC,GACF;AAAA,oBACA,8CAAC,OAAI,OAAM,UACT;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,WAAW;AAAA,0BACT;AAAA,0BACA,aAAa,kBAAkB,WAC3B,0CACA;AAAA,wBACN;AAAA,wBACA,SAAS,MAAM,aAAa,iBAAiB,QAAQ;AAAA,wBAErD,wDAAC,kCAAU,WAAU,YAAW;AAAA;AAAA,oBAClC,GACF;AAAA,qBACF;AAAA,kBAEA,+CAAC,SAAI,WAAU,8EACb;AAAA,mEAAC,UAAK,WAAU,yCACd;AAAA,oEAAC,uCAAe,WAAU,2CAA0C;AAAA,sBACnE,oBACC,8CAAC,UAAK,WAAU,mBAAmB,4BAAkB,cAAc,GAAE,IAErE;AAAA,wBAAC;AAAA;AAAA,0BACC,OAAO,gBAAgB,IAAI;AAAA,0BAC3B,eAAe,CAAC,iBAAiB;AAC/B,kCAAM,OAAO,gBAAgB,IAAI,SAAS,QAAQ,gBAAgB,IAAI,SAAS,KAAK,OAAO,gBAAgB,IAAI;AAC/G,4CAAgB,OAAO;AAAA,8BACrB;AAAA,8BACA;AAAA,8BACA,KAAK,GAAG,YAAY,GAAG,IAAI;AAAA,4BAC7B,CAAC;AAAA,0BACH;AAAA;AAAA,sBACF;AAAA,uBAEJ;AAAA,oBACA,+CAAC,UAAO,OAAO,gBAAgB,eAAe,CAAC,QAAQ;AACrD,0BAAI,IAAK,cAAa,kBAAkB,QAAQ,UAAU,eAAe,GAAG;AAAA,oBAC9E,GACE;AAAA,oEAAC,iBAAc,WAAU,yGACvB,wDAAC,uCAAe,WAAU,kCAAiC,GAC7D;AAAA,sBACA,8CAAC,gBACC,wDAAC,oBAAiB,MAAK,UAAS,YAAY,GAAG,sBAAsB,OAAO,WAAU,aACpF,wDAAC,eAAY,WAAU,wKACpB,2BAAiB,IAAI,CAAC,SACrB,+CAAC,cAAsB,OAAO,MAAM,WAAU,qJAC5C;AAAA,sEAAC,uBAAoB,WAAU,sDAC7B,wDAAC,8BAAM,WAAU,YAAW,GAC9B;AAAA,wBACA,8CAAC,kBAAgB,4BAAkB,IAAI,GAAE;AAAA,2BAJ1B,IAKjB,CACD,GACH,GACF,GACF;AAAA,uBACF;AAAA,qBACF;AAAA,mBACF;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,gBAAgB,aAAa;AAAA,oBAC7B,YAAY,aAAa;AAAA,oBACzB,UAAU,CAAC,SAAS,UAAU;AAC5B,mCAAa,kBAAkB,OAAO;AACtC,mCAAa,cAAc,KAAK;AAAA,oBAClC;AAAA;AAAA,gBACF;AAAA,iBACF;AAAA,eACF;AAAA,YAGD,kBACC,+CAAC,SACC;AAAA,4DAAC,SAAI,WAAU,kDAAiD,oBAAM;AAAA,cACtE;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO,eAAe;AAAA,kBACtB,QAAQ,eAAe;AAAA,kBACvB,eAAe,CAAC,UAAU,eAAe,SAAS,KAAK;AAAA,kBACvD,gBAAgB,CAAC,UAAU,eAAe,UAAU,KAAK;AAAA;AAAA,cAC3D;AAAA,eACF;AAAA,YAGF,+CAAC,SACC;AAAA,4DAAC,SAAI,WAAU,kDAAiD,qBAAO;AAAA,cACvE;AAAA,gBAAC;AAAA;AAAA,kBACC,QAAQ;AAAA,oBACN,KAAK,gBAAgB;AAAA,oBACrB,OAAO,gBAAgB;AAAA,oBACvB,QAAQ,gBAAgB;AAAA,oBACxB,MAAM,gBAAgB;AAAA,kBACxB;AAAA,kBACA,UAAU;AAAA;AAAA,cACZ;AAAA,eACF;AAAA,YAEA,+CAAC,SACC;AAAA,4DAAC,SAAI,WAAU,kDAAiD,oBAAM;AAAA,cACtE;AAAA,gBAAC;AAAA;AAAA,kBACC,QAAQ;AAAA,oBACN,KAAK,gBAAgB;AAAA,oBACrB,OAAO,gBAAgB;AAAA,oBACvB,QAAQ,gBAAgB;AAAA,oBACxB,MAAM,gBAAgB;AAAA,kBACxB;AAAA,kBACA,UAAU;AAAA;AAAA,cACZ;AAAA,eACF;AAAA,aACF,GACF;AAAA,UAEA,8CAAC,SAAI,KAAK,YAAY,QACpB,wDAAC,sBAAmB,OAAM,UACxB;AAAA,YAAC;AAAA;AAAA,cACC,QAAQ;AAAA,gBACN,SAAS,qBAAqB;AAAA,gBAC9B,UAAU,qBAAqB;AAAA,gBAC/B,aAAa,qBAAqB;AAAA,gBAClC,YAAY,qBAAqB;AAAA,cACnC;AAAA,cACA,UAAU;AAAA;AAAA,UACZ,GACF,GACF;AAAA,UAEA,8CAAC,SAAI,KAAK,YAAY,QACpB;AAAA,YAAC;AAAA;AAAA,cACC,QAAQ;AAAA,cACR,aAAa,eAAe;AAAA,cAC5B,cAAc,eAAe;AAAA,cAC7B,UAAU;AAAA,cACV,eAAe;AAAA,cACf,qBAAqB,CAAC,UAAU,cAAc,eAAe,KAAK;AAAA,cAClE,sBAAsB,CAAC,UAAU,cAAc,gBAAgB,KAAK;AAAA,cACpE;AAAA,cACA;AAAA;AAAA,UACF,GACF;AAAA,UAEC,YAAY,iBAAiB,sBAC5B,8CAAC,SAAI,KAAK,YAAY,MACpB,wDAAC,sBAAmB,OAAM,QACxB;AAAA,YAAC;AAAA;AAAA,cACC,YAAY;AAAA,cACZ,UAAU;AAAA;AAAA,UACZ,GACF,GACF;AAAA,UAGD,iBACC,8CAAC,SAAI,KAAK,YAAY,QACpB,wDAAC,sBAAmB,OAAM,oBACxB;AAAA,YAAC;AAAA;AAAA,cACC,iBAAiB,cAAc;AAAA,cAC/B,WAAW,cAAc;AAAA,cACzB,aAAa,cAAc;AAAA,cAC3B,cAAc,cAAc;AAAA,cAC5B,oBAAoB,CAAC,UAAU,cAAc,mBAAmB,KAAK;AAAA,cACrE,cAAc,CAAC,UAAU,cAAc,SAAS,KAAK;AAAA,cACrD,qBAAqB,CAAC,UAAU,cAAc,eAAe,KAAK;AAAA,cAClE,sBAAsB,CAAC,UAAU,cAAc,gBAAgB,KAAK;AAAA,cACpE,gBAAgB,YAAY;AAAA,cAC5B,qBAAqB,cAAc,gBAAgB,QAAQ;AAAA,cAC3D,iBAAiB;AAAA,cACjB,kBAAkB,cAAc,aAAa,QAAQ;AAAA;AAAA,UACvD,GACF,GACF;AAAA,WAEJ;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,eAAe;AAAA,YACjB;AAAA,YACA,eAAe;AAAA,YACf,eAAe;AAAA,YACf,aAAa;AAAA,YAEb;AAAA,4DAAC,SAAI,WAAU,UAAS;AAAA,cACxB,8CAAC,OAAI,OAAM,cACT;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAS;AAAA,kBACT,WAAU;AAAA,kBAET,sBACC,8CAAC,0BAAE,WAAU,yBAAwB,IACnC,SACF,8CAAC,8BAAM,WAAU,2BAA0B,IAE3C,8CAAC,6BAAK,WAAU,YAAW;AAAA;AAAA,cAE/B,GACF;AAAA,cACA,8CAAC,OAAI,OAAM,2BACT;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAS;AAAA,kBACT,UAAU,CAAC,qBAAqB,eAAe;AAAA,kBAC/C,WAAU;AAAA,kBAET,yBAAe,YACd,8CAAC,0BAAE,WAAU,yBAAwB,IACnC,eAAe,SACjB,8CAAC,8BAAM,WAAU,2BAA0B,IACzC,eAAe,YACjB,8CAAC,6BAAK,WAAU,0BAAyB,IAEzC,8CAAC,6BAAK,WAAU,YAAW;AAAA;AAAA,cAE/B,GACF;AAAA;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF,GACA;AAEJ;AAEA,SAAS,yBAAyB;AAChC,QAAM,YAAY,mBAAmB;AACrC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAAC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,oBAAAC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,cAAc;AAElB,QAAM,CAAC,UAAU,WAAW,IAAU,iBAAmB,kBAAkB;AAC3E,QAAM,CAAC,YAAY,aAAa,IAAU,iBAAS,KAAK;AACxD,QAAM,CAAC,YAAY,aAAa,IAAU,iBAAmB,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AAC3E,QAAM,CAAC,gBAAgB,iBAAiB,IAAU,iBAGxC,IAAI;AACd,QAAM,WAAiB,eAAuB,IAAI;AAElD,QAAM,oBAAoB,CAAC,MAA0B;AACnD,QAAI,CAAC,SAAS,QAAS;AAEvB,UAAM,OAAO,SAAS,QAAQ,sBAAsB;AACpD,kBAAc;AAAA,MACZ,GAAG,EAAE,UAAU,KAAK;AAAA,MACpB,GAAG,EAAE,UAAU,KAAK;AAAA,IACtB,CAAC;AACD,kBAAc,IAAI;AACjB,IAAC,EAAE,OAAuB,kBAAkB,EAAE,SAAS;AAAA,EAC1D;AAEA,QAAM,oBAAoB,CAAC,MAA0B;AACnD,QAAI,CAAC,WAAY;AAEjB,UAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,aAAa,aAAa,EAAE,UAAU,WAAW,CAAC,CAAC;AAC5F,UAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,cAAc,cAAc,EAAE,UAAU,WAAW,CAAC,CAAC;AAE9F,gBAAY,EAAE,GAAG,MAAM,GAAG,KAAK,CAAC;AAAA,EAClC;AAEA,QAAM,kBAAkB,CAAC,MAA0B;AACjD,QAAI,CAAC,WAAY;AAEjB,kBAAc,KAAK;AAClB,IAAC,EAAE,OAAuB,sBAAsB,EAAE,SAAS;AAE5D,QAAI;AAAE,mBAAa,QAAQF,cAAa,KAAK,UAAU,QAAQ,CAAC;AAAA,IAAE,QAAQ;AAAA,IAAC;AAAA,EAC7E;AAEA,EAAM,kBAAU,MAAM;AACpB,aAAS,eAAe;AACtB,kBAAY,CAAC,UAAU;AAAA,QACrB,GAAG,KAAK,IAAI,KAAK,GAAG,OAAO,aAAa,cAAc,EAAE;AAAA,QACxD,GAAG,KAAK,IAAI,KAAK,GAAG,OAAO,cAAc,eAAe,EAAE;AAAA,MAC5D,EAAE;AAAA,IACJ;AAEA,WAAO,iBAAiB,UAAU,YAAY;AAC9C,WAAO,MAAM,OAAO,oBAAoB,UAAU,YAAY;AAAA,EAChE,GAAG,CAAC,CAAC;AAEL,QAAM,EAAE,UAAU,mBAAmB,gBAAgB,cAAc,cAAc,IAAI;AAAA,IACnF,SAAS,kBAAkB;AAAA,EAC7B;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,QAAQ;AAAA,IACV,gBAAgB;AAAA,EAClB,CAAC;AAED,QAAM,UAAU,kBAAkB,gBAAY;AAAA,IAC5C,gFACE;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,oBAAiB;AAAA,UACjB,WAAW,GAAG,wCAAwC;AAAA,UACtD,OAAO,EAAE,eAAe,qBAAqB,SAAS,OAAO;AAAA,UAC7D,eAAe,CAAC,MAAM;AACpB,cAAE,eAAe;AACjB,gBAAI,eAAe,SAAU;AAC7B,kBAAM,eAAe,gCAAgC,EAAE,SAAS,EAAE,OAAO;AACzE,gBAAI,gBAAgB,iBAAiB,SAAS,QAAQ,iBAAiB,SAAS,iBAAiB;AAC/F,oBAAM,WAAW,qBAAqB,cAAc,eAAe;AACnE,kBAAI,cAAc,QAAQ,GAAG;AAC3B,oBAAI,oBAAoB,SAAU,eAAc,QAAQ;AACxD,iCAAiB,QAAQ;AAAA,cAC3B;AAAA,YACF;AAAA,UACF;AAAA,UACA,aAAa,CAAC,MAAM;AAClB,kBAAM,eAAe,gCAAgC,EAAE,SAAS,EAAE,OAAO;AACzE,8BAAkB,sBAAsB,cAAc,eAAe,CAAC;AAAA,UACxE;AAAA,UACA,cAAc,MAAM,kBAAkB,IAAI;AAAA,UAC1C,SAAS,CAAC,MAAM;AACd,cAAE,eAAe;AACjB,8BAAkB,IAAI;AACtB,gBAAI,iBAAiB;AAAE,iCAAmB,IAAI;AAAG;AAAA,YAAO;AACxD,kBAAM,eAAe,gCAAgC,EAAE,SAAS,EAAE,OAAO;AACzE,gBAAI,gBAAgB,iBAAiB,SAAS,QAAQ,iBAAiB,SAAS,iBAAiB;AAC/F,oBAAM,WAAW,qBAAqB,cAAc,eAAe;AACnE,kBAAI,eAAe,UAAW,YAAW,UAAU,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ,CAAC;AAAA,kBAC5E,eAAc,QAAQ;AAAA,YAC7B;AAAA,UACF;AAAA;AAAA,MACF;AAAA,MACC,mBAAmB,MAAM;AACxB,cAAM,KAAK,eAAe,cAAc,sBAAsB;AAC9D,eACE;AAAA,UAAC;AAAA;AAAA,YACC,oBAAiB;AAAA,YACjB,WAAU;AAAA,YACV,OAAM;AAAA,YACN,QAAO;AAAA,YACP,OAAO,EAAE,OAAO,SAAS,QAAQ,QAAQ;AAAA,YAEzC;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,GAAG,GAAG;AAAA,kBACN,GAAG,GAAG;AAAA,kBACN,OAAO,GAAG;AAAA,kBACV,QAAQ,GAAG;AAAA,kBACX,MAAK;AAAA,kBACL,QAAO;AAAA,kBACP,aAAa;AAAA;AAAA,cACf;AAAA,cACC,eAAe,SAAS,IAAI,CAAC,OAAO,MAAM;AACzC,sBAAM,IAAI,MAAM,sBAAsB;AACtC,uBACE;AAAA,kBAAC;AAAA;AAAA,oBAEC,GAAG,EAAE;AAAA,oBACL,GAAG,EAAE;AAAA,oBACL,OAAO,EAAE;AAAA,oBACT,QAAQ,EAAE;AAAA,oBACV,MAAK;AAAA,oBACL,QAAO;AAAA,oBACP,aAAa;AAAA,oBACb,iBAAgB;AAAA;AAAA,kBARX;AAAA,gBASP;AAAA,cAEJ,CAAC;AAAA;AAAA;AAAA,QACH;AAAA,MAEJ,GAAG;AAAA,OACL;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,iBAAiB,kBAAkB,SAAS,SAAS,KAAK,gBAAY;AAAA,IAC1E;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,oBAAoB;AAAA,QACpB,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,UAAU;AAAA,QACV,eAAeE;AAAA;AAAA,IACjB;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,MAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,eAAe,CAAC,wBAAwB,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,UAAW,QAAO,gFAAG;AAAA;AAAA,IAAS;AAAA,KAAe;AAE1N,QAAM,kBAAkB,CAAC,MAA0B;AACjD,QAAI,iBAAiB;AACnB,gBAAU,GAAG,eAAe;AAAA,IAC9B;AAAA,EACF;AAEA,aAAO;AAAA,IACL,gFACG;AAAA;AAAA,MACA;AAAA,MAEA,mBACC;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,YAAY,UAAU;AAAA,UACtB,eAAe,UAAU;AAAA,UACzB,aAAa;AAAA,UACb,eAAe,QAAQ,kBAAkB;AAAA,UACzC,eAAe,CAAC,SAAS,YAAY;AACnC,gBAAI,CAAC,gBAAiB;AACtB,gBAAI,cAAc,eAAe,GAAG;AAClC,+BAAiB,eAAe;AAChC;AAAA,YACF;AACA,kBAAM,eAAe,gCAAgC,SAAS,OAAO;AACrE,gBAAI,gBAAgB,iBAAiB,mBAAmB,gBAAgB,SAAS,YAAY,GAAG;AAC9F,oBAAM,WAAW,qBAAqB,cAAc,eAAe;AACnE,kBAAI,cAAc,QAAQ,GAAG;AAC3B,8BAAc,QAAQ;AACtB,iCAAiB,QAAQ;AAAA,cAC3B;AAAA,YACF;AAAA,UACF;AAAA,UACA,gBAAgB,CAAC,YAAY;AAC3B,8BAAkB,sBAAsB,SAAS,eAAe,CAAC;AAAA,UACnE;AAAA,UACA,gBAAgB,CAAC,SAAS,YAAY;AACpC,gBAAI,CAAC,gBAAiB;AACtB,kBAAM,eAAe,gCAAgC,SAAS,OAAO;AACrE,gBAAI,CAAC,aAAc;AACnB,gBAAI,iBAAiB,mBAAmB,gBAAgB,SAAS,YAAY,GAAG;AAC9E,oBAAM,WAAW,qBAAqB,cAAc,eAAe;AACnE,4BAAc,QAAQ;AACtB;AAAA,YACF;AACA,kBAAM,QAAQ,iBAAiB,iBAAiB,SAAS,OAAO;AAChE,gBAAI,OAAO;AACT,4BAAc,KAAK;AAAA,YACrB;AAAA,UACF;AAAA;AAAA,MACF;AAAA,MAGD,UAAU,cACT,8CAAC,eAAY,eAA8B;AAAA,MAG5C,qBAAqB,mBACpB;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA,cAAc;AAAA,YACZ,GAAG;AAAA,YACH,GAAG,+BAA+B,iBAAiB,oBAAoB,GAAG,aAAa;AAAA,UACzF;AAAA;AAAA,MACF;AAAA,MAGF;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT,gBAAgB;AAAA,UAChB,eAAe;AAAA,UACf,iBAAiB;AAAA,UACjB,sBAAsB;AAAA,UACtB,gBAAgB;AAAA,UAChB,qBAAqB;AAAA,UACrB,UAAU;AAAA,UACV,cAAc;AAAA,UACd,cAAc;AAAA,UACd,gBAAgB;AAAA,UAChB,eAAe;AAAA,UACf,oBAAoB;AAAA,UACpB,SAAS;AAAA,UACT,eAAe;AAAA,UACf,eAAeD;AAAA,UACf,WAAU;AAAA,UACV,OAAO;AAAA,YACL,MAAM,SAAS;AAAA,YACf,KAAK,SAAS;AAAA,YACd,WAAW;AAAA,YACX,eAAe;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA,qBAAqB;AAAA,UACrB,qBAAqB;AAAA,UACrB,mBAAmB;AAAA;AAAA,MACrB;AAAA,OACF;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,kBAAkB;AAChC,QAAM,CAAC,SAAS,UAAU,IAAU,iBAAS,KAAK;AAElD,EAAM,kBAAU,MAAM;AACpB,eAAW,IAAI;AAAA,EACjB,GAAG,CAAC,CAAC;AAEL,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,SAAO,8CAAC,0BAAuB;AACjC;;;AetiFA,IAAAE,UAAuB;AACvB,IAAAC,oBAA6B;;;ACD7B,IAAAC,UAAuB;AACvB,IAAAC,oBAA6B;AAoHvB,IAAAC,uBAAA;AA9GN,IAAMC,cAAa;AACnB,IAAM,kBAAkB;AACxB,IAAM,WAAW;AAEjB,SAAS,iBAAiB;AACxB,QAAM,CAAC,MAAM,OAAO,IAAU,iBAAS,KAAK;AAE5C,EAAM,kBAAU,MAAM;AACpB,UAAM,KAAK,OAAO,WAAW,8BAA8B;AAC3D,YAAQ,GAAG,OAAO;AAClB,UAAM,UAAU,CAAC,MAA2B,QAAQ,EAAE,OAAO;AAC7D,OAAG,iBAAiB,UAAU,OAAO;AACrC,WAAO,MAAM,GAAG,oBAAoB,UAAU,OAAO;AAAA,EACvD,GAAG,CAAC,CAAC;AAEL,SAAO,OACH;AAAA,IACE,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,EACT,IACA;AAAA,IACE,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AACN;AAEA,IAAM,YAAiC;AAAA,EACrC,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,oBAAoB;AACtB;AAIA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AACF,GAGG;AACD,QAAM,YAAkB,eAA0B,IAAI;AACtD,QAAM,gBAAgB,iBAAiB;AACvC,QAAM,SAAS,eAAe;AAE9B,EAAM,kBAAU,MAAM;AACpB,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,OAAQ;AACb,UAAM,MAAM,OAAO,oBAAoB;AACvC,UAAM,QAAQ,KAAK,IAAI,GAAG,gBAAgBA,WAAU;AACpD,UAAM,SAASA;AAEf,WAAO,QAAQ,QAAQ;AACvB,WAAO,SAAS,SAAS;AACzB,WAAO,MAAM,QAAQ,GAAG,KAAK;AAC7B,WAAO,MAAM,SAAS,GAAG,MAAM;AAE/B,QAAI,UAAU,EAAG;AAEjB,UAAM,MAAM,OAAO,WAAW,IAAI;AAClC,QAAI,CAAC,IAAK;AACV,QAAI,MAAM,KAAK,GAAG;AAClB,QAAI,UAAU,GAAG,GAAG,OAAO,MAAM;AAEjC,UAAM,UAAU,KAAK,MAAM,aAAa,IAAI,EAAE,IAAI;AAClD,UAAM,QAAQ,aAAa,IAAI;AAE/B,aAAS,KAAK,SAAS,MAAM,OAAO,MAAM,IAAI;AAC5C,YAAM,IAAI,KAAK,aAAa;AAC5B,YAAM,UAAU,KAAK,QAAQ;AAC7B,YAAM,QAAQ,KAAK,OAAO;AAE1B,UAAI,UAAU;AACd,UAAI,OAAO,GAAG,MAAM;AACpB,UAAI,OAAO,GAAG,UAAU,UAAU,KAAK,QAAQ,IAAI,EAAE;AACrD,UAAI,cAAc,OAAO;AACzB,UAAI,YAAY;AAChB,UAAI,OAAO;AAEX,UAAI,WAAW,OAAO,GAAG;AACvB,YAAI,YAAY,OAAO;AACvB,YAAI,OAAO;AACX,YAAI,YAAY;AAChB,YAAI,SAAS,OAAO,EAAE,GAAG,GAAG,CAAC;AAAA,MAC/B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,aAAa,GAAG,eAAe,MAAM,CAAC;AAE1C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,oBAAiB;AAAA,MACjB,OAAO;AAAA,QACL,UAAU;AAAA,QACV,KAAK;AAAA,QACL,MAAMA;AAAA,QACN,OAAO;AAAA,QACP,QAAQA;AAAA,QACR,YAAY,OAAO;AAAA,QACnB,cAAc,aAAa,OAAO,MAAM;AAAA,QACxC,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,eAAe;AAAA,QACf,UAAU;AAAA,MACZ;AAAA,MACA;AAAA,MAEA,wDAAC,YAAO,KAAK,WAAW,OAAO,EAAE,SAAS,QAAQ,GAAG;AAAA;AAAA,EACvD;AAEJ;AAIA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AACF,GAGG;AACD,QAAM,YAAkB,eAA0B,IAAI;AACtD,QAAM,iBAAiB,kBAAkB;AACzC,QAAM,SAAS,eAAe;AAE9B,EAAM,kBAAU,MAAM;AACpB,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,OAAQ;AACb,UAAM,MAAM,OAAO,oBAAoB;AACvC,UAAM,QAAQA;AACd,UAAM,SAAS,KAAK,IAAI,GAAG,iBAAiBA,WAAU;AAEtD,WAAO,QAAQ,QAAQ;AACvB,WAAO,SAAS,SAAS;AACzB,WAAO,MAAM,QAAQ,GAAG,KAAK;AAC7B,WAAO,MAAM,SAAS,GAAG,MAAM;AAE/B,QAAI,WAAW,EAAG;AAElB,UAAM,MAAM,OAAO,WAAW,IAAI;AAClC,QAAI,CAAC,IAAK;AACV,QAAI,MAAM,KAAK,GAAG;AAClB,QAAI,UAAU,GAAG,GAAG,OAAO,MAAM;AAEjC,UAAM,UAAU,KAAK,MAAM,aAAa,IAAI,EAAE,IAAI;AAClD,UAAM,QAAQ,aAAa,IAAI;AAE/B,aAAS,KAAK,SAAS,MAAM,OAAO,MAAM,IAAI;AAC5C,YAAM,IAAI,KAAK,aAAa;AAC5B,YAAM,UAAU,KAAK,QAAQ;AAC7B,YAAM,QAAQ,KAAK,OAAO;AAE1B,UAAI,UAAU;AACd,UAAI,OAAO,OAAO,CAAC;AACnB,UAAI,OAAO,SAAS,UAAU,KAAK,QAAQ,IAAI,IAAI,CAAC;AACpD,UAAI,cAAc,OAAO;AACzB,UAAI,YAAY;AAChB,UAAI,OAAO;AAEX,UAAI,WAAW,OAAO,GAAG;AACvB,YAAI,KAAK;AACT,YAAI,YAAY,OAAO;AACvB,YAAI,OAAO;AACX,YAAI,YAAY;AAChB,YAAI,UAAU,GAAG,CAAC;AAClB,YAAI,OAAO,CAAC,KAAK,KAAK,CAAC;AACvB,YAAI,SAAS,OAAO,EAAE,GAAG,GAAG,CAAC;AAC7B,YAAI,QAAQ;AAAA,MACd;AAAA,IACF;AAAA,EACF,GAAG,CAAC,aAAa,GAAG,gBAAgB,MAAM,CAAC;AAE3C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,oBAAiB;AAAA,MACjB,OAAO;AAAA,QACL,UAAU;AAAA,QACV,KAAKA;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,OAAOA;AAAA,QACP,YAAY,OAAO;AAAA,QACnB,aAAa,aAAa,OAAO,MAAM;AAAA,QACvC,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,eAAe;AAAA,QACf,UAAU;AAAA,MACZ;AAAA,MACA;AAAA,MAEA,wDAAC,YAAO,KAAK,WAAW,OAAO,EAAE,SAAS,QAAQ,GAAG;AAAA;AAAA,EACvD;AAEJ;AAIA,SAAS,eAAe;AACtB,QAAM,SAAS,eAAe;AAC9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,oBAAiB;AAAA,MACjB,OAAO;AAAA,QACL,UAAU;AAAA,QACV,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAOA;AAAA,QACP,QAAQA;AAAA,QACR,YAAY,OAAO;AAAA,QACnB,aAAa,aAAa,OAAO,MAAM;AAAA,QACvC,cAAc,aAAa,OAAO,MAAM;AAAA,QACxC,QAAQ;AAAA,QACR,eAAe;AAAA,MACjB;AAAA;AAAA,EACF;AAEJ;AAIA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,QAAM,eAAe,UAAU,gBAAgB;AAC/C,QAAM,YAAY,eAAe,aAAa,IAAI,aAAa;AAC/D,QAAM,cAAc,UAAU,WAAW;AAEzC,QAAM,oBAAoB,CAAC,MAA0B;AACnD,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAClB,gBAAY,UAAU,EAAE;AAAA,EAC1B;AAEA,QAAM,oBAAoB,CAAC,MAAwB;AACjD,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAClB,aAAS,UAAU,EAAE;AAAA,EACvB;AAEA,QAAM,aAAa,YAAY,iBAAiB,OAAO,eAAe;AAEtE,MAAI,cAAc;AAChB,WACE,gFAEE;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,oBAAiB;AAAA,UACjB,OAAO;AAAA,YACL,UAAU;AAAA,YACV,KAAK;AAAA,YACL,MAAM;AAAA,YACN,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,eAAe;AAAA,UACjB;AAAA;AAAA,MACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,UAAU;AAAA,YACV,KAAK,aAAa,KAAK,MAAM,WAAW,CAAC;AAAA,YACzC,MAAMA;AAAA,YACN,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,eAAe;AAAA,UACjB;AAAA,UACA,eAAe;AAAA,UACf,eAAe;AAAA;AAAA,MACjB;AAAA,MAEC,YACC;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,UAAU;AAAA,YACV,KAAK,aAAa;AAAA,YAClB,MAAMA,cAAa;AAAA,YACnB,YAAY;AAAA,YACZ,OAAO;AAAA,YACP,SAAS;AAAA,YACT,cAAc;AAAA,YACd,QAAQ;AAAA,YACR,eAAe;AAAA,YACf,GAAG;AAAA,UACL;AAAA,UAEC,eAAK,MAAM,UAAU,QAAQ;AAAA;AAAA,MAChC;AAAA,OAEJ;AAAA,EAEJ;AAGA,SACE,gFACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,oBAAiB;AAAA,QACjB,OAAO;AAAA,UACL,UAAU;AAAA,UACV,MAAM;AAAA,UACN,KAAK;AAAA,UACL,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,eAAe;AAAA,QACjB;AAAA;AAAA,IACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,MAAM,aAAa,KAAK,MAAM,WAAW,CAAC;AAAA,UAC1C,KAAKA;AAAA,UACL,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,eAAe;AAAA,QACjB;AAAA,QACA,eAAe;AAAA,QACf,eAAe;AAAA;AAAA,IACjB;AAAA,IACC,YACC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,MAAM,aAAa;AAAA,UACnB,KAAKA,cAAa;AAAA,UAClB,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,SAAS;AAAA,UACT,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,eAAe;AAAA,UACf,GAAG;AAAA,QACL;AAAA,QAEC,eAAK,MAAM,UAAU,QAAQ;AAAA;AAAA,IAChC;AAAA,KAEJ;AAEJ;AAIA,SAAS,mBAAmB;AAC1B,QAAM,CAAC,OAAO,QAAQ,IAAU,iBAAS,CAAC;AAC1C,EAAM,kBAAU,MAAM;AACpB,aAAS,OAAO,UAAU;AAC1B,UAAM,WAAW,MAAM,SAAS,OAAO,UAAU;AACjD,WAAO,iBAAiB,UAAU,QAAQ;AAC1C,WAAO,MAAM,OAAO,oBAAoB,UAAU,QAAQ;AAAA,EAC5D,GAAG,CAAC,CAAC;AACL,SAAO;AACT;AAEA,SAAS,oBAAoB;AAC3B,QAAM,CAAC,QAAQ,SAAS,IAAU,iBAAS,CAAC;AAC5C,EAAM,kBAAU,MAAM;AACpB,cAAU,OAAO,WAAW;AAC5B,UAAM,WAAW,MAAM,UAAU,OAAO,WAAW;AACnD,WAAO,iBAAiB,UAAU,QAAQ;AAC1C,WAAO,MAAM,OAAO,oBAAoB,UAAU,QAAQ;AAAA,EAC5D,GAAG,CAAC,CAAC;AACL,SAAO;AACT;AAIO,SAAS,cAAc,EAAE,QAAQ,GAAyB;AAC/D,QAAM,YAAY,mBAAmB;AAErC,QAAM,cAAoB,gBAAQ,MAAM;AACtC,QAAI,CAAC,UAAW,QAAO;AACvB,UAAM,OAAO,UAAU,YAAY;AACnC,QAAI,gBAAgB,WAAY,QAAO,KAAK;AAC5C,WAAO;AAAA,EACT,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,cAAc,SAAS,WAAW;AAEtC,MAAI,CAAC,WAAW,CAAC,UAAW,QAAO;AAEnC,QAAM,8BAA8B,CAAC,MAA0B;AAC7D,MAAE,eAAe;AACjB,gBAAY,cAAc,EAAE,OAAO;AAAA,EACrC;AAEA,QAAM,4BAA4B,CAAC,MAA0B;AAC3D,MAAE,eAAe;AACjB,gBAAY,YAAY,EAAE,OAAO;AAAA,EACnC;AAEA,aAAO;AAAA,IACL,gFACE;AAAA,oDAAC,gBAAa;AAAA,MACd,8CAAC,mBAAgB,cAA4B,eAAe,6BAA6B;AAAA,MACzF,8CAAC,iBAAc,cAA4B,eAAe,2BAA2B;AAAA,MACpF,WAAW,IAAI,CAAC,MACf;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW;AAAA,UACX;AAAA,UACA,UAAU,iBAAiB,OAAO,EAAE;AAAA,UACpC,cAAc,iBAAiB,OAAO,EAAE,KAAK,eAAe;AAAA,UAC5D,aAAa;AAAA,UACb,UAAU;AAAA;AAAA,QANL,EAAE;AAAA,MAOT,CACD;AAAA,OACH;AAAA,IACA;AAAA,EACF;AACF;AAEA,IAAM,qBAAqB;AAC3B,IAAM,sBAAsB;AAErB,SAAS,mBAA0C;AACxD,QAAM,CAAC,SAAS,UAAU,IAAU,iBAAS,IAAI;AAEjD,EAAM,kBAAU,MAAM;AACpB,QAAI;AACF,UAAI,aAAa,QAAQ,kBAAkB,MAAM,QAAS,YAAW,KAAK;AAAA,IAC5E,QAAQ;AAAA,IAAe;AAAA,EACzB,GAAG,CAAC,CAAC;AAEL,EAAM,kBAAU,MAAM;AACpB,aAAS,QAAQ,GAAU;AACzB,iBAAY,EAA2B,MAAM;AAAA,IAC/C;AACA,WAAO,iBAAiB,qBAAqB,OAAO;AACpD,WAAO,MAAM,OAAO,oBAAoB,qBAAqB,OAAO;AAAA,EACtE,GAAG,CAAC,CAAC;AAEL,QAAM,SAAe,oBAAY,MAAM;AACrC,eAAW,CAAC,SAAS;AACnB,YAAM,OAAO,CAAC;AACd,UAAI;AAAE,qBAAa,QAAQ,oBAAoB,OAAO,IAAI,CAAC;AAAA,MAAE,QAAQ;AAAA,MAAC;AACtE,aAAO,cAAc,IAAI,YAAY,qBAAqB,EAAE,QAAQ,KAAK,CAAC,CAAC;AAC3E,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,SAAO,CAAC,SAAS,MAAM;AACzB;AAEO,SAAS,SAAS;AACvB,QAAM,EAAE,eAAe,IAAI,cAAc;AACzC,QAAM,CAAC,eAAe,YAAY,IAAI,iBAAiB;AAEvD,EAAM,kBAAU,MAAM;AACpB,QAAI,CAAC,eAAgB;AAErB,aAAS,cAAc,GAAkB;AACvC,UAAI,EAAE,YAAY,EAAE,QAAQ,OAAO,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,QAAQ;AACxE,cAAM,SAAS,SAAS;AACxB,cAAM,UAAU,kBAAkB,oBAAoB,kBAAkB,uBAAwB,kBAAkB,eAAe,OAAO;AACxI,YAAI,QAAS;AACb,UAAE,eAAe;AACjB,qBAAa;AAAA,MACf;AAAA,IACF;AAEA,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,EAClE,GAAG,CAAC,gBAAgB,YAAY,CAAC;AAEjC,SAAO,8CAAC,iBAAc,SAAS,kBAAkB,eAAe;AAClE;;;ACvfA,IAAAC,UAAuB;AAIvB,IAAMC,eAAc;AACpB,IAAM,cAAc;AACpB,IAAMC,kBAAiB;AAEvB,SAAS,iBAA6B;AACpC,MAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,MAAI;AACF,UAAM,SAAS,aAAa,QAAQD,YAAW;AAC/C,QAAI,WAAW,SAAS,WAAW,YAAY,WAAW,UAAU,WAAW,SAAS;AACtF,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AAAA,EAAC;AACT,SAAO;AACT;AAEA,SAAS,kBAAkB,MAAkB,OAAe,QAAgB;AAC1E,QAAM,KAAK,OAAO;AAClB,QAAM,KAAK,OAAO;AAElB,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,EAAE,IAAI,KAAK,SAAS,GAAG,GAAG,KAAK,SAAS,YAAY;AAAA,IAC7D,KAAK;AACH,aAAO,EAAE,IAAI,KAAK,SAAS,GAAG,GAAG,YAAY;AAAA,IAC/C,KAAK;AACH,aAAO,EAAE,GAAG,aAAa,IAAI,KAAK,UAAU,EAAE;AAAA,IAChD,KAAK;AACH,aAAO,EAAE,GAAG,KAAK,QAAQ,aAAa,IAAI,KAAK,UAAU,EAAE;AAAA,EAC/D;AACF;AAEA,SAAS,eAAe,SAAiB,SAA6B;AACpE,QAAM,KAAK,OAAO;AAClB,QAAM,KAAK,OAAO;AAElB,QAAM,YAAwC;AAAA,IAC5C,KAAK;AAAA,IACL,QAAQ,KAAK;AAAA,IACb,MAAM;AAAA,IACN,OAAO,KAAK;AAAA,EACd;AAEA,MAAI,UAAsB;AAC1B,MAAI,MAAM;AACV,aAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,SAAS,GAA6B;AAC9E,QAAI,OAAO,KAAK;AACd,YAAM;AACN,gBAAU;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAIO,SAAS,eAAe,YAAoD;AACjF,QAAM,CAAC,YAAY,aAAa,IAAU,iBAAqB,cAAc;AAC7E,QAAM,CAAC,OAAO,QAAQ,IAAU,iBAAgB,QAAQ;AACxD,QAAM,CAAC,cAAc,eAAe,IAAU,iBAA0C,IAAI;AAE5F,QAAM,gBAAsB,eAAO,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AACjD,QAAM,kBAAwB,eAAO,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AACnD,QAAM,iBAAuB,eAAO,KAAK;AACzC,QAAM,qBAA2B,eAA2B,IAAI;AAChE,QAAM,eAAqB,eAA6C,IAAI;AAG5E,QAAM,eAAqB,oBAAY,MAAM;AAC3C,UAAM,KAAK,WAAW;AACtB,QAAI,CAAC,GAAI,QAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AAC7B,UAAM,OAAO,GAAG,sBAAsB;AACtC,WAAO,kBAAkB,YAAY,KAAK,OAAO,KAAK,MAAM;AAAA,EAC9D,GAAG,CAAC,YAAY,UAAU,CAAC;AAG3B,QAAM,CAAC,WAAW,YAAY,IAAU,iBAAmC,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AACzF,QAAM,CAAC,OAAO,QAAQ,IAAU,iBAAS,KAAK;AAG9C,EAAM,kBAAU,MAAM;AACpB,UAAM,KAAK,WAAW;AACtB,QAAI,CAAC,GAAI;AAET,UAAM,MAAM,sBAAsB,MAAM;AACtC,mBAAa,aAAa,CAAC;AAC3B,eAAS,IAAI;AAAA,IACf,CAAC;AACD,WAAO,MAAM,qBAAqB,GAAG;AAAA,EACvC,GAAG,CAAC,cAAc,UAAU,CAAC;AAG7B,EAAM,kBAAU,MAAM;AACpB,UAAM,KAAK,WAAW;AACtB,QAAI,CAAC,GAAI;AAET,aAAS,SAAS;AAChB,YAAM,OAAO,GAAI,sBAAsB;AACvC,mBAAa,kBAAkB,YAAY,KAAK,OAAO,KAAK,MAAM,CAAC;AAAA,IACrE;AAEA,UAAM,KAAK,IAAI,eAAe,MAAM;AACpC,OAAG,QAAQ,EAAE;AACb,WAAO,iBAAiB,UAAU,MAAM;AAExC,WAAO,MAAM;AACX,SAAG,WAAW;AACd,aAAO,oBAAoB,UAAU,MAAM;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,YAAY,UAAU,CAAC;AAE3B,QAAM,oBAA0B,oBAAY,CAAC,MAA0B;AACrE,UAAM,KAAK,WAAW;AACtB,QAAI,CAAC,GAAI;AAET,UAAM,OAAO,GAAG,sBAAsB;AACtC,kBAAc,UAAU,EAAE,GAAG,EAAE,UAAU,KAAK,MAAM,GAAG,EAAE,UAAU,KAAK,IAAI;AAC5E,oBAAgB,UAAU,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ;AACvD,mBAAe,UAAU;AACzB,uBAAmB,UAAU,EAAE;AAC/B,uBAAmB,QAAQ,kBAAkB,EAAE,SAAS;AAAA,EAC1D,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,oBAA0B,oBAAY,CAAC,MAA0B;AACrE,QAAI,CAAC,eAAe,WAAW,UAAU,WAAY;AAErD,UAAM,KAAK,EAAE,UAAU,gBAAgB,QAAQ;AAC/C,UAAM,KAAK,EAAE,UAAU,gBAAgB,QAAQ;AAG/C,QAAI,eAAe,SAAS;AAC1B,UAAI,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE,IAAIC,gBAAgB;AACnD,UAAI,aAAa,SAAS;AACxB,qBAAa,aAAa,OAAO;AACjC,qBAAa,UAAU;AAAA,MACzB;AACA,qBAAe,UAAU;AACzB,eAAS,UAAU;AAAA,IACrB;AAEA,UAAM,OAAO,KAAK,IAAI,GAAG,EAAE,UAAU,cAAc,QAAQ,CAAC;AAC5D,UAAM,OAAO,KAAK,IAAI,GAAG,EAAE,UAAU,cAAc,QAAQ,CAAC;AAC5D,oBAAgB,EAAE,GAAG,MAAM,GAAG,KAAK,CAAC;AAAA,EACtC,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,kBAAwB,oBAAY,CAAC,MAA0B;AACnE,QAAI,mBAAmB,SAAS;AAC9B,yBAAmB,QAAQ,sBAAsB,EAAE,SAAS;AAC5D,yBAAmB,UAAU;AAAA,IAC/B;AAEA,QAAI,eAAe,SAAS;AAE1B,qBAAe,UAAU;AACzB;AAAA,IACF;AAEA,QAAI,UAAU,WAAY;AAE1B,UAAM,KAAK,WAAW;AACtB,QAAI,CAAC,IAAI;AACP,eAAS,QAAQ;AACjB,sBAAgB,IAAI;AACpB;AAAA,IACF;AAEA,UAAM,OAAO,GAAG,sBAAsB;AACtC,UAAM,UAAU,KAAK,OAAO,KAAK,QAAQ;AACzC,UAAM,UAAU,KAAK,MAAM,KAAK,SAAS;AACzC,UAAM,UAAU,eAAe,SAAS,OAAO;AAE/C,kBAAc,OAAO;AACrB,QAAI;AACF,mBAAa,QAAQD,cAAa,OAAO;AAAA,IAC3C,QAAQ;AAAA,IAAC;AAGT,UAAM,SAAS,kBAAkB,SAAS,KAAK,OAAO,KAAK,MAAM;AACjE,iBAAa,MAAM;AACnB,aAAS,UAAU;AACnB,oBAAgB,IAAI;AAGpB,QAAI,aAAa,QAAS,cAAa,aAAa,OAAO;AAC3D,iBAAa,UAAU,WAAW,MAAM;AACtC,mBAAa,UAAU;AACvB,eAAS,QAAQ;AAAA,IACnB,GAAG,GAAG;AAAA,EACR,GAAG,CAAC,OAAO,UAAU,CAAC;AAEtB,QAAM,sBAA4B,oBAAY,CAAC,MAA0B;AACvE,QAAI,mBAAmB,SAAS;AAC9B,UAAI;AACF,2BAAmB,QAAQ,sBAAsB,EAAE,SAAS;AAAA,MAC9D,QAAQ;AAAA,MAAC;AACT,yBAAmB,UAAU;AAAA,IAC/B;AACA,mBAAe,UAAU;AACzB,QAAI,UAAU,YAAY;AACxB,eAAS,QAAQ;AACjB,sBAAgB,IAAI;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAGV,EAAM,kBAAU,MAAM;AACpB,WAAO,MAAM;AACX,UAAI,aAAa,QAAS,cAAa,aAAa,OAAO;AAAA,IAC7D;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,aAAa,UAAU;AAC7B,QAAM,aAAa,UAAU;AAE7B,QAAM,QAAc,gBAAQ,MAA2B;AACrD,UAAM,OAA4B;AAAA,MAChC,UAAU;AAAA,MACV,GAAI,CAAC,SAAS,EAAE,YAAY,SAAkB;AAAA,IAChD;AAEA,QAAI,UAAU,cAAc,cAAc;AACxC,aAAO;AAAA,QACL,GAAG;AAAA,QACH,MAAM,aAAa;AAAA,QACnB,KAAK,aAAa;AAAA,QAClB,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,YAAY;AAAA,MACd;AAAA,IACF;AAEA,QAAI,UAAU,YAAY;AACxB,YAAM,OAAO;AACb,aAAO;AAAA,QACL,GAAG;AAAA,QACH,MAAM,UAAU;AAAA,QAChB,KAAK,UAAU;AAAA,QACf,YAAY,QAAQ,IAAI,SAAS,IAAI;AAAA,MACvC;AAAA,IACF;AAGA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM,UAAU;AAAA,MAChB,KAAK,UAAU;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,OAAO,cAAc,WAAW,KAAK,CAAC;AAE1C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AF/PA,IAAAE,kBAAwB;AACxB,IAAAC,uBAAsJ;AA4B7I,IAAAC,uBAAA;AAFT,SAAS,mBAAmB,OAA8D;AACxF,QAAM,YAAY,mBAAmB;AACrC,SAAO,8CAAC,wBAAQ,QAAR,EAAe,WAAuB,GAAG,OAAO;AAC1D;AAEA,SAAS,mBAAmB,OAA8D;AACxF,QAAM,YAAY,mBAAmB;AACrC,SAAO,8CAAC,wBAAQ,QAAR,EAAe,WAAuB,GAAG,OAAO;AAC1D;AAEO,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,mBAAmB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAgC;AAC9B,QAAM,YAAY,mBAAmB;AACrC,QAAM,aAAmB,eAAuB,IAAI;AACpD,QAAM,EAAE,YAAY,YAAY,YAAY,OAAO,WAAW,mBAAmB,mBAAmB,iBAAiB,oBAAoB,IAAI,eAAe,UAAU;AACtK,QAAM,aAAa,eAAe,UAAU,eAAe;AAC3D,QAAM,cAAc,eAAe,WAAW,QAC1C,eAAe,QAAQ,WACvB,eAAe,SAAS,UAAU;AACtC,QAAM,CAAC,OAAO,QAAQ,IAAU,iBAAS,KAAK;AAC9C,QAAM,CAAC,cAAc,eAAe,IAAU,iBAAS,KAAK;AAC5D,QAAM,CAAC,WAAW,YAAY,IAAU,iBAAS,KAAK;AACtD,QAAM,CAAC,QAAQ,SAAS,IAAU,iBAAS,KAAK;AAChD,QAAM,mBAAyB,eAAuB,IAAI;AAC1D,QAAM,qBAA2B,eAA0B,IAAI;AAC/D,QAAM,gBAAsB,eAAuB,IAAI;AACvD,QAAM,kBAAwB,eAA0B,IAAI;AAC5D,QAAM,CAAC,eAAe,gBAAgB,IAAU,iBAAwB,CAAC,CAAC;AAE1E,EAAM,kBAAU,MAAM;AACpB,aAAS,UAAU,UAAU,SAAS,KAAK,KAAK,KAAK;AAAA,EACvD,GAAG,CAAC,CAAC;AAGL,EAAM,kBAAU,MAAM;AACpB,QAAI,CAAC,aAAc;AAEnB,aAASC,mBAAkB,GAAiB;AAC1C,YAAM,OAAO,EAAE,aAAa;AAC5B,UAAI,iBAAiB,WAAW,KAAK,SAAS,iBAAiB,OAAO,EAAG;AACzE,UAAI,mBAAmB,WAAW,KAAK,SAAS,mBAAmB,OAAO,EAAG;AAC7E,sBAAgB,KAAK;AAAA,IACvB;AAEA,UAAM,MAAM,sBAAsB,MAAM;AACtC,eAAS,iBAAiB,eAAeA,kBAAiB;AAAA,IAC5D,CAAC;AAED,WAAO,MAAM;AACX,2BAAqB,GAAG;AACxB,eAAS,oBAAoB,eAAeA,kBAAiB;AAAA,IAC/D;AAAA,EACF,GAAG,CAAC,YAAY,CAAC;AAGjB,EAAM,kBAAU,MAAM;AACpB,QAAI,CAAC,UAAW;AAEhB,aAASA,mBAAkB,GAAiB;AAC1C,YAAM,OAAO,EAAE,aAAa;AAC5B,UAAI,cAAc,WAAW,KAAK,SAAS,cAAc,OAAO,EAAG;AACnE,UAAI,gBAAgB,WAAW,KAAK,SAAS,gBAAgB,OAAO,EAAG;AACvE,mBAAa,KAAK;AAAA,IACpB;AAEA,UAAM,MAAM,sBAAsB,MAAM;AACtC,eAAS,iBAAiB,eAAeA,kBAAiB;AAAA,IAC5D,CAAC;AAED,WAAO,MAAM;AACX,2BAAqB,GAAG;AACxB,eAAS,oBAAoB,eAAeA,kBAAiB;AAAA,IAC/D;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAGd,EAAM,kBAAU,MAAM;AACpB,QAAI,aAAa,mBAAmB;AAClC,uBAAiB,kBAAkB,CAAC;AAAA,IACtC;AACA,QAAI,CAAC,WAAW;AACd,gBAAU,KAAK;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,WAAW,iBAAiB,CAAC;AAGjC,EAAM,kBAAU,MAAM;AACpB,QAAI,CAAC,WAAY;AACjB,oBAAgB,KAAK;AACrB,iBAAa,KAAK;AAAA,EACpB,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,WAAW;AACjB,QAAM,gBAAgB;AAEtB,QAAM,kBAAkB,QACtB,gFACE;AAAA,kDAAC,SAAI,WAAW,UAAU,wDAAC,gCAAQ,WAAU,YAAW,GAAE;AAAA,IAC1D,8CAAC,SAAI,WAAW,UAAU,eAAC;AAAA,KAC7B,IAEA,gFACE;AAAA,kDAAC,SAAI,WAAW,UAAU,kBAAI;AAAA,IAC9B,8CAAC,SAAI,WAAW,UAAU,eAAC;AAAA,KAC7B;AAGF,QAAM,UACJ,+EACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,oBAAiB;AAAA,MACjB,OAAO,EAAE,eAAe,QAAQ,aAAa,QAAQ,GAAG,UAAU;AAAA,MAClE,WAAW;AAAA,QACT;AAAA,QACA,aAAa,0BAA0B;AAAA,QACvC,cAAc;AAAA,QACd;AAAA,MACF;AAAA,MACA,eAAe;AAAA,MACf,eAAe;AAAA,MACf,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,sBAAsB;AAAA,MAGtB;AAAA,sDAAC,SAAI,WAAW;AAAA,UACd;AAAA,UACA,aAAa,uBAAuB;AAAA,QACtC,GACE,wDAAC,SAAI,WAAW;AAAA,UACd;AAAA,UACA,aAAa,cAAc;AAAA,QAC7B,GAAG,GACL;AAAA,QAEA,+CAAC,mBAAgB,eAAe,KAC9B;AAAA,yDAAC,WACC;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,kBAAkB,eAAe,YAC7B,yDACA,kBAAkB,eAAe,YAC/B,+DACA;AAAA,gBACR;AAAA,gBACA,eAAe,CAAC,MAA0B,EAAE,gBAAgB;AAAA,gBAC5D,SAAS,MAAM;AACb,sBAAI,kBAAkB,eAAe,WAAW;AAC9C,sCAAkB,QAAQ;AAAA,kBAC5B,OAAO;AACL,qCAAiB;AAAA,kBACnB;AAAA,gBACF;AAAA,gBAEA,wDAAC,sCAAc,WAAU,UAAS;AAAA;AAAA,YACpC;AAAA,YACA,+CAAC,kBAAe,MAAM,aAAa,WAAU,oCAC3C;AAAA,4DAAC,UAAM,2BAAiB,WAAW,wBAAuB;AAAA,cACzD;AAAA,eACH;AAAA,aACF;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,aACK,iBAAiB,mCAAmC,2BACpD,iBAAiB,mCAAmC;AAAA,cAC3D;AAAA,cAEA,yDAAC,SAAI,WAAW,GAAG,cAAc,aAAa,0BAA0B,uBAAuB,GAC7F;AAAA,+DAAC,WACC;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAW;AAAA,wBACT;AAAA,wBACA,eAAe,YACX,yDACA;AAAA,sBACN;AAAA,sBACA,eAAe,CAAC,MAAM,EAAE,gBAAgB;AAAA,sBACxC,SAAS,MAAM,kBAAkB,eAAe,YAAY,WAAW,SAAS;AAAA,sBAEhF,wDAAC,sCAAc,WAAU,UAAS;AAAA;AAAA,kBACpC;AAAA,kBACA,+CAAC,kBAAe,MAAM,aAAa,WAAU,oCAC3C;AAAA,kEAAC,UAAM,yBAAe,YAAY,sBAAsB,WAAU;AAAA,oBAClE,8CAAC,SAAI,WAAW,UAAU,wDAAC,mCAAW,WAAU,UAAS,GAAE;AAAA,oBAC3D,8CAAC,SAAI,WAAW,UAAU,eAAC;AAAA,qBAC7B;AAAA,mBACF;AAAA,gBAEA,+CAAC,WACC;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAW;AAAA,wBACT;AAAA,wBACA,gBACI,6BACA;AAAA,sBACN;AAAA,sBACA,eAAe,CAAC,MAAM,EAAE,gBAAgB;AAAA,sBACxC,SAAS;AAAA,sBAET,wDAAC,8BAAM,WAAU,UAAS;AAAA;AAAA,kBAC5B;AAAA,kBACA,+CAAC,kBAAe,MAAM,aAAa,WAAU,oCAC3C;AAAA,kEAAC,UAAM,0BAAgB,gBAAgB,eAAc;AAAA,oBACrD,8CAAC,SAAI,WAAW,UAAU,wDAAC,mCAAW,WAAU,YAAW,GAAE;AAAA,oBAC7D,8CAAC,SAAI,WAAW,UAAU,eAAC;AAAA,qBAC7B;AAAA,mBACF;AAAA,gBAEA,8CAAC,SAAI,WAAW;AAAA,kBACd;AAAA,kBACA,aAAa,wBAAwB;AAAA,gBACvC,GAAG;AAAA,gBAEH,+CAAC,wBAAQ,MAAR,EAAa,MAAM,WAAW,cAAc,cAC3C;AAAA,iEAAC,WACC;AAAA,kEAAC,wBAAQ,SAAR,EAAgB,KAAK,iBAAiB,QACrC;AAAA,sBAAC;AAAA;AAAA,wBACC,WAAW;AAAA,0BACT;AAAA,0BACA,mBAAmB,KAAK,YACpB,6BACA;AAAA,wBACN;AAAA,wBACA,eAAe,CAAC,MAA0B,EAAE,gBAAgB;AAAA;AAAA,oBAC9D,GAEA,wDAAC,sCAAc,WAAU,UAAS,GACpC;AAAA,oBACA,8CAAC,kBAAe,MAAM,aACpB,wDAAC,UAAK,2BAAa,GACrB;AAAA,qBACF;AAAA,kBACA,8CAAC,sBACC,wDAAC,wBAAQ,YAAR,EAAmB,MAAM,aAAa,YAAY,IAAI,WAAU,mBAAkB,OAAO,EAAE,eAAe,OAAO,GAChH,yDAAC,wBAAQ,OAAR,EAAc,KAAK,eAAe,WAAU,wFAAuF,eAAe,CAAC,MAA0B,EAAE,gBAAgB,GAC9L;AAAA,mEAAC,SAAI,WAAU,sDACb;AAAA,qEAAC,UAAK,WAAU,uCAAsC;AAAA;AAAA,wBAAgB,cAAc;AAAA,wBAAO;AAAA,yBAAC;AAAA,sBAC3F,cAAc,SAAS,KACtB;AAAA,wBAAC;AAAA;AAAA,0BACC,MAAK;AAAA,0BACL,WAAU;AAAA,0BACV,SAAS,MAAM;AACb,kDAAsB;AACtB,6CAAiB,CAAC,CAAC;AAAA,0BACrB;AAAA,0BACD;AAAA;AAAA,sBAED;AAAA,uBAEJ;AAAA,oBACC,cAAc,WAAW,IACxB,8CAAC,SAAI,WAAU,gDAA+C,6DAE9D,IAEA,gFACE;AAAA,oEAAC,SAAI,WAAU,2CACZ,wBAAc,IAAI,CAAC,MAAM,MAAM;AAC9B,8BAAM,gBAAgB,KAAK,QAAQ,WAAW,CAAC,GAAG,QAAQ,KAAK,QAAQ;AACvE,8BAAM,aAAa,OAAO,KAAK,KAAK,aAAa,EAAE;AACnD,8BAAM,QAAkB,CAAC;AACzB,4BAAI,aAAa,EAAG,OAAM,KAAK,GAAG,UAAU,SAAS,eAAe,IAAI,MAAM,EAAE,EAAE;AAClF,4BAAI,KAAK,KAAM,OAAM,KAAK,OAAO;AACjC,+BACE;AAAA,0BAAC;AAAA;AAAA,4BAEC,WAAU;AAAA,4BAEV;AAAA,6EAAC,SAAI,WAAU,kBACb;AAAA,+EAAC,SAAI,WAAU,wCAAuC;AAAA;AAAA,kCAAK;AAAA,kCAAc;AAAA,mCAAI;AAAA,gCAC7E,8CAAC,SAAI,WAAU,qCAAqC,gBAAM,KAAK,IAAI,GAAE;AAAA,iCACvE;AAAA,8BACA;AAAA,gCAAC;AAAA;AAAA,kCACC,MAAK;AAAA,kCACL,WAAU;AAAA,kCACV,SAAS,MAAM;AACb,0DAAsB,KAAK,OAAO;AAClC,qDAAiB,CAAC,SAAS,KAAK,OAAO,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC;AAAA,kCAC3D;AAAA,kCAEA,wDAAC,0BAAE,WAAU,UAAS;AAAA;AAAA,8BACxB;AAAA;AAAA;AAAA,0BAhBK;AAAA,wBAiBP;AAAA,sBAEJ,CAAC,GACH;AAAA,sBACA,8CAAC,SAAI,WAAU,qCACb;AAAA,wBAAC;AAAA;AAAA,0BACC,MAAK;AAAA,0BACL,WAAU;AAAA,0BACV,SAAS,YAAY;AACnB,kCAAM,UAAU,MAAM,mBAAmB;AACzC,gCAAI,SAAS;AACX,wCAAU,IAAI;AACd,yCAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,4BACzC;AAAA,0BACF;AAAA,0BAEC;AAAA,qCACC,8CAAC,8BAAM,WAAU,8BAA6B,IAE9C,8CAAC,6BAAK,WAAU,eAAc;AAAA,4BAE/B,SAAS,8BAA8B;AAAA;AAAA;AAAA,sBAC1C,GACF;AAAA,uBACF;AAAA,qBAEJ,GACF,GACF;AAAA,mBACF;AAAA,gBAEA,+CAAC,wBAAQ,MAAR,EAAa,MAAM,cAAc,cAAc,iBAC9C;AAAA,iEAAC,WACC;AAAA,kEAAC,wBAAQ,SAAR,EAAgB,KAAK,oBAAoB,QACxC;AAAA,sBAAC;AAAA;AAAA,wBACC,WAAW;AAAA,0BACT;AAAA,0BACA,eACI,6BACA;AAAA,wBACN;AAAA,wBACA,eAAe,CAAC,MAA0B,EAAE,gBAAgB;AAAA;AAAA,oBAC9D,GAEA,wDAAC,yCAAiB,WAAU,UAAS,GACvC;AAAA,oBACA,8CAAC,kBAAe,MAAM,aACpB,wDAAC,UAAK,kBAAI,GACZ;AAAA,qBACF;AAAA,kBACA,8CAAC,sBACC,wDAAC,wBAAQ,YAAR,EAAmB,MAAM,aAAa,YAAY,IAAI,WAAU,mBAAkB,OAAO,EAAE,eAAe,OAAO,GAChH,yDAAC,wBAAQ,OAAR,EAAc,KAAK,kBAAkB,WAAU,4FAA2F,eAAe,CAAC,MAA0B,EAAE,gBAAgB,GACrM;AAAA,kEAAC,SAAI,WAAU,8DAA6D,mBAAK;AAAA,oBAC/E;AAAA,sBACA,EAAE,OAAO,SAAkB,OAAO,SAAS,MAAM,yBAAI;AAAA,sBACrD,EAAE,OAAO,QAAiB,OAAO,QAAQ,MAAM,0BAAK;AAAA,sBACpD,EAAE,OAAO,UAAmB,OAAO,UAAU,MAAM,6BAAQ;AAAA,oBAC7D,EAAG,IAAI,CAAC,EAAE,OAAO,OAAO,KAAK,MAC3B;AAAA,sBAAC;AAAA;AAAA,wBAEC,MAAK;AAAA,wBACL,WAAW;AAAA,0BACT;AAAA,0BACA,UAAU,QACN,6BACA;AAAA,wBACN;AAAA,wBACA,SAAS,MAAM;AACb,uCAAa,KAAK;AAClB,0CAAgB,KAAK;AAAA,wBACvB;AAAA,wBAEA;AAAA,wEAAC,QAAK,WAAU,YAAW;AAAA,0BAC1B;AAAA;AAAA;AAAA,sBAdI;AAAA,oBAeP,CACD;AAAA,oBACD,8CAAC,SAAI,WAAU,6CAA4C;AAAA,oBAC3D,8CAAC,SAAI,WAAU,8DAA6D,gCAAkB;AAAA,oBAC5F;AAAA,sBACA,EAAE,OAAO,sBAAsB,MAAM,QAAQ,CAAC,8CAAC,gCAAkB,WAAU,cAAhB,KAA2B,GAAG,GAAI,IAAI,CAAC,QAAQ,GAAG,EAAE;AAAA,sBAC/G,EAAE,OAAO,QAAQ,MAAM,QAAQ,CAAC,8CAAC,gCAAkB,WAAU,cAAhB,KAA2B,GAAI,GAAG,IAAI,CAAC,QAAQ,GAAG,EAAE;AAAA,sBACjG,EAAE,OAAO,mBAAmB,MAAM,CAAC,8CAAC,mCAAuB,WAAU,YAAlB,OAA2B,GAAI,GAAG,EAAE;AAAA,sBACvF,EAAE,OAAO,iBAAiB,MAAM,CAAC,8CAAC,mCAAuB,WAAU,YAAlB,OAA2B,GAAI,GAAG,EAAE;AAAA,sBACrF,EAAE,OAAO,oBAAoB,MAAM,QAAQ,CAAC,QAAQ,8CAAC,+BAAiB,WAAU,cAAhB,KAA2B,CAAE,IAAI,CAAC,QAAQ,KAAK,EAAE;AAAA,sBACjH,EAAE,OAAO,eAAe,MAAM,CAAC,KAAK,EAAE;AAAA,oBACxC,EAAG,IAAI,CAAC,EAAE,OAAO,KAAK,MACpB,+CAAC,SAAgB,WAAU,mGACzB;AAAA,oEAAC,UAAM,iBAAM;AAAA,sBACb,8CAAC,UAAK,WAAU,6BACb,eAAK,IAAI,CAAC,GAAG,MACZ,8CAAC,SAAY,WAAW,eAAgB,eAA9B,CAAgC,CAC3C,GACH;AAAA,yBANQ,KAOV,CACD;AAAA,qBACH,GACF,GACF;AAAA,mBACF;AAAA,iBACF;AAAA;AAAA,UACF;AAAA,WACF;AAAA;AAAA;AAAA,EACF,GACF;AAGF,MAAI,WAAW;AACb,eAAO,gCAAa,SAAS,SAAS;AAAA,EACxC;AAEA,SAAO;AACT;AAEA,SAAS,2BAA2B;AAClC,QAAM;AAAA,IACJ;AAAA,IAAgB;AAAA,IAAgB;AAAA,IAAY;AAAA,IAAe;AAAA,IAAO;AAAA,IAClE;AAAA,IAAkB;AAAA,IAAiB;AAAA,IAAgB;AAAA,IAAmB;AAAA,EACxE,IAAI,cAAc;AAClB,QAAM,CAAC,eAAe,YAAY,IAAI,iBAAiB;AAEvD,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,kBAAkB;AAAA,MAClB;AAAA,MACA,gBAAgB;AAAA,MAChB;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,MACA,YAAY;AAAA,MACZ;AAAA,MACA,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,qBAAqB;AAAA,MACrB,qBAAqB;AAAA;AAAA,EACvB;AAEJ;AAEO,SAAS,oBAAoB;AAClC,QAAM,CAAC,SAAS,UAAU,IAAU,iBAAS,KAAK;AAElD,EAAM,kBAAU,MAAM;AACpB,eAAW,IAAI;AAAA,EACjB,GAAG,CAAC,CAAC;AAEL,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,SAAO,8CAAC,4BAAyB;AACnC;;;AGheI,IAAAC,uBAAA;AAFG,SAAS,aAAa;AAC3B,SACE,+CAAC,sBACC;AAAA,kDAAC,mBAAgB;AAAA,IACjB,8CAAC,qBAAkB;AAAA,IACnB,8CAAC,UAAO;AAAA,KACV;AAEJ;;;ACXA,IAAAC,UAAuB;AAwNf,IAAAC,uBAAA;AAjNR,SAAS,YAAY,KAAa,OAAuC,MAAwB;AAC/F,SAAO,EAAE,cAAc,KAAK,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,GAAG;AACzD;AAEA,SAAS,aAAa,KAAqB;AACzC,SAAO,IAAI,QAAQ,YAAY,KAAK,EAAE,YAAY;AACpD;AAEA,IAAM,eAAe;AAAA,EACnB,SAAS;AAAA,EACT,IAAI;AAAA,EACJ,WAAW,CAAC,QAAQ,YAAY,gBAAgB,SAAS,OAAO,cAAc,UAAU,eAAe;AAAA,EACvG,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,eAAe;AAAA,EACf,aAAa;AACf;AAEA,IAAM,eAA+B;AAAA,EACnC,YAAY,CAAC,EAAE,MAAM,iBAAiB,CAAC;AAAA,EACvC,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,SAAS,aAAa;AAAA,EACtB,IAAI,aAAa;AAAA,EACjB,WAAW,aAAa;AAC1B;AAEO,SAAS,iBAAiB;AAC/B,QAAM,CAAC,SAAS,UAAU,IAAU,iBAAS;AAAA,IAC3C,YAAY,YAAY,EAAE;AAAA,IAC1B,cAAc,YAAY,EAAE;AAAA,IAC5B,eAAe,YAAY,EAAE;AAAA,IAC7B,aAAa,YAAY,EAAE;AAAA,IAC3B,WAAW,YAAY,CAAC;AAAA,IACxB,aAAa,YAAY,CAAC;AAAA,IAC1B,cAAc,YAAY,CAAC;AAAA,IAC3B,YAAY,YAAY,CAAC;AAAA,IACzB,KAAK,YAAY,EAAE;AAAA,EACrB,CAAC;AAED,QAAM,CAAC,cAAc,eAAe,IAAU,iBAAS;AAAA,IACrD,qBAAqB,YAAY,CAAC;AAAA,IAClC,sBAAsB,YAAY,CAAC;AAAA,IACnC,yBAAyB,YAAY,CAAC;AAAA,IACtC,wBAAwB,YAAY,CAAC;AAAA,EACvC,CAAC;AAED,QAAM,CAAC,QAAQ,SAAS,IAAU,iBAA2B;AAAA,IAC3D,gBAAgB;AAAA,IAChB,gBAAgB,YAAY,CAAC;AAAA,IAC7B,kBAAkB;AAAA,IAClB,kBAAkB,YAAY,CAAC;AAAA,IAC/B,mBAAmB;AAAA,IACnB,mBAAmB,YAAY,CAAC;AAAA,IAChC,iBAAiB;AAAA,IACjB,iBAAiB,YAAY,CAAC;AAAA,EAChC,CAAC;AAED,QAAM,CAAC,MAAM,OAAO,IAAU,iBAAS;AAAA,IACrC,SAAS;AAAA,IACT,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,YAAY;AAAA,EACd,CAAC;AAED,QAAM,CAAC,QAAQ,SAAS,IAAU,iBAAS;AAAA,IACzC,OAAO,EAAE,MAAM,OAAgB,OAAO,YAAY,GAAG,EAAE;AAAA,IACvD,QAAQ,EAAE,MAAM,OAAgB,OAAO,YAAY,GAAG,EAAE;AAAA,EAC1D,CAAC;AAED,QAAM,CAAC,OAAO,QAAQ,IAAU,iBAAS;AAAA,IACvC,iBAAiB,EAAE,KAAK,UAAU,OAAO,KAAK,KAAK,qBAAqB;AAAA,IACxE,OAAO,EAAE,KAAK,UAAU,OAAO,KAAK,KAAK,eAAe;AAAA,IACxD,aAAa,EAAE,KAAK,UAAU,OAAO,KAAK,KAAK,qBAAqB;AAAA,IACpE,cAAc,EAAE,KAAK,UAAU,OAAO,GAAG,KAAK,cAAc;AAAA,EAC9D,CAAC;AAED,QAAM,CAAC,YAAY,aAAa,IAAU,iBAA+B;AAAA,IACvE,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,UAAU,YAAY,EAAE;AAAA,IACxB,YAAY,YAAY,EAAE;AAAA,IAC1B,eAAe,YAAY,GAAG,IAAI;AAAA,IAClC,WAAW;AAAA,IACX,mBAAmB;AAAA,EACrB,CAAC;AAED,QAAM,CAAC,eAAe,gBAAgB,IAAU,iBAAiC,CAAC,CAAC;AACnF,QAAM,CAAC,gBAAgB,iBAAiB,IAAU,iBAAS,KAAK;AAEhE,QAAM,sBAAsB,CAAC,KAAyB,UAA4B;AAChF,eAAW,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,EAAE;AAChD,qBAAiB,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,aAAa,GAAG,CAAC,GAAG,MAAM,IAAI,EAAE;AAAA,EAC1E;AAEA,QAAM,2BAA2B,CAAC,KAA8B,UAA4B;AAC1F,oBAAgB,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,EAAE;AACrD,qBAAiB,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,aAAa,GAAG,CAAC,GAAG,MAAM,IAAI,EAAE;AAAA,EAC1E;AAEA,QAAM,qBAAqB,CAAC,KAAwB,UAA+C;AACjG,cAAU,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,EAAE;AAC/C,UAAM,cAAc,uBAAuB,GAAG;AAC9C,UAAM,WAAW,OAAO,UAAU,WAAW,QAAQ,MAAM;AAC3D,qBAAiB,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,WAAW,GAAG,SAAS,EAAE;AAAA,EACnE;AAEA,QAAM,0BAA0B,CAAC,YAA6E;AAC5G,eAAW,CAAC,KAAK,KAAK,KAAK,SAAS;AAClC,yBAAmB,KAAK,KAAK;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,mBAAmB,CAAC,KAAwD,UAAkB;AAClG,YAAQ,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,EAAE;AAC7C,qBAAiB,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,aAAa,GAAG,CAAC,GAAG,MAAM,EAAE;AAAA,EACtE;AAEA,QAAM,qBAAqB,CAAC,KAAwB,UAAuB;AACzE,cAAU,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,EAAE;AAC/C,UAAM,WAAW,MAAM,SAAS,SAAS,SAAS,MAAM,SAAS,QAAQ,gBAAgB,MAAM,MAAM;AACrG,qBAAiB,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,SAAS,EAAE;AAAA,EAC3D;AAEA,QAAM,oBAAoB,CAAC,KAAuB,UAAsB;AACtE,aAAS,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,EAAE;AAC9C,UAAM,cAAc,sBAAsB,GAAG;AAC7C,qBAAiB,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,WAAW,GAAG,iBAAiB,KAAK,EAAE,EAAE;AAAA,EAClF;AAEA,QAAM,yBAAyB,CAAC,KAA4B,UAAqC;AAC/F,kBAAc,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,EAAE;AACnD,UAAM,WAAW,OAAO,UAAU,WAAW,QAAQ,MAAM;AAC3D,qBAAiB,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,aAAa,GAAG,CAAC,GAAG,SAAS,EAAE;AAAA,EACzE;AAEA,QAAM,cAAc,MAAM;AACxB,eAAW;AAAA,MACT,YAAY,YAAY,EAAE;AAAA,MAC1B,cAAc,YAAY,EAAE;AAAA,MAC5B,eAAe,YAAY,EAAE;AAAA,MAC7B,aAAa,YAAY,EAAE;AAAA,MAC3B,WAAW,YAAY,CAAC;AAAA,MACxB,aAAa,YAAY,CAAC;AAAA,MAC1B,cAAc,YAAY,CAAC;AAAA,MAC3B,YAAY,YAAY,CAAC;AAAA,MACzB,KAAK,YAAY,EAAE;AAAA,IACrB,CAAC;AACD,oBAAgB;AAAA,MACd,qBAAqB,YAAY,CAAC;AAAA,MAClC,sBAAsB,YAAY,CAAC;AAAA,MACnC,yBAAyB,YAAY,CAAC;AAAA,MACtC,wBAAwB,YAAY,CAAC;AAAA,IACvC,CAAC;AACD,cAAU;AAAA,MACR,gBAAgB;AAAA,MAChB,gBAAgB,YAAY,CAAC;AAAA,MAC7B,kBAAkB;AAAA,MAClB,kBAAkB,YAAY,CAAC;AAAA,MAC/B,mBAAmB;AAAA,MACnB,mBAAmB,YAAY,CAAC;AAAA,MAChC,iBAAiB;AAAA,MACjB,iBAAiB,YAAY,CAAC;AAAA,IAChC,CAAC;AACD,YAAQ;AAAA,MACN,SAAS;AAAA,MACT,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,YAAY;AAAA,IACd,CAAC;AACD,cAAU;AAAA,MACR,OAAO,EAAE,MAAM,OAAO,OAAO,YAAY,GAAG,EAAE;AAAA,MAC9C,QAAQ,EAAE,MAAM,OAAO,OAAO,YAAY,GAAG,EAAE;AAAA,IACjD,CAAC;AACD,aAAS;AAAA,MACP,iBAAiB,EAAE,KAAK,UAAU,OAAO,KAAK,KAAK,qBAAqB;AAAA,MACxE,OAAO,EAAE,KAAK,UAAU,OAAO,KAAK,KAAK,eAAe;AAAA,MACxD,aAAa,EAAE,KAAK,UAAU,OAAO,KAAK,KAAK,qBAAqB;AAAA,MACpE,cAAc,EAAE,KAAK,UAAU,OAAO,GAAG,KAAK,cAAc;AAAA,IAC9D,CAAC;AACD,kBAAc;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,UAAU,YAAY,EAAE;AAAA,MACxB,YAAY,YAAY,EAAE;AAAA,MAC1B,eAAe,YAAY,GAAG,IAAI;AAAA,MAClC,WAAW;AAAA,MACX,mBAAmB;AAAA,IACrB,CAAC;AACD,qBAAiB,CAAC,CAAC;AAAA,EACrB;AAEA,QAAM,oBAAoB,YAAY;AACpC,QAAI,OAAO,KAAK,aAAa,EAAE,WAAW,EAAG,QAAO;AACpD,UAAM,iBAAiB,gBAAgB,cAAc,aAAa;AAClE,QAAI;AACF,YAAM,UAAU,UAAU,UAAU,cAAc;AAClD,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SACE,8CAAC,SAAI,WAAU,oBACb,yDAAC,SAAI,WAAU,qBACb;AAAA,kDAAC,QAAG,WAAU,2BAA0B,+BAAiB;AAAA,IACzD,8CAAC,OAAE,WAAU,8BAA6B,iFAE1C;AAAA,IAEA,8CAAC,SAAI,WAAU,4BACb;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,kBAAkB,MAAM,kBAAkB,CAAC,cAAc;AAAA,QACzD,eAAe;AAAA,QACf,gBAAgB,MAAM;AAAA,QAAC;AAAA;AAAA,IACzB,GACF;AAAA,IAEA,+CAAC,SAAI,WAAU,uCACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,aAAa;AAAA,UACb,iBAAiB;AAAA,UACjB,sBAAsB;AAAA,UACtB,gBAAgB;AAAA,UAChB,cAAc;AAAA,UACd,gBAAgB;AAAA,UAChB,eAAe;AAAA,UACf,oBAAoB;AAAA,UACpB;AAAA,UACA,gBAAgB,MAAM;AAAA,UAAC;AAAA,UACvB,iBAAiB;AAAA,UACjB,sBAAsB;AAAA,UACtB,gBAAgB;AAAA,UAChB,qBAAqB;AAAA,UACrB,UAAU,MAAM;AAAA,UAAC;AAAA,UACjB,cAAc;AAAA,UACd,cAAc,MAAM;AAAA,UAAC;AAAA,UACrB,gBAAgB;AAAA,UAChB,eAAe;AAAA,UACf,oBAAoB;AAAA,UACpB,SAAS;AAAA,UACT,eAAe;AAAA,UACf,eAAe,YAAY;AAAA;AAAA,MAC7B;AAAA,MAEA,+CAAC,SAAI,WAAU,aACb;AAAA,uDAAC,SACC;AAAA,wDAAC,QAAG,WAAU,4BAA2B,0BAAY;AAAA,UACrD;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,SAAS,GAAG,QAAQ,WAAW,GAAG,IAAI,QAAQ,aAAa,GAAG,IAAI,QAAQ,cAAc,GAAG,IAAI,QAAQ,YAAY,GAAG;AAAA,gBACtH,cAAc,GAAG,aAAa,oBAAoB,GAAG,IAAI,aAAa,qBAAqB,GAAG,IAAI,aAAa,wBAAwB,GAAG,IAAI,aAAa,uBAAuB,GAAG;AAAA,gBACrL,gBAAgB,OAAO;AAAA,gBACvB,gBAAgB,OAAO,eAAe;AAAA,gBACtC,kBAAkB,OAAO;AAAA,gBACzB,kBAAkB,OAAO,iBAAiB;AAAA,gBAC1C,mBAAmB,OAAO;AAAA,gBAC1B,mBAAmB,OAAO,kBAAkB;AAAA,gBAC5C,iBAAiB,OAAO;AAAA,gBACxB,iBAAiB,OAAO,gBAAgB;AAAA,gBACxC,aAAa,IAAI,MAAM,YAAY,GAAG;AAAA,gBACtC,KAAK,QAAQ,IAAI;AAAA,gBACjB,eAAe,KAAK;AAAA,gBACpB,gBAAgB,KAAK;AAAA,gBACrB,YAAY,KAAK;AAAA,cACnB;AAAA,cAEA;AAAA,8DAAC,SAAI,WAAU,4DAA2D;AAAA,gBAC1E,8CAAC,SAAI,WAAU,8DAA6D;AAAA,gBAC5E,8CAAC,SAAI,WAAU,gEAA+D;AAAA;AAAA;AAAA,UAChF;AAAA,WACF;AAAA,QAEA,+CAAC,SACC;AAAA,wDAAC,QAAG,WAAU,4BAA2B,4BAAc;AAAA,UACvD,8CAAC,SAAI,WAAU,4DACZ,iBAAO,KAAK,aAAa,EAAE,SAAS,IACjC,KAAK,UAAU,eAAe,MAAM,CAAC,IACrC,yCACN;AAAA,WACF;AAAA,QAEA,+CAAC,SACC;AAAA,wDAAC,QAAG,WAAU,4BAA2B,8BAAgB;AAAA,UACzD,8CAAC,UAAK,WAAU,kEACb,iBAAO,KAAK,aAAa,EAAE,SAAS,IACjC,iBAAiB,aAAa,IAC9B,wCACN;AAAA,WACF;AAAA,SACF;AAAA,OACF;AAAA,KACF,GACF;AAEJ;","names":["React","isFlexContainer","containerRect","token","import_jsx_runtime","sendEditToAgent","sendCommentToAgent","active","React","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","TooltipPrimitive","import_jsx_runtime","SelectPrimitive","React","import_jsx_runtime","React","import_jsx_runtime","SliderPrimitive","React","React","import_jsx_runtime","React","React","import_jsx_runtime","BLUE","React","import_jsx_runtime","BLUE","React","import_jsx_runtime","import_lucide_react","import_jsx_runtime","STORAGE_KEY","sendEditToAgent","sendCommentToAgent","React","import_react_dom","React","import_react_dom","import_jsx_runtime","RULER_SIZE","React","STORAGE_KEY","DRAG_THRESHOLD","import_popover","import_lucide_react","import_jsx_runtime","handlePointerDown","import_jsx_runtime","React","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../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":["'use client'\n\nexport { DirectEdit } from './direct-edit'\nexport { DirectEditDemo } from './demo'\n\nexport { DirectEditProvider } from './provider'\nexport type { DirectEditContextValue } from './provider'\nexport { DirectEditPanel, DirectEditPanelInner } from './panel'\nexport type { DirectEditPanelInnerProps } from './panel'\nexport { DirectEditToolbar, DirectEditToolbarInner } from './toolbar'\nexport type { DirectEditToolbarInnerProps } from './toolbar'\nexport { useDirectEdit } from './hooks'\nexport { useMeasurement } from './use-measurement'\nexport type { UseMeasurementResult } from './use-measurement'\nexport { MeasurementOverlay } from './measurement-overlay'\nexport type { MeasurementOverlayProps } from './measurement-overlay'\nexport { useMove } from './use-move'\nexport type { UseMoveOptions, UseMoveDropTarget, UseMoveResult, MoveInfo } from './use-move'\nexport { SelectionOverlay } from './selection-overlay'\nexport type { SelectionOverlayProps } from './selection-overlay'\nexport { MoveOverlay } from './move-overlay'\nexport type { MoveOverlayProps } from './move-overlay'\nexport { Rulers, RulersOverlay, useRulersVisible } from './rulers-overlay'\nexport { useGuidelines, getStoredGuidelines } from './use-guidelines'\nexport type { UseGuidelinesResult } from './use-guidelines'\nexport { CommentOverlay } from './comment-overlay'\nexport type { CommentOverlayProps } from './comment-overlay'\n\nexport type {\n ElementInfo,\n CSSPropertyValue,\n SpacingProperties,\n BorderRadiusProperties,\n BorderProperties,\n FlexProperties,\n DirectEditState,\n SpacingPropertyKey,\n BorderRadiusPropertyKey,\n BorderStyle,\n BorderPropertyKey,\n FlexPropertyKey,\n SizingMode,\n SizingValue,\n SizingProperties,\n SizingPropertyKey,\n TypographyProperties,\n TypographyPropertyKey,\n MeasurementLine,\n MeasurementState,\n ColorValue,\n ColorProperties,\n ColorPropertyKey,\n ReactComponentFrame,\n ElementLocator,\n DomSourceLocation,\n DragState,\n DropTarget,\n DropIndicator,\n UndoEntry,\n UndoEditEntry,\n UndoSelectionEntry,\n UndoMoveEntry,\n Guideline,\n ActiveTool,\n Theme,\n Comment,\n CommentReply,\n SessionEdit,\n} from './types'\n\nexport {\n parsePropertyValue,\n formatPropertyValue,\n getComputedStyles,\n getComputedBorderStyles,\n stylesToTailwind,\n getElementInfo,\n getDimensionDisplay,\n calculateParentMeasurements,\n calculateElementMeasurements,\n parseColorValue,\n getComputedColorStyles,\n colorToTailwind,\n getElementLocator,\n isFlexContainer,\n getFlexDirection,\n findContainerAtPoint,\n calculateDropPosition,\n elementFromPointWithoutOverlays,\n calculateGuidelineMeasurements,\n buildCommentExport,\n buildSessionExport,\n} from './utils'\n\nexport { formatColorValue } from './ui/color-utils'\n","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 updateRawCSS: (properties: Record<string, string>) => 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 updateRawCSS = React.useCallback(\n (properties: Record<string, string>) => {\n if (!state.selectedElement || Object.keys(properties).length === 0) return\n\n const undoProperties: Array<{ cssProperty: string; previousValue: string | null }> = []\n const pendingUpdates: Record<string, string> = {}\n\n for (const [cssProperty, cssValue] of Object.entries(properties)) {\n const previousValue = state.selectedElement.style.getPropertyValue(cssProperty) || null\n undoProperties.push({ cssProperty, previousValue })\n state.selectedElement.style.setProperty(cssProperty, cssValue)\n pendingUpdates[cssProperty] = cssValue\n }\n\n pushUndo({ type: 'edit', element: state.selectedElement, properties: undoProperties })\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 'outline-style',\n 'outline-width',\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 updateRawCSS,\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 updateRawCSS,\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;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@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-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-700:oklch(37.3% .034 259.733);--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);--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-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-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}.contents{display:contents}.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-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-11{width:calc(var(--spacing)*11)}.w-14{width:calc(var(--spacing)*14)}.w-\\[1\\.5px\\]{width:1.5px}.w-\\[60px\\]{width:60px}.w-\\[68px\\]{width:68px}.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%}.w-px{width:1px}.max-w-0{max-width:calc(var(--spacing)*0)}.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}.origin-\\(--transform-origin\\){transform-origin:var(--transform-origin)}.-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-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-\\[canvas\\]{background-color:canvas}.bg-background{background-color:var(--color-background)}.bg-background\\/85{background-color:#ffffffd9}@supports (color:color-mix(in lab, red, red)){.bg-background\\/85{background-color:color-mix(in oklab,var(--color-background)85%,transparent)}}.bg-blue-500{background-color:var(--color-blue-500)}.bg-border{background-color:var(--color-border)}.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-gray-200{background-color:var(--color-gray-200)}.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-primary{background-color:var(--color-primary)}.bg-transparent{background-color:#0000}.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-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\\.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-3{padding-left:calc(var(--spacing)*3)}.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-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-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-gray-500{color:var(--color-gray-500)}.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)}.shadow-gray-200{--tw-shadow-color:oklch(92.8% .006 264.531)}@supports (color:color-mix(in lab, red, red)){.shadow-gray-200{--tw-shadow-color:color-mix(in oklab,var(--color-gray-200)var(--tw-shadow-alpha),transparent)}}.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)}}.outline-gray-200{outline-color:var(--color-gray-200)}.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-\\[transform\\,scale\\,opacity\\]{transition-property:transform,scale,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-dashed{--tw-outline-style:dashed;outline-style:dashed}.outline-dotted{--tw-outline-style:dotted;outline-style:dotted}.outline-double{--tw-outline-style:double;outline-style:double}.outline-none{--tw-outline-style:none;outline-style:none}.outline-solid{--tw-outline-style:solid;outline-style:solid}.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\\: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-ending-style\\:scale-90[data-ending-style]{--tw-scale-x:90%;--tw-scale-y:90%;--tw-scale-z:90%;scale:var(--tw-scale-x)var(--tw-scale-y)}.data-ending-style\\:opacity-0[data-ending-style]{opacity:0}.data-instant\\:transition-none[data-instant]{transition-property:none}.data-starting-style\\:scale-90[data-starting-style]{--tw-scale-x:90%;--tw-scale-y:90%;--tw-scale-z:90%;scale:var(--tw-scale-x)var(--tw-scale-y)}.data-starting-style\\:opacity-0[data-starting-style]{opacity:0}.data-\\[highlighted\\]\\:bg-muted[data-highlighted]{background-color:var(--color-muted)}.data-\\[highlighted\\]\\:text-foreground[data-highlighted]{color:var(--color-foreground)}@media (prefers-color-scheme:dark){.dark\\:bg-gray-700{background-color:var(--color-gray-700)}.dark\\:text-gray-400{color:var(--color-gray-400)}.dark\\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark\\:-outline-offset-1{outline-offset:calc(1px*-1)}.dark\\:outline-gray-300{outline-color:var(--color-gray-300)}}.\\[\\&_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}}.lucide{stroke-width:1px}@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}@property --tw-scale-x{syntax:\"*\";inherits:false;initial-value:1}@property --tw-scale-y{syntax:\"*\";inherits:false;initial-value:1}@property --tw-scale-z{syntax:\"*\";inherits:false;initial-value:1}@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 TooltipContent,\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\nfunction Tip({ children, label, side = 'top' }: { children: React.ReactElement; label: React.ReactNode; side?: 'top' | 'bottom' | 'left' | 'right' }) {\n return (\n <Tooltip>\n <TooltipTrigger render={children} />\n <TooltipContent side={side}>{label}</TooltipContent>\n </Tooltip>\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 <Tip label=\"Left\">\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 />\n </div>\n </Tip>\n <Tip label=\"Top\">\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 />\n </div>\n </Tip>\n <Tip label=\"Combined mode\">\n <Button\n variant=\"secondary\"\n size=\"icon\"\n className=\"size-7 shrink-0\"\n onClick={() => setIndividual(false)}\n >\n <Columns2 className=\"size-3.5\" />\n </Button>\n </Tip>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Tip label=\"Right\">\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 />\n </div>\n </Tip>\n <Tip label=\"Bottom\">\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 />\n </div>\n </Tip>\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 <Tip label=\"Horizontal (left & right)\">\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 />\n </div>\n </Tip>\n <Tip label=\"Vertical (top & bottom)\">\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 />\n </div>\n </Tip>\n <Tip label=\"Individual mode\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 shrink-0 text-muted-foreground\"\n onClick={() => setIndividual(true)}\n >\n <Grid2x2 className=\"size-3.5\" />\n </Button>\n </Tip>\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 <Tip label=\"Left\">\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 />\n </div>\n </Tip>\n <Tip label=\"Top\">\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 />\n </div>\n </Tip>\n <Tip label=\"Combined mode\">\n <Button\n variant=\"secondary\"\n size=\"icon\"\n className=\"size-7 shrink-0\"\n onClick={() => setIndividual(false)}\n >\n <Columns2 className=\"size-3.5\" />\n </Button>\n </Tip>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Tip label=\"Right\">\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 />\n </div>\n </Tip>\n <Tip label=\"Bottom\">\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 />\n </div>\n </Tip>\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 <Tip label=\"Horizontal (left & right)\">\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 />\n </div>\n </Tip>\n <Tip label=\"Vertical (top & bottom)\">\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 />\n </div>\n </Tip>\n <Tip label=\"Individual mode\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 shrink-0 text-muted-foreground\"\n onClick={() => setIndividual(true)}\n >\n <Grid2x2 className=\"size-3.5\" />\n </Button>\n </Tip>\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 <Tip label=\"Top Left\">\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 />\n </div>\n </Tip>\n <Tip label=\"Top Right\">\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 />\n </div>\n </Tip>\n <Tip label=\"Combined mode\">\n <Button\n variant=\"secondary\"\n size=\"icon\"\n className=\"size-7 shrink-0\"\n onClick={() => setIndividual(false)}\n >\n <Columns2 className=\"size-3.5\" />\n </Button>\n </Tip>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Tip label=\"Bottom Left\">\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 />\n </div>\n </Tip>\n <Tip label=\"Bottom Right\">\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 />\n </div>\n </Tip>\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 <Tip label=\"Individual mode\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 shrink-0 text-muted-foreground\"\n onClick={() => setIndividual(true)}\n >\n <Grid2x2 className=\"size-3.5\" />\n </Button>\n </Tip>\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\ntype BorderPosition = 'border' | 'outline'\nconst BORDER_POSITION_OPTIONS: Array<{ value: BorderPosition; label: string }> = [\n { value: 'border', label: 'Border' },\n { value: 'outline', label: 'Outline' },\n]\n\nconst BORDER_SIDES = ['Top', 'Right', 'Bottom', 'Left'] as const\n\ninterface BorderInputsProps {\n border: BorderProperties\n borderColor?: ColorValue\n outlineColor?: ColorValue\n onChange: (key: BorderPropertyKey, value: BorderProperties[BorderPropertyKey]) => void\n onBatchChange: (changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]>) => void\n onBorderColorChange?: (value: ColorValue) => void\n onOutlineColorChange?: (value: ColorValue) => void\n onSetCSS?: (properties: Record<string, string>) => void\n borderPosition: BorderPosition\n onPositionChange: (position: BorderPosition) => void\n outlineStyle?: BorderStyle\n outlineWidth?: number\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, outlineColor, onChange, onBatchChange, onBorderColorChange, onOutlineColorChange, onSetCSS, borderPosition, onPositionChange, outlineStyle, outlineWidth }: BorderInputsProps) {\n const [selectedSide, setSelectedSide] = React.useState<BorderSideOption>('All')\n\n const isOutline = borderPosition === 'outline'\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 = isOutline\n ? (outlineStyle || 'solid')\n : (stylesMatch ? (border[`border${activeSides[0]}Style` as keyof BorderProperties] as BorderStyle) || 'solid' : 'solid')\n const currentWidth = isOutline\n ? (outlineWidth ?? 0)\n : (widthsMatch ? (border[`border${activeSides[0]}Width` as keyof BorderProperties] as CSSPropertyValue)?.numericValue ?? 0 : null)\n\n const handleStyleChange = (style: BorderStyle) => {\n if (isOutline && onSetCSS) {\n const props: Record<string, string> = { 'outline-style': style }\n if ((outlineWidth ?? 0) <= 0) {\n props['outline-width'] = '1px'\n }\n onSetCSS(props)\n return\n }\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 if (isOutline && onSetCSS) {\n onSetCSS({ 'outline-width': `${clamped}px` })\n return\n }\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 const activeColor = isOutline ? outlineColor : borderColor\n const activeColorChange = isOutline ? onOutlineColorChange : onBorderColorChange\n\n return (\n <div className=\"space-y-2\">\n {/* Row 1: Color */}\n {activeColor && activeColorChange && (\n <ColorInput\n id={isOutline ? 'outline-color' : 'border-color'}\n label={isOutline ? 'Outline' : 'Border'}\n icon={isOutline ? <Focus className=\"size-3.5\" /> : <Square className=\"size-3.5\" />}\n value={activeColor}\n onChange={activeColorChange}\n />\n )}\n\n {/* Row 2: Position + Style + Width + Side — all on one row */}\n <div className=\"flex items-center gap-1.5\">\n <Select value={borderPosition} onValueChange={(val) => val && onPositionChange(val as BorderPosition)}>\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>{BORDER_POSITION_OPTIONS.find((o) => o.value === borderPosition)?.label}</span>\n <SelectIcon>\n <ChevronDown className=\"size-3.5 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-xl outline outline-1 outline-foreground/10 bg-background p-1 text-popover-foreground shadow-lg animate-in fade-in-0 zoom-in-95\">\n {BORDER_POSITION_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.5\" />\n </SelectItemIndicator>\n <SelectItemText>{option.label}</SelectItemText>\n </SelectItem>\n ))}\n </SelectPopup>\n </SelectPositioner>\n </SelectPortal>\n </Select>\n\n <Select value={currentStyle} onValueChange={(val) => val && handleStyleChange(val as BorderStyle)}>\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.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.5 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-xl outline outline-1 outline-foreground/10 bg-background 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.5\" />\n </SelectItemIndicator>\n <SelectItemText>{option.label}</SelectItemText>\n </SelectItem>\n ))}\n </SelectPopup>\n </SelectPositioner>\n </SelectPortal>\n </Select>\n\n <Tip label={isOutline ? 'Outline width' : 'Border width'}>\n <div>\n <NumberInput\n min={0}\n step={0.5}\n value={typeof currentWidth === 'number' ? Math.round(currentWidth * 100) / 100 : 0}\n placeholder={currentWidth === null ? '–' : undefined}\n onValueChange={handleAllWidthChange}\n className=\"h-7 w-11 px-2 text-center text-xs tabular-nums\"\n />\n </div>\n </Tip>\n\n {!isOutline && (\n <Select value={selectedSide} onValueChange={(val) => val && setSelectedSide(val as BorderSideOption)}>\n <Tip label={`Sides: ${selectedSide}`}>\n <SelectTrigger className=\"flex size-7 shrink-0 items-center justify-center rounded-md border-0 bg-muted text-muted-foreground hover:bg-muted-foreground/10 hover:text-foreground focus:outline-none\">\n {selectedSide === 'Custom' ? (\n <Grid2x2 className=\"size-3.5\" strokeWidth={1} />\n ) : selectedSide === 'All' ? (\n <Square className=\"size-3.5\" />\n ) : (\n <BorderSideIcon side={selectedSide} className=\"\" />\n )}\n </SelectTrigger>\n </Tip>\n <SelectPortal>\n <SelectPositioner sideOffset={4} className=\"z-[99999]\">\n <SelectPopup className=\"min-w-[90px] overflow-hidden rounded-xl outline outline-1 outline-foreground/10 bg-background 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.5\" />\n </SelectItemIndicator>\n <SelectItemText>{side}</SelectItemText>\n </SelectItem>\n ))}\n </SelectPopup>\n </SelectPositioner>\n </SelectPortal>\n </Select>\n )}\n </div>\n\n {!isOutline && 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 <Tip label={`Border ${side.toLowerCase()} width`} key={side}>\n <div 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 />\n </div>\n </Tip>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\ninterface BorderSectionProps {\n border: BorderProperties\n borderColor?: ColorValue\n outlineColor?: ColorValue\n onChange: (key: BorderPropertyKey, value: BorderProperties[BorderPropertyKey]) => void\n onBatchChange: (changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]>) => void\n onBorderColorChange?: (value: ColorValue) => void\n onOutlineColorChange?: (value: ColorValue) => void\n onSetCSS?: (properties: Record<string, string>) => void\n pendingStyles?: Record<string, string>\n}\n\nfunction BorderSection({ border, borderColor, outlineColor, onChange, onBatchChange, onBorderColorChange, onOutlineColorChange, onSetCSS, pendingStyles }: BorderSectionProps) {\n // Auto-detect initial position from pending styles\n const hasOutlinePending = Boolean(\n pendingStyles?.['outline-style'] || pendingStyles?.['outline-width']\n )\n const [borderPosition, setBorderPosition] = React.useState<BorderPosition>(\n hasOutlinePending ? 'outline' : 'border'\n )\n\n const isOutline = borderPosition === 'outline'\n\n // Derive outline values from pending styles or computed\n const outlineStyleValue = (pendingStyles?.['outline-style'] as BorderStyle) || 'none'\n const outlineWidthValue = pendingStyles?.['outline-width']\n ? parseFloat(pendingStyles['outline-width'])\n : 0\n\n const hasBorder = isOutline\n ? (outlineStyleValue !== 'none' && outlineWidthValue > 0)\n : 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 if (isOutline && onSetCSS) {\n onSetCSS({ 'outline-style': 'solid', 'outline-width': '1px' })\n return\n }\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 if (isOutline && onSetCSS) {\n onSetCSS({ 'outline-style': 'none', 'outline-width': '0px' })\n return\n }\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 handlePositionChange = (newPosition: BorderPosition) => {\n if (newPosition === borderPosition) return\n\n if (newPosition === 'outline' && onSetCSS) {\n // Transfer border values to outline\n const firstSideStyle = border.borderTopStyle !== 'none' ? border.borderTopStyle : 'solid'\n const firstSideWidth = border.borderTopWidth.numericValue > 0 ? border.borderTopWidth.numericValue : 1\n\n // Clear border props\n const clearChanges: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]> = []\n for (const s of BORDER_SIDES) {\n clearChanges.push([`border${s}Style` as BorderPropertyKey, 'none'])\n clearChanges.push([`border${s}Width` as BorderPropertyKey, { numericValue: 0, unit: 'px', raw: '0px' }])\n }\n onBatchChange(clearChanges)\n\n // Set outline props\n if (hasBorder) {\n onSetCSS({\n 'outline-style': firstSideStyle,\n 'outline-width': `${firstSideWidth}px`,\n })\n // Transfer border color to outline color\n if (borderColor && onOutlineColorChange) {\n onOutlineColorChange(borderColor)\n }\n }\n } else if (newPosition === 'border' && onSetCSS) {\n // Transfer outline values to border\n const style = outlineStyleValue !== 'none' ? outlineStyleValue : 'solid'\n const width = outlineWidthValue > 0 ? outlineWidthValue : 1\n\n // Clear outline props\n onSetCSS({ 'outline-style': 'none', 'outline-width': '0px' })\n\n // Set border props\n if (hasBorder) {\n const changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]> = []\n for (const s of BORDER_SIDES) {\n changes.push([`border${s}Style` as BorderPropertyKey, style])\n changes.push([`border${s}Width` as BorderPropertyKey, { numericValue: width, unit: 'px', raw: `${width}px` }])\n }\n onBatchChange(changes)\n // Transfer outline color to border color\n if (outlineColor && onBorderColorChange) {\n onBorderColorChange(outlineColor)\n }\n }\n }\n\n setBorderPosition(newPosition)\n }\n\n const headerActions = (\n <Tip label={hasBorder ? 'Remove border' : 'Add border'}>\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 >\n {hasBorder ? <Minus className=\"size-3.5\" /> : <Plus className=\"size-3.5\" />}\n </button>\n </Tip>\n )\n\n return (\n <CollapsibleSection title=\"Border\" actions={headerActions}>\n {hasBorder ? (\n <ColorPickerGroup>\n <BorderInputs\n border={border}\n borderColor={borderColor}\n outlineColor={outlineColor}\n onChange={onChange}\n onBatchChange={onBatchChange}\n onBorderColorChange={onBorderColorChange}\n onOutlineColorChange={onOutlineColorChange}\n onSetCSS={onSetCSS}\n borderPosition={borderPosition}\n onPositionChange={handlePositionChange}\n outlineStyle={outlineStyleValue}\n outlineWidth={outlineWidthValue}\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=\"flex flex-col rounded-md bg-[canvas] px-2 py-1 text-xs origin-(--transform-origin) shadow-lg shadow-gray-200 outline-1 outline-gray-200 transition-[transform,scale,opacity] data-starting-style:scale-90 data-starting-style:opacity-0 data-ending-style:scale-90 data-ending-style:opacity-0 data-instant:transition-none dark:shadow-none dark:outline-gray-300 dark:-outline-offset-1\">\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 text-xs 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.5 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-xl outline outline-1 outline-foreground/10 bg-background 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.5\" />\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 <Tip label={locked ? 'Unlock aspect ratio' : 'Lock aspect ratio'}>\n <Button\n variant={locked ? 'secondary' : 'ghost'}\n size=\"icon\"\n className=\"size-7 shrink-0\"\n onClick={handleLockToggle}\n disabled={!canLock}\n >\n {locked ? <Link className=\"size-3.5\" /> : <Unlink className=\"size-3.5\" />}\n </Button>\n </Tip>\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.5 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-xl outline outline-1 outline-foreground/10 bg-background 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.5\" />\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.5 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-xl outline outline-1 outline-foreground/10 bg-background 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.5\" />\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 <Tip label=\"Font Size\">\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 />\n </div>\n </Tip>\n <Tip label=\"Line Height\">\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 />\n </div>\n </Tip>\n <Tip label=\"Letter Spacing (em)\">\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 />\n </div>\n </Tip>\n </div>\n\n <div className=\"flex items-center gap-3\">\n <div className=\"flex gap-1\">\n <Tip label=\"Align Left\">\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 >\n <AlignLeft className=\"size-3.5\" />\n </Button>\n </Tip>\n <Tip label=\"Align Center\">\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 >\n <AlignCenter className=\"size-3.5\" />\n </Button>\n </Tip>\n <Tip label=\"Align Right\">\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 >\n <AlignRight className=\"size-3.5\" />\n </Button>\n </Tip>\n </div>\n\n <div className=\"flex gap-1\">\n <Tip label=\"Align Top\">\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 >\n <AlignVerticalJustifyStart className=\"size-3.5\" />\n </Button>\n </Tip>\n <Tip label=\"Align Middle\">\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 >\n <AlignVerticalJustifyCenter className=\"size-3.5\" />\n </Button>\n </Tip>\n <Tip label=\"Align Bottom\">\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 >\n <AlignVerticalJustifyEnd className=\"size-3.5\" />\n </Button>\n </Tip>\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 (showText) sections.push('text')\n if (showColors) sections.push('colors')\n\n const handleClick = (key: SectionKey) => {\n const scrollEl = scrollRef.current\n if (!scrollEl) return\n if (key === 'layout') {\n scrollEl.scrollTo({ top: 0, behavior: 'smooth' })\n return\n }\n const el = sectionRefs[key].current\n if (!el) 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 bg-background\">\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 onSetCSS: (properties: Record<string, string>) => 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 onSetCSS,\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 <TooltipProvider delayDuration={200}>\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 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 pl-3 pr-2 py-2',\n isDraggable && 'cursor-grab active:cursor-grabbing'\n )}\n onPointerDown={onHeaderPointerDown}\n onPointerMove={onHeaderPointerMove}\n onPointerUp={onHeaderPointerUp}\n >\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 </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {onSelectParent && (\n <Tip label=\"Select Parent\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onSelectParent}\n disabled={!elementInfo.parentElement}\n className=\"size-7\"\n >\n <ChevronUp className=\"size-3.5\" />\n </Button>\n </Tip>\n )}\n {onSelectChild && (\n <Tip label=\"Select Child\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onSelectChild}\n disabled={!elementInfo.hasChildren}\n className=\"size-7\"\n >\n <ChevronDown className=\"size-3.5\" />\n </Button>\n </Tip>\n )}\n {onClose && (\n <>\n <div className=\"mx-0.5 h-4 w-px bg-border\" />\n <Button variant=\"ghost\" size=\"icon\" className=\"size-7\" onClick={onClose}>\n <X className=\"size-3.5\" />\n </Button>\n </>\n )}\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 backdrop-blur-xl bg-background/85\" ref={scrollRef}>\n <CollapsibleSection title=\"Layout\" actions={\n <Tip label={elementInfo.isFlexContainer ? 'Remove flex (Shift+A)' : 'Add flex (Shift+A)'}>\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 >\n {elementInfo.isFlexContainer ? <Minus className=\"size-3.5\" /> : <Plus className=\"size-3.5\" />}\n </button>\n </Tip>\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 <Tip label=\"Row\">\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 >\n <ArrowRight className=\"size-3.5\" />\n </button>\n </Tip>\n <Tip label=\"Column\">\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 >\n <ArrowDown className=\"size-3.5\" />\n </button>\n </Tip>\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.5 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-xl outline outline-1 outline-foreground/10 bg-background 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.5\" />\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 outlineColor={computedColor?.outlineColor}\n onChange={onUpdateBorder}\n onBatchChange={onBatchUpdateBorder}\n onBorderColorChange={(value) => onUpdateColor('borderColor', value)}\n onOutlineColorChange={(value) => onUpdateColor('outlineColor', value)}\n onSetCSS={onSetCSS}\n pendingStyles={pendingStyles}\n />\n </div>\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\n {computedColor && (\n <div ref={sectionRefs.colors}>\n <CollapsibleSection title=\"Selection 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 </div>\n\n <div\n className={cn(\n 'flex shrink-0 items-center gap-1 border-t border-border/50 bg-background 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 <Tip label=\"Copy edits\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleCopy}\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 </Tip>\n <Tip label=\"Apply changes via agent\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={handleSendToAgent}\n disabled={!hasPendingChanges || sendStatus === 'sending'}\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 </Tip>\n </div>\n </div>\n </TooltipProvider>\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 updateRawCSS,\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] 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 onSetCSS={updateRawCSS}\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-sm 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 [&::-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 'rounded-md bg-[canvas] px-2 py-1 text-xs origin-(--transform-origin) shadow-lg shadow-gray-200 outline-1 outline-gray-200 transition-[transform,scale,opacity] data-starting-style:scale-90 data-starting-style:opacity-0 data-ending-style:scale-90 data-ending-style:opacity-0 data-instant:transition-none dark:shadow-none dark:outline-gray-300 dark:-outline-offset-1',\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-xs 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-xs 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-xl outline outline-1 outline-foreground/10 bg-background 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-xs text-muted-foreground\">#</span>\n <HexInput value={currentHex} onChange={handleHexInput} />\n <span className=\"text-xs text-muted-foreground\">/</span>\n <AlphaInput value={alpha} onChange={handleAlphaInput} />\n <span className=\"text-xs 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-xs 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-xs 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, ElementLocator } from './types'\nimport { cn } from './cn'\nimport { ChevronLeft, Check, Copy, Trash2, ArrowUp, Send, X } from 'lucide-react'\nimport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from './ui/tooltip'\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\nfunction ElementLabel({ locator }: { locator: ElementLocator }) {\n return (\n <span className=\"truncate text-[10px] text-muted-foreground\">\n <code className=\"font-medium\">&lt;{locator.tagName.toLowerCase()}&gt;</code>\n {locator.id && <span>#{locator.id}</span>}\n {!locator.id && locator.classList.length > 0 && (\n <span>.{locator.classList.slice(0, 2).join('.')}{locator.classList.length > 2 ? `\\u2026` : ''}</span>\n )}\n </span>\n )\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 [elementRect, setElementRect] = React.useState<DOMRect | null>(null)\n const [flipHorizontal, setFlipHorizontal] = React.useState(false)\n const [flipVertical, setFlipVertical] = React.useState(false)\n const [autoExport, setAutoExport] = 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 setElementRect(rect)\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 {isActive && elementRect && (\n <svg\n data-direct-edit=\"comment-highlight\"\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={elementRect.left}\n y={elementRect.top}\n width={elementRect.width}\n height={elementRect.height}\n fill=\"rgba(59, 130, 246, 0.06)\"\n stroke=\"#3B82F6\"\n strokeWidth={1}\n />\n </svg>\n )}\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) => {\n onUpdateText(text)\n setAutoExport(true)\n }}\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={(text) => {\n onAddReply(text)\n setAutoExport(true)\n }}\n onDelete={onDelete}\n onExport={onExport}\n onSendToAgent={onSendToAgent}\n autoExport={autoExport}\n onAutoExportDone={() => setAutoExport(false)}\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-xl 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 autoExport: boolean\n onAutoExportDone: () => void\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 autoExport,\n onAutoExportDone,\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 React.useEffect(() => {\n if (autoExport) {\n onAutoExportDone()\n onExport().then((success) => {\n if (success) {\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n })\n }\n }, [autoExport])\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-xl 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 <TooltipProvider delayDuration={300} closeDelay={0}>\n <div className=\"flex items-center justify-between border-b border-border/50 px-2 py-1.5\">\n <div className=\"flex min-w-0 items-center gap-1\">\n <Tooltip>\n <TooltipTrigger\n render={\n <button\n type=\"button\"\n className=\"flex size-6 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n onClick={onClose}\n />\n }\n >\n <ChevronLeft className=\"size-3.5\" />\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">Back</TooltipContent>\n </Tooltip>\n <ElementLabel locator={comment.locator} />\n </div>\n <div className=\"flex shrink-0 items-center gap-0.5\">\n <Tooltip>\n <TooltipTrigger\n render={\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 />\n }\n >\n {copied ? (\n <Check className=\"size-3.5 text-green-500\" />\n ) : (\n <Copy className=\"size-3.5\" />\n )}\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{copied ? 'Copied' : 'Copy'}</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger\n render={\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 />\n }\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 </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {sendStatus === 'sent' ? 'Sent' : sendStatus === 'offline' ? 'Offline' : 'Send to Agent'}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger\n render={\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 />\n }\n >\n <Trash2 className=\"size-3.5\" />\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">Delete</TooltipContent>\n </Tooltip>\n </div>\n </div>\n </TooltipProvider>\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-gray-200 text-gray-500 px-1.5 py-0.5 font-mono text-[10px] min-w-[20px] min-h-[18px] dark:bg-gray-700 dark:text-gray-400'\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-xl 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 */}\n <div className={cn(\n 'flex shrink-0 cursor-grab items-center justify-center',\n isVertical ? 'w-full pt-0 pb-1.5' : 'h-full pl-0 pr-1.5'\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-xl 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-xl 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'\n\nconst canUseDOM = typeof window !== 'undefined'\nconst rulersVisibleListeners = new Set<() => void>()\n\nfunction readStoredRulersVisible(): boolean {\n if (!canUseDOM) {\n return true\n }\n\n try {\n return localStorage.getItem(RULERS_VISIBLE_KEY) !== 'false'\n } catch {\n return true\n }\n}\n\nlet rulersVisibleSnapshot = readStoredRulersVisible()\n\nfunction emitRulersVisible() {\n rulersVisibleListeners.forEach((listener) => listener())\n}\n\nfunction setRulersVisible(next: boolean) {\n if (rulersVisibleSnapshot === next) {\n return\n }\n\n rulersVisibleSnapshot = next\n\n if (canUseDOM) {\n try {\n localStorage.setItem(RULERS_VISIBLE_KEY, String(next))\n } catch {\n // ignore write failures (e.g. private mode)\n }\n }\n\n emitRulersVisible()\n}\n\nfunction subscribeRulersVisible(listener: () => void) {\n rulersVisibleListeners.add(listener)\n return () => {\n rulersVisibleListeners.delete(listener)\n }\n}\n\nexport function useRulersVisible(): [boolean, () => void] {\n const visible = React.useSyncExternalStore(\n subscribeRulersVisible,\n () => rulersVisibleSnapshot,\n () => true,\n )\n\n const toggle = React.useCallback(() => {\n setRulersVisible(!rulersVisibleSnapshot)\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 onSetCSS={() => {}}\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","import_jsx_runtime","sendEditToAgent","sendCommentToAgent","active","React","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","TooltipPrimitive","import_jsx_runtime","SelectPrimitive","React","import_jsx_runtime","React","import_jsx_runtime","SliderPrimitive","React","React","import_jsx_runtime","React","React","import_jsx_runtime","BLUE","React","import_jsx_runtime","BLUE","React","import_jsx_runtime","import_lucide_react","import_jsx_runtime","STORAGE_KEY","sendEditToAgent","sendCommentToAgent","React","import_react_dom","React","import_react_dom","import_jsx_runtime","RULER_SIZE","React","STORAGE_KEY","DRAG_THRESHOLD","import_popover","import_lucide_react","import_jsx_runtime","handlePointerDown","import_jsx_runtime","React","import_jsx_runtime"]}